Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions Api/Api.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,11 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.3">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.3" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
<PackageReference Include="System.Data.SqlClient" Version="4.8.6" />
</ItemGroup>
Expand Down
41 changes: 27 additions & 14 deletions Api/Controllers/OrderController.cs
Original file line number Diff line number Diff line change
@@ -1,21 +1,34 @@
namespace Api.Controllers
{
using Infrastructure;
using Microsoft.AspNetCore.Mvc;
using Models;
using Infrastructure;
using Microsoft.AspNetCore.Mvc;
using Models;

[ApiController]
[Route("api")]
public class OrderController : ControllerBase
{
[HttpGet]
[Route("order/{id}")]

public IEnumerable<Order> GetOrders(int id = 1)
[ApiController]
[Route("api")]
public class OrderController : ControllerBase
{
var data = new OrderService();
private readonly IOrderService _orderService;

public OrderController(IOrderService orderService)
{
_orderService = orderService;
}

[HttpGet]
[Route("order/{id}")]
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(IEnumerable<OrderResult>))]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public IActionResult GetOrders(int id = 1)
{
IEnumerable<OrderResult> result = _orderService.GetOrdersForCompany(id);

if (!result.Any())
{
return NotFound(new { message = "Orders not found"});
}

return data.GetOrdersForCompany(id);
return Ok(result);
}
}
}
}
38 changes: 0 additions & 38 deletions Api/Infrastructure/Database.cs

This file was deleted.

26 changes: 26 additions & 0 deletions Api/Infrastructure/EntityHandler.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
using Api.Models;
using Microsoft.EntityFrameworkCore;

namespace Api.Infrastructure
{
public class EntityHandler : IEntityHandler
{
private readonly BrainWareContext _context;
public EntityHandler(BrainWareContext context)
{
_context = context;
}

public List<Order> GetOrdersForCompany(int CompanyId)
{
List<Order> orders = _context.Orders
.Include(o => o.Company)
.Include(o => o.Orderproducts)
.ThenInclude(op => op.Product)
.Where(e => e.CompanyId == CompanyId)
.ToList();

return orders;
}
}
}
9 changes: 9 additions & 0 deletions Api/Infrastructure/IEntityHandler.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using Api.Models;

namespace Api.Infrastructure
{
public interface IEntityHandler
{
List<Order> GetOrdersForCompany(int CompanyId);
}
}
9 changes: 9 additions & 0 deletions Api/Infrastructure/IOrderService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using Api.Models;

namespace Api.Infrastructure
{
public interface IOrderService
{
List<OrderResult> GetOrdersForCompany(int CompanyId);
}
}
93 changes: 32 additions & 61 deletions Api/Infrastructure/OrderService.cs
Original file line number Diff line number Diff line change
@@ -1,80 +1,51 @@
namespace Api.Infrastructure
{
using System.Data;
using Models;

public class OrderService
public class OrderService : IOrderService
{
public List<Order> GetOrdersForCompany(int CompanyId)
private readonly IEntityHandler _entityHandler;
public OrderService(IEntityHandler entityHandler)
{
_entityHandler = entityHandler;
}
public List<OrderResult> GetOrdersForCompany(int CompanyId)
{
List<Order> orders = _entityHandler.GetOrdersForCompany(CompanyId);

var database = new Database();

// Get the orders
var sql1 =
"SELECT c.name, o.description, o.order_id FROM company c INNER JOIN [order] o on c.company_id=o.company_id";

var reader1 = database.ExecuteReader(sql1);

var values = new List<Order>();

while (reader1.Read())
{
var record1 = (IDataRecord) reader1;

values.Add(new Order()
{
CompanyName = record1.GetString(0),
Description = record1.GetString(1),
OrderId = record1.GetInt32(2),
OrderProducts = new List<OrderProduct>()
});

}

reader1.Close();

//Get the order products
var sql2 =
"SELECT op.price, op.order_id, op.product_id, op.quantity, p.name, p.price FROM orderproduct op INNER JOIN product p on op.product_id=p.product_id";

var reader2 = database.ExecuteReader(sql2);

var values2 = new List<OrderProduct>();
var orderResults = new List<OrderResult>();

while (reader2.Read())
foreach (var order in orders)
{
var record2 = (IDataRecord)reader2;
var orderProductResults = new List<OrderProductResult>();

values2.Add(new OrderProduct()
foreach(Orderproduct op in order.Orderproducts)
{
OrderId = record2.GetInt32(1),
ProductId = record2.GetInt32(2),
Price = record2.GetDecimal(0),
Quantity = record2.GetInt32(3),
Product = new Product()
orderProductResults.Add(new OrderProductResult
{
Name = record2.GetString(4),
Price = record2.GetDecimal(5)
}
});
}

reader2.Close();
OrderId = op.OrderId,
ProductId = op.ProductId,
Price = op.Price!.Value,
Quantity = op.Quantity,
Product = new ProductResult
{
Name = op.Product!.Name,
Price = op.Product.Price!.Value
}
});
}

foreach (var order in values)
{
foreach (var orderproduct in values2)
orderResults.Add(new OrderResult
{
if (orderproduct.OrderId != order.OrderId)
continue;

order.OrderProducts.Add(orderproduct);
order.OrderTotal = order.OrderTotal + (orderproduct.Price * orderproduct.Quantity);
}
CompanyName = order.Company.Name,
Description = order.Description,
OrderId = order.OrderId,
OrderProducts = orderProductResults,
OrderTotal = orderProductResults.Sum(op => op.Price * op.Quantity)
});
}

