-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: muistutuksen kasittely (HASSU-775) (#324)
* initial commit * wip * kuittauksen lahetys, email validointi * testit
- Loading branch information
Showing
10 changed files
with
539 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
import { MuistutusInput } from "../../../common/graphql/apiModel"; | ||
import { Muistutus } from "../database/model"; | ||
import { localDateTimeString } from "../util/dateUtil"; | ||
import { uuid } from "../util/uuid"; | ||
|
||
export function adaptMuistutusInput(muistutus: MuistutusInput): Muistutus { | ||
const aikaleima = localDateTimeString(); | ||
return { ...muistutus, vastaanotettu: aikaleima, id: uuid.v4() }; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,48 @@ | ||
import { DBProjekti, Muistutus } from "../database/model"; | ||
import { emailClient } from "../email/email"; | ||
import { createMuistutusKirjaamolleEmail, createKuittausMuistuttajalleEmail } from "../email/emailTemplates"; | ||
import { getFileAttachment } from "../handler/emailHandler"; | ||
import { kirjaamoOsoitteetService } from "../kirjaamoOsoitteet/kirjaamoOsoitteetService"; | ||
import { log } from "../logger"; | ||
|
||
class MuistutusEmailService { | ||
async sendEmailToMuistuttaja(projekti: DBProjekti, muistutus: Muistutus) { | ||
log.info("Lähetetään kuittaus muistutuksen tekijälle"); | ||
const emailOptions = createKuittausMuistuttajalleEmail(projekti, muistutus); | ||
await emailClient.sendEmail(emailOptions); | ||
log.info("Kuittaus muistuttajalle lähetetty: " + emailOptions.to); | ||
} | ||
|
||
async sendEmailToKirjaamo(projekti: DBProjekti, muistutus: Muistutus) { | ||
const vastaavaViranomainen = projekti.velho.suunnittelustaVastaavaViranomainen; | ||
const kirjaamot = await kirjaamoOsoitteetService.listKirjaamoOsoitteet(); | ||
// Hassussa on kahden tyyppista Viranomais -enumia, jotka eivat ole kuitenkaan taysin yhtenaisia kattavuudeltaan | ||
// mutta string arvoiltaan ovat samoja, silloin kun viranomainen molemmista loytyy | ||
const sahkoposti = kirjaamot.find(({ nimi }) => nimi.toString() === vastaavaViranomainen.toString())?.sahkoposti; | ||
log.info("Muistutuksen vastaanottaja: ", sahkoposti); | ||
if (!sahkoposti) { | ||
log.error("Vastaavan viranomaisen kirjaamon sähköpostiosoitetta ei löytynyt", vastaavaViranomainen); | ||
throw new Error("Muistutusta ei voitu lähettää kirjaamoon, syy: kirjaamon osoitetta ei löytynyt"); | ||
} | ||
|
||
const emailOptions = createMuistutusKirjaamolleEmail(projekti, muistutus, sahkoposti); | ||
|
||
if (muistutus.liite) { | ||
log.info("haetaan muistutuksen liite: ", muistutus.liite); | ||
const liite = await getFileAttachment(projekti.oid, muistutus.liite); | ||
emailOptions.attachments = [liite]; | ||
emailOptions.text.toString().concat(` | ||
Muistutukseen on lisätty liite`); | ||
} else { | ||
emailOptions.text.toString().concat(` | ||
Muistutukseen ei ole lisätty liitettä`); | ||
} | ||
|
||
await emailClient.sendEmail(emailOptions); | ||
log.info("Muistutuksen sisältävä sähköposti lähetetty: " + emailOptions.to); | ||
} | ||
} | ||
|
||
export const muistutusEmailService = new MuistutusEmailService(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
import { LisaaMuistutusMutationVariables, Status } from "../../../common/graphql/apiModel"; | ||
import { NotFoundError } from "../error/NotFoundError"; | ||
import { projektiDatabase } from "../database/projektiDatabase"; | ||
import { fileService } from "../files/fileService"; | ||
import { projektiAdapterJulkinen } from "../handler/projektiAdapterJulkinen"; | ||
import { muistutusEmailService } from "./muistutusEmailService"; | ||
import { adaptMuistutusInput } from "./muistutusAdapter"; | ||
import { isValidEmail } from "../util/emailUtil"; | ||
import { log } from "../logger"; | ||
|
||
class MuistutusHandler { | ||
async kasitteleMuistutus({ oid, muistutus: muistutusInput }: LisaaMuistutusMutationVariables) { | ||
const projektiFromDB = await projektiDatabase.loadProjektiByOid(oid); | ||
if (!projektiFromDB) { | ||
log.error("Projektia ei löydy"); | ||
throw new NotFoundError("Projektia ei löydy"); | ||
} | ||
const julkinenProjekti = projektiAdapterJulkinen.adaptProjekti(projektiFromDB); | ||
if (!julkinenProjekti) { | ||
log.error("Projektia ei löydy tai se ei ole vielä julkinen"); | ||
throw new NotFoundError("Projektia ei löydy tai se ei ole vielä julkinen"); | ||
} | ||
|
||
if (julkinenProjekti.status !== Status.NAHTAVILLAOLO) { | ||
log.error("Projekti ei ole nähtävilläolovaiheessa, joten muistutuksia ei voi antaa", julkinenProjekti.status); | ||
throw new NotFoundError("Projekti ei ole nähtävilläolovaiheessa, joten muistutuksia ei voi antaa"); | ||
} | ||
|
||
const muistutus = adaptMuistutusInput(muistutusInput); | ||
if (muistutus.liite) { | ||
muistutus.liite = await fileService.persistFileToProjekti({ | ||
uploadedFileSource: muistutus.liite, | ||
oid, | ||
targetFilePathInProjekti: "muistutukset/" + muistutus.id, | ||
}); | ||
} | ||
|
||
await muistutusEmailService.sendEmailToKirjaamo(projektiFromDB, muistutus); | ||
|
||
if (muistutus.sahkoposti && isValidEmail(muistutus.sahkoposti)) { | ||
await muistutusEmailService.sendEmailToMuistuttaja(projektiFromDB, muistutus); | ||
} else { | ||
log.error("Muistuttajalle ei voitu lähettää kuittausviestiä: ", muistutus.sahkoposti); | ||
} | ||
|
||
//TODO: kasvata ja tallenna lähetettyjen muistutusten määrää projektilla -> | ||
// ehkä aikaleimoina, niin lisää jäljitettävyyttä? | ||
|
||
return "OK"; | ||
} | ||
} | ||
|
||
export const muistutusHandler = new MuistutusHandler(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
// eslint-disable-next-line no-useless-escape | ||
const emailRegex = /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/g; | ||
export function isValidEmail(email: string): boolean { | ||
if (emailRegex.test(email)) { | ||
return true; | ||
} | ||
return false; | ||
} |
Oops, something went wrong.