From d7a90e51b1e4cce08f90166c684fa06b636ad8ea Mon Sep 17 00:00:00 2001 From: ASaug Date: Mon, 3 Feb 2025 10:18:03 +0100 Subject: [PATCH] done Base --- ERD-base.png | Bin 0 -> 25849 bytes api-cinema-challenge/api-cinema-challenge.sln | 1 + .../api-cinema-challenge/DTO/CustomerDTO.cs | 11 + .../api-cinema-challenge/DTO/MovieDTO.cs | 28 +++ .../api-cinema-challenge/DTO/ScreeningDTO.cs | 28 +++ .../Data/CinemaContext.cs | 21 +- .../api-cinema-challenge/Data/Seeder.cs | 40 ++++ .../EndPoint/CinemaEndpoint.cs | 189 ++++++++++++++++++ .../api-cinema-challenge/Models/Customer.cs | 10 + .../api-cinema-challenge/Models/Dateing.cs | 8 + .../api-cinema-challenge/Models/Movie.cs | 12 ++ .../api-cinema-challenge/Models/Screening.cs | 13 ++ .../api-cinema-challenge/Program.cs | 13 +- .../Repository/IRepository.cs | 23 +++ .../Repository/Repository.cs | 115 +++++++++++ .../api-cinema-challenge.csproj | 6 +- 16 files changed, 509 insertions(+), 9 deletions(-) create mode 100644 ERD-base.png create mode 100644 api-cinema-challenge/api-cinema-challenge/DTO/CustomerDTO.cs create mode 100644 api-cinema-challenge/api-cinema-challenge/DTO/MovieDTO.cs create mode 100644 api-cinema-challenge/api-cinema-challenge/DTO/ScreeningDTO.cs create mode 100644 api-cinema-challenge/api-cinema-challenge/Data/Seeder.cs create mode 100644 api-cinema-challenge/api-cinema-challenge/EndPoint/CinemaEndpoint.cs create mode 100644 api-cinema-challenge/api-cinema-challenge/Models/Customer.cs create mode 100644 api-cinema-challenge/api-cinema-challenge/Models/Dateing.cs create mode 100644 api-cinema-challenge/api-cinema-challenge/Models/Movie.cs create mode 100644 api-cinema-challenge/api-cinema-challenge/Models/Screening.cs create mode 100644 api-cinema-challenge/api-cinema-challenge/Repository/IRepository.cs create mode 100644 api-cinema-challenge/api-cinema-challenge/Repository/Repository.cs diff --git a/ERD-base.png b/ERD-base.png new file mode 100644 index 0000000000000000000000000000000000000000..9c4efdde34607b9ee050c7569a6c481a81d255e5 GIT binary patch literal 25849 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 Screenings { get; set; } + + } + public class MovieSmall : Dateing + { + public string Title { get; set; } + public string Rating { get; set; } + public string Description { get; set; } + public int RuntimeMins { get; set; } + } + public class MoviePost + { + public string Title { get; set; } + public string Rating { get; set; } + public string Description { get; set; } + public int RuntimeMins { get; set; } + } +} diff --git a/api-cinema-challenge/api-cinema-challenge/DTO/ScreeningDTO.cs b/api-cinema-challenge/api-cinema-challenge/DTO/ScreeningDTO.cs new file mode 100644 index 00000000..da912400 --- /dev/null +++ b/api-cinema-challenge/api-cinema-challenge/DTO/ScreeningDTO.cs @@ -0,0 +1,28 @@ +using api_cinema_challenge.Models; + +namespace api_cinema_challenge.DTO +{ + public class ScreeningDTO : Dateing + { + public int ScreenNumber { get; set; } + public int Capacity { get; set; } + public DateTime StartsAt { get; set; } + public int MovieId { get; set; } + } + public class ScreeningDTOBig : Dateing + { + public int ScreenNumber { get; set; } + public int Capacity { get; set; } + public DateTime StartsAt { get; set; } + public int MovieId { get; set; } + public MovieSmall Movie { get; set; } + + } + public class ScreeningPost + { + public int ScreenNumber { get; set; } + public int Capacity { get; set; } + public DateTime StartsAt { get; set; } + public int MovieId { get; set; } + } +} diff --git a/api-cinema-challenge/api-cinema-challenge/Data/CinemaContext.cs b/api-cinema-challenge/api-cinema-challenge/Data/CinemaContext.cs index ad4fe854..8589e998 100644 --- a/api-cinema-challenge/api-cinema-challenge/Data/CinemaContext.cs +++ b/api-cinema-challenge/api-cinema-challenge/Data/CinemaContext.cs @@ -1,4 +1,6 @@ -using Microsoft.EntityFrameworkCore; +using System.Net.Sockets; +using api_cinema_challenge.Models; +using Microsoft.EntityFrameworkCore; using Newtonsoft.Json.Linq; namespace api_cinema_challenge.Data @@ -6,10 +8,11 @@ namespace api_cinema_challenge.Data public class CinemaContext : DbContext { private string _connectionString; - public CinemaContext(DbContextOptions options) : base(options) + public CinemaContext() { var configuration = new ConfigurationBuilder().AddJsonFile("appsettings.json").Build(); - _connectionString = configuration.GetValue("ConnectionStrings:DefaultConnectionString")!; + _connectionString = configuration.GetValue("ConnectionStrings:DefaultConnection")!; + this.Database.SetConnectionString(_connectionString); this.Database.EnsureCreated(); } @@ -20,7 +23,19 @@ protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) protected override void OnModelCreating(ModelBuilder modelBuilder) { + //Primary keys + modelBuilder.Entity().HasKey(c => c.Id); + modelBuilder.Entity().HasKey(m => m.Id); + modelBuilder.Entity().HasKey(s => s.Id); + + //Relations + modelBuilder.Entity() + .HasMany(m => m.Screenings) + .WithOne(m => m.Movie); } + public DbSet Customers { get; set; } + public DbSet Movies { get; set; } + public DbSet Screenings { get; set; } } } diff --git a/api-cinema-challenge/api-cinema-challenge/Data/Seeder.cs b/api-cinema-challenge/api-cinema-challenge/Data/Seeder.cs new file mode 100644 index 00000000..b3e5501b --- /dev/null +++ b/api-cinema-challenge/api-cinema-challenge/Data/Seeder.cs @@ -0,0 +1,40 @@ +using System; +using api_cinema_challenge.Models; + +namespace api_cinema_challenge.Data +{ + public static class Seeder + { + public async static void SeedCinemaApi(this WebApplication app) + { + using (var db = new CinemaContext()) + { + if (!db.Customers.Any()) + { + db.Add(new Customer() { Name = "Nigel" }); + db.Add(new Customer() { Name = "Dave" }); + await db.SaveChangesAsync(); + } + if (!db.Movies.Any()) + { + db.Add(new Movie() { Title = "Cheese & Pineapple" }); + db.Add(new Movie() { Title = "Vegan Cheese Tastic" }); + await db.SaveChangesAsync(); + + } + if (!db.Screenings.Any()) + { + db.Add(new Screening() { MovieId = 1, StartsAt = DateTime.UtcNow.AddDays(1)}); + await db.SaveChangesAsync(); + } + + //order data + if (1 == 1) + { + + await db.SaveChangesAsync(); + } + } + } + } +} diff --git a/api-cinema-challenge/api-cinema-challenge/EndPoint/CinemaEndpoint.cs b/api-cinema-challenge/api-cinema-challenge/EndPoint/CinemaEndpoint.cs new file mode 100644 index 00000000..8fe10e7c --- /dev/null +++ b/api-cinema-challenge/api-cinema-challenge/EndPoint/CinemaEndpoint.cs @@ -0,0 +1,189 @@ +using api_cinema_challenge.DTO; +using api_cinema_challenge.Models; +using api_cinema_challenge.Repository; +using Microsoft.AspNetCore.Mvc; + +namespace api_cinema_challenge.EndPoint +{ + public static class CinemaEndpoint + { + public static void ConfigureCinemaEndPoint (this WebApplication app) + { + app.MapPost("/customers", AddCustomer); + app.MapGet("/customers", GetCustomers); + app.MapPut("/customers/{id}", UpdateCustomer); + app.MapDelete("/customers/{id}", DeleteCustomer); + + app.MapPost("/movies", AddMovie); + app.MapGet("/movies", GetMovies); + app.MapPut("/movies/{id}", UpdateMovie); + app.MapDelete("movies/{id}", DeleteMovie); + + app.MapPost("/movies/{id}/screenings", AddScreening); + app.MapGet("movies/{id}/screenings", GetScreenings); + + + } + public static async Task AddCustomer(IRepository repo, CustomerPost customer) + { + Customer result = new Customer + { + Name = customer.name, + Email = customer.email, + Phone = customer.phone, + CreatedAt = DateTime.UtcNow, + UpdatedAt = DateTime.UtcNow + }; + await repo.AddCustomer(result); + + return TypedResults.Ok(result); + } + public static async Task GetCustomers(IRepository repo) + { + var customers = await repo.GetCustomers(); + + return TypedResults.Ok(customers); + } + public static async Task UpdateCustomer(IRepository repo, CustomerPost customer, int id) + { + var customerReturned = await repo.GetCustomer(id); + if (customerReturned == null) + { + return TypedResults.NotFound(); + } + if (customer.name != null) customerReturned.Name = customer.name; + if (customer.email != null) customerReturned.Email = customer.email; + if (customer.phone != null) customerReturned.Phone = customer.phone; + + var updated = await repo.UpdateCustomer(customerReturned, id); + + return TypedResults.Ok(updated); + } + public static async Task DeleteCustomer(IRepository repo, int id) + { + var deleted = await repo.DeleteCustomer(id); + return TypedResults.Ok(deleted); + } + + public static async Task AddMovie(IRepository repo, MoviePost movie) + { + Movie result = new Movie + { + Title = movie.Title, + Rating = movie.Rating, + Description = movie.Description, + RuntimeMins = movie.RuntimeMins, + CreatedAt = DateTime.UtcNow, + UpdatedAt = DateTime.UtcNow + }; + await repo.AddMovie(result); + + return TypedResults.Ok(result); + + } + public static async Task GetMovies(IRepository repo) + { + var movies = await repo.GetMovies(); + + var movieDTO = movies.Select(m => new MovieDTO + { + Title = m.Title, + Rating = m.Rating, + Description = m.Description, + RuntimeMins = m.RuntimeMins, + CreatedAt = m.CreatedAt, + UpdatedAt = m.UpdatedAt, + Screenings = m.Screenings.Select(s => new ScreeningDTO + { + ScreenNumber = s.ScreenNumber, + Capacity = s.Capacity, + StartsAt = s.StartsAt, + MovieId = s.MovieId, + CreatedAt = s.CreatedAt, + UpdatedAt = s.UpdatedAt + }).ToList() + }); + return TypedResults.Ok(movies); + } + public static async Task UpdateMovie(IRepository repo, MoviePost movie, int id) + { + var movieReturned = await repo.GetMovie(id); + if (movieReturned == null) + { + return TypedResults.NotFound(); + } + if (movie.Title != null) movieReturned.Title = movie.Title; + if (movie.Rating != null) movieReturned.Rating = movie.Rating; + if (movie.Description != null) movieReturned.Description = movie.Description; + if (movie.RuntimeMins != null) movieReturned.RuntimeMins = movie.RuntimeMins; + + var updated = await repo.UpdateMovie(movieReturned, id); + + MovieDTO movieDTO = new MovieDTO + { + Title = movieReturned.Title, + Rating = movieReturned.Rating, + Description = movieReturned.Description, + RuntimeMins = movieReturned.RuntimeMins, + CreatedAt = movieReturned.CreatedAt, + UpdatedAt = movieReturned.UpdatedAt, + Screenings = movieReturned.Screenings.Select(s => new ScreeningDTO + { + ScreenNumber = s.ScreenNumber, + Capacity = s.Capacity, + StartsAt = s.StartsAt, + MovieId = s.MovieId, + CreatedAt = s.CreatedAt, + UpdatedAt = s.UpdatedAt + }).ToList() + }; + return TypedResults.Ok(movieDTO); + } + public static async Task DeleteMovie(IRepository repo, int id) + { + var deleted = await repo.DeleteMovie(id); + return TypedResults.Ok(deleted); + } + + public static async Task AddScreening(IRepository repo, ScreeningPost screening, int id) + { + Screening result = new Screening + { + ScreenNumber = screening.ScreenNumber, + Capacity = screening.Capacity, + StartsAt = screening.StartsAt, + MovieId = screening.MovieId, + CreatedAt = DateTime.UtcNow, + UpdatedAt = DateTime.UtcNow + }; + await repo.AddScreening(result); + + return TypedResults.Ok(result); + + } + public static async Task GetScreenings(IRepository repo, int movieId) + { + var result = await repo.GetScreenings(movieId); + var screenings = result.Select(s => new ScreeningDTOBig + { + ScreenNumber = s.ScreenNumber, + Capacity = s.Capacity, + StartsAt = s.StartsAt, + MovieId = s.MovieId, + CreatedAt = DateTime.UtcNow, + UpdatedAt = DateTime.UtcNow, + Movie = new MovieSmall + { + Title = s.Movie.Title, + Rating = s.Movie.Rating, + Description = s.Movie.Description, + RuntimeMins = s.Movie.RuntimeMins, + CreatedAt = s.Movie.CreatedAt, + UpdatedAt = s.Movie.UpdatedAt + } + }); + + return TypedResults.Ok(screenings); + } + } +} diff --git a/api-cinema-challenge/api-cinema-challenge/Models/Customer.cs b/api-cinema-challenge/api-cinema-challenge/Models/Customer.cs new file mode 100644 index 00000000..b9767fb4 --- /dev/null +++ b/api-cinema-challenge/api-cinema-challenge/Models/Customer.cs @@ -0,0 +1,10 @@ +namespace api_cinema_challenge.Models +{ + public class Customer : Dateing + { + public int Id { get; set; } + public string Name { get; set; } + public string Email { get; set; } + public string Phone { get; set; } + } +} diff --git a/api-cinema-challenge/api-cinema-challenge/Models/Dateing.cs b/api-cinema-challenge/api-cinema-challenge/Models/Dateing.cs new file mode 100644 index 00000000..b952ec3b --- /dev/null +++ b/api-cinema-challenge/api-cinema-challenge/Models/Dateing.cs @@ -0,0 +1,8 @@ +namespace api_cinema_challenge.Models +{ + public abstract class Dateing + { + public DateTime CreatedAt { get; set; } + public DateTime UpdatedAt { get; set; } + } +} diff --git a/api-cinema-challenge/api-cinema-challenge/Models/Movie.cs b/api-cinema-challenge/api-cinema-challenge/Models/Movie.cs new file mode 100644 index 00000000..ee566e6a --- /dev/null +++ b/api-cinema-challenge/api-cinema-challenge/Models/Movie.cs @@ -0,0 +1,12 @@ +namespace api_cinema_challenge.Models +{ + public class Movie : Dateing + { + public int Id { get; set; } + public string Title { get; set; } + public string Rating { get; set; } + public string Description { get; set; } + public int RuntimeMins { get; set; } + public IEnumerable Screenings { get; set; } + } +} diff --git a/api-cinema-challenge/api-cinema-challenge/Models/Screening.cs b/api-cinema-challenge/api-cinema-challenge/Models/Screening.cs new file mode 100644 index 00000000..b3710ec4 --- /dev/null +++ b/api-cinema-challenge/api-cinema-challenge/Models/Screening.cs @@ -0,0 +1,13 @@ +namespace api_cinema_challenge.Models +{ + public class Screening : Dateing + { + public int Id { get; set; } + public int ScreenNumber { get; set; } + public int Capacity { get; set; } + + public DateTime StartsAt { get; set; } + public int MovieId { get; set; } + public Movie Movie { get; set; } + } +} diff --git a/api-cinema-challenge/api-cinema-challenge/Program.cs b/api-cinema-challenge/api-cinema-challenge/Program.cs index e55d9d54..9835c0c8 100644 --- a/api-cinema-challenge/api-cinema-challenge/Program.cs +++ b/api-cinema-challenge/api-cinema-challenge/Program.cs @@ -1,11 +1,15 @@ using api_cinema_challenge.Data; +using api_cinema_challenge.EndPoint; +using api_cinema_challenge.Repository; var builder = WebApplication.CreateBuilder(args); // Add services to the container. +builder.Services.AddControllers(); +builder.Services.AddDbContext(); +builder.Services.AddScoped(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); -builder.Services.AddDbContext(); var app = builder.Build(); @@ -17,4 +21,11 @@ } app.UseHttpsRedirection(); + +app.MapControllers(); + +app.ConfigureCinemaEndPoint(); + +app.SeedCinemaApi(); + app.Run(); diff --git a/api-cinema-challenge/api-cinema-challenge/Repository/IRepository.cs b/api-cinema-challenge/api-cinema-challenge/Repository/IRepository.cs new file mode 100644 index 00000000..63a3ae9c --- /dev/null +++ b/api-cinema-challenge/api-cinema-challenge/Repository/IRepository.cs @@ -0,0 +1,23 @@ +using api_cinema_challenge.DTO; +using api_cinema_challenge.Models; + +namespace api_cinema_challenge.Repository +{ + public interface IRepository + { + Task AddCustomer(Customer customer); + Task> GetCustomers(); + Task GetCustomer(int id); + Task UpdateCustomer(Customer customer, int id); + Task DeleteCustomer(int id); + + Task AddMovie(Movie movie); + Task> GetMovies(); + Task GetMovie(int id); + Task UpdateMovie(Movie movie, int id); + Task DeleteMovie(int id); + + Task AddScreening(Screening screening); + Task> GetScreenings(int movieId); + } +} diff --git a/api-cinema-challenge/api-cinema-challenge/Repository/Repository.cs b/api-cinema-challenge/api-cinema-challenge/Repository/Repository.cs new file mode 100644 index 00000000..62e44bbc --- /dev/null +++ b/api-cinema-challenge/api-cinema-challenge/Repository/Repository.cs @@ -0,0 +1,115 @@ +using api_cinema_challenge.Data; +using api_cinema_challenge.Models; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Query.Internal; + +namespace api_cinema_challenge.Repository +{ + public class Repository : IRepository + { + CinemaContext _db; + public Repository(CinemaContext db) + { + _db = db; + } + + public async Task AddCustomer(Customer customer) + { + await _db.Customers.AddAsync(customer); + await _db.SaveChangesAsync(); + return customer; + } + + public async Task AddMovie(Movie movie) + { + await _db.Movies.AddAsync(movie); + await _db.SaveChangesAsync(); + return movie; + } + + public async Task AddScreening(Screening screening) + { + var movie = await _db.Movies.FirstOrDefaultAsync(x => x.Id == screening.MovieId); + if (movie == null) + { + return null; + } + screening.Movie = movie; + await _db.Screenings.AddAsync(screening); + await _db.SaveChangesAsync(); + return screening; + } + + public async Task DeleteCustomer(int id) + { + var result = await _db.Customers.FindAsync(id); + _db.Customers.Remove(result); + await _db.SaveChangesAsync(); + return result; + } + + public async Task DeleteMovie(int id) + { + var result = await _db.Movies.FindAsync(id); + _db.Movies.Remove(result); + await _db.SaveChangesAsync(); + return result; + } + + public async Task> GetCustomers() + { + return await _db.Customers.ToListAsync(); + } + public async Task GetCustomer(int id) + { + return await _db.Customers.FirstOrDefaultAsync(b => b.Id == id); + } + + public async Task> GetMovies() + { + return await _db.Movies.Include(x => x.Screenings).ToListAsync(); + } + public async Task GetMovie(int id) + { + return await _db.Movies.Include(b => b.Screenings).FirstOrDefaultAsync(b => b.Id == id); + } + + public async Task> GetScreenings(int id) + { + return await _db.Screenings.Include(x => x.Movie).Where(x => x.MovieId == id).ToListAsync(); + } + + public async Task UpdateCustomer(Customer customer, int id) + { + var result = await _db.Customers.FindAsync(id); + if (result == null) + { + return null; + } + customer.Name = result.Name; + customer.Email = result.Email; + customer.Phone = result.Phone; + customer.UpdatedAt = DateTime.UtcNow; + + await _db.SaveChangesAsync(); + return customer; + } + + public async Task UpdateMovie(Movie movie, int id) + { + var result = await _db.Movies.FindAsync(id); + if (result == null) + { + return null; + } + movie.Title = result.Title; + movie.Rating = result.Rating; + movie.Description = result.Description; + movie.RuntimeMins = result.RuntimeMins; + movie.UpdatedAt = DateTime.UtcNow; + + await _db.SaveChangesAsync(); + return movie; + } + } +} diff --git a/api-cinema-challenge/api-cinema-challenge/api-cinema-challenge.csproj b/api-cinema-challenge/api-cinema-challenge/api-cinema-challenge.csproj index 8c888bf8..89f468ed 100644 --- a/api-cinema-challenge/api-cinema-challenge/api-cinema-challenge.csproj +++ b/api-cinema-challenge/api-cinema-challenge/api-cinema-challenge.csproj @@ -1,4 +1,4 @@ - + net9.0 @@ -27,8 +27,4 @@ - - - -