return values;
return orderResults;
}
}
}
106 changes: 106 additions & 0 deletions Api/Models/BrainWareContext.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
using Microsoft.EntityFrameworkCore;

namespace Api.Models;

public partial class BrainWareContext : DbContext
{
public BrainWareContext()
{
}

public BrainWareContext(DbContextOptions<BrainWareContext> options)
: base(options)
{
}

public virtual DbSet<Company> Companies { get; set; }

public virtual DbSet<Order> Orders { get; set; }

public virtual DbSet<Orderproduct> Orderproducts { get; set; }

public virtual DbSet<Product> Products { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.UseCollation("SQL_Latin1_General_CP1_CI_AS");

modelBuilder.Entity<Company>(entity =>
{
entity.HasKey(e => e.CompanyId).HasName("PK__Company__3E267235D89E42FC");

entity.ToTable("Company");

entity.Property(e => e.CompanyId)
.ValueGeneratedNever()
.HasColumnName("company_id");
entity.Property(e => e.Name)
.HasMaxLength(128)
.IsFixedLength()
.HasColumnName("name");
});

modelBuilder.Entity<Order>(entity =>
{
entity.HasKey(e => e.OrderId).HasName("PK__Order__46596229DAD3555B");

entity.ToTable("Order");

entity.Property(e => e.OrderId).HasColumnName("order_id");
entity.Property(e => e.CompanyId).HasColumnName("company_id");
entity.Property(e => e.Description)
.HasMaxLength(1000)
.HasColumnName("description");

entity.HasOne(d => d.Company).WithMany(p => p.Orders)
.HasForeignKey(d => d.CompanyId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK_order_to_company");
});

modelBuilder.Entity<Orderproduct>(entity =>
{
entity.HasKey(e => new { e.OrderId, e.ProductId });

entity.ToTable("orderproduct");

entity.Property(e => e.OrderId).HasColumnName("order_id");
entity.Property(e => e.ProductId).HasColumnName("product_id");
entity.Property(e => e.Price)
.HasColumnType("decimal(18, 2)")
.HasColumnName("price");
entity.Property(e => e.Quantity).HasColumnName("quantity");

entity.HasOne(d => d.Order).WithMany(p => p.Orderproducts)
.HasForeignKey(d => d.OrderId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK_orderproduct_order");

entity.HasOne(d => d.Product).WithMany(p => p.Orderproducts)
.HasForeignKey(d => d.ProductId)
.OnDelete(DeleteBehavior.ClientSetNull)
.HasConstraintName("FK_orderproduct_product");
});

modelBuilder.Entity<Product>(entity =>
{
entity.HasKey(e => e.ProductId).HasName("PK__Product__47027DF569E694B0");

entity.ToTable("Product");

entity.Property(e => e.ProductId)
.ValueGeneratedNever()
.HasColumnName("product_id");
entity.Property(e => e.Name)
.HasMaxLength(128)
.HasColumnName("name");
entity.Property(e => e.Price)
.HasColumnType("decimal(18, 2)")
.HasColumnName("price");
});

OnModelCreatingPartial(modelBuilder);
}

partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}
13 changes: 13 additions & 0 deletions Api/Models/Company.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
using System;
using System.Collections.Generic;

namespace Api.Models;

public partial class Company
{
public int CompanyId { get; set; }

public string Name { get; set; } = null!;

public virtual ICollection<Order> Orders { get; set; } = new List<Order>();
}
Loading