From 89b28b6e25a09f58a6efa376b72bd1d28ce7e0c2 Mon Sep 17 00:00:00 2001 From: Julian Krauser Date: Fri, 7 Mar 2025 16:02:24 +0100 Subject: [PATCH] added detail form entities --- src/data-source.ts | 22 ++- src/entity/configuration/equipment.ts | 3 + src/entity/configuration/force.ts | 3 + src/entity/configuration/vehicle.ts | 3 + src/entity/operation/mission.ts | 64 ++++++++- src/entity/operation/mission_contact.ts | 33 +++++ src/entity/operation/mission_equipment.ts | 28 ++++ src/entity/operation/mission_force.ts | 25 ++++ src/entity/operation/mission_vehicle.ts | 50 +++++++ src/migrations/1739697068682-CreateSchema.ts | 16 ++- .../baseSchemaTables/configuration.ts | 3 + src/migrations/baseSchemaTables/operation.ts | 128 +++++++++++++++++- 12 files changed, 369 insertions(+), 9 deletions(-) create mode 100644 src/entity/operation/mission_contact.ts create mode 100644 src/entity/operation/mission_equipment.ts create mode 100644 src/entity/operation/mission_force.ts create mode 100644 src/entity/operation/mission_vehicle.ts diff --git a/src/data-source.ts b/src/data-source.ts index 41128fa..780dc54 100644 --- a/src/data-source.ts +++ b/src/data-source.ts @@ -16,6 +16,10 @@ import { CreateSchema1739697068682 } from "./migrations/1739697068682-CreateSche import { vehicle } from "./entity/configuration/vehicle"; import { equipment } from "./entity/configuration/equipment"; import { mission } from "./entity/operation/mission"; +import { mission_force } from "./entity/operation/mission_force"; +import { mission_equipment } from "./entity/operation/mission_equipment"; +import { mission_vehicle } from "./entity/operation/mission_vehicle"; +import { mission_contact } from "./entity/operation/mission_contact"; const dataSource = new DataSource({ type: DB_TYPE as any, @@ -27,7 +31,23 @@ const dataSource = new DataSource({ synchronize: false, logging: process.env.NODE_ENV ? true : ["schema", "error", "warn", "log", "migration"], bigNumberStrings: false, - entities: [user, refresh, invite, reset, userPermission, role, rolePermission, force, vehicle, equipment, mission], + entities: [ + user, + refresh, + invite, + reset, + userPermission, + role, + rolePermission, + force, + vehicle, + equipment, + mission, + mission_force, + mission_equipment, + mission_vehicle, + mission_contact, + ], migrations: [CreateSchema1739697068682], migrationsRun: true, migrationsTransactionMode: "each", diff --git a/src/entity/configuration/equipment.ts b/src/entity/configuration/equipment.ts index 1d9a81d..9fba18c 100644 --- a/src/entity/configuration/equipment.ts +++ b/src/entity/configuration/equipment.ts @@ -19,4 +19,7 @@ export class equipment { @Column({ type: "date", nullable: true, default: null }) decommissioned?: Date; + + @Column({ type: "boolean", default: false }) + external: boolean; } diff --git a/src/entity/configuration/force.ts b/src/entity/configuration/force.ts index ed116a9..89e65e6 100644 --- a/src/entity/configuration/force.ts +++ b/src/entity/configuration/force.ts @@ -22,4 +22,7 @@ export class force { @Column({ type: "date", nullable: true, default: null }) decommissioned?: Date; + + @Column({ type: "boolean", default: false }) + external: boolean; } diff --git a/src/entity/configuration/vehicle.ts b/src/entity/configuration/vehicle.ts index c77ac4c..63a55a8 100644 --- a/src/entity/configuration/vehicle.ts +++ b/src/entity/configuration/vehicle.ts @@ -19,4 +19,7 @@ export class vehicle { @Column({ type: "date", nullable: true, default: null }) decommissioned?: Date; + + @Column({ type: "boolean", default: false }) + external: boolean; } diff --git a/src/entity/operation/mission.ts b/src/entity/operation/mission.ts index ee5be2c..e5ecbda 100644 --- a/src/entity/operation/mission.ts +++ b/src/entity/operation/mission.ts @@ -1,16 +1,72 @@ -import { Column, CreateDateColumn, Entity, PrimaryColumn } from "typeorm"; +import { Column, CreateDateColumn, Entity, ManyToOne, OneToMany, PrimaryColumn } from "typeorm"; +import { force } from "../configuration/force"; +import { mission_force } from "./mission_force"; +import { mission_vehicle } from "./mission_vehicle"; +import { mission_equipment } from "./mission_equipment"; +import { mission_contact } from "./mission_contact"; @Entity() export class mission { @PrimaryColumn({ generated: "uuid" }) id: string; - @Column({ type: "varchar", length: 255 }) + @Column({ type: "varchar", length: 255, default: "" }) title: string; - @Column({ type: "varchar", length: 255, nullable: true }) - keyword?: string; + @Column({ type: "varchar", length: 36, nullable: true }) + commandId?: string | null; + + @Column({ type: "varchar", length: 36, nullable: true }) + secretaryId?: string | null; + + @Column({ type: "datetime", nullable: true, default: null }) + mission_start?: Date | null; + + @Column({ type: "datetime", nullable: true, default: null }) + mission_end?: Date | null; + + @Column({ type: "varchar", length: 255, default: "" }) + keyword: string; + + @Column({ type: "varchar", length: 255, default: "" }) + location: string; + + @Column({ type: "varchar", length: 255, default: "" }) + others: string; + + @Column({ type: "int", default: 0 }) + rescued: number; + + @Column({ type: "int", default: 0 }) + recovered: number; + + @Column({ type: "text", default: "" }) + description: string; @CreateDateColumn() createdAt: Date; + + @ManyToOne(() => force, { + onDelete: "RESTRICT", + onUpdate: "RESTRICT", + }) + command: force; + + @ManyToOne(() => force, { + onDelete: "RESTRICT", + onUpdate: "RESTRICT", + }) + secretary: force; + + @OneToMany(() => mission_force, (mf) => mf.mission, { cascade: ["insert"] }) + forces: mission_force[]; + + @OneToMany(() => mission_vehicle, (mv) => mv.mission, { cascade: ["insert"] }) + vehicles: mission_vehicle[]; + + @OneToMany(() => mission_equipment, (me) => me.mission, { cascade: ["insert"] }) + equipments: mission_equipment[]; + + @OneToMany(() => mission_contact, (mc) => mc.mission, { cascade: ["insert"] }) + contacts: mission_contact[]; } diff --git a/src/entity/operation/mission_contact.ts b/src/entity/operation/mission_contact.ts new file mode 100644 index 0000000..e94c1ea --- /dev/null +++ b/src/entity/operation/mission_contact.ts @@ -0,0 +1,33 @@ +import { Column, Entity, ManyToOne, PrimaryColumn } from "typeorm"; +import { mission } from "./mission"; + +@Entity() +export class mission_contact { + @PrimaryColumn({ type: "varchar", length: 36 }) + missionId: string; + + @PrimaryColumn({ type: "varchar", length: 36 }) + contactId: string; + + @Column({ type: "varchar", length: 255, default: "" }) + firstname: string; + + @Column({ type: "varchar", length: 255, default: "" }) + lastname: string; + + @Column({ type: "varchar", length: 255, default: "" }) + phone: string; + + @Column({ type: "varchar", length: 255, default: "" }) + address: string; + + @Column({ type: "varchar", length: 255, default: "" }) + note: string; + + @ManyToOne(() => mission, { + nullable: false, + onDelete: "CASCADE", + onUpdate: "RESTRICT", + }) + mission: mission; +} diff --git a/src/entity/operation/mission_equipment.ts b/src/entity/operation/mission_equipment.ts new file mode 100644 index 0000000..eed4ad5 --- /dev/null +++ b/src/entity/operation/mission_equipment.ts @@ -0,0 +1,28 @@ +import { Column, Entity, ManyToOne, PrimaryColumn } from "typeorm"; +import { mission } from "./mission"; +import { equipment } from "../configuration/equipment"; + +@Entity() +export class mission_equipment { + @PrimaryColumn({ type: "varchar", length: 36 }) + missionId: string; + + @PrimaryColumn({ type: "varchar", length: 36 }) + equipmentId: string; + + @Column({ type: "varchar", length: 255, default: "" }) + note: string; + + @ManyToOne(() => mission, { + nullable: false, + onDelete: "CASCADE", + onUpdate: "RESTRICT", + }) + mission: mission; + + @ManyToOne(() => equipment, { + onDelete: "RESTRICT", + onUpdate: "RESTRICT", + }) + equipment: equipment; +} diff --git a/src/entity/operation/mission_force.ts b/src/entity/operation/mission_force.ts new file mode 100644 index 0000000..b0db0f7 --- /dev/null +++ b/src/entity/operation/mission_force.ts @@ -0,0 +1,25 @@ +import { Entity, ManyToOne, PrimaryColumn } from "typeorm"; +import { force } from "../configuration/force"; +import { mission } from "./mission"; + +@Entity() +export class mission_force { + @PrimaryColumn({ type: "varchar", length: 36 }) + missionId: string; + + @PrimaryColumn({ type: "varchar", length: 36 }) + forceId: string; + + @ManyToOne(() => mission, { + nullable: false, + onDelete: "CASCADE", + onUpdate: "RESTRICT", + }) + mission: mission; + + @ManyToOne(() => force, { + onDelete: "RESTRICT", + onUpdate: "RESTRICT", + }) + force: force; +} diff --git a/src/entity/operation/mission_vehicle.ts b/src/entity/operation/mission_vehicle.ts new file mode 100644 index 0000000..a4c17e3 --- /dev/null +++ b/src/entity/operation/mission_vehicle.ts @@ -0,0 +1,50 @@ +import { Column, Entity, ManyToOne, PrimaryColumn } from "typeorm"; +import { force } from "../configuration/force"; +import { mission } from "./mission"; +import { vehicle } from "../configuration/vehicle"; + +@Entity() +export class mission_vehicle { + @PrimaryColumn({ type: "varchar", length: 36 }) + missionId: string; + + @PrimaryColumn({ type: "varchar", length: 36 }) + vehicleId: string; + + @Column({ type: "varchar", length: 36, nullable: true }) + driverId?: string | null; + + @Column({ type: "varchar", length: 36, nullable: true }) + leaderId?: string | null; + + @Column({ type: "int", nullable: true, default: null }) + mileage_start?: number | null; + + @Column({ type: "int", nullable: true, default: null }) + mileage_end?: number | null; + + @ManyToOne(() => mission, { + onDelete: "CASCADE", + onUpdate: "RESTRICT", + }) + mission: mission; + + @ManyToOne(() => vehicle, { + nullable: false, + onDelete: "RESTRICT", + onUpdate: "RESTRICT", + }) + vehicle: vehicle; + + @ManyToOne(() => force, { + onDelete: "RESTRICT", + onUpdate: "RESTRICT", + }) + driver: force; + + @ManyToOne(() => force, { + onDelete: "RESTRICT", + onUpdate: "RESTRICT", + }) + leader: force; +} diff --git a/src/migrations/1739697068682-CreateSchema.ts b/src/migrations/1739697068682-CreateSchema.ts index 8afca2e..1a5e155 100644 --- a/src/migrations/1739697068682-CreateSchema.ts +++ b/src/migrations/1739697068682-CreateSchema.ts @@ -10,7 +10,13 @@ import { user_table, } from "./baseSchemaTables/admin"; import { equipment_table, force_table, vehicle_table } from "./baseSchemaTables/configuration"; -import { mission_table } from "./baseSchemaTables/operation"; +import { + mission_contact_table, + mission_equipment_table, + mission_force_table, + mission_table, + mission_vehicle_table, +} from "./baseSchemaTables/operation"; export class CreateSchema1739697068682 implements MigrationInterface { name = "CreateSchema1739697068682"; @@ -30,9 +36,17 @@ export class CreateSchema1739697068682 implements MigrationInterface { await queryRunner.createTable(vehicle_table, true, true, true); await queryRunner.createTable(mission_table, true, true, true); + await queryRunner.createTable(mission_force_table, true, true, true); + await queryRunner.createTable(mission_vehicle_table, true, true, true); + await queryRunner.createTable(mission_equipment_table, true, true, true); + await queryRunner.createTable(mission_contact_table, true, true, true); } public async down(queryRunner: QueryRunner): Promise { + await queryRunner.dropTable("mission_contact", true, true, true); + await queryRunner.dropTable("mission_equipment", true, true, true); + await queryRunner.dropTable("mission_vehicle", true, true, true); + await queryRunner.dropTable("mission_force", true, true, true); await queryRunner.dropTable("mission", true, true, true); await queryRunner.dropTable("vehicle", true, true, true); diff --git a/src/migrations/baseSchemaTables/configuration.ts b/src/migrations/baseSchemaTables/configuration.ts index df6cd74..692f979 100644 --- a/src/migrations/baseSchemaTables/configuration.ts +++ b/src/migrations/baseSchemaTables/configuration.ts @@ -11,6 +11,7 @@ export const force_table = new Table({ { name: "nameaffix", ...getTypeByORM("varchar") }, { name: "commissioned", ...getTypeByORM("date"), default: getDefaultByORM("currentDate") }, { name: "decommissioned", ...getTypeByORM("date", true), default: getDefaultByORM("null") }, + { name: "external", ...getTypeByORM("boolean"), default: getDefaultByORM("boolean", false) }, ], }); @@ -23,6 +24,7 @@ export const equipment_table = new Table({ { name: "name", ...getTypeByORM("varchar"), isUnique: true }, { name: "commissioned", ...getTypeByORM("date"), default: getDefaultByORM("currentDate") }, { name: "decommissioned", ...getTypeByORM("date", true), default: getDefaultByORM("null") }, + { name: "external", ...getTypeByORM("boolean"), default: getDefaultByORM("boolean", false) }, ], }); @@ -35,5 +37,6 @@ export const vehicle_table = new Table({ { name: "name", ...getTypeByORM("varchar"), isUnique: true }, { name: "commissioned", ...getTypeByORM("date"), default: getDefaultByORM("currentDate") }, { name: "decommissioned", ...getTypeByORM("date", true), default: getDefaultByORM("null") }, + { name: "external", ...getTypeByORM("boolean"), default: getDefaultByORM("boolean", false) }, ], }); diff --git a/src/migrations/baseSchemaTables/operation.ts b/src/migrations/baseSchemaTables/operation.ts index e2f3c81..114f313 100644 --- a/src/migrations/baseSchemaTables/operation.ts +++ b/src/migrations/baseSchemaTables/operation.ts @@ -1,12 +1,134 @@ -import { Table } from "typeorm"; +import { Table, TableForeignKey } from "typeorm"; import { getDefaultByORM, getTypeByORM, isUUIDPrimary } from "../ormHelper"; export const mission_table = new Table({ name: "mission", columns: [ { name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary }, - { name: "title", ...getTypeByORM("varchar") }, - { name: "keyword", ...getTypeByORM("varchar", true), default: getDefaultByORM("null") }, + { name: "title", ...getTypeByORM("varchar"), default: getDefaultByORM("string") }, + { name: "commandId", ...getTypeByORM("uuid", true), default: getDefaultByORM("null") }, + { name: "secretaryId", ...getTypeByORM("uuid", true), default: getDefaultByORM("null") }, + { name: "mission_start", ...getTypeByORM("datetime", true, 6), default: getDefaultByORM("null") }, + { name: "mission_end", ...getTypeByORM("datetime", true, 6), default: getDefaultByORM("null") }, + { name: "keyword", ...getTypeByORM("varchar"), default: getDefaultByORM("string") }, + { name: "location", ...getTypeByORM("varchar"), default: getDefaultByORM("string") }, + { name: "others", ...getTypeByORM("varchar"), default: getDefaultByORM("string") }, + { name: "rescued", ...getTypeByORM("int"), default: getDefaultByORM("number", 0) }, + { name: "recovered", ...getTypeByORM("int"), default: getDefaultByORM("number", 0) }, + { name: "description", ...getTypeByORM("text"), default: getDefaultByORM("string") }, { name: "createdAt", ...getTypeByORM("datetime", false, 6), default: getDefaultByORM("currentTimestamp") }, ], }); + +export const mission_force_table = new Table({ + name: "mission_force", + columns: [ + { name: "missionId", ...getTypeByORM("uuid"), isPrimary: true }, + { name: "forceId", ...getTypeByORM("uuid"), isPrimary: true }, + ], + foreignKeys: [ + new TableForeignKey({ + columnNames: ["missionId"], + referencedColumnNames: ["id"], + referencedTableName: "mission", + onDelete: "CASCADE", + onUpdate: "RESTRICT", + }), + new TableForeignKey({ + columnNames: ["forceId"], + referencedColumnNames: ["id"], + referencedTableName: "force", + onDelete: "RESTRICT", + onUpdate: "RESTRICT", + }), + ], +}); + +export const mission_vehicle_table = new Table({ + name: "mission_vehicle", + columns: [ + { name: "missionId", ...getTypeByORM("uuid"), isPrimary: true }, + { name: "vehicleId", ...getTypeByORM("uuid"), isPrimary: true }, + { name: "driverId", ...getTypeByORM("uuid", true), default: getDefaultByORM("null") }, + { name: "leaderId", ...getTypeByORM("uuid", true), default: getDefaultByORM("null") }, + { name: "mileage_start", ...getTypeByORM("int", true), default: getDefaultByORM("null") }, + { name: "mileage_end", ...getTypeByORM("int", true), default: getDefaultByORM("null") }, + ], + foreignKeys: [ + new TableForeignKey({ + columnNames: ["missionId"], + referencedColumnNames: ["id"], + referencedTableName: "mission", + onDelete: "CASCADE", + onUpdate: "RESTRICT", + }), + new TableForeignKey({ + columnNames: ["vehicleId"], + referencedColumnNames: ["id"], + referencedTableName: "vehicle", + onDelete: "RESTRICT", + onUpdate: "RESTRICT", + }), + new TableForeignKey({ + columnNames: ["driverId"], + referencedColumnNames: ["id"], + referencedTableName: "force", + onDelete: "RESTRICT", + onUpdate: "RESTRICT", + }), + new TableForeignKey({ + columnNames: ["leaderId"], + referencedColumnNames: ["id"], + referencedTableName: "force", + onDelete: "RESTRICT", + onUpdate: "RESTRICT", + }), + ], +}); + +export const mission_equipment_table = new Table({ + name: "mission_equipment", + columns: [ + { name: "missionId", ...getTypeByORM("uuid"), isPrimary: true }, + { name: "equipmentId", ...getTypeByORM("uuid"), isPrimary: true }, + { name: "note", ...getTypeByORM("varchar"), default: getDefaultByORM("string") }, + ], + foreignKeys: [ + new TableForeignKey({ + columnNames: ["missionId"], + referencedColumnNames: ["id"], + referencedTableName: "mission", + onDelete: "CASCADE", + onUpdate: "RESTRICT", + }), + new TableForeignKey({ + columnNames: ["equipmentId"], + referencedColumnNames: ["id"], + referencedTableName: "equipment", + onDelete: "RESTRICT", + onUpdate: "RESTRICT", + }), + ], +}); + +export const mission_contact_table = new Table({ + name: "mission_contact", + columns: [ + { name: "missionId", ...getTypeByORM("uuid"), isPrimary: true }, + { name: "contactId", ...getTypeByORM("uuid"), isPrimary: true }, + { name: "firstname", ...getTypeByORM("varchar"), default: getDefaultByORM("string") }, + { name: "lastname", ...getTypeByORM("varchar"), default: getDefaultByORM("string") }, + { name: "phone", ...getTypeByORM("varchar"), default: getDefaultByORM("string") }, + { name: "address", ...getTypeByORM("varchar"), default: getDefaultByORM("string") }, + { name: "note", ...getTypeByORM("varchar"), default: getDefaultByORM("string") }, + ], + foreignKeys: [ + new TableForeignKey({ + columnNames: ["missionId"], + referencedColumnNames: ["id"], + referencedTableName: "mission", + onDelete: "CASCADE", + onUpdate: "RESTRICT", + }), + ], +});