public async Task <IActionResult> Execute([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]
                                                  HttpRequest req,
                                                  ILogger log)
        {
            try
            {
                var request = await req.ReadSlackRequest();

                if (string.IsNullOrWhiteSpace(request.Text))
                {
                    return(SlackResponse.NoLocationProvided().AsJson());
                }

                var location = new LocationFromRequest(request.Text);

                var totalAvailableSeats = _locations.TotalCapacityOf(location);
                var filledSeats         = _capacityService.NumberOfDesksOccupiedForLocation(location);

                var result   = $"There are {filledSeats} of {totalAvailableSeats} desks used in {request.Text}.";
                var imageUrl = _urlHelper.CapacityImageFor(location);
                return(new SlackResponse(result, imageUrl).AsJson());
            }
            catch (Exception ex)
            {
                log.LogError(ex.ToString());
                throw;
            }
        }
        public async Task <IActionResult> Execute([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]
                                                  HttpRequest req,
                                                  ILogger log)
        {
            try
            {
                var rawLocation = req.Query.ContainsKey("location") ? req.Query["location"].FirstOrDefault() : null;
                var location    = new LocationFromRequest(rawLocation);
                if (!location.IsValid())
                {
                    return(new BadRequestResult());
                }

                _capacityService.CheckIn(location);
                return(new JsonResult(new { message = "Thanks for checking in!" })
                {
                    StatusCode = 200
                });
            }
            catch (Exception ex)
            {
                log.LogError(ex.ToString());
                throw;
            }
        }
        public int NumberOfDesksOccupiedForLocation(LocationFromRequest location)
        {
            var state            = _repo.Load();
            var keysInThisRegion = state.Keys.Where(x => x.ToLower().StartsWith(location.Value));

            return(keysInThisRegion.Sum(key => state[key]));
        }
        public void CheckIn(LocationFromRequest compoundKey)
        {
            var state = _repo.Load();

            if (!state.ContainsKey(compoundKey))
            {
                state.Add(compoundKey, 0);
            }

            state[compoundKey]++;

            _repo.Save(state);
        }