public async Task <IActionResult> Create([FromBody] AddReceivingDto receivingDto)
        {
            var result = await _receivingAdder.AddReceiving(receivingDto);

            return(StatusCode(result));
        }
예제 #2
0
        public async Task <IActionResult> Create([FromBody] AddReceivingDto addReceivingViewModel)
        {
            if (addReceivingViewModel == null || addReceivingViewModel.RegistrationToken.IsNullOrEmpty())
            {
                return(StatusCode(new ErrorMessage
                {
                    ErrorCode = "TRANSACTION.RECEIVING.ADD.NULL",
                    Message = "Please send valid data",
                    StatusCode = System.Net.HttpStatusCode.BadRequest,
                }));
            }

            var(login, user) = await userDataManager.AddCurrentUserIfNeeded();

            if (login is null)
            {
                return(StatusCode(new ErrorMessage
                {
                    ErrorCode = "TRANSACTION.RECEIVING.ADD.UNAUTHOROIZED",
                    Message = "You are not authorized to make this request",
                    StatusCode = System.Net.HttpStatusCode.Unauthorized
                }));
            }

            var authResult = _ownershipAuthorization.IsAuthorized(tt => tt.Type == TokenType.Receiving && tt.Token == addReceivingViewModel.RegistrationToken,
                                                                  tt => tt.Registration.Object.OwnerUser);

            if (!authResult)
            {
                return(StatusCode(new ErrorMessage
                {
                    ErrorCode = "TRANSACTION.RECEIVING.ADD.UNAUTHOROIZED",
                    Message = "You are not authorized to make this request",
                    StatusCode = System.Net.HttpStatusCode.Unauthorized
                }));
            }

            var theToken = (from t in _tokensRepo.Table
                            where t.Token == addReceivingViewModel.RegistrationToken && t.Type == TokenType.Receiving
                            select t).FirstOrDefault();

            if (theToken == null)
            {
                return(StatusCode(new ErrorMessage
                {
                    ErrorCode = "TRANSACTION.RECEIVING.ADD.NOT.EXISTS",
                    Message = "The QR code provided is faulty",
                    StatusCode = System.Net.HttpStatusCode.BadRequest
                }));
            }

            if (!(theToken.UseAfterUtc < DateTime.UtcNow && theToken.UseBeforeUtc > DateTime.UtcNow))
            {
                return(StatusCode(new ErrorMessage
                {
                    ErrorCode = "TRANSACTION.RECEIVING.ADD.TOKEN.EXPIRED",
                    Message = "The QR code provided is too old",
                    StatusCode = System.Net.HttpStatusCode.BadRequest
                }));
            }

            if (theToken.Status != TokenStatus.Ok)
            {
                return(StatusCode(new ErrorMessage
                {
                    ErrorCode = "TRANSACTION.RECEIVING.ADD.TOKEN.INVALID",
                    Message = "The QR code provided is too old",
                    StatusCode = System.Net.HttpStatusCode.BadRequest
                }));
            }

            var theRegistration = (from rg in _registrationsRepo.Table
                                   where rg.Tokens.Any(rt => rt.Token == addReceivingViewModel.RegistrationToken)
                                   select rg).FirstOrDefault();

            if (theRegistration is null)
            {
                return(StatusCode(new ErrorMessage
                {
                    ErrorCode = "TRANSACTION.RECEIVING.ADD.NOT.EXISTS",
                    Message = "The QR code provided is faulty",
                    StatusCode = System.Net.HttpStatusCode.BadRequest
                }));
            }


            if (theRegistration.ObjectReceiving is object)
            {
                return(StatusCode(new ErrorMessage
                {
                    ErrorCode = "TRANSACTION.RECEIVING.ADD.TOKEN.USED",
                    Message = "The QR code provided is already used",
                    StatusCode = System.Net.HttpStatusCode.BadRequest
                }));
            }

            var objectRegistrations = from rg in _registrationsRepo.Table
                                      where rg.ObjectId == theRegistration.ObjectId
                                      select rg;

            // if not all of them returned or not received
            if (!objectRegistrations.All(or => or.ObjectReceiving == null || or.ObjectReceiving.ObjectReturning != null))
            {
                return(StatusCode(new ErrorMessage
                {
                    ErrorCode = "TRANSACTION.RECEIVING.ADD.OBJECT.TAKEN",
                    Message = "Do you even have the object?",
                    StatusCode = System.Net.HttpStatusCode.BadRequest
                }));
            }

            theToken.Status = TokenStatus.Used;

            var receiving = new ObjectReceiving
            {
                ReceivedAtUtc        = DateTime.UtcNow,
                GiverLoginId         = login.LoginId,
                RecipientLoginId     = theToken.IssuerLoginId,
                HourlyCharge         = 0f,
                ObjectRegistrationId = theRegistration.ObjectRegistrationId,
                ObjectReceivingId    = Guid.NewGuid(),
            };

            _receivingsRepo.Add(receiving);
            // this will save theToken.Status also
            await _receivingsRepo.SaveChangesAsync();

            var evnt = new TransactionReceivedIntegrationEvent
            {
                Id             = Guid.NewGuid(),
                OccuredAt      = DateTime.UtcNow,
                ReceivedAtUtc  = receiving.ReceivedAtUtc,
                ReceivingId    = receiving.ObjectReceivingId,
                RegistrationId = receiving.ObjectRegistrationId,
            };

            _eventBus.Publish(evnt);

            // Publish the event
            return(StatusCode(200, new AddReceivingResultDto
            {
                ObjectId = _objectRepo.Get(theRegistration.ObjectId).OriginalObjectId,
                ReceivedAtUtc = receiving.ReceivedAtUtc,
                RegistrationId = theRegistration.ObjectRegistrationId,
                ShouldBeReturnedAfterReceving = theRegistration.ShouldReturnItAfter,
            }));
        }