Beispiel #1
0
        public void Run(APIGatewayProxyRequest request, APIGatewayProxyResponse response, FinanceUser user)
        {
            var validation = new List <string>();
            var rentalDate = request.QueryStringParameters != null && request.QueryStringParameters.ContainsKey("rentalDate")
                ? request.QueryStringParameters["rentalDate"]
                : string.Empty;
            var databaseClient = new DatabaseClient <SpotReservation>(new AmazonDynamoDBClient(), new ConsoleLogger());
            var service        = new SpotReservationService(databaseClient);

            List <SpotReservation> spotReservations;

            if (!string.IsNullOrWhiteSpace(rentalDate))
            {
                validation.AddRange(ReceiptValidation.GetRentalDateValidation(rentalDate));
                if (validation.Any())
                {
                    response.StatusCode = 400;
                    response.Body       = new JObject {
                        { "error", JArray.FromObject(validation) }
                    }.ToString();
                    return;
                }

                spotReservations = service.GetSpotReservations(rentalDate);
            }
            else
            {
                var vendorId = request.QueryStringParameters != null && request.QueryStringParameters.ContainsKey("vendorId")
                    ? request.QueryStringParameters["vendorId"]
                    : string.Empty;
                spotReservations = service.GetSpotReservationsByVendor(vendorId)
                                   .OrderBy(x => x.RentalDate)
                                   .ToList();
            }

            response.Body = JsonConvert.SerializeObject(spotReservations);
        }
        public void Run(APIGatewayProxyRequest request, APIGatewayProxyResponse response, FinanceUser user)
        {
            var dbClientCore = new AmazonDynamoDBClient();
            var logger       = new ConsoleLogger();
            var spotClient   = new DatabaseClient <Spot>(dbClientCore, logger);
            var spots        = spotClient.ScanAll(new ScanRequest(new Spot().GetTable()))
                               .OrderBy(x => x.Section?.Name)
                               .ThenBy(x => x.Name)
                               .ToList();
            var qboClient          = new QuickBooksOnlineClient(PrivateAccounting.Constants.LakelandMiPuebloRealmId, new DatabaseClient <QuickBooksOnlineConnection>(dbClientCore, logger), logger);
            var allActiveCustomers = qboClient
                                     .QueryAll <Customer>("select * from customer")
                                     .ToDictionary(x => x.Id);
            var allActiveVendors = new ActiveVendorSearch()
                                   .GetActiveVendors(allActiveCustomers, new DatabaseClient <Vendor>(dbClientCore, logger))
                                   .ToList();
            var spotReservationCheck = new SpotReservationCheck(
                spotClient,
                new DatabaseClient <SpotReservation>(dbClientCore, logger),
                allActiveVendors,
                allActiveCustomers
                );
            var rentalDate = request.QueryStringParameters.ContainsKey("rentalDate")
                ? request.QueryStringParameters["rentalDate"]
                : string.Empty;
            var validation = ReceiptValidation.GetRentalDateValidation(rentalDate);

            if (validation.Any())
            {
                response.StatusCode = 400;
                response.Body       = new JObject {
                    { "error", JArray.FromObject(validation) }
                }.ToString();
                return;
            }
            validation = new List <string>();
            DateTime.TryParseExact(rentalDate, "yyyy-MM-dd", CultureInfo.InvariantCulture, DateTimeStyles.None, out var parsedRentalDate);
            if (parsedRentalDate - DateTime.UtcNow > TimeSpan.FromDays(91)) // Endpoint is cached. The date constraint prevents denial of service causing the cache to be hit and database hits to plateau quickly.
            {
                validation.Add("rentalDate can't be greater than 90 days in the future");
            }
            if (parsedRentalDate - DateTime.UtcNow < TimeSpan.FromDays(-1))
            {
                validation.Add("rentalDate can't be in the past");
            }
            if (validation.Any())
            {
                response.StatusCode = 400;
                response.Body       = new JObject {
                    { "error", JArray.FromObject(validation) }
                }.ToString();
                return;
            }
            var jsonResponse = new List <PublicSpot>();

            foreach (var spot in spots)
            {
                var reservation = spotReservationCheck.GetReservation(spot.Id, rentalDate);
                int?reservedByQuickBooksOnlineId = 0;
                if (reservation?.Item1 != null)
                {
                    reservedByQuickBooksOnlineId = reservation.Item1.QuickBooksOnlineId;
                }
                if (reservation?.Item2 != null)
                {
                    reservedByQuickBooksOnlineId = reservation.Item2.QuickBooksOnlineId;
                }
                var publicSpot = new PublicSpot
                {
                    Id      = spot.Id,
                    Name    = spot.Name,
                    Section = spot.Section,
                    Right   = spot.Right,
                    Bottom  = spot.Bottom
                };
                if (reservedByQuickBooksOnlineId.HasValue &&
                    allActiveCustomers.TryGetValue(reservedByQuickBooksOnlineId, out var customer))
                {
                    publicSpot.ReservedBy = customer.DisplayName;
                }
                jsonResponse.Add(publicSpot);
            }
            response.Body = JsonConvert.SerializeObject(jsonResponse);
        }