public FlightsModule(SchedulerRepository repository)
            : base("/flights")
        {
            // Get all flights
            Get["/"] = _ => repository.GetSchedule().Flights
                .Select(f => new
                {
                    f.Flight,
                    f.Arrives,
                    f.Departs
                });

            // Get all flights
            Get["/unscheduled"] = _ => repository.GetSchedule().Flights
                .Where(f => f.Gate == null)
                .Select(f => new
                {
                    f.Flight,
                    f.Arrives,
                    f.Departs
                });

            // Add flights
            Post["/"] = parameters =>
            {
                // This API POSTs a list of flights at a time instead of individual flights.
                var flights = this.Bind<IEnumerable<FlightModel>>().ToList();
                var schedule = repository.GetSchedule();
                schedule.AddFlights(flights);
                schedule.ScheduleUnassignedFlights();
                repository.SaveSchedule(schedule);
                return null;
            };
        }
        /// <summary>
        /// Create Gates Module. The constructor is called by the IoC container
        /// instead of by our own code.
        /// </summary>
        public GatesModule(SchedulerRepository repository)
            : base("/gates")
        {
            // This tells the web server to use the provided delegate (Lambda)
            // to serve a GET request at this endpoint.
            Get["/"] = _ => repository.GetSchedule().Gates
                .Select(g => new
                {
                    g.Gate
                });

            Post["/"] = _ =>
            {
                var gates = this.Bind<IEnumerable<GateModel>>();
                var schedule = repository.GetSchedule();
                schedule.AddGates(gates.ToArray());
                repository.SaveSchedule(schedule);
                return null;
            };
        }
        public StatusEndpoint(SchedulerRepository repository)
            : base("/status")
        {
            Get["/"] = _ =>
                new StatusModel
                {
                    StartupKey = Program.StartupKey,
                    State = SystemState.Ready
                };

            Put["/"] = _ =>
            {
                var status = this.Bind<StatusModel>();
                if (status.State == SystemState.Reset)
                {
                    repository.SaveSchedule(new Schedule());
                }
                return new StatusModel
                {
                    StartupKey = Program.StartupKey,
                    State = SystemState.Ready
                };
            };
        }