diff --git a/backend/prisma/schema.prisma b/backend/prisma/schema.prisma index 6ea93ad..556d875 100644 --- a/backend/prisma/schema.prisma +++ b/backend/prisma/schema.prisma @@ -296,3 +296,12 @@ model aqi_units_xref { update_user_id String @db.VarChar(200) update_utc_timestamp DateTime @db.Timestamp(6) } + +model aqi_tissue_types { + aqi_tissue_types_id String @id @db.Uuid + custom_id String @db.VarChar(200) + create_user_id String @db.VarChar(200) + create_utc_timestamp DateTime @db.Timestamp(6) + update_user_id String @db.VarChar(200) + update_utc_timestamp DateTime @db.Timestamp(6) +} diff --git a/backend/src/cron-job/cron-job.service.ts b/backend/src/cron-job/cron-job.service.ts index c2ee24e..10a3987 100644 --- a/backend/src/cron-job/cron-job.service.ts +++ b/backend/src/cron-job/cron-job.service.ts @@ -34,6 +34,7 @@ export class CronJobService { ["aqi_detection_conditions", this.prisma.aqi_detection_conditions], ["aqi_result_status", this.prisma.aqi_result_status], ["aqi_result_grade", this.prisma.aqi_result_grade], + ["aqi_tissue_types", this.prisma.aqi_tissue_types], ["aqi_locations", this.prisma.aqi_locations], ["aqi_field_visits", this.prisma.aqi_field_visits], ["aqi_field_activities", this.prisma.aqi_field_activities], @@ -108,6 +109,13 @@ export class CronJobService { dbTable: "aqi_result_grade", paramsEnabled: false, }, + { + endpoint: + "/v1/extendedattributes/6f7d5be0-f91a-4353-9d31-13983205cbe0/dropdownlistitems", + method: "GET", + dbTable: "aqi_tissue_types", + paramsEnabled: false, + }, { endpoint: "/v1/samplinglocations", method: "GET", @@ -175,6 +183,15 @@ export class CronJobService { */ private getUpdatePayload(dbTable: string, record: any): any { switch (dbTable) { + case "aqi_tissue_types": + return { + aqi_tissue_types_id: record.id, + custom_id: record.customId, + create_user_id: "EnMoDS", + create_utc_timestamp: new Date(), + update_user_id: "EnMoDS", + update_utc_timestamp: new Date(), + }; case "aqi_field_visits": return { aqi_field_visit_start_time: new Date(record.startTime), @@ -237,6 +254,15 @@ export class CronJobService { */ private getCreatePayload(dbTable: string, record: any): any { switch (dbTable) { + case "aqi_tissue_types": + return { + aqi_tissue_types_id: record.id, + custom_id: record.customId, + create_user_id: "EnMoDS", + create_utc_timestamp: new Date(), + update_user_id: "EnMoDS", + update_utc_timestamp: new Date(), + }; case "aqi_field_visits": return { [`${dbTable}_id`]: record.id, @@ -474,6 +500,23 @@ export class CronJobService { modificationTime, }; }; + const filterTissueTypes = (obj: any): any => { + const { id, customId } = obj; + const create_user_id = "EnMoDs"; + const create_utc_timestamp = new Date().toISOString(); + const update_user_id = "EnMoDs"; + const update_utc_timestamp = new Date().toISOString(); + + return { + id, + customId, + create_user_id, + create_utc_timestamp, + update_user_id, + update_utc_timestamp, + }; + } + const filterArray = (array: any): any => { if (endpoint == "/v1/tags") { return array.map(filterNameAttributes); @@ -485,7 +528,9 @@ export class CronJobService { return array.map(filterSpecimenAttributes); } else if (endpoint == "/v1/analysismethods") { return array.map(filerAnalysisMethodAttributes); - } else { + } else if (endpoint == "/v1/extendedattributes/6f7d5be0-f91a-4353-9d31-13983205cbe0/dropdownlistitems"){ + return array.map(filterTissueTypes) + }else { return array.map(filterAttributes); } }; @@ -541,13 +586,13 @@ export class CronJobService { `Error processing file ${file.file_name}: ${error}`, ); }); - + while (!fileProcessed) { - this.logger.log(`WAITING FOR FILE TO COMPLETE: ${file.file_name}`) + this.logger.log(`WAITING FOR FILE TO COMPLETE: ${file.file_name}`); await new Promise((resolve) => setTimeout(resolve, 100)); } - this.logger.log("GOING TO NEXT FILE") + this.logger.log("GOING TO NEXT FILE"); } this.dataPullDownComplete = false; diff --git a/backend/src/file_parse_and_validation/file_parse_and_validation.service.ts b/backend/src/file_parse_and_validation/file_parse_and_validation.service.ts index 27530b3..e7ba97b 100644 --- a/backend/src/file_parse_and_validation/file_parse_and_validation.service.ts +++ b/backend/src/file_parse_and_validation/file_parse_and_validation.service.ts @@ -1073,6 +1073,22 @@ export class FileParseValidateService { } } + if (record.hasOwnProperty("TissueType")){ + if (record["Medium"] == "Animal - Fish" && record["TissueType"] == ""){ + let errorLog = `{"rowNum": ${index + 2}, "type": "ERROR", "message": {"Tissue Type": "Cannot be empty when Medium is Animal - Fish"}}`; + errorLogs.push(JSON.parse(errorLog)); + }else if (record["TissueType"]) { + const present = await this.aqiService.databaseLookup( + "aqi_tissue_types", + record.TissueType, + ); + if (!present) { + let errorLog = `{"rowNum": ${index + 2}, "type": "ERROR", "message": {"Tissue Type": "${record.TissueType} not found in EnMoDS Tissue Types"}}`; + errorLogs.push(JSON.parse(errorLog)); + } + } + } + if (record.hasOwnProperty("SpecimenName")) { if (record["CompositeStat"] != "" && record["SpecimenName"] == "") { let errorLog = `{"rowNum": ${index + 2}, "type": "ERROR", "message": {"Specimen Name": "Cannot be empty when Composite Stat is present."}}`; diff --git a/migrations/sql/V1.0.3__create_code_tables.sql b/migrations/sql/V1.0.3__create_code_tables.sql index 1026d25..b44ac99 100644 --- a/migrations/sql/V1.0.3__create_code_tables.sql +++ b/migrations/sql/V1.0.3__create_code_tables.sql @@ -107,6 +107,14 @@ CREATE TABLE IF NOT EXISTS enmods.aqi_result_grade ( update_user_id varchar(200) NOT NULL, update_utc_timestamp timestamp NOT NULL ); +CREATE TABLE IF NOT EXISTS enmods.aqi_tissue_types( + aqi_tissue_types_id UUID PRIMARY KEY NOT NULL, + custom_id varchar(200) NOT NULL, + create_user_id varchar(200) NOT NULL, + create_utc_timestamp timestamp NOT NULL, + update_user_id varchar(200) NOT NULL, + update_utc_timestamp timestamp NOT NULL +); CREATE TABLE IF NOT EXISTS enmods.aqi_field_visits( aqi_field_visits_id UUID PRIMARY KEY NOT NULL, aqi_field_visit_start_time timestamptz NOT NULL,