Skip to content

Commit

Permalink
feat: ensimmäinen versio migraatiotyökalusta (#205)
Browse files Browse the repository at this point in the history
  • Loading branch information
haapamakim committed May 4, 2022
1 parent e22d37b commit 2dd28d1
Show file tree
Hide file tree
Showing 33 changed files with 102,020 additions and 176 deletions.
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -61,3 +61,7 @@ build
__pycache__
/.eslintcache
.sonar
migration/node_modules
migration/~*

/migration/.env.test
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
exports[`AloitusKuulutus should create and manipulate projekti successfully 1`] = `
Object {
"aloitusKuulutus": Object {
"elyKeskus": "Pirkanmaa",
"esitettavatYhteystiedot": Array [
Object {
"etunimi": "Marko",
Expand All @@ -28,7 +27,6 @@ Object {
exports[`AloitusKuulutus should create and manipulate projekti successfully 2`] = `
Object {
"aloitusKuulutus": Object {
"elyKeskus": "Pirkanmaa",
"esitettavatYhteystiedot": Array [
Object {
"etunimi": "Marko",
Expand All @@ -48,7 +46,6 @@ Object {
},
"aloitusKuulutusJulkaisut": Array [
Object {
"elyKeskus": "Pirkanmaa",
"hankkeenKuvaus": Object {
"RUOTSI": "På svenska",
"SAAME": "Saameksi",
Expand Down Expand Up @@ -101,7 +98,6 @@ Object {
exports[`AloitusKuulutus should create and manipulate projekti successfully 3`] = `
Object {
"aloitusKuulutus": Object {
"elyKeskus": "Pirkanmaa",
"esitettavatYhteystiedot": Array [
Object {
"etunimi": "Marko",
Expand All @@ -127,7 +123,6 @@ Object {
exports[`AloitusKuulutus should create and manipulate projekti successfully 4`] = `
Object {
"aloitusKuulutus": Object {
"elyKeskus": "Pirkanmaa",
"esitettavatYhteystiedot": Array [
Object {
"etunimi": "Marko",
Expand All @@ -148,7 +143,6 @@ Object {
},
"aloitusKuulutusJulkaisut": Array [
Object {
"elyKeskus": "Pirkanmaa",
"hankkeenKuvaus": Object {
"RUOTSI": "På svenska",
"SAAME": "Saameksi",
Expand Down Expand Up @@ -201,7 +195,6 @@ Object {
exports[`AloitusKuulutus should create and manipulate projekti successfully 5`] = `
Object {
"aloitusKuulutus": Object {
"elyKeskus": "Pirkanmaa",
"esitettavatYhteystiedot": Array [
Object {
"etunimi": "Marko",
Expand Down Expand Up @@ -232,7 +225,6 @@ Object {
"aloituskuulutusPDFPath": "/aloituskuulutus/KUULUTUS SUUNNITTELUN ALOITTAMISESTA Testiprojekti 1.pdf",
},
},
"elyKeskus": "Pirkanmaa",
"hankkeenKuvaus": Object {
"RUOTSI": "På svenska",
"SAAME": "Saameksi",
Expand Down
2 changes: 1 addition & 1 deletion backend/integrationtest/api/__snapshots__/api.test.ts.snap
Original file line number Diff line number Diff line change
Expand Up @@ -869,7 +869,6 @@ Object {
},
"__typename": "AloitusKuulutusPDFt",
},
"elyKeskus": "Pirkanmaa",
"hankkeenKuvaus": Object {
"RUOTSI": "På Svenska",
"SAAME": "Saameksi",
Expand All @@ -891,6 +890,7 @@ Object {
"puhelinnumero": "123",
"sukunimi": "Jossain",
},
"tila": "HYVAKSYTTY",
"velho": Object {
"__typename": "Velho",
"kunnat": Array [
Expand Down
2 changes: 1 addition & 1 deletion backend/integrationtest/api/api.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -453,7 +453,7 @@ describe("Api", () => {
const oid = await searchProjectsFromVelhoAndPickFirst();
const projekti = await api.lataaProjekti(oid);
await expect(projekti.tallennettu).to.be.false;
log.info(JSON.stringify(projekti, null, 2));
log.info({ projekti });
return projekti;
}

Expand Down
1 change: 0 additions & 1 deletion backend/integrationtest/api/apiTestFixture.ts
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,6 @@ class ApiTestFixture {
SAAME: "Saameksi",
},
siirtyySuunnitteluVaiheeseen: "2022-01-01",
elyKeskus: "Pirkanmaa",
esitettavatYhteystiedot: this.esitettavatYhteystiedot,
};

Expand Down
2 changes: 0 additions & 2 deletions backend/src/asiakirja/abstractPdf.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import deburr from "lodash/deburr";
import log from "loglevel";
import { PDF } from "../../../common/graphql/apiModel";

import PDFDocument from "pdfkit";
Expand Down Expand Up @@ -93,7 +92,6 @@ export abstract class AbstractPdf {

// PDF/A standard requires fonts to be embedded.
const arialFontFile = __dirname + "/files/arialmt.ttf";
log.info(arialFontFile);
doc.registerFont("ArialMT", arialFontFile);
doc.registerFont("ArialMTBold", __dirname + "/files/ARIALBOLDMT.OTF");

Expand Down
6 changes: 3 additions & 3 deletions backend/src/cache/s3Cache.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ export class S3Cache {
triggerUpdate: () => void,
populateMissingData: () => Promise<T>
): Promise<T> {
const cachedData = this.cache.get(key) as T;
const cachedData = this.cache.get(key);
if (cachedData) {
return cachedData;
return cachedData as T;
}

const s3Object = await this.getS3Object(key, ttlMillis);
Expand Down Expand Up @@ -61,7 +61,7 @@ export class S3Cache {
.promise();
const body = output.Body;
if (body instanceof Buffer) {
const s3json = (body as Buffer).toString("utf-8");
const s3json = body.toString("utf-8");

const lastModified = output.LastModified;
const expiresTime = S3Cache.getExpiresTime(lastModified, ttlMillis);
Expand Down
9 changes: 0 additions & 9 deletions backend/src/database/model/projekti.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,6 @@ import { Palaute, SuunnitteluVaihe, Vuorovaikutus } from "./suunnitteluVaihe";

export type LocalizedMap<T> = { [key in Kieli]?: T } | null;

export type Kuulutus = {
kuulutusPaiva?: string;
siirtyySuunnitteluVaiheeseen?: string;
hankkeenKuvaus?: LocalizedMap<string>;
elyKeskus?: string;
yhteystiedot?: string[];
};

export type DBVaylaUser = {
rooli: ProjektiRooli;
email: string;
Expand All @@ -33,7 +25,6 @@ export type AloitusKuulutus = {
kuulutusPaiva?: string | null;
siirtyySuunnitteluVaiheeseen?: string | null;
hankkeenKuvaus?: LocalizedMap<string>;
elyKeskus?: string | null;
esitettavatYhteystiedot?: Yhteystieto[] | null;
ilmoituksenVastaanottajat?: IlmoituksenVastaanottajat | null;
palautusSyy?: string | null;
Expand Down
11 changes: 9 additions & 2 deletions backend/src/database/projektiDatabase.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,11 @@ function createExpression(expression: string, properties: string[]) {
}

async function saveProjekti(dbProjekti: Partial<DBProjekti>): Promise<DocumentClient.UpdateItemOutput> {
log.info("Updating projekti to Hassu ", { dbProjekti });
if (log.isLevelEnabled("debug")) {
log.debug("Updating projekti to Hassu ", { projekti: dbProjekti });
} else {
log.info("Updating projekti to Hassu ", { oid: dbProjekti.oid });
}
const setExpression: string[] = [];
const removeExpression: string[] = [];
const ExpressionAttributeNames = {};
Expand Down Expand Up @@ -137,7 +141,10 @@ async function saveProjekti(dbProjekti: Partial<DBProjekti>): Promise<DocumentCl
ExpressionAttributeValues,
};

log.info("Updating projekti to Hassu", { params });
if (log.isLevelEnabled("debug")) {
log.debug("Updating projekti to Hassu ", { params });
}

return await getDynamoDBDocumentClient().update(params).promise();
}

Expand Down
14 changes: 14 additions & 0 deletions backend/src/handler/asiakirjaAdapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,20 @@ export class AsiakirjaAdapter {
throw new Error("Aloituskuulutus puuttuu");
}

migrateAloitusKuulutusJulkaisu(dbProjekti: DBProjekti): AloitusKuulutusJulkaisu {
if (dbProjekti.aloitusKuulutus) {
const { palautusSyy: _palautusSyy, ...includedFields } = dbProjekti.aloitusKuulutus;
return {
...includedFields,
id: createNextID(dbProjekti),
yhteystiedot: [],
velho: adaptVelho(dbProjekti),
suunnitteluSopimus: null,
};
}
throw new Error("Aloituskuulutus puuttuu");
}

findAloitusKuulutusWaitingForApproval(projekti: DBProjekti): AloitusKuulutusJulkaisu | undefined {
if (projekti.aloitusKuulutusJulkaisut) {
return projekti.aloitusKuulutusJulkaisut
Expand Down
6 changes: 3 additions & 3 deletions backend/src/handler/emailHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,15 +29,15 @@ async function getFileAttachment(oid: string, key: string): Promise<Mail.Attachm
})
.promise();

if (output.Body instanceof Readable) {
if (output.Body instanceof Readable || output.Body instanceof Buffer) {
return {
filename: getFilename(key),
contentDisposition: "attachment",
contentType: "application/pdf",
content: output.Body as Readable,
content: output.Body,
};
} else {
log.error("Liitetiedoston sisaltossa ongelmia");
log.error("Liitetiedoston sisallossa ongelmia");
}
} catch (error) {
log.error("Virhe liitetiedostojen haussa", error);
Expand Down
84 changes: 46 additions & 38 deletions backend/src/handler/projektiAdapterJulkinen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,6 @@ import {
SuunnitteluSopimus,
} from "../database/model/projekti";
import * as API from "../../../common/graphql/apiModel";
import {
AloitusKuulutusPDFt,
AloitusKuulutusTila,
Kieli,
ProjektiJulkinen,
Status,
} from "../../../common/graphql/apiModel";
import pickBy from "lodash/pickBy";
import dayjs from "dayjs";
import {
Expand All @@ -30,27 +23,27 @@ import { parseDate } from "../util/dateUtil";
import { Vuorovaikutus } from "../database/model/suunnitteluVaihe";

class ProjektiAdapterJulkinen {
applyStatus(projekti: ProjektiJulkinen) {
applyStatus(projekti: API.ProjektiJulkinen) {
function checkAloituskuulutus() {
if (projekti.aloitusKuulutusJulkaisut) {
const julkisetAloituskuulutukset = projekti.aloitusKuulutusJulkaisut.filter((julkaisu) => {
return julkaisu.kuulutusPaiva && parseDate(julkaisu.kuulutusPaiva).isBefore(dayjs());
});

if (julkisetAloituskuulutukset?.length > 0) {
projekti.status = Status.ALOITUSKUULUTUS;
projekti.status = API.Status.ALOITUSKUULUTUS;
}
}
}

function checkSuunnittelu() {
// Valiaikainen ui kehitysta varten, kunnes suunnitteluvaihe tietomallissa
if (projekti.suunnitteluVaihe) {
projekti.status = Status.SUUNNITTELU;
projekti.status = API.Status.SUUNNITTELU;
}
}

projekti.status = Status.EI_JULKAISTU;
projekti.status = API.Status.EI_JULKAISTU;

checkAloituskuulutus();

Expand Down Expand Up @@ -82,7 +75,7 @@ class ProjektiAdapterJulkinen {
suunnitteluVaihe = ProjektiAdapterJulkinen.adaptSuunnitteluVaihe(dbProjekti);
}

const projekti: ProjektiJulkinen = {
const projekti: API.ProjektiJulkinen = {
__typename: "ProjektiJulkinen",
oid: dbProjekti.oid,
euRahoitus: dbProjekti.euRahoitus,
Expand All @@ -97,24 +90,26 @@ class ProjektiAdapterJulkinen {
aloitusKuulutusJulkaisut?: AloitusKuulutusJulkaisu[] | null
): API.AloitusKuulutusJulkaisuJulkinen[] | undefined {
if (aloitusKuulutusJulkaisut) {
return aloitusKuulutusJulkaisut
.filter((julkaisu) => julkaisu.tila == AloitusKuulutusTila.HYVAKSYTTY)
.map((julkaisu) => {
const { yhteystiedot, velho, suunnitteluSopimus, kielitiedot } = julkaisu;
// Pick HYVAKSYTTY or MIGROITU aloituskuulutusjulkaisu, by this order
const julkaisu =
findJulkaisuByStatus(aloitusKuulutusJulkaisut, API.AloitusKuulutusTila.HYVAKSYTTY) ||
findJulkaisuByStatus(aloitusKuulutusJulkaisut, API.AloitusKuulutusTila.MIGROITU);
const { yhteystiedot, velho, suunnitteluSopimus, kielitiedot } = julkaisu;

return {
__typename: "AloitusKuulutusJulkaisuJulkinen",
kuulutusPaiva: julkaisu.kuulutusPaiva,
elyKeskus: julkaisu.elyKeskus,
siirtyySuunnitteluVaiheeseen: julkaisu.siirtyySuunnitteluVaiheeseen,
hankkeenKuvaus: adaptHankkeenKuvaus(julkaisu.hankkeenKuvaus),
yhteystiedot: adaptYhteystiedot(yhteystiedot),
velho: adaptVelho(velho),
suunnitteluSopimus: this.adaptSuunnitteluSopimus(oid, suunnitteluSopimus),
kielitiedot: adaptKielitiedot(kielitiedot),
aloituskuulutusPDFt: this.adaptJulkaisuPDFPaths(oid, julkaisu.aloituskuulutusPDFt),
};
});
return [
{
__typename: "AloitusKuulutusJulkaisuJulkinen",
kuulutusPaiva: julkaisu.kuulutusPaiva,
siirtyySuunnitteluVaiheeseen: julkaisu.siirtyySuunnitteluVaiheeseen,
hankkeenKuvaus: adaptHankkeenKuvaus(julkaisu.hankkeenKuvaus),
yhteystiedot: adaptYhteystiedot(yhteystiedot),
velho: adaptVelho(velho),
suunnitteluSopimus: this.adaptSuunnitteluSopimus(oid, suunnitteluSopimus),
kielitiedot: adaptKielitiedot(kielitiedot),
aloituskuulutusPDFt: this.adaptJulkaisuPDFPaths(oid, julkaisu.aloituskuulutusPDFt),
tila: julkaisu.tila,
},
];
}
return undefined;
}
Expand All @@ -136,7 +131,7 @@ class ProjektiAdapterJulkinen {
adaptJulkaisuPDFPaths(
oid: string,
aloitusKuulutusPDFS: LocalizedMap<AloitusKuulutusPDF>
): AloitusKuulutusPDFt | undefined {
): API.AloitusKuulutusPDFt | undefined {
if (!aloitusKuulutusPDFS) {
return undefined;
}
Expand All @@ -154,11 +149,12 @@ class ProjektiAdapterJulkinen {
),
} as AloitusKuulutusPDF;
}
return { __typename: "AloitusKuulutusPDFt", SUOMI: result[Kieli.SUOMI], ...result };
return { __typename: "AloitusKuulutusPDFt", SUOMI: result[API.Kieli.SUOMI], ...result };
}

private static adaptSuunnitteluVaihe(dbProjekti: DBProjekti): API.SuunnitteluVaiheJulkinen {
const { hankkeenKuvaus, arvioSeuraavanVaiheenAlkamisesta, suunnittelunEteneminenJaKesto } = dbProjekti.suunnitteluVaihe;
const { hankkeenKuvaus, arvioSeuraavanVaiheenAlkamisesta, suunnittelunEteneminenJaKesto } =
dbProjekti.suunnitteluVaihe;
return {
__typename: "SuunnitteluVaiheJulkinen",
hankkeenKuvaus: adaptHankkeenKuvaus(hankkeenKuvaus),
Expand Down Expand Up @@ -192,6 +188,13 @@ function adaptVuorovaikutukset(dbProjekti: DBProjekti): API.VuorovaikutusJulkine
return vuorovaikutukset as undefined;
}

function findJulkaisuByStatus<T extends { tila?: API.AloitusKuulutusTila }>(
aloitusKuulutusJulkaisut: T[],
tila: API.AloitusKuulutusTila
): T {
return aloitusKuulutusJulkaisut.filter((j) => j.tila == tila).pop();
}

function checkIfAloitusKuulutusJulkaisutIsPublic(
aloitusKuulutusJulkaisut: API.AloitusKuulutusJulkaisuJulkinen[]
): boolean {
Expand All @@ -200,12 +203,17 @@ function checkIfAloitusKuulutusJulkaisutIsPublic(
return false;
}

const julkaisu = aloitusKuulutusJulkaisut[0];
if (julkaisu.kuulutusPaiva && parseDate(julkaisu.kuulutusPaiva).isAfter(dayjs())) {
log.info("Projektin aloituskuulutuksen kuulutuspäivä on tulevaisuudessa", {
kuulutusPaiva: parseDate(julkaisu.kuulutusPaiva).format(),
now: dayjs().format(),
});
const hyvaksyttyJulkaisu = findJulkaisuByStatus(aloitusKuulutusJulkaisut, API.AloitusKuulutusTila.HYVAKSYTTY);
if (hyvaksyttyJulkaisu) {
if (hyvaksyttyJulkaisu.kuulutusPaiva && parseDate(hyvaksyttyJulkaisu.kuulutusPaiva).isAfter(dayjs())) {
log.info("Projektin aloituskuulutuksen kuulutuspäivä on tulevaisuudessa", {
kuulutusPaiva: parseDate(hyvaksyttyJulkaisu.kuulutusPaiva).format(),
now: dayjs().format(),
});
return false;
}
} else if (!findJulkaisuByStatus(aloitusKuulutusJulkaisut, API.AloitusKuulutusTila.MIGROITU)) {
// If there are no HYVAKSYTTY or MIGROITU aloitusKuulutusJulkaisu, hide projekti
return false;
}
return true;
Expand Down
Loading

0 comments on commit 2dd28d1

Please sign in to comment.