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