Advertisement
Guest User

Untitled

a guest
Jan 20th, 2020
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.47 KB | None | 0 0
  1. using System;
  2. using System.Linq;
  3. using System.Threading;
  4. using System.Threading.Tasks;
  5. using AutoMapper;
  6. using iTero.Application.Abstractions;
  7. using iTero.Orders.Application.Abstractions;
  8. using iTero.Orders.Domain.Entities;
  9. using iTero.Orders.EntityFrameworkRepository.Model;
  10. using iTero.Orders.WebApi.Contract;
  11. using Microsoft.EntityFrameworkCore;
  12. using Microsoft.Extensions.Logging;
  13. using DalCasePartnerLink = iTero.Orders.EntityFrameworkRepository.Model.CasePartnerLink;
  14. using DomainCasePartnerLink = iTero.Orders.Domain.Entities.CasePartnerLink;
  15.  
  16. namespace iTero.Orders.EntityFrameworkRepository
  17. {
  18.     public class OrdersEntityFrameworkRepository : IOrdersRepository, IDisposable
  19.     {
  20.         private readonly ILogger<OrdersEntityFrameworkRepository> logger;
  21.         private readonly IMapper mapper;
  22.         private readonly OrdersDBContext ordersDbContext;
  23.         private readonly IPropertyScopeManager<FlowPhaseDescriptor> _flowPhaseScopeManager;
  24.  
  25.         public OrdersEntityFrameworkRepository(
  26.             OrdersDBContext ordersDbContext, ILogger<OrdersEntityFrameworkRepository> logger, IMapper mapper, IPropertyScopeManager<FlowPhaseDescriptor> flowPhaseScopeManager)
  27.         {
  28.             this.ordersDbContext = ordersDbContext;
  29.             this.logger = logger;
  30.             this.mapper = mapper;
  31.             _flowPhaseScopeManager = flowPhaseScopeManager;
  32.         }
  33.  
  34.         public async Task<bool> HealthcheckAsync(CancellationToken cancellationToken)
  35.         {
  36.             using (_flowPhaseScopeManager.BeginScope(
  37.                 new FlowPhaseDescriptor() {Flow = "healthchek", Phase = "ordersdb"}))
  38.  
  39.             {
  40.                 try
  41.                 {
  42.                     var canConnect = await ordersDbContext.Database.CanConnectAsync(cancellationToken);
  43.                     if (canConnect)
  44.                         logger.LogInformation("Healthcheck successful");
  45.                     else
  46.                         logger.LogWarning("Healthcheck issue - cannot connect to the database");
  47.                     return canConnect;
  48.  
  49.                 }
  50.                 catch (Exception e)
  51.                 {
  52.                     logger.LogError(e, "healthcheck issue");
  53.                     return false;
  54.                 }
  55.             }
  56.         }
  57.  
  58.         public async Task<RegisteredOrder> RegisterOrderAsync(NewOrder order, Guid eventId,
  59.             DomainCasePartnerLink[] casePartnerLinks)
  60.         {
  61.             using var transaction = ordersDbContext.Database.BeginTransaction();
  62.             var orderHeader = mapper.Map<OrderHeader>(order);
  63.             ordersDbContext.OrderHeaders.Add(orderHeader);
  64.             ordersDbContext.CasePartnerLinks.AddRange(
  65.                 casePartnerLinks.Select(cpl =>
  66.                 {
  67.                     var dalCpl = mapper.Map<DalCasePartnerLink>(cpl);
  68.                     dalCpl.OrderHeader = orderHeader;
  69.                     return dalCpl;
  70.                 })
  71.             );
  72.  
  73.             ordersDbContext.EventLog.Add(new EventLogEntry
  74.             {
  75.                 OrderHeader = orderHeader, EventType = EventType.OrderRegistered, Id = eventId
  76.             });
  77.  
  78.             await ordersDbContext.SaveChangesAsync();
  79.             transaction.Commit();
  80.  
  81.             foreach (var od in ordersDbContext.ChangeTracker.Entries().ToArray())
  82.             {
  83.                 od.State = EntityState.Detached;
  84.             }
  85.  
  86.             var savedOrder = mapper.Map<RegisteredOrder>(orderHeader);
  87.             return savedOrder;
  88.         }
  89.  
  90.         public async Task<Order> SaveOrderAsync(Order order, Guid eventId, EventType eventType, DomainCasePartnerLink[] casePartnerLinks, CancellationToken cancellationToken)
  91.         {
  92.             using var transaction = ordersDbContext.Database.BeginTransaction();
  93.             var orderHeader = mapper.Map<OrderHeader>(order);
  94.             ordersDbContext.OrderHeaders.Update(orderHeader);
  95.             await ordersDbContext.EventLog.AddAsync(new EventLogEntry
  96.             {
  97.                 OrderHeader = orderHeader, EventType = eventType, Id = eventId
  98.             }, cancellationToken);
  99.             var existingLinks = await ordersDbContext.CasePartnerLinks
  100.                 .Where(x => x.OrderHeader.OrderHeaderId == orderHeader.OrderHeaderId)
  101.                 .Select(x => mapper.Map<DomainCasePartnerLink>(x)).ToListAsync(cancellationToken);
  102.             var missingLinks = casePartnerLinks.Where(x=>!existingLinks.Contains(x)).ToList();
  103.  
  104.             await ordersDbContext.CasePartnerLinks.AddRangeAsync(
  105.                 missingLinks.Select(cpl =>
  106.                 {
  107.                     var dalCpl = mapper.Map<DalCasePartnerLink>(cpl);
  108.                     dalCpl.OrderHeader = orderHeader;
  109.                     return dalCpl;
  110.                 }), cancellationToken);
  111.             await ordersDbContext.SaveChangesAsync(cancellationToken);
  112.             transaction.Commit();
  113.             order = mapper.Map<Order>(orderHeader);
  114.             return order;
  115.         }
  116.  
  117.         public async Task<Order> GetOrderByIdAsync(long orderHeaderId)
  118.         {
  119.             var orderHeader = (await ordersDbContext.OrderHeaders.AsNoTracking()
  120.                     .Include(oh => oh.OrderDetails)
  121.                     .ThenInclude(od => od.WorkOrders)
  122.                     .Include(oh=>oh.CasePartnerLinks)
  123.                     .Where(oh => oh.OrderHeaderId == orderHeaderId).ToArrayAsync())
  124.                 .FirstOrDefault();
  125.  
  126.             if (orderHeader == default)
  127.             {
  128.                 return default;
  129.             }
  130.  
  131.             var order = mapper.Map<Order>(orderHeader);
  132.             return order;
  133.         }
  134.  
  135.         public async Task<Guid?> GetEventIdByOrderIdAndTypeAsync(long orderHeaderId, EventType eventType)
  136.         {
  137.             var eventId = (await ordersDbContext.EventLog.AsNoTracking()
  138.                 .SingleOrDefaultAsync(evt =>
  139.                     evt.EventType == eventType && evt.OrderHeader.OrderHeaderId == orderHeaderId))?.Id;
  140.             return eventId;
  141.         }
  142.  
  143.         public async Task<Order> GetOrderByEventIdAsync(string eventId, EventType eventType)
  144.         {
  145.             var orderHeader = (await ordersDbContext.EventLog.AsNoTracking()
  146.                     .Include(el => el.OrderHeader)
  147.                     .ThenInclude(oh => oh.OrderDetails)
  148.                     .ThenInclude(od => od.WorkOrders)
  149.                     .Where(el => el.Id == Guid.Parse(eventId)).ToArrayAsync())
  150.                 .FirstOrDefault()?.OrderHeader;
  151.  
  152.             if (orderHeader == default)
  153.             {
  154.                 return default;
  155.             }
  156.  
  157.             var order = eventType switch{
  158.                 EventType.OrderRegistered => mapper.Map<RegisteredOrder>(orderHeader),
  159.                 EventType.ScanningDoneHandled => mapper.Map<Order>(orderHeader)
  160.                 };
  161.  
  162.             return order;
  163.         }
  164.  
  165.         public async Task<DomainCasePartnerLink[]> GetCasePartnerLinksAsync(long orderId,
  166.             CancellationToken cancellationToken)
  167.         {
  168.             var links = await ordersDbContext.CasePartnerLinks
  169.                 .AsNoTracking()
  170.                 .Include(cpl => cpl.OrderHeader)
  171.                 .ThenInclude(oh => oh.OrderDetails)
  172.                 .ThenInclude(od => od.WorkOrders)
  173.                 .Where(x => x.OrderHeader.OrderHeaderId == orderId)
  174.                 .ToArrayAsync(cancellationToken);
  175.  
  176.             return mapper.Map<DomainCasePartnerLink[]>(links);
  177.         }
  178.  
  179.         public void Dispose()
  180.         {
  181.             ordersDbContext.Dispose();
  182.         }
  183.     }
  184. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement