public async Task <List <ShiftJob> > GetOpenShiftJobsByFilter(GetOpenShiftJobsByFilterRequest request)
        {
            string path = $"/api/GetOpenShiftJobsByFilter";

            using (HttpResponseMessage response = await _httpClientWrapper.GetAsync(HttpClientConfigName.RequestService, path, request, CancellationToken.None).ConfigureAwait(false))
            {
                string jsonResponse = await response.Content.ReadAsStringAsync();

                var getJobsResponse = JsonConvert.DeserializeObject <ResponseWrapper <GetOpenShiftJobsByFilterResponse, RequestServiceErrorCode> >(jsonResponse);
                if (getJobsResponse.HasContent && getJobsResponse.IsSuccessful)
                {
                    return(getJobsResponse.Content.ShiftJobs);
                }
                else
                {
                    if (response.StatusCode == System.Net.HttpStatusCode.BadRequest)
                    {
                        throw new BadRequestException($"GetOpenShiftJobsByFilter Returned a bad request");
                    }
                    else
                    {
                        throw new InternalServerException($"GetOpenShiftJobsByFilter Returned {jsonResponse}");
                    }
                }
            }
        }
예제 #2
0
        public async Task <List <SendMessageRequest> > IdentifyRecipients(int?recipientUserId, int?jobId, int?groupId, int?requestId, Dictionary <string, string> additionalParameters)
        {
            GetOpenShiftJobsByFilterRequest request = new GetOpenShiftJobsByFilterRequest();
            var shifts = await _connectRequestService.GetOpenShiftJobsByFilter(request);

            List <Tuple <int, Location> > usersToBeNotified = new List <Tuple <int, Location> >();

            if (shifts != null)
            {
                var locationsSupportActivities = shifts.GroupBy(d => new { d.Location, d.SupportActivity })
                                                 .Select(m => new { m.Key.Location, m.Key.SupportActivity });

                if (locationsSupportActivities != null && locationsSupportActivities.Count() > 0)
                {
                    foreach (var x in locationsSupportActivities)
                    {
                        var locations = await _connectAddressService.GetLocationDetails(x.Location, CancellationToken.None);

                        if (locations != null)
                        {
                            var users = await _connectUserService.GetVolunteersByPostcodeAndActivity(
                                locations.Address.Postcode,
                                new List <SupportActivities>() { x.SupportActivity },
                                _emailConfig.Value.OpenRequestRadius,
                                CancellationToken.None);

                            if (users != null && users.Volunteers.Count() > 0)
                            {
                                usersToBeNotified.AddRange(users.Volunteers.Select(i => new Tuple <int, Location>(i.UserID, x.Location)).ToList());
                            }
                        }
                    }
                }

                if (usersToBeNotified.Count > 0)
                {
                    var openRequests      = shifts.Select(x => x.RequestID).Distinct();
                    var shiftsDetailsSent = await _cosmosDbService.GetAllUserShiftDetailsHaveBeenSentTo(openRequests);

                    foreach (var userId in usersToBeNotified.GroupBy(g => g.Item1).Select(m => m.Key).ToList())
                    {
                        var requestsThatUserHasAlreadyBeenNotifiedAbout = shiftsDetailsSent.Where(x => x.RecipientUserID == userId).Select(x => x.RequestID);
                        var requestsStillToBeNotifiedAbout = openRequests.Where(s => !requestsThatUserHasAlreadyBeenNotifiedAbout.Contains(s)).ToList();

                        if (requestsStillToBeNotifiedAbout.Count > 0)
                        {
                            List <Location>             locations          = usersToBeNotified.Where(x => x.Item1 == userId).Select(m => m.Item2).ToList();
                            string                      parameter          = string.Join(",", locations.Cast <int>().ToArray());
                            Dictionary <string, string> locationParameters = new Dictionary <string, string>();
                            locationParameters.Add("locations", parameter);
                            AddRecipientAndTemplate(TemplateName.RequestNotification, userId, null, null, null, locationParameters);
                        }
                    }
                }
            }

            return(_sendMessageRequests);
        }
예제 #3
0
        private async Task <List <ShiftJob> > GetOpenShiftsForUser(int userId, string locations)
        {
            HelpMyStreet.Contracts.RequestService.Request.LocationsRequest lr = new HelpMyStreet.Contracts.RequestService.Request.LocationsRequest()
            {
                Locations = new List <Location>()
            };

            locations.Split(",").ToList()
            .ForEach(x =>
            {
                lr.Locations.Add((Location)Enum.Parse(typeof(Location), x));
            });

            var userGroups = await _connectGroupService.GetUserGroups(userId);

            List <int> groups = new List <int>();

            if (userGroups != null)
            {
                groups = userGroups.Groups;
            }

            GetOpenShiftJobsByFilterRequest getOpenShiftJobsByFilterRequest = new GetOpenShiftJobsByFilterRequest()
            {
                Locations         = lr,
                SupportActivities = new SupportActivityRequest {
                    SupportActivities = new List <SupportActivities>()
                },
                Groups = new GroupRequest {
                    Groups = groups
                },
            };

            var allShifts = await _connectRequestService.GetOpenShiftJobsByFilter(getOpenShiftJobsByFilterRequest);

            if (allShifts == null)
            {
                throw new Exception($"No shifts returned from user id {userId}");
            }

            var dedupedShifts = allShifts.Distinct(_shiftJobDedupe_EqualityComparer);
            var userShifts    = await GetShiftsForUser(userId);

            var notMyShifts = dedupedShifts.Where(s => !userShifts.Contains(s, _shiftJobDedupe_EqualityComparer)).ToList();

            return(notMyShifts);
        }
예제 #4
0
        public async Task <IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]
            [RequestBodyType(typeof(GetOpenShiftJobsByFilterRequest), "Get Open Shift Jobs By Filter request")] GetOpenShiftJobsByFilterRequest req,
            CancellationToken cancellationToken)
        {
            try
            {
                _logger.LogInformation("GetOpenShiftJobsByFilter started");
                GetOpenShiftJobsByFilterResponse response = await _mediator.Send(req, cancellationToken);

                return(new OkObjectResult(ResponseWrapper <GetOpenShiftJobsByFilterResponse, RequestServiceErrorCode> .CreateSuccessfulResponse(response)));
            }
            catch (Exception exc)
            {
                _logger.LogErrorAndNotifyNewRelic("Exception occured in GetOpenShiftJobsByFilterResponse", exc);
                return(new ObjectResult(ResponseWrapper <GetOpenShiftJobsByFilterResponse, RequestServiceErrorCode> .CreateUnsuccessfulResponse(RequestServiceErrorCode.InternalServerError, "Internal Error"))
                {
                    StatusCode = StatusCodes.Status500InternalServerError
                });
            }
        }