Skip to content

Commit 35209e1

Browse files
committed
feat: clone entries from previous quesitonnaire
1 parent 971fc9b commit 35209e1

File tree

5 files changed

+59
-3
lines changed

5 files changed

+59
-3
lines changed

apps/backend/db/migrations/.snapshot-postgres.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -445,7 +445,7 @@
445445
"unsigned": false,
446446
"autoincrement": false,
447447
"primary": false,
448-
"nullable": false,
448+
"nullable": true,
449449
"mappedType": "integer"
450450
},
451451
"carer_id": {
@@ -497,6 +497,7 @@
497497
"id"
498498
],
499499
"referencedTableName": "public.questionnaire",
500+
"deleteRule": "cascade",
500501
"updateRule": "cascade"
501502
},
502503
"entry_carer_id_foreign": {
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import { Migration } from "@mikro-orm/migrations";
2+
3+
export class Migration20241211083949 extends Migration {
4+
override async up(): Promise<void> {
5+
this.addSql(`alter table "entry" drop constraint "entry_questionnaire_id_foreign";`);
6+
7+
this.addSql(`alter table "entry" alter column "questionnaire_id" type int using ("questionnaire_id"::int);`);
8+
this.addSql(`alter table "entry" alter column "questionnaire_id" drop not null;`);
9+
this.addSql(
10+
`alter table "entry" add constraint "entry_questionnaire_id_foreign" foreign key ("questionnaire_id") references "questionnaire" ("id") on update cascade on delete cascade;`
11+
);
12+
}
13+
14+
override async down(): Promise<void> {
15+
this.addSql(`alter table "entry" drop constraint "entry_questionnaire_id_foreign";`);
16+
17+
this.addSql(`alter table "entry" alter column "questionnaire_id" type int using ("questionnaire_id"::int);`);
18+
this.addSql(`alter table "entry" alter column "questionnaire_id" set not null;`);
19+
this.addSql(
20+
`alter table "entry" add constraint "entry_questionnaire_id_foreign" foreign key ("questionnaire_id") references "questionnaire" ("id") on update cascade;`
21+
);
22+
}
23+
}

apps/backend/src/research/entries/entry.entity.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Check, Collection, Entity, ManyToOne, OneToMany, Opt, Property } from "@mikro-orm/core";
1+
import { Cascade, Check, Collection, Entity, ManyToOne, OneToMany, Opt, Property } from "@mikro-orm/core";
22
import { BaseEntity } from "../../common/entities/base.entity";
33
import { Carer } from "../../defaults/carers/carer.entity";
44
import { EntryLanguage } from "../entry-languages/entry-language.entity";
@@ -23,7 +23,7 @@ export class Entry extends BaseEntity {
2323
@Check<Entry>({ expression: (columns) => `${columns.weeklyRecurring} >= 1` })
2424
weeklyRecurring!: number & Opt;
2525

26-
@ManyToOne()
26+
@ManyToOne({ cascade: [Cascade.ALL] })
2727
questionnaire!: Questionnaire;
2828

2929
@ManyToOne()

apps/backend/src/research/questionnaires/questionnaires.service.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import { InjectRepository } from "@mikro-orm/nestjs";
33
import { Injectable, UnprocessableEntityException } from "@nestjs/common";
44
import { QuestionnaireCreationDto, QuestionnaireMutationDto } from "./questionnaire.dto";
55
import { Questionnaire } from "./questionnaire.entity";
6+
import { Entry } from "../entries/entry.entity";
7+
import { EntryLanguage } from "../entry-languages/entry-language.entity";
68

79
@Injectable()
810
export class QuestionnairesService {
@@ -16,6 +18,25 @@ export class QuestionnairesService {
1618
const questionnaire = new Questionnaire();
1719
questionnaire.assign(questionnaireCreationDto, { em: this.em });
1820

21+
const prevQuestionnaire = await this.questionnaireRepository.findOne(
22+
{ participant: questionnaire.participant },
23+
{ orderBy: { endedAt: "desc" }, populate: ["entries.entryLanguages"] }
24+
);
25+
26+
const clonedEntries = prevQuestionnaire?.entries.map((entry) => {
27+
const { id: _id, entryLanguages: _entryLanguages, questionnaire: _questionnaire, ...rest } = entry.toPOJO();
28+
const newEntry = this.em.create(Entry, { ...rest, questionnaire });
29+
30+
entry.entryLanguages.map((entryLanguage) => {
31+
const { id: _id, entry: _entry, ...rest } = entryLanguage.toPOJO();
32+
return this.em.create(EntryLanguage, { ...rest, entry: newEntry });
33+
});
34+
35+
return newEntry;
36+
});
37+
38+
questionnaire.assign({ entries: clonedEntries });
39+
1940
try {
2041
await this.em.persist(questionnaire).flush();
2142
} catch (e) {

eslint.config.mjs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,17 @@ export default tseslint.config(
1717
"react-hooks": pluginReactHooks,
1818
"react-refresh": pluginReactRefresh,
1919
},
20+
rules: {
21+
"no-unused-vars": "off",
22+
"@typescript-eslint/no-unused-vars": [
23+
"warn", // or "error"
24+
{
25+
argsIgnorePattern: "^_",
26+
varsIgnorePattern: "^_",
27+
caughtErrorsIgnorePattern: "^_",
28+
},
29+
],
30+
},
2031
},
2132
pluginJs.configs.recommended,
2233
...tseslint.configs.recommended,

0 commit comments

Comments
 (0)