Exemplo n.º 1
0
        public static HttpResponseMessage Run([HttpTrigger(AuthorizationLevel.Function, "post", Route = "v1.0/state/{stateAbbreviation}/submit")] HttpRequestMessage req, string stateAbbreviation, TraceWriter log)
        {
            //TODO: handle error responses
            //TODO: integrate with something for JWT bearer tokens
            MongoClient    client   = new MongoClient(System.Environment.GetEnvironmentVariable("ScreeningCosmosDb", EnvironmentVariableTarget.Process));
            IMongoDatabase database = client.GetDatabase("Screening");
            IMongoCollection <PrepareScreeningsForStatePost> collection = database.GetCollection <PrepareScreeningsForStatePost>("Screening");
            IMongoCollection <StateSubmissionConfiguration>  configurationCollection =
                database.GetCollection <StateSubmissionConfiguration>("Screening");

            log.Info("PrepareScreeningsForState function started");

            var content = req.Content.ReadAsStringAsync().Result;

            var prepareScreeningsPost =
                JsonConvert.DeserializeObject <PrepareScreeningsForStatePost>(content);

            if (prepareScreeningsPost != null)
            {
                log.Info("Screenings deserialized");

                collection.InsertOne(prepareScreeningsPost);

                var filter = string.Format("{{ State: '{0}',Type: 'StateSubmissionConfiguration'}}", stateAbbreviation);

                var result = configurationCollection.Find(filter).FirstOrDefault();

                if (result == null)
                {
                    var unitOfWork = new GeneratePhysicalStatePacket();
                    unitOfWork.State      = stateAbbreviation;
                    unitOfWork.StartDate  = prepareScreeningsPost.StartDate;
                    unitOfWork.EndDate    = prepareScreeningsPost.EndDate;
                    unitOfWork.Screenings = prepareScreeningsPost.Screenings;
                    unitOfWork.Execute(() => {
                    }, (f) => { });
                }
                else
                {
                    var unitOfWork = new GenerateSystemXBatchUploadFile();
                    unitOfWork.Configuration = result;
                    unitOfWork.StartDate     = prepareScreeningsPost.StartDate;
                    unitOfWork.EndDate       = prepareScreeningsPost.EndDate;
                    unitOfWork.Screenings    = prepareScreeningsPost.Screenings;
                    unitOfWork.Execute(() => {
                    }, (f) => { });
                }

                return(req.CreateResponse(HttpStatusCode.OK));
            }

            return(req.CreateResponse(HttpStatusCode.OK));
        }
