public async Task AddOrder(string userId, string userName, string vendorId, string formattedOrderDate, UserOrderHistory userOrderHistory, string fullName) { var docDbUserOrderHistory = _mapper.Map <UserOrderHistory, Domain.Entities.DocumentDb.UserOrderHistory>(userOrderHistory); docDbUserOrderHistory.Id = Guid.NewGuid(); docDbUserOrderHistory.UserId = userId; docDbUserOrderHistory.UserName = userName; var vendorOrderHistory = new VendorOrderHistory { Id = Guid.NewGuid(), VendorId = Guid.Parse(vendorId), OrderDate = formattedOrderDate }; var docDbVendorOrderHistoryEntries = _mapper.Map <IEnumerable <Domain.Entities.DocumentDb.UserOrderHistoryEntry>, IEnumerable <Domain.Entities.DocumentDb.VendorOrderHistoryEntry> >(docDbUserOrderHistory.Entries); foreach (var entry in docDbVendorOrderHistoryEntries) { entry.UserId = userId; entry.UserName = userName; entry.FullName = fullName; } // todo, this should be user local time // make sure that the vendor order history isn't created multiple times because of concurrency. We do this in a different query. var vendorOrderId = await _documentStore.ExecuteStoredProcedure <string>(DocumentDbSp.GetOrCreateVendorOrderHistory, vendorOrderHistory); var lastOrder = _mapper.Map <Domain.Entities.DocumentDb.UserOrderHistory, Domain.Entities.DocumentDb.LastOrder>(docDbUserOrderHistory); lastOrder.UserOrderHistoryId = docDbUserOrderHistory.Id; /* transaction for multiple operations in documentdb is done using stored procedure. * let's call it here and leave it up to the sp * 1. does a check on user balance * 2. adds order to user order history * 3. adds order to vendor order * 4. updates user last orders * 5. updates user balance */ var success = await _documentStore.ExecuteStoredProcedure <bool>(DocumentDbSp.AddUserOrder, vendorOrderId, docDbVendorOrderHistoryEntries, docDbUserOrderHistory, lastOrder); }
public async Task AddOrder(string userId, string userName, string vendorId, string formattedOrderDate, UserOrderHistory userOrderHistory, string fullName) { var docDbUserOrderHistory = _mapper.Map<UserOrderHistory, Domain.Entities.DocumentDb.UserOrderHistory>(userOrderHistory); docDbUserOrderHistory.Id = Guid.NewGuid(); docDbUserOrderHistory.UserId = userId; docDbUserOrderHistory.UserName = userName; var vendorOrderHistory = new VendorOrderHistory { Id = Guid.NewGuid(), VendorId = Guid.Parse(vendorId), OrderDate = formattedOrderDate }; var docDbVendorOrderHistoryEntries = _mapper.Map<IEnumerable<Domain.Entities.DocumentDb.UserOrderHistoryEntry>, IEnumerable<Domain.Entities.DocumentDb.VendorOrderHistoryEntry>>(docDbUserOrderHistory.Entries); foreach (var entry in docDbVendorOrderHistoryEntries) { entry.UserId = userId; entry.UserName = userName; entry.FullName = fullName; } // todo, this should be user local time // make sure that the vendor order history isn't created multiple times because of concurrency. We do this in a different query. var vendorOrderId = await _documentStore.ExecuteStoredProcedure<string>(DocumentDbSp.GetOrCreateVendorOrderHistory, vendorOrderHistory); var lastOrder = _mapper.Map<Domain.Entities.DocumentDb.UserOrderHistory, Domain.Entities.DocumentDb.LastOrder>(docDbUserOrderHistory); lastOrder.UserOrderHistoryId = docDbUserOrderHistory.Id; /* transaction for multiple operations in documentdb is done using stored procedure. * let's call it here and leave it up to the sp * 1. does a check on user balance * 2. adds order to user order history * 3. adds order to vendor order * 4. updates user last orders * 5. updates user balance */ var success = await _documentStore.ExecuteStoredProcedure<bool>(DocumentDbSp.AddUserOrder, vendorOrderId, docDbVendorOrderHistoryEntries, docDbUserOrderHistory, lastOrder); }