Skip to content
Snippets Groups Projects
DatabaseSeeding.cs 5.6 KiB
Newer Older
using FlightBooking.Service.Data.Models;
using Microsoft.EntityFrameworkCore;

namespace FlightBooking.Service.Data
{
    public static class DatabaseSeeding
    {
        public static void Initialize(IServiceProvider serviceProvider)
        {
            using (var context = new FlightBookingContext(serviceProvider.GetRequiredService<DbContextOptions<FlightBookingContext>>()))
            {
                if (context.FlightInformation.Any())
                {
                    return;
                }

                string flightA = Guid.NewGuid().ToString("N")[..4].ToUpper();
                string flightB = Guid.NewGuid().ToString("N")[..4].ToUpper();
                List<FlightFare> flightFaresA = new List<FlightFare>
                {
                    new FlightFare
                    {
                        FareName = "Economy class",
                        FareCode = "Eco-1",
                        Price = 4000,
                        SeatCapacity = 30,
                        SeatReserved = 0,
                        CreatedAt = DateTime.UtcNow,
                        UpdatedAt = DateTime.UtcNow,
                    },
                    new FlightFare
                    {
                        FareName = "Business class",
                        FareCode = "Biz-1",
                        Price = 4000,
                        SeatCapacity = 30,
                        SeatReserved = 0,
                        CreatedAt = DateTime.UtcNow,
                        UpdatedAt = DateTime.UtcNow,
                    },
                };

                List<FlightFare> flightFaresB = new List<FlightFare>
                {
                    new FlightFare
                    {
                        FareName = "Economy class",
                        FareCode = "Eco-11",
                        Price = 5000,
                        SeatCapacity = 20,
                        SeatReserved = 0,
                        CreatedAt = DateTime.UtcNow,
                        UpdatedAt = DateTime.UtcNow,
                    },
                    new FlightFare
                    {
                        FareName = "Business class",
                        FareCode = "Biz-11",
                        Price = 4000,
                        SeatCapacity = 10,
                        SeatReserved = 0,
                        CreatedAt = DateTime.UtcNow,
                        UpdatedAt = DateTime.UtcNow,
                    },
                };

                //Create available seats
                var reservedSeatsA = GenerateSeats(flightA, 60);
                var reservedSeatsB = GenerateSeats(flightB, 60);

                List<FlightInformation> flights = new List<FlightInformation>
                {
                    new FlightInformation
                    {
                        SeatCapacity = 60,
                        DepartureDate = DateTime.UtcNow.AddMonths(3),
                        ArrivalDate = DateTime.UtcNow.AddMonths(3).AddHours(4),
                        Airline = "Emirates",
                        SeatReserved = 0,
                        Destination = "London",
                        Origin = "Lagos",
                        FlightNumber = flightA,
                        CreatedAt = DateTime.UtcNow,
                        UpdatedAt = DateTime.UtcNow,
                        FlightFares = flightFaresA,
                        ReservedSeats = reservedSeatsA,
                    },
                    new FlightInformation
                    {
                        SeatCapacity = 40,
                        DepartureDate = DateTime.UtcNow.AddMonths(3).AddDays(7),
                        ArrivalDate = DateTime.UtcNow.AddMonths(3).AddDays(7).AddHours(4),
                        Airline = "Emirates",
                        SeatReserved = 0,
                        Destination = "Lagos",
                        Origin = "London",
                        FlightNumber = flightB,
                        CreatedAt = DateTime.UtcNow,
                        UpdatedAt = DateTime.UtcNow,
                        FlightFares = flightFaresB,
                        ReservedSeats = reservedSeatsB
                    }
                };

                context.FlightInformation.AddRange(flights);

                context.SaveChanges();

                context.Database.EnsureCreated();
            }
        }

        private static List<ReservedSeat> GenerateSeats(string flightNumber, int flightCapacity)
        {
            //assume seats are in group of 4 Alphabets e.g 1A, 1B, 1C, 1D

            Dictionary<int, string> SeatMaps = new Dictionary<int, string>
            {
                {1, "A" },
                {2, "B" },
                {3, "C" },
                {4, "D" }
            };

            int seatId = 1;
            int seatCount = 1;

            List<string> seatNumbers = new List<string>();

            for (int i = 1; i < flightCapacity + 1; i++)
            {
                if (seatCount > 4)
                {
                    seatId++;
                    seatCount = 1;
                }

                seatNumbers.Add(seatId + SeatMaps[seatCount]);
                seatCount++;
            }

            List<ReservedSeat> reservedSeats = new List<ReservedSeat>();

            foreach (var seatNumber in seatNumbers)
            {
                reservedSeats.Add(new ReservedSeat
                {
                    BookingNumber = null,
                    FlightNumber = flightNumber,
                    IsReserved = false,
                    SeatNumber = seatNumber
                });
            }

            return reservedSeats;
        }
    }
}