Beispiel #1
0
        public async Task <CommandResult> AddPhotoToObject(int objectId, IFormFile image)
        {
            var authorizationResult = _authorizer.IsAuthorized(o => o.OfferedObjectId == objectId, (o) => o.OwnerLogin.User);

            if (!authorizationResult)
            {
                return(new CommandResult(new ErrorMessage
                {
                    ErrorCode = "OBJECT.PHOTO.UNAUTHORIZED",
                    Message = "You are not authorized to add a photo to this object",
                    StatusCode = System.Net.HttpStatusCode.Unauthorized
                }));
            }


            var @object = _objectsRepo.Get(objectId);

            if (@object is null || @object.ObjectStatus != ObjectStatus.Available)
            {
                return(new CommandResult(new ErrorMessage
                {
                    ErrorCode = "OBJECT.DOES.NOT.EXISTS",
                    Message = "You are not authorized to add a photo to this object",
                    StatusCode = System.Net.HttpStatusCode.Unauthorized
                }));
            }

            var savingResult = await _imageSaver.SaveImage(image);

            if (!savingResult.IsSuccessful)
            {
                return(new CommandResult(savingResult.Error));
            }

            var newPhoto = new ObjectPhoto
            {
                AddedAtUtc            = DateTime.UtcNow,
                ObjectId              = objectId,
                AdditionalInformation = QueryString.Create(new Dictionary <string, string>
                {
                    { "Name", savingResult.Result.Name.ToString() },
                    { "Version", "1" }
                }).ToUriComponent(),
                FilePath = savingResult.Result.Path,
            };

            _photoRepo.Add(newPhoto);
            await _photoRepo.SaveChangesAsync();

            return(new CommandResult());
        }
