/// <summary> /// Rents 1st of avaible catridge copies by given cartridge id to given user /// Adds new Rental to database /// </summary> /// <param name="cartridgeId">Cartridge id</param> /// <param name="userId">User that wants to rent id</param> /// <param name="request">Rental request</param> /// <returns>Null if cartridge or user is not found. True if user could rent given cartridge, false otherwise.</returns> public async Task <bool?> RentCartridge(Guid cartridgeId, Guid userId, CartridgeRentRequest request) { var cartridge = await CartridgeRepo .GetAll() .AsNoTracking() .FirstOrDefaultAsync(c => c.Id == cartridgeId); if (cartridge == null) { return(null); } var copy = await CartridgeCopyRepo .GetAll() .FirstOrDefaultAsync(c => c.CartridgeId == cartridgeId && c.Avaible); if (copy == null) { return(false); } var address = new Address(); if (request.Delivery == collectionInPerson) { address = null; } else if (request.AddAddress) { request.NewAddress.UserId = userId.ToString(); address = await AddressService.CreateAddress(request.NewAddress); } else { address = await AddressRepo .GetAll() .FirstOrDefaultAsync(a => a.Id == new Guid(request.AddressId)); if (address == null) { return(null); } } var shopUser = await ShopUserRepo .GetAll() .AsNoTracking() .FirstOrDefaultAsync(su => su.UserId == userId.ToString()); var rental = new Rental { DaysToReturn = cartridge.DaysToReturn, RentPrice = cartridge.RentPrice, Rented = DateTime.UtcNow, AddressId = address?.Id, CartridgeCopyId = copy.Id, Delivery = request.Delivery, ShopUserId = shopUser.Id, }; copy.Avaible = false; await CartridgeCopyRepo.SaveChangesAsync(); await RentalRepo.CreateAsync(rental); await RentalRepo.SaveChangesAsync(); return(true); }
public async Task <IActionResult> RentCartridge(Guid cartridgeId, Guid userId, [FromBody] CartridgeRentRequest request) { var canUserRent = await ShopUserService.CanUserRent(userId); if (canUserRent == null) { return(BadRequest(ApiResponse.Failure("Null", "User does not seem to exist"))); } if (!canUserRent.Value) { return(BadRequest(ApiResponse.Failure("CantRent", "User cannot rent"))); } var rentalResult = await RentalService.RentCartridge(cartridgeId, userId, request); if (rentalResult == null) { return(BadRequest(ApiResponse.Failure("Null", "Cartridge or selected address does not seemt to exist"))); } if (!rentalResult.Value) { return(BadRequest(ApiResponse.Failure("NoCopies", "No copies avaible"))); } return(Ok(ApiResponse.Success())); }