public async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req, ILogger log) { log.LogInformation("GET - Get stop audits requested"); try { if (!RIPAAuthorization.ValidateUserOrAdministratorRole(req, log).ConfigureAwait(false).GetAwaiter().GetResult()) { return(new UnauthorizedResult()); } } catch (Exception ex) { log.LogError(ex.Message); return(new UnauthorizedResult()); } string id = req.Query["id"]; string queryString = $"SELECT * FROM c WHERE Substring(c.id, 0, 12) = \"{id}\""; IEnumerable <Common.Models.Stop> stopResponse; try { stopResponse = await _stopAuditCosmosDbService.GetStopAuditsAsync(queryString); } catch (Exception ex) { log.LogError(ex, "An error occurred getting stop audits requested."); return(new BadRequestObjectResult("An error occurred getting stop audits requested. Please try again.")); } return(new OkObjectResult(stopResponse)); }
public async Task <IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "delete", Route = "DeleteUser/{Id}")] HttpRequest req, string Id, ILogger log) { log.LogInformation("Delete - Delete User requested"); try { if (!RIPAAuthorization.ValidateAdministratorRole(req, log).ConfigureAwait(false).GetAwaiter().GetResult()) { return(new UnauthorizedResult()); } } catch (Exception ex) { log.LogError(ex.Message); return(new UnauthorizedResult()); } if (!string.IsNullOrEmpty(Id)) { await _userProfileCosmosDbService.DeleteUserProfileAsync(Id); return(new OkObjectResult($"Deleted {Id}")); } return(new BadRequestObjectResult("Not found")); }
public static async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "delete", Route = "DeleteStatute/{Id}")] HttpRequest req, int Id, [Table("Statutes", Connection = "RipaStorage")] CloudTable statutes, ILogger log) { try { if (!RIPAAuthorization.ValidateAdministratorRole(req, log).ConfigureAwait(false).GetAwaiter().GetResult()) { return(new UnauthorizedResult()); } } catch (Exception ex) { log.LogError(ex.Message); return(new UnauthorizedResult()); } try { Statute statute = new Statute { PartitionKey = "CA", RowKey = Id.ToString(), OffenseCode = Id, ETag = "*" }; TableOperation deleteOperation = TableOperation.Delete(statute); TableResult result = await statutes.ExecuteAsync(deleteOperation); return(new OkObjectResult(result)); } catch { return(new BadRequestObjectResult("Statute Offense Code not found")); } }
public async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req, ILogger log) { log.LogInformation("Getting Historical CPRA Reports"); try { if (!RIPAAuthorization.ValidateUserOrAdministratorRole(req, log).ConfigureAwait(false).GetAwaiter().GetResult()) { return(new UnauthorizedResult()); } } catch (Exception ex) { log.LogError(ex.Message); return(new UnauthorizedResult()); } await _blobContainerClient.CreateIfNotExistsAsync(); var blobs = _blobContainerClient.GetBlobsAsync(); var response = new List <string>(); await foreach (BlobItem blob in blobs) { response.Add(blob.Name); } return(new OkObjectResult(response)); }
public async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req, ILogger log) { log.LogInformation("Downloading CPRA report"); try { if (!RIPAAuthorization.ValidateUserOrAdministratorRole(req, log).ConfigureAwait(false).GetAwaiter().GetResult()) { return(new UnauthorizedResult()); } } catch (Exception ex) { log.LogError(ex.Message); return(new UnauthorizedResult()); } var fileName = req.Query["FileName"]; try { var resultFile = await blobUtilities.GetBlob(fileName, _blobContainerClient); return(new FileContentResult(resultFile.Value.Content.ToArray(), "application/octet-stream") { FileDownloadName = fileName }); } catch (Exception) { return(new NotFoundResult()); } }
public async Task <IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get", Route = "GetStop/{Id}")] HttpRequest req, string Id, ILogger log) { log.LogInformation("GET - Get Stop requested"); try { if (!RIPAAuthorization.ValidateAdministratorRole(req, log).ConfigureAwait(false).GetAwaiter().GetResult()) { return(new UnauthorizedResult()); } } catch (Exception ex) { log.LogError(ex.Message); return(new UnauthorizedResult()); } if (!string.IsNullOrEmpty(Id)) { var response = await _stopCosmosDbService.GetStopAsync(Id); if (response != null) { return(new OkObjectResult(response)); } } return(new BadRequestObjectResult("Not found")); }
public static async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req, [Table("Statutes", Connection = "RipaStorage")] CloudTable statutes, ILogger log) { try { if (!RIPAAuthorization.ValidateUserOrAdministratorRole(req, log).ConfigureAwait(false).GetAwaiter().GetResult()) { return(new UnauthorizedResult()); } } catch (Exception ex) { log.LogError(ex.Message); return(new UnauthorizedResult()); } List <Statute> response = new List <Statute>(); TableContinuationToken continuationToken = null; do { var request = await statutes.ExecuteQuerySegmentedAsync(new TableQuery <Statute>(), continuationToken); continuationToken = request.ContinuationToken; foreach (Statute entity in request) { response.Add(entity); } }while (continuationToken != null); log.LogInformation($"GetStatutes returned {response.Count} statutes"); return(new OkObjectResult(response)); }
public static async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "get", Route = "GetTemplate/{Id}")] HttpRequest req, string Id, [Table("Templates", Connection = "RipaStorage")] CloudTable templates, ILogger log) { try { if (!RIPAAuthorization.ValidateUserOrAdministratorRole(req, log).ConfigureAwait(false).GetAwaiter().GetResult()) { return(new UnauthorizedResult()); } } catch (Exception ex) { log.LogError(ex.Message); return(new UnauthorizedResult()); } try { TableOperation getOperation = TableOperation.Retrieve <Template>(partitionKey: "CA", rowkey: Id); TableResult result = await templates.ExecuteAsync(getOperation); if (result.Result == null) { throw new Exception("Template not found"); } return(new OkObjectResult((Template)result.Result)); } catch { return(new BadRequestObjectResult("Template not found")); } }
public static async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "Put", Route = "PutCity/{Id}")] City city, HttpRequest req, string Id, [Table("Cities", Connection = "RipaStorage")] CloudTable cities, ILogger log) { try { if (!RIPAAuthorization.ValidateAdministratorRole(req, log).ConfigureAwait(false).GetAwaiter().GetResult()) { return(new UnauthorizedResult()); } } catch (Exception ex) { log.LogError(ex.Message); return(new UnauthorizedResult()); } try { city.PartitionKey = "CA"; city.RowKey = Id; city.Name = Id; city.ETag = "*"; city.State = "CA"; TableOperation createOperation = TableOperation.InsertOrReplace(city); TableResult result = await cities.ExecuteAsync(createOperation); return(new OkObjectResult(result)); } catch { return(new BadRequestObjectResult("City failed on insert or replace")); } }
public static async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "put", Route = "PutBeat/{Id}")] Beat beat, HttpRequest req, int Id, [Table("Beats", Connection = "RipaStorage")] CloudTable beats, ILogger log) { try { if (!RIPAAuthorization.ValidateAdministratorRole(req, log).ConfigureAwait(false).GetAwaiter().GetResult()) { return(new UnauthorizedResult()); } } catch (Exception ex) { log.LogError(ex.Message); return(new UnauthorizedResult()); } try { beat.PartitionKey = "CA"; beat.RowKey = Id.ToString(); beat.Id = Id; beat.ETag = "*"; TableOperation createOperation = TableOperation.InsertOrReplace(beat); TableResult result = await beats.ExecuteAsync(createOperation); return(new OkObjectResult(result)); } catch { return(new BadRequestObjectResult("beat failed on insert or replace")); } }
public async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req, ILogger log) { try { if (!RIPAAuthorization.ValidateUserOrAdministratorRole(req, log).ConfigureAwait(false).GetAwaiter().GetResult()) { return(new UnauthorizedResult()); } } catch (Exception ex) { log.LogError(ex.Message); return(new UnauthorizedResult()); } string requestBody = await new StreamReader(req.Body).ReadToEndAsync(); dynamic data = JsonConvert.DeserializeObject(requestBody); string document = data?.Document; if (string.IsNullOrEmpty(document)) { document = data?.document; } if (string.IsNullOrEmpty(document)) { return(new BadRequestObjectResult("Must Provide Document")); } try { PiiEntityCollection piiEntities = await _piiTextAnalyticsService.GetPiiEntities(document); PiiResponse piiResponse = new PiiResponse() { RedactedText = piiEntities.RedactedText, PiiEntities = new List <PiiEntity>(), MinimumConfidenceScore = _minimumConfidenceScore, AllowedCategories = _allowedCategories }; foreach (var entity in piiEntities.Where(x => (x.ConfidenceScore > _minimumConfidenceScore) && _allowedCategories.Any(x.Category.ToString().Equals))) { piiResponse.PiiEntities.Add(new PiiEntity { EntityText = entity.Text, ConfidenceScore = $"{entity.ConfidenceScore:F2}", Category = entity.Category.ToString() }); } return(new OkObjectResult(piiResponse)); } catch (Exception ex) { log.LogError("There was an error checking for PII: ", ex.Message, ex.InnerException); return(new BadRequestObjectResult(ex.Message)); } }
public async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req, ILogger log) { log.LogInformation("C# HTTP trigger function processed a request."); try { if (!RIPAAuthorization.ValidateUserOrAdministratorRole(req, log).ConfigureAwait(false).GetAwaiter().GetResult()) { return(new UnauthorizedResult()); } } catch (Exception ex) { log.LogError(ex.Message); return(new UnauthorizedResult()); } string requestBody = await new StreamReader(req.Body).ReadToEndAsync(); dynamic data = JsonConvert.DeserializeObject(requestBody); string document = data?.Document; if (string.IsNullOrEmpty(document)) { document = data?.document; } if (string.IsNullOrEmpty(document)) { return(new BadRequestObjectResult("Must Provide Document")); } var categorizedEntities = await _piiTextAnalyticsService.GetCategorizedEntities(document); EntityResponse entityResponse = new EntityResponse() { Entities = new List <Entity>() }; foreach (var entity in categorizedEntities.Where(x => x.ConfidenceScore > .75)) { entityResponse.Entities.Add(new Entity { EntityText = entity.Text, ConfidenceScore = $"{entity.ConfidenceScore:F2}", Category = entity.Category.ToString() }); } entityResponse.RedactedText = RedactText(entityResponse.Entities, document); return(new OkObjectResult(entityResponse)); }
public static async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req, [Table("Templates", Connection = "RipaStorage")] CloudTable templates, ILogger log) { try { if (!RIPAAuthorization.ValidateUserOrAdministratorRole(req, log).ConfigureAwait(false).GetAwaiter().GetResult()) { return(new UnauthorizedResult()); } } catch (Exception ex) { log.LogError(ex.Message); return(new UnauthorizedResult()); } List <object> response = new List <object>(); TableContinuationToken continuationToken = null; do { var request = await templates.ExecuteQuerySegmentedAsync(new TableQuery <Template>(), continuationToken); continuationToken = request.ContinuationToken; var orderedRequest = request.Results.OrderBy(e => e.Id); foreach (Template entity in orderedRequest) { if (entity?.DeactivationDate <= DateTime.Now) { continue; } response.Add(new { id = entity.Id, displayName = entity.DisplayName, deactivationDate = entity.DeactivationDate, stop = JsonConvert.DeserializeObject(entity.StopTemplate) }); } }while (continuationToken != null); log.LogInformation($"GetTemplates returned {response.Count} templates"); return(new OkObjectResult(response)); }
public async Task <IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "put", Route = "PutUser/{Id}")] Common.Models.UserProfile userProfile, HttpRequest req, string Id, ILogger log) { log.LogInformation("PUT - Put User requested"); try { if (!RIPAAuthorization.ValidateUserOrAdministratorRole(req, log).ConfigureAwait(false).GetAwaiter().GetResult()) { return(new UnauthorizedResult()); } } catch (Exception ex) { log.LogError(ex.Message); return(new UnauthorizedResult()); } if (!string.IsNullOrEmpty(userProfile.OfficerId) && userProfile.OfficerId.Length != 9) { return(new BadRequestObjectResult("OfficerId must be 9 chars")); } if (string.IsNullOrEmpty(userProfile.OfficerId)) { int officerId = 100000000; string query = "SELECT VALUE c FROM c ORDER BY c.officerId DESC OFFSET 0 LIMIT 1"; IEnumerable <Common.Models.UserProfile> maxOfficer = await _userProfileCosmosDbService.GetUserProfilesAsync(query); Common.Models.UserProfile maxId = maxOfficer.FirstOrDefault(); if (maxId != null) { officerId = int.Parse(maxId.OfficerId); officerId++; } userProfile.OfficerId = officerId.ToString(); } userProfile.Id = Id; await _userProfileCosmosDbService.UpdateUserProfileAsync(Id, userProfile); return(new OkObjectResult(userProfile)); }
public async Task <IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req, ILogger log) { log.LogInformation("GET - Get Submissions requested"); try { if (!RIPAAuthorization.ValidateAdministratorRole(req, log).ConfigureAwait(false).GetAwaiter().GetResult()) { return(new UnauthorizedResult()); } } catch (Exception ex) { log.LogError(ex.Message); return(new UnauthorizedResult()); } SubmissionQuery submissionQuery = new SubmissionQuery() { StartDate = !string.IsNullOrWhiteSpace(req.Query["StartDate"]) ? DateTime.Parse(req.Query["StartDate"]) : DateTime.MinValue, EndDate = !string.IsNullOrWhiteSpace(req.Query["EndDate"]) ? DateTime.Parse(req.Query["EndDate"]) : DateTime.MaxValue, Offset = !string.IsNullOrWhiteSpace(req.Query["offset"]) ? Convert.ToInt32(req.Query["offset"]) : default,
public async Task <IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req, ILogger log) { log.LogInformation("GET - Get Users requested"); try { if (!RIPAAuthorization.ValidateAdministratorRole(req, log).ConfigureAwait(false).GetAwaiter().GetResult()) { return(new UnauthorizedResult()); } } catch (Exception ex) { log.LogError(ex.Message); return(new UnauthorizedResult()); } var response = await _userProfileCosmosDbService.GetUserProfilesAsync("SELECT * FROM c ORDER BY c.name"); return(new OkObjectResult(response)); }
public async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req, ILogger log) { log.LogInformation("Get - GetErrorCodes requested."); try { if (!RIPAAuthorization.ValidateAdministratorRole(req, log).ConfigureAwait(false).GetAwaiter().GetResult()) { return(new UnauthorizedResult()); } } catch (Exception ex) { log.LogError(ex.Message); return(new UnauthorizedResult()); } var inputText = req.Query["Search"]; var submissionId = req.Query["SubmissionId"]; var response = await _stopCosmosDbService.GetErrorCodes(inputText, submissionId); return(new OkObjectResult(response)); }
public static async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "Put", Route = "PutSchool/{Id}")] School school, HttpRequest req, string Id, [Table("Schools", Connection = "RipaStorage")] CloudTable schools, ILogger log) { try { if (!RIPAAuthorization.ValidateAdministratorRole(req, log).ConfigureAwait(false).GetAwaiter().GetResult()) { return(new UnauthorizedResult()); } } catch (Exception ex) { log.LogError(ex.Message); return(new UnauthorizedResult()); } try { if (string.IsNullOrWhiteSpace(school.CDSCode)) { throw new Exception("CDS CODE Must be provided"); } school.PartitionKey = "CA"; school.RowKey = Id; school.Name = Id; school.ETag = "*"; TableOperation createOperation = TableOperation.InsertOrReplace(school); TableResult result = await schools.ExecuteAsync(createOperation); return(new OkObjectResult(result)); } catch { return(new BadRequestObjectResult("School failed on insert or replace")); } }
public static async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "Put", Route = "PutStatute/{Id}")] Statute statute, HttpRequest req, int Id, [Table("Statutes", Connection = "RipaStorage")] CloudTable statutes, ILogger log) { try { if (!RIPAAuthorization.ValidateAdministratorRole(req, log).ConfigureAwait(false).GetAwaiter().GetResult()) { return(new UnauthorizedResult()); } } catch (Exception ex) { log.LogError(ex.Message); return(new UnauthorizedResult()); } try { if (statute.OffenseCode == 0) { throw new Exception("Offense Code Must be type Integer and is required"); } statute.PartitionKey = "CA"; statute.RowKey = Id.ToString(); statute.OffenseCode = Id; statute.ETag = "*"; TableOperation createOperation = TableOperation.InsertOrReplace(statute); TableResult result = await statutes.ExecuteAsync(createOperation); return(new OkObjectResult(result)); } catch { return(new BadRequestObjectResult("Statute failed on insert or replace")); } }
public static async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "Put", Route = "PutTemplate/{Id}")] Template template, HttpRequest req, string Id, [Table("Templates", Connection = "RipaStorage")] CloudTable templates, ILogger log) { try { if (!RIPAAuthorization.ValidateAdministratorRole(req, log).ConfigureAwait(false).GetAwaiter().GetResult()) { return(new UnauthorizedResult()); } } catch (Exception ex) { log.LogError(ex.Message); return(new UnauthorizedResult()); } try { if (String.IsNullOrEmpty(Id)) { throw new Exception("template id is required"); } template.PartitionKey = "CA"; template.RowKey = Id; template.ETag = "*"; TableOperation createOperation = TableOperation.InsertOrReplace(template); TableResult result = await templates.ExecuteAsync(createOperation); return(new OkObjectResult(result)); } catch { return(new BadRequestObjectResult("Template failed on insert or replace")); } }
public async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] SubmitRequest submitRequest, HttpRequest req, ILogger log) { log.LogInformation("Submit to DOJ requested"); try { if (!RIPAAuthorization.ValidateUserOrAdministratorRole(req, log).ConfigureAwait(false).GetAwaiter().GetResult()) { return(new UnauthorizedResult()); } } catch (Exception ex) { log.LogError(ex.Message); return(new UnauthorizedResult()); } UserProfile userProfile; try { var objectId = await RIPAAuthorization.GetUserId(req, log); userProfile = (await _userProfileCosmosDbService.GetUserProfileAsync(objectId)); if (userProfile == null) { throw new Exception($"User profile not found for {objectId}"); } } catch (Exception ex) { log.LogError(ex.Message); return(new BadRequestObjectResult("User profile was not found")); } if (submitRequest?.StopIds == null || submitRequest.StopIds.Count == 0) { return(new BadRequestObjectResult("stop ids are required")); } var where = Environment.NewLine + $"WHERE c.id IN ('{string.Join("','", submitRequest.StopIds)}')"; var order = Environment.NewLine + $"ORDER BY c.StopDateTime DESC"; IEnumerable <Stop> stopResponse; try { stopResponse = await _stopCosmosDbService.GetStopsAsync($"SELECT VALUE c FROM c {where} {order}"); } catch (Exception ex) { log.LogError(ex, "An error occurred getting stops requested."); return(new BadRequestObjectResult("An error occurred getting stops requested. Please try again.")); } SubmissionUtilities submissionUtilities = new SubmissionUtilities(_stopCosmosDbService, _submissionCosmosDbService, _sftpService, log); Guid submissionId; try { List <string> errorList = submissionUtilities.ValidateStops(stopResponse); if (errorList.Any()) { errorList.Add("Please adjust your filter criteria and try again."); return(new BadRequestObjectResult(string.Join(Environment.NewLine, errorList))); } } catch (Exception ex) { log.LogError(ex, "An error occurred validating stops."); return(new BadRequestObjectResult("An error validating stops requested. Please try again.")); } try { submissionId = await submissionUtilities.NewSubmission(stopResponse, userProfile); foreach (var stop in stopResponse) { stop.Status = Enum.GetName(typeof(SubmissionStatus), SubmissionStatus.Pending); await _stopCosmosDbService.UpdateStopAsync(stop); } } catch (Exception ex) { log.LogError($"Failure Adding Submission to CosmosDb, No Records Submitted: {ex.Message}"); return(new BadRequestObjectResult($"Failure Adding Submission to CosmosDb, No Records Submitted: {ex.Message}")); } await _serviceBusService.SendServiceBusMessagesAsync(stopResponse.Select(x => new ServiceBusMessage(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(new SubmissionMessage() { StopId = x.Id, SubmissionId = submissionId })))).ToList()); return(new OkObjectResult(new { submissionId })); }
public async Task <IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req, ILogger log) { log.LogInformation("Submit to DOJ requested - submit search"); try { if (!RIPAAuthorization.ValidateUserOrAdministratorRole(req, log).ConfigureAwait(false).GetAwaiter().GetResult()) { return(new UnauthorizedResult()); } } catch (Exception ex) { log.LogError(ex.Message); return(new UnauthorizedResult()); } UserProfile userProfile; try { var objectId = await RIPAAuthorization.GetUserId(req, log); userProfile = (await _userProfileCosmosDbService.GetUserProfileAsync(objectId)); if (userProfile == null) { throw new Exception($"User profile not found for {objectId}"); } } catch (Exception ex) { log.LogError(ex.Message); return(new BadRequestObjectResult("User profile was not found")); } string stopQueryString = String.Empty; try { StopQueryUtility stopQueryUtility = new StopQueryUtility(); StopQuery stopQuery = stopQueryUtility.GetStopQuery(req); stopQueryString = stopQueryUtility.GetStopsQueryString(stopQuery, false); } catch (Exception ex) { log.LogError("An error occured while evaluating the stop query.", ex); return(new BadRequestObjectResult("An error occured while evaluating the stop query. Please try again.")); } IEnumerable <Stop> stopResponse; try { stopResponse = await _stopCosmosDbService.GetStopsAsync(stopQueryString); } catch (Exception ex) { log.LogError(ex, "An error occurred getting stops requested."); return(new BadRequestObjectResult("An error occurred getting stops requested. Please try again.")); } SubmissionUtilities submissionUtilities = new SubmissionUtilities(_stopCosmosDbService, _submissionCosmosDbService, _sftpService, log); Guid submissionId; if (!submissionUtilities.IsValidSFTPConnection()) { return(new BadRequestObjectResult("An error occurred connecting to DOJ SFTP service.")); } try { List <string> errorList = submissionUtilities.ValidateStops(stopResponse); if (errorList.Any()) { errorList.Add("Please adjust your filter criteria and try again."); return(new BadRequestObjectResult(string.Join(Environment.NewLine, errorList))); } } catch (Exception ex) { log.LogError(ex, "An error occurred validating stops."); return(new BadRequestObjectResult("An error validating stops requested. Please try again.")); } try { submissionId = await submissionUtilities.NewSubmission(stopResponse, userProfile); } catch (Exception ex) { log.LogError($"Failure Adding Submission to CosmosDb, No Records Submitted: {ex.Message}"); return(new BadRequestObjectResult($"Failure Adding Submission to CosmosDb, No Records Submitted: {ex.Message}")); } await _submissionServiceBusService.SendServiceBusMessagesAsync(stopResponse.Select(x => new ServiceBusMessage(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(new SubmissionMessage() { StopId = x.Id, SubmissionId = submissionId })))).ToList()); return(new OkObjectResult(new { submissionId })); }
public static async Task <IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req, ILogger log) { try { if (!RIPAAuthorization.ValidateAdministratorRole(req, log).ConfigureAwait(false).GetAwaiter().GetResult()) { return(new UnauthorizedResult()); } } catch (Exception ex) { log.LogError(ex.Message); return(new UnauthorizedResult()); } try { int recordCount = 0; _log = log; var formData = await req.ReadFormAsync(); var file = req.Form.Files["file"]; var account = CloudStorageAccount.Parse(Environment.GetEnvironmentVariable("RipaStorage")); var client = account.CreateCloudTableClient(); DataSet dataSet = RunExcelDataReader(file); if (dataSet.Tables["Beat_Table"] != null) { recordCount += await ProcessEntities(dataSet.Tables["Beat_Table"], client.GetTableReference("Beats")); } recordCount += await ProcessEntities(dataSet.Tables["City_Table"], client.GetTableReference("Cities")); recordCount += await ProcessEntities(dataSet.Tables["School_Table"], client.GetTableReference("Schools")); // CA DOJ currently has the table name as "Offense Table" which does not follow the conventions of the other tables if (dataSet.Tables["Offense_Table"] != null) { recordCount += await ProcessEntities(dataSet.Tables["Offense_Table"], client.GetTableReference("Statutes")); } else if (dataSet.Tables["Offense Table"] != null) { recordCount += await ProcessEntities(dataSet.Tables["Offense Table"], client.GetTableReference("Statutes")); } string responseMessage; if (recordCount >= 1) { responseMessage = $"Upload complete: {recordCount} {(recordCount > 1 ? "records" : "record")} updated."; } else { responseMessage = "No records found"; } return(new OkObjectResult(responseMessage)); } catch (Exception ex) { _log.LogError(ex.Message); return(new BadRequestObjectResult("File Format Error. Sheets should be included: City_Table, School_Table, and Offense_Table")); } }
public async Task <IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req, ILogger log) { log.LogInformation("GET - Get Stops requested"); try { if (!RIPAAuthorization.ValidateUserOrAdministratorRole(req, log).ConfigureAwait(false).GetAwaiter().GetResult()) { return(new UnauthorizedResult()); } } catch (Exception ex) { log.LogError(ex.Message); return(new UnauthorizedResult()); } string stopQueryString = String.Empty; string stopSummaryQueryString = String.Empty; try { StopQueryUtility stopQueryUtility = new StopQueryUtility(); StopQuery stopQuery = stopQueryUtility.GetStopQuery(req); stopQueryString = stopQueryUtility.GetStopsQueryString(stopQuery, true); stopSummaryQueryString = stopQueryUtility.GetStopsSummaryQueryString(stopQuery); } catch (Exception ex) { log.LogError("An error occured while evaluating the stop query.", ex); return(new BadRequestObjectResult("An error occured while evaluating the stop query. Please try again.")); } IEnumerable <Common.Models.Stop> stopResponse; IEnumerable <StopStatusCount> stopStatusCounts; try { stopResponse = await _stopCosmosDbService.GetStopsAsync(stopQueryString); stopStatusCounts = await _stopCosmosDbService.GetStopStatusCounts(stopSummaryQueryString); } catch (Exception ex) { log.LogError(ex, "An error occurred getting stops requested."); return(new BadRequestObjectResult("An error occurred getting stops requested. Please try again.")); } var response = new { stops = stopResponse, summary = new SummaryResponse() { Total = stopStatusCounts.Sum(x => x.Count), Submitted = stopStatusCounts.Where(x => x.Status == "Submitted").Select(x => x.Count).FirstOrDefault(), Resubmitted = stopStatusCounts.Where(x => x.Status == "Resubmitted").Select(x => x.Count).FirstOrDefault(), Unsubmitted = stopStatusCounts.Where(x => x.Status == "Unsubmitted").Select(x => x.Count).FirstOrDefault(), Pending = stopStatusCounts.Where(x => x.Status == "Pending").Select(x => x.Count).FirstOrDefault(), Failed = stopStatusCounts.Where(x => x.Status == "Failed").Select(x => x.Count).FirstOrDefault(), } }; return(new OkObjectResult(response)); }
public async Task <IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "put", Route = "PutStop/{Id}")] Common.Models.Stop stop, HttpRequest req, string Id, ILogger log) { log.LogInformation($"PUT - Put Stop requested, ID: {Id}, OID: {stop.OfficerId}, DATE: {stop.Date}, TIME: {stop.Time}"); try { if (!RIPAAuthorization.ValidateUserOrAdministratorRole(req, log).ConfigureAwait(false).GetAwaiter().GetResult()) { return(new UnauthorizedResult()); } } catch (Exception ex) { log.LogError(ex.Message); return(new UnauthorizedResult()); } try { var objectId = await RIPAAuthorization.GetUserId(req, log); stop.EditStopOfficerId = (await _userProfileCosmosDbService.GetUserProfileAsync(objectId)).OfficerId; } catch (Exception ex) { log.LogError(ex.Message); return(new BadRequestObjectResult("User profile was not found")); } if (string.IsNullOrEmpty(Id)) { return(new BadRequestObjectResult("Stop Id cannot be empty or null")); } if (stop.OfficerId.Length != 9) { return(new BadRequestObjectResult("Officer ID must be 9 char")); } if (stop.Location.City == null) { return(new BadRequestObjectResult("City is required")); } if (stop.Status == null) { stop.Status = SubmissionStatus.Unsubmitted.ToString(); } stop.Ori = Environment.GetEnvironmentVariable("ORI"); //What is an Originating Agency Identification (ORI) Number? A nine-character identifier assigned to an agency. Agencies must identify their ORI Number... bool isDuplicate = await _stopCosmosDbService.CheckForDuplicateStop(stop.Id, stop.Ori, stop.OfficerId, stop.Date, stop.Time); if (isDuplicate) { log.LogError($"This appears to be a duplicate Stop: ID: {Id}, SID: {stop.Id}, OID: {stop.OfficerId}, DATE: {stop.Date}, TIME: {stop.Time}"); return(new BadRequestObjectResult("This appears to be a duplicate Stop")); } stop.IsEdited = Id == "0" ? false : true; try { if (Id != "0") { //Protect the submission history Common.Models.Stop editingStop = await _stopCosmosDbService.GetStopAsync(Id); editingStop.Id = $"{stop.Id}-{DateTime.UtcNow:yyyyMMddHHmmss}"; await _stopAuditCosmosDbService.UpdateStopAuditAsync(editingStop.Id, editingStop); log.LogInformation($"Saving stop audit ID: {editingStop.Id}"); stop.ListSubmission = editingStop.ListSubmission; } } catch (Exception ex) { log.LogError($"Failed getting stop to protect submission history, ID: {Id}, SID: {stop.Id}, OID: {stop.OfficerId}, DATE: {stop.Date}, TIME: {stop.Time}"); return(new BadRequestObjectResult("Failed getting stop submission history")); } int retryAttemps = GetRetrySetting("RetryAttemps", 3); int retrywait = GetRetrySetting("RetryWait", 1000); while (retryAttemps > 0) { try { stop.Id = Id; if (stop.Id == "0") { await _stopCosmosDbService.AddStopAsync(stop); } else { if (!RIPAAuthorization.ValidateAdministratorRole(req, log).ConfigureAwait(false).GetAwaiter().GetResult()) { return(new UnauthorizedResult()); } await _stopCosmosDbService.UpdateStopAsync(stop); } log.LogInformation($"PUT - saved stop, ID: {Id}, SID: {stop.Id}, OID: {stop.OfficerId}, DATE: {stop.Date}, TIME: {stop.Time}"); return(new OkObjectResult(stop)); } catch (Exception exception) { log.LogError($"Failed to insert/update stop, attempt counter: {retryAttemps}, ID: {Id}, SID: {stop.Id}, OID: {stop.OfficerId}, DATE: {stop.Date}, TIME: {stop.Time}", exception.GetBaseException()); } await Task.Delay(retrywait); retryAttemps--; } return(new BadRequestObjectResult("The maximum number of attemps to save the STOP was exceeded")); }
public async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] string officerName, HttpRequest req, ILogger log) { log.LogInformation("CPRA Report Generation Requested"); try { if (!RIPAAuthorization.ValidateUserOrAdministratorRole(req, log).ConfigureAwait(false).GetAwaiter().GetResult()) { return(new UnauthorizedResult()); } } catch (Exception ex) { log.LogError(ex.Message); return(new UnauthorizedResult()); } await _blobContainerClient.CreateIfNotExistsAsync(); byte[] fileBytes; string tempPath = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.csv"); var startDate = req.Query["StartDate"]; var endDate = req.Query["EndDate"]; var fileName = $"{startDate}-{endDate}-CPRAReport.csv"; string stopQueryString; string stopSummaryQueryString; try { StopQueryUtility stopQueryUtility = new StopQueryUtility(); StopQuery stopQuery = stopQueryUtility.GetStopQuery(req); stopQueryString = stopQueryUtility.GetStopsQueryString(stopQuery, true, true); stopSummaryQueryString = stopQueryUtility.GetStopsSummaryQueryString(stopQuery); } catch (Exception ex) { log.LogError("An error occurred while evaluating the stop query.", ex); return(new BadRequestObjectResult("An error occurred while evaluating the stop query. Please try again.")); } List <Stop> stopResponse; IEnumerable <StopStatusCount> stopStatuses; int totalStopCount = 0; try { stopResponse = await _stopCosmosDbService.GetStopsAsync(stopQueryString) as List <Stop>; stopStatuses = await _stopCosmosDbService.GetStopStatusCounts(stopSummaryQueryString); foreach (var stopStatus in stopStatuses) { totalStopCount += stopStatus.Count; } } catch (Exception ex) { log.LogError("An error occurred getting stops requested.", ex); return(new BadRequestObjectResult("An error occurred getting stops requested. Please try again.")); } if (totalStopCount == 0) { return(new OkObjectResult("No valid stops were found during that date range.")); } var builder = new StringBuilder(); try { foreach (var stop in stopResponse) { var dojStop = _stopService.CastToDojStop(stop); dojStop.Officer = null; var jsonStop = JsonConvert.SerializeObject(dojStop); if (stop.Location.Beat != null) { jsonStop += $"|{stop.Location.Beat.Codes.Text}"; } jsonStop = jsonStop.Replace("\"", "\"\""); builder.AppendLine($"\"{jsonStop}\""); } } catch (Exception ex) { log.LogError("An error occurred while parsing stops.", ex.Message); } await File.WriteAllTextAsync(tempPath, builder.ToString(), Encoding.UTF8); using (StreamReader sr = new StreamReader(tempPath)) { using (MemoryStream ms = new MemoryStream()) { sr.BaseStream.CopyTo(ms); fileBytes = ms.ToArray(); } } File.Delete(tempPath); try { await blobUtilities.UploadBlobCpraReport(fileBytes, fileName, officerName, _blobContainerClient); } catch (Exception ex) { return(new BadRequestObjectResult(ex.Message)); } var result = new CpraResult { FileName = $"{officerName}/{fileName}", CpraItems = new List <CpraListItem> { new CpraListItem() { Level = 1, Header = "Total stops in date range", Detail = totalStopCount.ToString(), }, new CpraListItem() { Level = 1, Header = "Submitted stops included on report", Detail = stopResponse.Count.ToString(), }, new CpraListItem() { Level = 1, Header = "From Date", Detail = startDate, }, new CpraListItem() { Level = 1, Header = "To Date", Detail = endDate, } } }; return(new OkObjectResult(result)); }
public async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "get", Route = "GetSubmission/{Id}")] HttpRequest req, string Id, ILogger log) { log.LogInformation("GET - Get Submission requested"); try { if (!RIPAAuthorization.ValidateAdministratorRole(req, log).ConfigureAwait(false).GetAwaiter().GetResult()) { return(new UnauthorizedResult()); } } catch (Exception ex) { log.LogError(ex.Message); return(new UnauthorizedResult()); } //limit var queryLimit = !string.IsNullOrWhiteSpace(req.Query["limit"]) ? Convert.ToInt32(req.Query["limit"]) : default; var queryOffset = !string.IsNullOrWhiteSpace(req.Query["offset"]) ? Convert.ToInt32(req.Query["offset"]) : default; var limit = string.Empty; if (queryLimit != 0) { limit = Environment.NewLine + $"OFFSET {queryOffset} LIMIT {queryLimit}"; } var queryOrderBy = !string.IsNullOrWhiteSpace(req.Query["OrderBy"]) ? req.Query["OrderBy"] : default; var queryOrder = !string.IsNullOrWhiteSpace(req.Query["Order"]) ? req.Query["Order"] : default; var order = Environment.NewLine + "ORDER BY c.StopDateTime DESC"; if (!string.IsNullOrWhiteSpace(queryOrderBy)) { order = Environment.NewLine + $"ORDER BY c.{queryOrderBy} "; if (!string.IsNullOrWhiteSpace(queryOrder)) { if (queryOrder.ToString().ToUpperInvariant() == "DESC" || queryOrder.ToString().ToUpperInvariant() == "ASC") { order += queryOrder; } } } List <string> whereStatements = new List <string>(); string join = string.Empty; join += Environment.NewLine + "JOIN ListSubmission IN c.ListSubmission"; whereStatements.Add(Environment.NewLine + $"ListSubmission.Id = '{Id}'"); if (!string.IsNullOrWhiteSpace(req.Query["ErrorCode"])) { join += Environment.NewLine + "JOIN ListSubmissionError IN ListSubmission.ListSubmissionError"; whereStatements.Add(Environment.NewLine + $"ListSubmissionError.Code = '{req.Query["ErrorCode"]}'"); } string where = string.Empty; if (whereStatements.Count > 0) { where = " WHERE "; foreach (var whereStatement in whereStatements) { where += Environment.NewLine + whereStatement; where += Environment.NewLine + "AND"; } where = where.Remove(where.Length - 3); } if (!string.IsNullOrEmpty(Id)) { var submissionResponse = await _submissionCosmosDbService.GetSubmissionAsync(Id); if (submissionResponse != null) { string query = $"SELECT VALUE c FROM c {join} {where} {order} {limit}"; var stopResponse = await _stopCosmosDbService.GetStopsAsync(query); var getSubmissionErrorSummariesResponse = await _stopCosmosDbService.GetSubmissionErrorSummaries(Id); var response = new { submission = new { submissionResponse.Id, submissionResponse.DateSubmitted, submissionResponse.RecordCount, submissionResponse.OfficerId, submissionResponse.OfficerName, submissionResponse.MaxStopDate, submissionResponse.MinStopDate, ErrorCount = getSubmissionErrorSummariesResponse.Sum(x => x.Count) }, stops = stopResponse, summary = getSubmissionErrorSummariesResponse }; return(new OkObjectResult(response)); } } return(new BadRequestObjectResult("Submission Id not found")); }
public async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req, ILogger log) { log.LogInformation("Importing user profiles from uploaded csv"); var count = 0; try { if (!RIPAAuthorization.ValidateAdministratorRole(req, log).ConfigureAwait(false).GetAwaiter().GetResult()) { return(new UnauthorizedResult()); } } catch (Exception ex) { log.LogError(ex.Message); return(new UnauthorizedResult()); } try { using (var reader = new StreamReader(req.Form.Files[0].OpenReadStream())) using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture)) { var agency = req.Query["agency"]; csv.Context.RegisterClassMap <UserProfileMap>(); var records = csv.GetRecords <Common.Models.UserProfile>().ToList(); count = records.Count(); foreach (var record in records) { record.StartDate = DateTime.Now.AddYears(-record.YearsExperience); if (string.IsNullOrEmpty(record.Agency)) { record.Agency = agency; } record.FirstName ??= ""; record.LastName ??= ""; await _userProfileCosmosDbService.UpdateUserProfileAsync(record.Id, record); } } string responseMessage; if (count >= 0) { responseMessage = $"Upload Complete: {count} {(count > 1 ? "records" : "record")} uploaded"; } else { responseMessage = "No records found"; } return(new OkObjectResult(responseMessage)); } catch (Exception ex) { log.LogError(ex.Message); return(new BadRequestObjectResult("There was an error with the file format. Please verify data and try again.")); } }