Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Integrate notifications #39

Open
wants to merge 10 commits into
base: main
Choose a base branch
from
Open
1 change: 1 addition & 0 deletions backend/prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ model file_submission {
create_utc_timestamp DateTime @db.Timestamp(6)
update_user_id String @db.VarChar(200)
update_utc_timestamp DateTime @db.Timestamp(6)
data_submitter_email String? @db.VarChar(200)
file_error_logs file_error_logs[]
file_operation_codes file_operation_codes @relation(fields: [file_operation_code], references: [file_operation_code], onDelete: NoAction, onUpdate: NoAction, map: "file_operation_code_fk")
submission_status submission_status_code @relation(fields: [submission_status_code], references: [submission_status_code], onDelete: NoAction, onUpdate: NoAction, map: "submission_status_code_fk")
Expand Down
7 changes: 4 additions & 3 deletions backend/src/file_error_logs/file_error_logs.module.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { Module } from '@nestjs/common';
import { FileErrorLogsService } from './file_error_logs.service';
import { FileErrorLogsController } from './file_error_logs.controller';
import { Module } from "@nestjs/common";
import { FileErrorLogsService } from "./file_error_logs.service";
import { FileErrorLogsController } from "./file_error_logs.controller";

@Module({
exports: [FileErrorLogsService],
controllers: [FileErrorLogsController],
providers: [FileErrorLogsService],
})
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,20 @@
import { Module } from '@nestjs/common';
import { HttpModule } from '@nestjs/axios';
import { FileParseValidateService } from './file_parse_and_validation.service';
import { AqiApiService } from 'src/aqi_api/aqi_api.service';
import { FileSubmissionsService } from 'src/file_submissions/file_submissions.service';
import { ObjectStoreModule } from 'src/objectStore/objectStore.module';
import { Module } from "@nestjs/common";
import { HttpModule } from "@nestjs/axios";
import { FileParseValidateService } from "./file_parse_and_validation.service";
import { AqiApiService } from "src/aqi_api/aqi_api.service";
import { FileSubmissionsService } from "src/file_submissions/file_submissions.service";
import { NotificationsService } from "src/notifications/notifications.service";
import { ObjectStoreModule } from "src/objectStore/objectStore.module";
import { FileErrorLogsModule } from "src/file_error_logs/file_error_logs.module";

@Module({
providers: [FileParseValidateService, FileSubmissionsService, AqiApiService],
providers: [
FileParseValidateService,
FileSubmissionsService,
AqiApiService,
NotificationsService,
],
exports: [FileParseValidateService],
imports: [HttpModule, ObjectStoreModule]
imports: [HttpModule, ObjectStoreModule, FileErrorLogsModule],
})
export class FileParseValidateModule {}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import * as path from "path";
import * as csvWriter from "csv-writer";
import fs from "fs";
import { PrismaService } from "nestjs-prisma";
import { NotificationsService } from "src/notifications/notifications.service";

const visits: FieldVisits = {
MinistryContact: "",
Expand Down Expand Up @@ -146,6 +147,7 @@ export class FileParseValidateService {
private prisma: PrismaService,
private readonly fileSubmissionsService: FileSubmissionsService,
private readonly aqiService: AqiApiService,
private readonly notificationsService: NotificationsService,
) {}

async getQueuedFiles() {
Expand Down Expand Up @@ -599,7 +601,7 @@ export class FileParseValidateService {
return dupeCount;
}

async localValidation(allRecords, observaionFilePath) {
async localValidation(allRecords, observationFilePath) {
let errorLogs = [];
for (const [index, record] of allRecords.entries()) {
const isoDateTimeRegex =
Expand Down Expand Up @@ -861,7 +863,7 @@ export class FileParseValidateService {

// Do a dry run of the observations
const observationsErrors = await this.aqiService.importObservations(
observaionFilePath,
observationFilePath,
"dryrun",
);

Expand Down Expand Up @@ -944,7 +946,9 @@ export class FileParseValidateService {
fileName,
);

const uniqueMinistryContacts = Array.from(new Set(allRecords.map(rec => rec.MinistryContact)))
const uniqueMinistryContacts = Array.from(
new Set(allRecords.map((rec) => rec.MinistryContact)),
);
/*
* Do the local validation for each section here - if passed then go to the API calls - else create the message/file/email for the errors
*/
Expand Down Expand Up @@ -975,14 +979,19 @@ export class FileParseValidateService {
file_name: fileName,
original_file_name: originalFileName,
file_operation_code: file_operation_code,
ministry_contact: uniqueMinistryContacts.join(', '),
ministry_contact: uniqueMinistryContacts.join(", "),
error_log: localValidationResults,
create_utc_timestamp: new Date(),
};

await this.prisma.file_error_logs.create({
data: file_error_log_data,
});

await this.notificationsService.sendDataSubmitterNotification(
file_submission_id,
);

return;
} else if (!(await localValidationResults).includes("ERROR")) {
await this.fileSubmissionsService.updateFileStatus(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ export class CreateFileSubmissionDto extends PickType(FileSubmissionDto, [
'active_ind',
'error_log',
'organization_guid',
'data_submitter_email',
'create_user_id',
'create_utc_timestamp',
'update_user_id',
Expand Down
5 changes: 5 additions & 0 deletions backend/src/file_submissions/dto/file_submission.dto.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,11 @@ export class FileSubmissionDto {
})
organization_guid: string;

@ApiProperty({
description: 'The data submitter\'s email'
})
data_submitter_email: string;

@ApiProperty({
description: 'The id of the user that created the record',
})
Expand Down
13 changes: 13 additions & 0 deletions backend/src/file_submissions/file_submissions.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ export class FileSubmissionsService {
createFileSubmissionDto.sample_count = 0;
createFileSubmissionDto.result_count = 0;
createFileSubmissionDto.organization_guid = body.orgGUID; // TODO: change this once BCeID is set up
createFileSubmissionDto.data_submitter_email = body.dataSubmitterEmail;
createFileSubmissionDto.create_user_id = body.userID;
createFileSubmissionDto.create_utc_timestamp = new Date();
createFileSubmissionDto.update_user_id = body.userID;
Expand All @@ -68,6 +69,7 @@ export class FileSubmissionsService {
active_ind: createFileSubmissionDto.active_ind,
error_log: createFileSubmissionDto.error_log,
organization_guid: createFileSubmissionDto.organization_guid,
data_submitter_email: createFileSubmissionDto.data_submitter_email,
create_user_id: createFileSubmissionDto.create_user_id,
create_utc_timestamp: createFileSubmissionDto.create_utc_timestamp,
update_user_id: createFileSubmissionDto.update_user_id,
Expand Down Expand Up @@ -184,6 +186,17 @@ export class FileSubmissionsService {
return records;
}

async findBySubmissionId(submission_id: string) {
return await this.prisma.file_submission.findUnique({
where: {
submission_id: submission_id,
},
include: {
file_error_logs: true,
},
});
}

async updateFileStatus(submission_id: string, status: string) {
await this.prisma.file_submission.update({
where: {
Expand Down
32 changes: 16 additions & 16 deletions backend/src/notifications/notifications.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,38 +22,38 @@ export class NotificationsController {
// test route TODO: delete this
@Get("send-email/:email")
sendEmail(@Param("email") email: string) {
const re =
/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
if (!re.test(String(email).toLowerCase())) {
email = "mtennant@salussystems.com";
}
// const re =
// /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
// if (!re.test(String(email).toLowerCase())) {
// email = "mtennant@salussystems.com";
// }

const variables = {
file_name: "test_file.csv",
user_account_name: "MTENNANT",
file_status: "Failed",
errors: "Something went wrong.",
warnings: "",
};
return this.notificationsService.sendContactNotification(email, variables);
// const variables = {
// file_name: "test_file.csv",
// user_account_name: "MTENNANT",
// file_status: "Failed",
// errors: ["Something went wrong."],
// warnings: [],
// };
// return this.notificationsService.sendContactNotification(email, variables);
}

@Post("update-notification")
updateNotification(
@Body() userData: { email: string; username: string; enabled: boolean }
@Body() userData: { email: string; username: string; enabled: boolean },
) {
return this.notificationsService.updateNotificationEntry(
userData.email,
userData.username,
userData.enabled
userData.enabled,
);
}

@Post("get-notification-status")
getNotificationStatus(@Body() userData: { email: string; username: string }) {
return this.notificationsService.getNotificationStatus(
userData.email,
userData.username
userData.username,
);
}

Expand Down
4 changes: 3 additions & 1 deletion backend/src/notifications/notifications.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@ import { Module } from "@nestjs/common";
import { NotificationsController } from "./notifications.controller";
import { NotificationsService } from "./notifications.service";
import { HttpModule } from "@nestjs/axios";
import { FileErrorLogsModule } from "src/file_error_logs/file_error_logs.module";
import { FileSubmissionsModule } from "src/file_submissions/file_submissions.module";

@Module({
imports: [HttpModule],
imports: [HttpModule, FileErrorLogsModule, FileSubmissionsModule],
controllers: [NotificationsController],
providers: [NotificationsService],
exports: [NotificationsService],
Expand Down
Loading
Loading