Exemplo n.º 2
0
        public override void Execute(Action onSuccess, Action <Exception> onFailure)
        {
            try
            {
                string filename = string.Format("{0}_{1}_{2}_{3}_{4}_{5}_{6}_{7}.txt",
                                                Configuration.State,
                                                StartDate.Month,
                                                StartDate.Day,
                                                StartDate.Year,
                                                EndDate.Month,
                                                EndDate.Day,
                                                EndDate.Year,
                                                DateTime.Now.Ticks);

                MongoClient    client   = new MongoClient(System.Environment.GetEnvironmentVariable("ScreeningCosmosDb", EnvironmentVariableTarget.Process));
                IMongoDatabase database = client.GetDatabase("Screening");
                IMongoCollection <BsonDocument> collection = database.GetCollection <BsonDocument>("Screening");

                OutputText = string.Empty;
                ChakraRuntime runtime = ChakraRuntime.Create();

                JObject headerObject = new JObject();
                headerObject.Add("StartMonth", StartDate.Month.ToString());
                headerObject.Add("StartDay", StartDate.Day.ToString());
                headerObject.Add("StartYear", StartDate.Year.ToString());
                headerObject.Add("EndMonth", EndDate.Month.ToString());
                headerObject.Add("EndDay", EndDate.Day.ToString());
                headerObject.Add("EndYear", EndDate.Year.ToString());
                headerObject.Add("Ticks", DateTime.Now.Ticks.ToString());
                headerObject.Add("RecordCount", Screenings.Count);

                List <string> headerValues = new List <string>();
                if (Configuration.HeaderConfiguration != null)
                {
                    foreach (StateSubmissionField field in Configuration.HeaderConfiguration)
                    {
                        headerValues.Add(ParseValues(field, headerObject, runtime));
                    }

                    if (Configuration.HeaderConfiguration.Count > 0)
                    {
                        OutputText += ((Configuration.EncloseFieldsInQuotes ? "\"" : string.Empty) + string.Join(Configuration.DefaultDelimiter, headerValues) + (Configuration.EncloseFieldsInQuotes ? "\"" : string.Empty)) + "\n";
                    }
                }

                if (Screenings != null)
                {
                    List <Screening> screeningsToPrint = new List <Screening>();
                    foreach (var screening in Screenings)
                    {
                        var jsonObject = JObject.FromObject(screening);

                        if (!string.IsNullOrEmpty(Configuration.OnExecuteJavascript))
                        {
                            var           jsonObjectString = jsonObject.ToString();
                            ChakraContext context          = runtime.CreateContext(true);
                            context.GlobalObject.WriteProperty <string>("screeningString", jsonObjectString);
                            context.RunScript(Configuration.OnExecuteJavascript);
                            context.RunScript("var screening=JSON.parse(screeningString);");
                            jsonObjectString = context.GlobalObject.CallFunction <string>("onExecute");
                            jsonObject       = JObject.Parse(jsonObjectString);
                        }

                        JToken forcePrint = null;
                        if (jsonObject.TryGetValue("ForcePrint", out forcePrint))
                        {
                            if (forcePrint.Value <bool>() == true)
                            {
                                screeningsToPrint.Add(screening);
                                continue;
                            }
                        }

                        jsonObject.Add("Type", "StateSubmissionRecord");
                        jsonObject.Add("State", Configuration.State);
                        jsonObject.Add("DatePrepared", DateTime.Now.ToString());
                        jsonObject.Add("FileProduced", string.Empty);
                        jsonObject.Add("DateSent", string.Empty);
                        jsonObject.Add("DateValidated", string.Empty);
                        jsonObject.Add("OutputFile", filename);

                        collection.InsertOne(
                            MongoDB.Bson.Serialization.BsonSerializer.Deserialize <BsonDocument>(jsonObject.ToString()));

                        List <string> screeningValues = new List <string>();

                        if (Configuration.RecordConfiguration != null)
                        {
                            foreach (StateSubmissionField field in Configuration.RecordConfiguration)
                            {
                                screeningValues.Add(ParseValues(field, jsonObject, runtime));
                            }
                        }

                        OutputText += ((Configuration.EncloseFieldsInQuotes ? "\"" : string.Empty) +
                                       string.Join(Configuration.DefaultDelimiter, screeningValues) +
                                       (Configuration.EncloseFieldsInQuotes ? "\"" : string.Empty)) + "\n";
                    }

                    if (screeningsToPrint.Count > 0)
                    {
                        var unitOfWork = new GeneratePhysicalStatePacket();
                        unitOfWork.State      = Configuration.State;
                        unitOfWork.StartDate  = StartDate;
                        unitOfWork.EndDate    = EndDate;
                        unitOfWork.Screenings = screeningsToPrint;
                        unitOfWork.Execute(() => {
                        }, (f) => { });
                    }
                }

                //Microsoft.Azure.KeyVault.KeyVaultKeyResolver cloudResolver = new Microsoft.Azure.KeyVault.KeyVaultKeyResolver(GetToken);
                //var rsa = cloudResolver.ResolveKeyAsync(@"https://neonprod01vault.vault.azure.net/keys/FileStorage",
                //    CancellationToken.None).Result;
                //BlobEncryptionPolicy policy = new BlobEncryptionPolicy(rsa, cloudResolver);
                //BlobRequestOptions options = new BlobRequestOptions() { EncryptionPolicy = policy };

                StorageCredentials  storageCredentials = new StorageCredentials(System.Environment.GetEnvironmentVariable("StorageAccountName", EnvironmentVariableTarget.Process), System.Environment.GetEnvironmentVariable("StorageKeyVault", EnvironmentVariableTarget.Process));
                CloudStorageAccount account            = new CloudStorageAccount(storageCredentials, useHttps: true);
                CloudBlobClient     storageClient      = account.CreateCloudBlobClient();
                CloudBlobContainer  storageContainer   = storageClient.GetContainerReference("statepackages");
                storageContainer.CreateIfNotExists(BlobContainerPublicAccessType.Off);

                CloudBlockBlob blob = storageContainer.GetBlockBlobReference(filename);

                using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(OutputText ?? "")))
                {
                    if (stream.Length == 0)
                    {
                        return;
                    }
                    blob.UploadFromStream(stream, stream.Length, null, null, null);
                }

                string filter = string.Format("{{ Type: 'StateSubmissionRecord', OutputFile : '{0}'}}", filename);
                var    update = Builders <BsonDocument> .Update.Set("FileProduced", DateTime.Now.ToString());

                collection.UpdateMany(filter, update);
            }
            catch (Exception e)
            {
                onFailure(e);
            }

            onSuccess();
        }