From 9ae557538aa83bc292453bc21368a34b89b4a13c Mon Sep 17 00:00:00 2001 From: giarreh Date: Mon, 27 Jan 2025 11:27:53 +0100 Subject: [PATCH 1/4] Added all endpoints --- .gitignore | 1 + exercise.pizzashopapi/DTO/CustomerDTO.cs | 8 + exercise.pizzashopapi/DTO/OrderDTO.cs | 9 + exercise.pizzashopapi/DTO/PizzaDTO.cs | 8 + exercise.pizzashopapi/Data/Seeder.cs | 9 +- .../EndPoints/PizzaShopApi.cs | 153 ++++++++++++++++- exercise.pizzashopapi/Models/Customer.cs | 6 +- exercise.pizzashopapi/Models/Order.cs | 15 +- exercise.pizzashopapi/Models/Pizza.cs | 12 +- .../Repository/IRepository.cs | 20 ++- .../Repository/Repository.cs | 159 +++++++++++++++++- .../exercise.pizzashopapi.csproj | 4 + 12 files changed, 388 insertions(+), 16 deletions(-) create mode 100644 exercise.pizzashopapi/DTO/CustomerDTO.cs create mode 100644 exercise.pizzashopapi/DTO/OrderDTO.cs create mode 100644 exercise.pizzashopapi/DTO/PizzaDTO.cs diff --git a/.gitignore b/.gitignore index a62e968..7e6cc08 100644 --- a/.gitignore +++ b/.gitignore @@ -482,3 +482,4 @@ $RECYCLE.BIN/ */**/obj/Release /exercise.pizzashopapi/appsettings.json /exercise.pizzashopapi/appsettings.Development.json +*/migrations/** \ No newline at end of file diff --git a/exercise.pizzashopapi/DTO/CustomerDTO.cs b/exercise.pizzashopapi/DTO/CustomerDTO.cs new file mode 100644 index 0000000..5fc3f3a --- /dev/null +++ b/exercise.pizzashopapi/DTO/CustomerDTO.cs @@ -0,0 +1,8 @@ +namespace exercise.pizzashopapi.DTO +{ + public class CustomerDTO + { + public string Name { get; set; } + + } +} diff --git a/exercise.pizzashopapi/DTO/OrderDTO.cs b/exercise.pizzashopapi/DTO/OrderDTO.cs new file mode 100644 index 0000000..ea88da5 --- /dev/null +++ b/exercise.pizzashopapi/DTO/OrderDTO.cs @@ -0,0 +1,9 @@ +namespace exercise.pizzashopapi.DTO +{ + public class OrderDTO + { + + public int CustomerId { get; set; } + public int PizzaId { get; set; } + } +} diff --git a/exercise.pizzashopapi/DTO/PizzaDTO.cs b/exercise.pizzashopapi/DTO/PizzaDTO.cs new file mode 100644 index 0000000..a2f13ee --- /dev/null +++ b/exercise.pizzashopapi/DTO/PizzaDTO.cs @@ -0,0 +1,8 @@ +namespace exercise.pizzashopapi.DTO +{ + public class PizzaDTO + { + public string Name { get; set; } + public decimal Price { get; set; } + } +} diff --git a/exercise.pizzashopapi/Data/Seeder.cs b/exercise.pizzashopapi/Data/Seeder.cs index f87fbef..eecbc18 100644 --- a/exercise.pizzashopapi/Data/Seeder.cs +++ b/exercise.pizzashopapi/Data/Seeder.cs @@ -16,16 +16,17 @@ public async static void SeedPizzaShopApi(this WebApplication app) } if(!db.Pizzas.Any()) { - db.Add(new Pizza() { Name = "Cheese & Pineapple" }); - db.Add(new Pizza() { Name = "Vegan Cheese Tastic" }); + db.Add(new Pizza() { Name = "Cheese & Pineapple", Price = 20 }); + db.Add(new Pizza() { Name = "Vegan Cheese Tastic", Price = 15 }); await db.SaveChangesAsync(); } //order data - if(1==1) + if (!db.Orders.Any()) { - + db.Add(new Order() { CustomerId = 1, PizzaId = 1, Date = DateTime.Now }); + db.Add(new Order() { CustomerId = 2, PizzaId = 2, Date = DateTime.Now }); await db.SaveChangesAsync(); } } diff --git a/exercise.pizzashopapi/EndPoints/PizzaShopApi.cs b/exercise.pizzashopapi/EndPoints/PizzaShopApi.cs index f8be2b0..26d0c41 100644 --- a/exercise.pizzashopapi/EndPoints/PizzaShopApi.cs +++ b/exercise.pizzashopapi/EndPoints/PizzaShopApi.cs @@ -1,5 +1,8 @@ -using exercise.pizzashopapi.Repository; +using exercise.pizzashopapi.DTO; +using exercise.pizzashopapi.Models; +using exercise.pizzashopapi.Repository; using Microsoft.AspNetCore.Mvc; +using System.Numerics; namespace exercise.pizzashopapi.EndPoints { @@ -7,9 +10,153 @@ public static class PizzaShopApi { public static void ConfigurePizzaShopApi(this WebApplication app) { - + app.MapGet("/pizza", GetAllPizzas); + app.MapGet("/pizza/{id}", GetPizzaById); + app.MapPost("/pizza", AddPizza); + app.MapPut("/pizza/{id}", UpdatePizza); + app.MapDelete("/pizza/{id}", DeletePizza); + + app.MapGet("/customers", GetAllCustomers); + app.MapGet("/customers/{id}", GetCustomerById); + app.MapPost("/customers", AddCustomer); + app.MapPut("/customers/{id}", UpdateCustomer); + app.MapDelete("/customers/{id}", DeleteCustomer); + + app.MapGet("/orders", GetAllOrders); + app.MapGet("/orders/{id}", GetOrderById); + app.MapGet("/orders/customer/{id}", GetOrderByCustomerId); + app.MapPost("/orders", AddOrder); + app.MapPut("/orders/{id}", UpdateOrder); + app.MapDelete("/orders/{id}", DeleteOrder); + + } + + private static async TaskDeleteOrder(IRepository repository, int id) + { + return Results.Ok(await repository.DeleteOrder(id)); + } + + private static async TaskUpdateOrder(IRepository repository, int id, OrderDTO orderDTO) + { + Order order = await repository.GetOrder(id); + order.PizzaId = orderDTO.PizzaId; + order.CustomerId = orderDTO.CustomerId; + order.Date = DateTime.Now; + + await repository.UpdateOrder(id, order); + return Results.Ok(order); + } + + private static async Task AddOrder(IRepository repository, OrderDTO order) + { + Order order1 = new Order + { + CustomerId = order.CustomerId, + PizzaId = order.PizzaId, + Date = DateTime.Now + }; + await repository.AddOrder(order1); + return Results.Created($"/pizza/{order1.Id}", order1); + } + + private static async TaskGetOrderByCustomerId(IRepository repository, int id) + { + IEnumerable orders = await repository.GetOrdersByCustomer(id); + return Results.Ok(orders); + } + + private static async Task GetOrderById(IRepository repository, int id) + { + Order order = await repository.GetOrder(id); + return Results.Ok(order); + } + + private static async TaskGetAllOrders(IRepository repository) + { + IEnumerable orders = await repository.GetOrders(); + return Results.Ok(orders); + } + + private static async TaskDeleteCustomer(IRepository repository, int id) + { + return Results.Ok(await repository.DeleteCustomer(id)); + } + + private static async TaskUpdateCustomer(IRepository repository, int id, CustomerDTO customer) + { + Customer customer1 = await repository.GetCustomer(id); + + customer1.Name = customer.Name; + await repository.UpdateCustomer(id, customer1); + return Results.Ok(customer1); + } + + private static async Task AddCustomer(IRepository repository, CustomerDTO customer) + { + Customer customer1 = new Customer + { + Name = customer.Name, + }; + await repository.AddCustomer(customer1); + return Results.Created($"/pizza/{customer1.Id}", customer1); + } + + private static async TaskGetCustomerById(IRepository repository, int id) + { + Customer customer = await repository.GetCustomer(id); + return Results.Ok(customer); + } + + private static async Task GetAllCustomers(IRepository repository) + { + IEnumerable customers = await repository.GetCustomers(); + return Results.Ok(customers); + } + + + [ProducesResponseType(StatusCodes.Status200OK)] + private static async TaskUpdatePizza(IRepository repository, int id, PizzaDTO pizzaDTO) + { + Pizza pizza = await repository.GetPizza(id); + + pizza.Name = pizzaDTO.Name; + pizza.Price = pizzaDTO.Price; + await repository.UpdatePizza(id, pizza); + + + return Results.Ok(pizza); + } + + private static async TaskDeletePizza(IRepository repository, int id) + { + return Results.Ok(await repository.DeletePizza(id)); + } + + [ProducesResponseType(StatusCodes.Status201Created)] + private static async Task AddPizza(IRepository repository, PizzaDTO pizzaDTO) + { + Pizza pizza1 = new Pizza + { + Name = pizzaDTO.Name, + Price = pizzaDTO.Price + }; + await repository.AddPizza(pizza1); + return Results.Created($"/pizza/{pizza1.Id}", pizza1); + } + + [ProducesResponseType(StatusCodes.Status200OK)] + private static async Task GetPizzaById(IRepository repository, int id) + { + Pizza pizza = await repository.GetPizza(id); + return Results.Ok(pizza); + } + + [ProducesResponseType(StatusCodes.Status200OK)] + public static async Task GetAllPizzas(IRepository repository) + { + IEnumerable pizzas = await repository.GetPizzas(); + return Results.Ok(pizzas); } - } } diff --git a/exercise.pizzashopapi/Models/Customer.cs b/exercise.pizzashopapi/Models/Customer.cs index 2ca83bd..256c342 100644 --- a/exercise.pizzashopapi/Models/Customer.cs +++ b/exercise.pizzashopapi/Models/Customer.cs @@ -1,10 +1,14 @@ -using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; namespace exercise.pizzashopapi.Models { + [Table("Customers")] public class Customer { + [Key] public int Id { get; set; } + [Column("Name")] public string Name { get; set; } } } diff --git a/exercise.pizzashopapi/Models/Order.cs b/exercise.pizzashopapi/Models/Order.cs index fbe6113..5263e02 100644 --- a/exercise.pizzashopapi/Models/Order.cs +++ b/exercise.pizzashopapi/Models/Order.cs @@ -1,10 +1,21 @@ -using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; namespace exercise.pizzashopapi.Models { + [Table("Orders")] public class Order { - + [Key] + public int Id { get; set; } + [ForeignKey("Customers")] + public int CustomerId { get; set; } + [ForeignKey("Pizzas")] + public int PizzaId { get; set; } + + [Column(TypeName = "date")] + public DateTime Date { get; set; } + } } diff --git a/exercise.pizzashopapi/Models/Pizza.cs b/exercise.pizzashopapi/Models/Pizza.cs index 5c085ec..92532d5 100644 --- a/exercise.pizzashopapi/Models/Pizza.cs +++ b/exercise.pizzashopapi/Models/Pizza.cs @@ -1,12 +1,18 @@ -using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; namespace exercise.pizzashopapi.Models { - + [Table("Pizzas")] public class Pizza - { + { + [Key] public int Id { get; set; } + [Required] + [Column("Pizza")] public string Name { get; set; } + [Required] + [Column("Price")] public decimal Price { get; set; } } } \ No newline at end of file diff --git a/exercise.pizzashopapi/Repository/IRepository.cs b/exercise.pizzashopapi/Repository/IRepository.cs index b114ea8..6a61820 100644 --- a/exercise.pizzashopapi/Repository/IRepository.cs +++ b/exercise.pizzashopapi/Repository/IRepository.cs @@ -4,8 +4,26 @@ namespace exercise.pizzashopapi.Repository { public interface IRepository { + Task> GetPizzas(); + Task GetPizza(int id); + Task AddPizza(Pizza pizza); + + Task UpdatePizza(int id, Pizza pizza); + Task DeletePizza(int id); + + Task> GetCustomers(); + Task GetCustomer(int id); + Task AddCustomer(Customer customer); + Task UpdateCustomer(int id, Customer customer); + Task DeleteCustomer(int id); + + Task> GetOrders(); + Task AddOrder(Order order); Task> GetOrdersByCustomer(int id); - + Task GetOrder(int id); + Task UpdateOrder(int id, Order order); + Task DeleteOrder(int id); } } + diff --git a/exercise.pizzashopapi/Repository/Repository.cs b/exercise.pizzashopapi/Repository/Repository.cs index e109fce..d25f256 100644 --- a/exercise.pizzashopapi/Repository/Repository.cs +++ b/exercise.pizzashopapi/Repository/Repository.cs @@ -1,14 +1,169 @@ using exercise.pizzashopapi.Data; using exercise.pizzashopapi.Models; +using Microsoft.EntityFrameworkCore; namespace exercise.pizzashopapi.Repository { public class Repository : IRepository { private DataContext _db; - public Task> GetOrdersByCustomer(int id) + + public Repository(DataContext db) + { + _db = db; + } + + public async Task> GetPizzas() + { + return await _db.Pizzas.ToListAsync(); + } + + public async Task> GetCustomers() + { + return await _db.Customers.ToListAsync(); + } + + public async Task> GetOrders() + { + return await _db.Orders.ToListAsync(); + } + public async Task GetCustomer(int id) + { + return await _db.Customers.FirstOrDefaultAsync(c => c.Id == id); + } + + public async Task GetOrder(int id) + { + return await _db.Orders.FirstOrDefaultAsync(o => o.Id == id); + } + public async Task GetPizza(int id) + { + return await _db.Pizzas.FirstOrDefaultAsync(p => p.Id == id); + } + + public async Task> GetOrdersByCustomer(int id) + { + return await _db.Orders.Where(o => o.CustomerId == id).ToListAsync(); + } + + public async Task UpdatePizza(int id, Pizza pizza) + { + var pizzaToEdit = await _db.Pizzas.FindAsync(id); + + if (pizzaToEdit == null) + { + return null; // Or handle not found appropriately (e.g., throw an exception) + } + + // Update properties + pizzaToEdit.Name = pizza.Name; + pizzaToEdit.Price = pizza.Price; + + _db.Pizzas.Update(pizzaToEdit); + await _db.SaveChangesAsync(); + + return pizzaToEdit; + } + + public async Task UpdateCustomer(int id, Customer customer) + { + var customerToEdit = await _db.Customers.FindAsync(id); + + if (customer == null) + { + return null; // Or handle not found appropriately (e.g., throw an exception) + } + + // Update properties + customerToEdit.Name = customer.Name; + + _db.Customers.Update(customerToEdit); + await _db.SaveChangesAsync(); + + return customerToEdit; + } + + public async Task UpdateOrder(int id, Order order) + { + Order orderToEdit = await _db.Orders.FindAsync(id); + if(orderToEdit == null) + { + return null; + }; + orderToEdit.CustomerId = order.CustomerId; + orderToEdit.PizzaId = order.PizzaId; + orderToEdit.Date = order.Date; + + _db.Orders.Update(orderToEdit); + await _db.SaveChangesAsync(); + + return orderToEdit; + } + + public async Task DeleteCustomer(int id) + { + var customerToDelete = await _db.Customers.FindAsync(id); + + if (customerToDelete == null) + { + return null; // Or handle appropriately (e.g., throw an exception) + } + + _db.Customers.Remove(customerToDelete); + await _db.SaveChangesAsync(); + + return customerToDelete; + } + + public async Task DeleteOrder(int id) + { + var orderToDelete = await _db.Orders.FindAsync(id); + + if (orderToDelete == null) + { + return null; // Or handle appropriately (e.g., throw an exception) + } + + _db.Orders.Remove(orderToDelete); + await _db.SaveChangesAsync(); + + return orderToDelete; + } + + public async Task DeletePizza(int id) + { + var pizzaToDelete = await _db.Pizzas.FindAsync(id); + + if (pizzaToDelete == null) + { + return null; // Or handle appropriately (e.g., throw an exception) + } + + _db.Pizzas.Remove(pizzaToDelete); + await _db.SaveChangesAsync(); + + return pizzaToDelete; + } + + public async Task AddPizza(Pizza pizza) + { + await _db.Pizzas.AddAsync(pizza); + await _db.SaveChangesAsync(); + return pizza; + } + + public async Task AddCustomer(Customer customer) + { + await _db.Customers.AddAsync(customer); + await _db.SaveChangesAsync(); + return customer; + } + + public async Task AddOrder(Order order) { - throw new NotImplementedException(); + await _db.Orders.AddAsync(order); + await _db.SaveChangesAsync(); + return order; } } } diff --git a/exercise.pizzashopapi/exercise.pizzashopapi.csproj b/exercise.pizzashopapi/exercise.pizzashopapi.csproj index 624203b..b1311af 100644 --- a/exercise.pizzashopapi/exercise.pizzashopapi.csproj +++ b/exercise.pizzashopapi/exercise.pizzashopapi.csproj @@ -25,4 +25,8 @@ + + + + From 6414505500b79c9d91a0307cbc9b7a6726184a12 Mon Sep 17 00:00:00 2001 From: giarreh Date: Mon, 27 Jan 2025 11:30:42 +0100 Subject: [PATCH 2/4] Core Finished --- exercise.pizzashopapi/Data/Seeder.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/exercise.pizzashopapi/Data/Seeder.cs b/exercise.pizzashopapi/Data/Seeder.cs index eecbc18..d001cbb 100644 --- a/exercise.pizzashopapi/Data/Seeder.cs +++ b/exercise.pizzashopapi/Data/Seeder.cs @@ -12,12 +12,16 @@ public async static void SeedPizzaShopApi(this WebApplication app) { db.Add(new Customer() { Name="Nigel" }); db.Add(new Customer() { Name = "Dave" }); + db.Add(new Customer() { Name = "Giar" }); + await db.SaveChangesAsync(); } if(!db.Pizzas.Any()) { db.Add(new Pizza() { Name = "Cheese & Pineapple", Price = 20 }); db.Add(new Pizza() { Name = "Vegan Cheese Tastic", Price = 15 }); + db.Add(new Pizza() { Name = "Cheese & Chicken", Price = 15 }); + await db.SaveChangesAsync(); } @@ -27,6 +31,7 @@ public async static void SeedPizzaShopApi(this WebApplication app) { db.Add(new Order() { CustomerId = 1, PizzaId = 1, Date = DateTime.Now }); db.Add(new Order() { CustomerId = 2, PizzaId = 2, Date = DateTime.Now }); + db.Add(new Order() { CustomerId = 3, PizzaId = 3, Date = DateTime.Now }); await db.SaveChangesAsync(); } } From 4ded61b4bdf2dc3d07fba8fba5047addaafd087e Mon Sep 17 00:00:00 2001 From: giarreh Date: Mon, 27 Jan 2025 11:58:01 +0100 Subject: [PATCH 3/4] Extension 1: Toppings --- exercise.pizzashopapi/DTO/PizzaDTO.cs | 2 -- exercise.pizzashopapi/DTO/PizzaDTONoTopping.cs | 8 ++++++++ exercise.pizzashopapi/DTO/PizzaToppingDTO.cs | 8 ++++++++ exercise.pizzashopapi/Data/DataContext.cs | 1 + exercise.pizzashopapi/Data/Seeder.cs | 7 +++++++ .../EndPoints/PizzaShopApi.cs | 17 +++++++++++++++-- exercise.pizzashopapi/Models/Pizza.cs | 2 ++ exercise.pizzashopapi/Models/PizzaTopping.cs | 10 ++++++++++ .../Repository/IRepository.cs | 1 + exercise.pizzashopapi/Repository/Repository.cs | 18 ++++++++++++++++++ 10 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 exercise.pizzashopapi/DTO/PizzaDTONoTopping.cs create mode 100644 exercise.pizzashopapi/DTO/PizzaToppingDTO.cs create mode 100644 exercise.pizzashopapi/Models/PizzaTopping.cs diff --git a/exercise.pizzashopapi/DTO/PizzaDTO.cs b/exercise.pizzashopapi/DTO/PizzaDTO.cs index a2f13ee..befa124 100644 --- a/exercise.pizzashopapi/DTO/PizzaDTO.cs +++ b/exercise.pizzashopapi/DTO/PizzaDTO.cs @@ -2,7 +2,5 @@ { public class PizzaDTO { - public string Name { get; set; } - public decimal Price { get; set; } } } diff --git a/exercise.pizzashopapi/DTO/PizzaDTONoTopping.cs b/exercise.pizzashopapi/DTO/PizzaDTONoTopping.cs new file mode 100644 index 0000000..c12698c --- /dev/null +++ b/exercise.pizzashopapi/DTO/PizzaDTONoTopping.cs @@ -0,0 +1,8 @@ +namespace exercise.pizzashopapi.DTO +{ + public class PizzaDTONoTopping + { + public string Name { get; set; } + public decimal Price { get; set; } + } +} diff --git a/exercise.pizzashopapi/DTO/PizzaToppingDTO.cs b/exercise.pizzashopapi/DTO/PizzaToppingDTO.cs new file mode 100644 index 0000000..0cbc226 --- /dev/null +++ b/exercise.pizzashopapi/DTO/PizzaToppingDTO.cs @@ -0,0 +1,8 @@ +namespace exercise.pizzashopapi.DTO +{ + public class PizzaToppingDTO + { + public string Name { get; set; } + public decimal Price { get; set; } + } +} diff --git a/exercise.pizzashopapi/Data/DataContext.cs b/exercise.pizzashopapi/Data/DataContext.cs index 129199e..1214daa 100644 --- a/exercise.pizzashopapi/Data/DataContext.cs +++ b/exercise.pizzashopapi/Data/DataContext.cs @@ -24,5 +24,6 @@ protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) public DbSet Pizzas { get; set; } public DbSet Customers { get; set; } public DbSet Orders { get; set; } + public DbSet Toppings { get; set; } } } diff --git a/exercise.pizzashopapi/Data/Seeder.cs b/exercise.pizzashopapi/Data/Seeder.cs index d001cbb..93cdd91 100644 --- a/exercise.pizzashopapi/Data/Seeder.cs +++ b/exercise.pizzashopapi/Data/Seeder.cs @@ -34,6 +34,13 @@ public async static void SeedPizzaShopApi(this WebApplication app) db.Add(new Order() { CustomerId = 3, PizzaId = 3, Date = DateTime.Now }); await db.SaveChangesAsync(); } + //topping data + if (!db.Toppings.Any()) + { + db.Add(new PizzaTopping() { Name = "Pepperoni", Price = 2 }); + db.Add(new PizzaTopping() { Name = "Bacon", Price = 4 }); + await db.SaveChangesAsync(); + } } } } diff --git a/exercise.pizzashopapi/EndPoints/PizzaShopApi.cs b/exercise.pizzashopapi/EndPoints/PizzaShopApi.cs index 26d0c41..0e36c9b 100644 --- a/exercise.pizzashopapi/EndPoints/PizzaShopApi.cs +++ b/exercise.pizzashopapi/EndPoints/PizzaShopApi.cs @@ -13,6 +13,7 @@ public static void ConfigurePizzaShopApi(this WebApplication app) app.MapGet("/pizza", GetAllPizzas); app.MapGet("/pizza/{id}", GetPizzaById); app.MapPost("/pizza", AddPizza); + app.MapPost("/pizza/{id}", AddToppingToPizza); app.MapPut("/pizza/{id}", UpdatePizza); app.MapDelete("/pizza/{id}", DeletePizza); @@ -29,6 +30,18 @@ public static void ConfigurePizzaShopApi(this WebApplication app) app.MapPut("/orders/{id}", UpdateOrder); app.MapDelete("/orders/{id}", DeleteOrder); + //app.MapGet("/toppings", GetAllToppings); + //app.MapGet("/toppings/{id}", GetToppingById); + //app.MapPost("/toppings", AddTopping); + + + } + + private static async Task AddToppingToPizza(IRepository repository, int pizzaId, int toppingId) + { + + Pizza pizza = await repository.AddToppingToPizza(pizzaId, toppingId); + return Results.Ok(pizza); } private static async TaskDeleteOrder(IRepository repository, int id) @@ -115,7 +128,7 @@ private static async Task GetAllCustomers(IRepository repository) [ProducesResponseType(StatusCodes.Status200OK)] - private static async TaskUpdatePizza(IRepository repository, int id, PizzaDTO pizzaDTO) + private static async TaskUpdatePizza(IRepository repository, int id, PizzaDTONoTopping pizzaDTO) { Pizza pizza = await repository.GetPizza(id); @@ -133,7 +146,7 @@ private static async TaskDeletePizza(IRepository repository, int id) } [ProducesResponseType(StatusCodes.Status201Created)] - private static async Task AddPizza(IRepository repository, PizzaDTO pizzaDTO) + private static async Task AddPizza(IRepository repository, PizzaDTONoTopping pizzaDTO) { Pizza pizza1 = new Pizza { diff --git a/exercise.pizzashopapi/Models/Pizza.cs b/exercise.pizzashopapi/Models/Pizza.cs index 92532d5..664a113 100644 --- a/exercise.pizzashopapi/Models/Pizza.cs +++ b/exercise.pizzashopapi/Models/Pizza.cs @@ -14,5 +14,7 @@ public class Pizza [Required] [Column("Price")] public decimal Price { get; set; } + [Column("Toppings")] + public List Toppings { get; set; } } } \ No newline at end of file diff --git a/exercise.pizzashopapi/Models/PizzaTopping.cs b/exercise.pizzashopapi/Models/PizzaTopping.cs new file mode 100644 index 0000000..fa00241 --- /dev/null +++ b/exercise.pizzashopapi/Models/PizzaTopping.cs @@ -0,0 +1,10 @@ +namespace exercise.pizzashopapi.Models +{ + public class PizzaTopping + { + public int Id { get; set; } + public string Name { get; set; } + public decimal Price { get; set; } + + } +} diff --git a/exercise.pizzashopapi/Repository/IRepository.cs b/exercise.pizzashopapi/Repository/IRepository.cs index 6a61820..46a9f31 100644 --- a/exercise.pizzashopapi/Repository/IRepository.cs +++ b/exercise.pizzashopapi/Repository/IRepository.cs @@ -7,6 +7,7 @@ public interface IRepository Task> GetPizzas(); Task GetPizza(int id); Task AddPizza(Pizza pizza); + Task AddToppingToPizza(int pizzaId, int toppingId); Task UpdatePizza(int id, Pizza pizza); Task DeletePizza(int id); diff --git a/exercise.pizzashopapi/Repository/Repository.cs b/exercise.pizzashopapi/Repository/Repository.cs index d25f256..f91c06e 100644 --- a/exercise.pizzashopapi/Repository/Repository.cs +++ b/exercise.pizzashopapi/Repository/Repository.cs @@ -165,5 +165,23 @@ public async Task AddOrder(Order order) await _db.SaveChangesAsync(); return order; } + + public async Task AddTopping(PizzaTopping topping) + { + await _db.Toppings.AddAsync(topping); + await _db.SaveChangesAsync(); + return topping; + } + + public async Task AddToppingToPizza(int pizzaId, int toppingId) + { + Pizza pizza = await _db.Pizzas.Include(p => p.Toppings).FirstOrDefaultAsync(p => p.Id == pizzaId); + PizzaTopping pizzaTopping = await _db.Toppings.FirstOrDefaultAsync(t => t.Id == toppingId); + + pizza.Toppings.Add(pizzaTopping); + await _db.SaveChangesAsync(); + return pizza; + + } } } From 900bd8af7369160a3de773c1f34d5809bcb44576 Mon Sep 17 00:00:00 2001 From: giarreh Date: Mon, 27 Jan 2025 12:27:00 +0100 Subject: [PATCH 4/4] Extension 4: Delivery Driver --- exercise.pizzashopapi/DTO/DriverDTO.cs | 7 ++++ exercise.pizzashopapi/DTO/OrderDTODriver.cs | 10 ++++++ exercise.pizzashopapi/Data/DataContext.cs | 1 + exercise.pizzashopapi/Data/Seeder.cs | 8 +++++ .../EndPoints/PizzaShopApi.cs | 35 ++++++++++++++++++- exercise.pizzashopapi/Models/Driver.cs | 18 ++++++++++ exercise.pizzashopapi/Models/Order.cs | 6 +++- .../Repository/IRepository.cs | 6 ++++ .../Repository/Repository.cs | 27 ++++++++++++++ 9 files changed, 116 insertions(+), 2 deletions(-) create mode 100644 exercise.pizzashopapi/DTO/DriverDTO.cs create mode 100644 exercise.pizzashopapi/DTO/OrderDTODriver.cs create mode 100644 exercise.pizzashopapi/Models/Driver.cs diff --git a/exercise.pizzashopapi/DTO/DriverDTO.cs b/exercise.pizzashopapi/DTO/DriverDTO.cs new file mode 100644 index 0000000..cb97935 --- /dev/null +++ b/exercise.pizzashopapi/DTO/DriverDTO.cs @@ -0,0 +1,7 @@ +namespace exercise.pizzashopapi.DTO +{ + public class DriverDTO + { + public string Name { get; set; } + } +} diff --git a/exercise.pizzashopapi/DTO/OrderDTODriver.cs b/exercise.pizzashopapi/DTO/OrderDTODriver.cs new file mode 100644 index 0000000..611ac1b --- /dev/null +++ b/exercise.pizzashopapi/DTO/OrderDTODriver.cs @@ -0,0 +1,10 @@ +namespace exercise.pizzashopapi.DTO +{ + public class OrderDTODriver + { + public int Id { get; set; } + public int CustomerId { get; set; } + public int PizzaId { get; set; } + public DateTime Date = DateTime.Now; + } +} diff --git a/exercise.pizzashopapi/Data/DataContext.cs b/exercise.pizzashopapi/Data/DataContext.cs index 1214daa..f3b6b27 100644 --- a/exercise.pizzashopapi/Data/DataContext.cs +++ b/exercise.pizzashopapi/Data/DataContext.cs @@ -25,5 +25,6 @@ protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) public DbSet Customers { get; set; } public DbSet Orders { get; set; } public DbSet Toppings { get; set; } + public DbSet Drivers { get; set; } } } diff --git a/exercise.pizzashopapi/Data/Seeder.cs b/exercise.pizzashopapi/Data/Seeder.cs index 93cdd91..c1ec66e 100644 --- a/exercise.pizzashopapi/Data/Seeder.cs +++ b/exercise.pizzashopapi/Data/Seeder.cs @@ -41,6 +41,14 @@ public async static void SeedPizzaShopApi(this WebApplication app) db.Add(new PizzaTopping() { Name = "Bacon", Price = 4 }); await db.SaveChangesAsync(); } + //driver data + if (!db.Drivers.Any()) + { + db.Add(new Driver() { Name = "Tim" }); + db.Add(new Driver() { Name = "Henrik" }); + + await db.SaveChangesAsync(); + } } } } diff --git a/exercise.pizzashopapi/EndPoints/PizzaShopApi.cs b/exercise.pizzashopapi/EndPoints/PizzaShopApi.cs index 0e36c9b..e02c65b 100644 --- a/exercise.pizzashopapi/EndPoints/PizzaShopApi.cs +++ b/exercise.pizzashopapi/EndPoints/PizzaShopApi.cs @@ -34,9 +34,13 @@ public static void ConfigurePizzaShopApi(this WebApplication app) //app.MapGet("/toppings/{id}", GetToppingById); //app.MapPost("/toppings", AddTopping); - + app.MapPut("/orders/{orderId}/driver/{driverId}", AddDriverToOrder); + app.MapPost("/drivers", AddDriver); + app.MapGet("/drivers", GetAllDrivers); + app.MapGet("/drivers/{id}/orders", GetAllOrdersForDriverID); } + private static async Task AddToppingToPizza(IRepository repository, int pizzaId, int toppingId) { @@ -44,6 +48,35 @@ private static async Task AddToppingToPizza(IRepository repository, int return Results.Ok(pizza); } + private static async Task AddDriverToOrder(IRepository repository, int orderId, int driverId) + { + Order order = await repository.AddDriverToOrder(orderId, driverId); + return Results.Ok(order); + } + + private static async Task AddDriver(IRepository repository, DriverDTO driver) + { + Driver driver1 = new Driver + { + Name = driver.Name + }; + await repository.AddDriver(driver1); + + return Results.Created($"/pizza/{driver1.Id}", driver1); + } + + private static async Task GetAllDrivers(IRepository repository) + { + IEnumerable drivers = await repository.GetAllDrivers(); + return Results.Ok(drivers); + } + + private static async Task GetAllOrdersForDriverID(IRepository repository, int driverId) + { + IEnumerable orders = await repository.GetAllOrdersForDriverID(driverId); + return Results.Ok(orders); + } + private static async TaskDeleteOrder(IRepository repository, int id) { return Results.Ok(await repository.DeleteOrder(id)); diff --git a/exercise.pizzashopapi/Models/Driver.cs b/exercise.pizzashopapi/Models/Driver.cs new file mode 100644 index 0000000..3c4a70b --- /dev/null +++ b/exercise.pizzashopapi/Models/Driver.cs @@ -0,0 +1,18 @@ +using exercise.pizzashopapi.DTO; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace exercise.pizzashopapi.Models +{ + [Table("DeliveryDrivers")] + public class Driver + { + [Key] + public int Id { get; set; } + [Column("Name")] + public string Name { get; set; } + [Column("Orders")] + public List orders { get; set; } + + } +} diff --git a/exercise.pizzashopapi/Models/Order.cs b/exercise.pizzashopapi/Models/Order.cs index 5263e02..deee74a 100644 --- a/exercise.pizzashopapi/Models/Order.cs +++ b/exercise.pizzashopapi/Models/Order.cs @@ -13,9 +13,13 @@ public class Order [ForeignKey("Pizzas")] public int PizzaId { get; set; } + [Column("Driver")] + public int DriverId { get; set; } + [Column(TypeName = "date")] public DateTime Date { get; set; } - + + } } diff --git a/exercise.pizzashopapi/Repository/IRepository.cs b/exercise.pizzashopapi/Repository/IRepository.cs index 46a9f31..dda151d 100644 --- a/exercise.pizzashopapi/Repository/IRepository.cs +++ b/exercise.pizzashopapi/Repository/IRepository.cs @@ -25,6 +25,12 @@ public interface IRepository Task GetOrder(int id); Task UpdateOrder(int id, Order order); Task DeleteOrder(int id); + + Task AddDriver(Driver driver); + Task AddDriverToOrder(int orderId, int driverId); + Task> GetAllDrivers(); + Task> GetAllOrdersForDriverID(int driverId); + } } diff --git a/exercise.pizzashopapi/Repository/Repository.cs b/exercise.pizzashopapi/Repository/Repository.cs index f91c06e..36469dd 100644 --- a/exercise.pizzashopapi/Repository/Repository.cs +++ b/exercise.pizzashopapi/Repository/Repository.cs @@ -181,7 +181,34 @@ public async Task AddToppingToPizza(int pizzaId, int toppingId) pizza.Toppings.Add(pizzaTopping); await _db.SaveChangesAsync(); return pizza; + } + + public async Task AddDriver(Driver driver) + { + await _db.Drivers.AddAsync(driver); + await _db.SaveChangesAsync(); + return driver; + } + + public async Task AddDriverToOrder(int orderId, int driverId) + { + Order order = await _db.Orders.FirstOrDefaultAsync(o => o.Id == orderId); + Driver driver = await _db.Drivers.FirstOrDefaultAsync(d => d.Id == driverId); + + order.DriverId = driverId; + await _db.SaveChangesAsync(); + return order; + + } + public async Task> GetAllOrdersForDriverID(int driverId) + { + return await _db.Orders.Where(o => o.DriverId == driverId).ToListAsync(); + } + + public async Task> GetAllDrivers() + { + return await _db.Drivers.ToListAsync(); } } }