Beispiel #2
0
        public async Task <IActionResult> CancelRegistration([FromBody] CancelRegistrationDto cancelRegistration)
        {
            if (cancelRegistration == null)
            {
                return(StatusCode(new ErrorMessage
                {
                    ErrorCode = "TRANSACTION.REGISTRATION.CANCEL.NULL",
                    Message = "Please send valid data",
                    StatusCode = System.Net.HttpStatusCode.BadRequest
                }));
            }

            if (!Guid.TryParse(cancelRegistration.RegistrationId, out var registrationIdGuid))
            {
                return(StatusCode(new ErrorMessage
                {
                    ErrorCode = "TRANSACTION.REGISTRATION.INVALID.DATA",
                    Message = "Please send valid data",
                    StatusCode = System.Net.HttpStatusCode.BadRequest
                }));
            }

            var authResult = _ownershipAuth.IsAuthorized(or => or.ObjectRegistrationId == registrationIdGuid, or => or.RecipientLogin.User);

            if (!authResult)
            {
                return(StatusCode(new ErrorMessage
                {
                    ErrorCode = "TRANSACTION.REGISTRATION.CANCEL.UNAUTHORIZED",
                    Message = "You are not authorized to cancel this registration",
                    StatusCode = System.Net.HttpStatusCode.Unauthorized
                }));
            }

            var registrations = from r in _registrationsRepo.Table
                                where r.ObjectRegistrationId == registrationIdGuid &&
                                r.ObjectReceiving == null &&
                                r.Status == ObjectRegistrationStatus.OK &&
                                r.ExpiresAtUtc > DateTime.UtcNow
                                select r;

            if (!registrations.Any())
            {
                return(StatusCode(new ErrorMessage
                {
                    ErrorCode = "TRANSACTION.REGISTRATION.CANCEL.UNAVAILABLE",
                    Message = "You can not cancel this registration",
                    StatusCode = System.Net.HttpStatusCode.Unauthorized
                }));
            }


            var theRegistration = _registrationsRepo.Get(registrationIdGuid);

            theRegistration.Status = ObjectRegistrationStatus.Canceled;
            await _registrationsRepo.SaveChangesAsync();

            _eventBus.Publish(new TransactionCancelledIntegrationEvent
            {
                Id             = Guid.NewGuid(),
                OccuredAt      = DateTime.UtcNow,
                RegistrationId = theRegistration.ObjectRegistrationId,
                CancelledAtUtc = DateTime.UtcNow,
            });
            return(StatusCode(200, new
            {
                Message = "A registration has been canceled"
            }));
        }
        public async Task <CommandResult <GenerateReturnTokenResultDto> > GenerateToken(GenerateReturnTokenDto generateReturnTokenDto)
        {
            if (generateReturnTokenDto is null || generateReturnTokenDto.RegistrationId.IsNullOrEmpty())
            {
                return(new ErrorMessage
                {
                    ErrorCode = "TRANSACTION.TOKEN.GENERATE.RETURN.NULL",
                    Message = "Please provide valid data",
                    StatusCode = System.Net.HttpStatusCode.BadRequest
                }.ToCommand <GenerateReturnTokenResultDto>());
            }

            if (!Guid.TryParse(generateReturnTokenDto.RegistrationId, out var guidRegistrationId))
            {
                return(new ErrorMessage
                {
                    ErrorCode = "TRANSACTION.TOKEN.GENERATE.INVALID.ID",
                    Message = "Please provide valid data",
                    StatusCode = System.Net.HttpStatusCode.BadRequest
                }.ToCommand <GenerateReturnTokenResultDto>());
            }

            var registration = (from r in _registrationsRepo.Table
                                where r.ObjectRegistrationId == guidRegistrationId
                                select r)
                               .Include(r => r.ObjectReceiving)
                               .ThenInclude(r => r.ObjectReturning)
                               .Include(r => r.Object)
                               .FirstOrDefault();

            if (registration is null || registration.Status == ObjectRegistrationStatus.Canceled)
            {
                return(new ErrorMessage
                {
                    ErrorCode = "TRANSACTION.TOKEN.GENERATE.RETURN.INVALID.ID",
                    Message = "Please provide valid data",
                    StatusCode = System.Net.HttpStatusCode.BadRequest
                }.ToCommand <GenerateReturnTokenResultDto>());
            }

            //if (!registration.Object.ShouldReturn)
            //{
            //    return new ErrorMessage
            //    {
            //        ErrorCode = "TRANSACTION.TOKEN.GENERATE.RETURN.FREE.OBJECT",
            //        Message = "The Object now is yours, you don't have to return it",
            //        StatusCode = System.Net.HttpStatusCode.BadRequest
            //    }.ToCommand<GenerateReturnTokenResultDto>();
            //}

            if (!_authorizer.IsAuthorized(or => or.ObjectRegistrationId == guidRegistrationId, or => or.RecipientLogin.User))
            {
                return(new ErrorMessage
                {
                    ErrorCode = "TRANSACTION.TOKEN.GENERATE.RETURN.UNAUTHORIZED",
                    Message = "You are not authorized to execute this request",
                    StatusCode = System.Net.HttpStatusCode.BadRequest
                }.ToCommand <GenerateReturnTokenResultDto>());
            }

            if (registration.ObjectReceiving is null)
            {
                return(new ErrorMessage
                {
                    ErrorCode = "TRANSACTION.TOKEN.GENERATE.RETURN.NOT.RECEIVED",
                    Message = "The object has not been received yet",
                    StatusCode = System.Net.HttpStatusCode.BadRequest
                }.ToCommand <GenerateReturnTokenResultDto>());
            }

            if (registration.ObjectReceiving.ObjectReturning is object)
            {
                return(new ErrorMessage
                {
                    ErrorCode = "TRANSACTION.TOKEN.GENERATE.RETURN.ALREADY.RETURNED",
                    Message = "The object has been returned",
                    StatusCode = System.Net.HttpStatusCode.BadRequest
                }.ToCommand <GenerateReturnTokenResultDto>());
            }

            var token = await _tokenManager.GenerateToken(registration.ObjectReceiving.ObjectReceivingId, TokenType.Returning);

            return(new CommandResult <GenerateReturnTokenResultDto>(new GenerateReturnTokenResultDto
            {
                CreatedAtUtc = token.IssuedAtUtc,
                UseBeforeUtc = token.UseBeforeUtc,
                ReturnToken = token.Token
            }));
        }
