# Mission Control 🚀 Welcome! This is the starter repo for the X-Lab take-home exercise. Mission Control is a small app for running a (fictional) space programme. It is built the way we build software at X-Lab: a C#/.NET API using FastEndpoints and Entity Framework Core on SQL Server, and a React + TypeScript front end using Vite, TanStack Router/Query, and Mantine. The app currently does one thing: it tracks **missions**. The full vertical slice for missions — endpoint, validation, data access, UI, and tests work out of the box. ## Your task Mission Control can plan missions, but nothing ever lifts off. The flight team wants to schedule **launches**. Build the launches feature end to end. Requirements: - A launch belongs to a mission and has, at minimum, a scheduled time and a status. - Launches can be created and viewed in the UI. - Invalid input is rejected sensibly. - At least one test, wherever you think it adds the most value. Everything else is your call: the fields, the routes, the UX, what "sensible validation" means, how launches relate to missions. The missions slice shows you our patterns — follow them, or deliberately diverge and tell us why in DECISIONS.md. If you finish the core and want to keep going, there is an **optional extension**: take the app in a direction that shows us something you care about. More features, refactor, nicer UX, more tests, infrastructure (see [terraform/](terraform/)), whatever you like. This is genuinely optional. ## Time We would much rather see a thoughtful, unfinished hour than a polished weekend, we will talk through what you built together at the next stage. ## AI Use whatever tools you use day to day, **including AI — we do**. We are not testing whether you can code without it. What we care about is the judgement on top: what you chose to build, what you accepted or rejected, and whether you understand what you shipped. ## DECISIONS.md Before you send your submission back, spend a few extra minutes filling in [DECISIONS.md](DECISIONS.md). We will keep this open and read as we review your submission. ## Getting started You will need: - [.NET 10 SDK](https://dotnet.microsoft.com/download) - [Node 20+](https://nodejs.org/) - [Docker](https://www.docker.com/products/docker-desktop/) Then: ```bash # 1. Start SQL Server docker compose up -d # 2. Install front-end dependencies npm install --prefix src/mission-control-client # 3. Run the app (starts the API and the Vite dev server together) dotnet run --project src/MissionControl.Server ``` **** Open http://localhost:5173 — you should see the seeded missions. Database migrations and seed data apply automatically on startup. Swagger UI is at http://localhost:5010/swagger. > **Apple Silicon:** the SQL Server image is x64 and runs via Rosetta. If the container fails to start, enable "Use Rosetta for x86_64/amd64 emulation" in Docker Desktop → Settings → General. ## Running the tests ```bash dotnet test npm test --prefix src/mission-control-client ``` ## The lay of the land | Path | What it is | | --- | --- | | `src/MissionControl.Server` | The API host. Endpoints live in `Endpoints//`, one file per operation with its request, response, and validator alongside. | | `src/MissionControl.Domain` | Domain entities. | | `src/MissionControl.Data` | EF Core: DbContext, entity configurations, migrations, dev seed data. | | `src/mission-control-client` | The React app. File-based routes in `src/routes/`, API calls and types in `src/api/`. | | `test/MissionControl.Server.Tests` | xUnit + Shouldly + NSubstitute, with example endpoint and validator tests (endpoints test against in-memory SQLite via `TestDatabase`). | | `terraform/` | A small, optional Azure skeleton. Not needed to run anything locally. | ## Useful commands Add an EF migration: ```bash dotnet ef migrations add AddLaunches --project src/MissionControl.Data --startup-project src/MissionControl.Server ``` Reset the database (the container has no volume, so this starts fresh): ```bash docker compose down && docker compose up -d ``` ## Submitting Send back either a zip of the repo (please leave out `node_modules`, `bin`, and `obj`) or a link to a private repo — whichever is easier. If you use git as you go, keep the history; we enjoy reading it. If anything in the starter is broken or confusing, please let us know.