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"));
            }
        }
Exemple #4
0
        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());
            }
        }
Exemple #6
0
        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));
            }
        }
Exemple #12
0
        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));
        }
Exemple #13
0
        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));
        }
Exemple #14
0
        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));
        }
Exemple #15
0
        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 }));
        }
Exemple #23
0
        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"));
            }
        }
Exemple #24
0
        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"));
        }
Exemple #26
0
        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"));
        }
Exemple #28
0
        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."));
            }
        }