Beispiel #4
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,
            }));
        }
        public async Task <IActionResult> ReturnObject([FromBody] AddObjectReturningDto returnDto)
        {
            if (returnDto == null || returnDto.ReturningToken.IsNullOrEmpty())
            {
                return(StatusCode(new ErrorMessage
                {
                    ErrorCode = "TRANSACTION.RETURNING.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.RETURNING.ADD.UNAUTHOROIZED",
                    Message = "You are not authorized to make this request",
                    StatusCode = System.Net.HttpStatusCode.Unauthorized
                }));
            }

            var authResult = _transactionOwnershipAuthorizer.IsAuthorized(tt => tt.Type == TokenType.Returning && tt.Token == returnDto.ReturningToken,
                                                                          tt => tt.Receiving.ObjectRegistration.Object.OwnerUser);

            if (!authResult)
            {
                return(StatusCode(new ErrorMessage
                {
                    ErrorCode = "TRANSACTION.RETURNING.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 == returnDto.ReturningToken && t.Type == TokenType.Returning
                            select t).FirstOrDefault();

            if (theToken == null)
            {
                return(StatusCode(new ErrorMessage
                {
                    ErrorCode = "TRANSACTION.RETURNING.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.RETURNING.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.RETURNING.ADD.TOKEN.USED",
                    Message = "The QR code provided is already used",
                    StatusCode = System.Net.HttpStatusCode.BadRequest
                }));
            }

            var theReceiving = (from rc in _receivingsRepo.Table
                                where rc.Tokens.Any(returningToken => returningToken.Token == returnDto.ReturningToken)
                                select rc).Include(rc => rc.ObjectRegistration).FirstOrDefault();

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

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

            theToken.Status = TokenStatus.Used;
            var returning = new ObjectReturning
            {
                ReturnedAtUtc     = DateTime.UtcNow,
                LoanerLoginId     = login.LoginId,
                LoaneeLoginId     = theToken.IssuerLoginId,
                ObjectReceivingId = theReceiving.ObjectReceivingId,
                ObjectReturningId = Guid.NewGuid()
            };

            _returningRepo.Add(returning);

            // This will save theToken.Status also
            await _returningRepo.SaveChangesAsync();

            var returnedAfter = DateTime.UtcNow - theReceiving.ReceivedAtUtc;

            var evnt = new TransactionReturnedIntegrationEvent()
            {
                Id             = Guid.NewGuid(),
                OccuredAt      = DateTime.UtcNow,
                RegistrationId = theReceiving.ObjectRegistrationId,
                ReturnedAtUtc  = DateTime.UtcNow,
                ReturnIdId     = returning.ObjectReturningId,
            };

            _eventBus.Publish(evnt);

            TimeSpan late = new TimeSpan();

            if (theReceiving.ObjectRegistration.ShouldReturnItAfter.HasValue)
            {
                late = DateTime.UtcNow - theReceiving.ReceivedAtUtc.Add(theReceiving.ObjectRegistration.ShouldReturnItAfter.Value);

                // if the value is nigative (not late)
                if (late.TotalSeconds < 0)
                {
                    late = new TimeSpan(0);
                }
            }
            var      charge = theReceiving.HourlyCharge is null ? null : (float?)(theReceiving.HourlyCharge * returnedAfter.TotalHours);
            DateTime?shouldBeReturnedAtUtc = null;

            if (theReceiving.ObjectRegistration.ShouldReturnItAfter.HasValue)
            {
                shouldBeReturnedAtUtc = theReceiving.ReceivedAtUtc.Add(theReceiving.ObjectRegistration.ShouldReturnItAfter.Value);
            }

            return(Ok(new AddObjectReturningResultDto
            {
                RegistrationId = theReceiving.ObjectRegistrationId,
                ReceivingId = theReceiving.ObjectReceivingId,
                ReturningId = returning.ObjectReturningId,
                Late = late,
                ReturnedAfter = returnedAfter,
                ShouldPay = charge,
                RegisteredAtUtc = theReceiving.ObjectRegistration.RegisteredAtUtc,
                ReceivedAtUtc = theReceiving.ReceivedAtUtc,
                ReturnedAtUtc = returning.ReturnedAtUtc,
                ShouldBeReturnedAtUtc = shouldBeReturnedAtUtc
            }));
        }