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}"); } } } }
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); }
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); }
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 }); } }