Пример #1
0
        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);
        }
Пример #2
0
        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);
        }