base migration and schema optimization

This commit is contained in:
Julian Krauser 2025-05-26 14:53:25 +02:00
parent 0d8499b828
commit d156cc6ad6
16 changed files with 426 additions and 22 deletions

View file

@ -56,6 +56,19 @@ import { SettingsFromEnv1745059495807 } from "./migrations/1745059495807-setting
import { MemberCreatedAt1746006549262 } from "./migrations/1746006549262-memberCreatedAt";
import { UserLoginRoutine1746252454922 } from "./migrations/1746252454922-UserLoginRoutine";
import { SettingsFromEnv_SET1745059495808 } from "./migrations/1745059495808-settingsFromEnv_set";
import { equipmentType } from "./entity/unit/equipment/equipmentType";
import { equipment } from "./entity/unit/equipment/equipment";
import { vehicleType } from "./entity/unit/vehicle/vehicleType";
import { vehicle } from "./entity/unit/vehicle/vehicle";
import { wearableType } from "./entity/unit/wearable/wearableType";
import { wearable } from "./entity/unit/wearable/wearable";
import { damageReport } from "./entity/unit/damageReport";
import { inspectionPlan } from "./entity/unit/inspection/inspectionPlan";
import { inspectionVersionedPlan } from "./entity/unit/inspection/inspectionVersionedPlan";
import { inspectionPoint } from "./entity/unit/inspection/inspectionPoint";
import { inspection } from "./entity/unit/inspection/inspection";
import { inspectionPointResult } from "./entity/unit/inspection/inspectionPointResult";
import { UnitBase1748261477410 } from "./migrations/1748261477410-unitBase";
configCheck();
@ -111,6 +124,18 @@ const dataSource = new DataSource({
webapi,
webapiPermission,
setting,
equipmentType,
equipment,
vehicleType,
vehicle,
wearableType,
wearable,
damageReport,
inspectionPlan,
inspectionVersionedPlan,
inspectionPoint,
inspection,
inspectionPointResult,
],
migrations: [
BackupAndResetDatabase1738166124200,
@ -123,6 +148,7 @@ const dataSource = new DataSource({
SettingsFromEnv_SET1745059495808,
MemberCreatedAt1746006549262,
UserLoginRoutine1746252454922,
UnitBase1748261477410,
],
migrationsRun: true,
migrationsTransactionMode: "each",

View file

@ -20,13 +20,13 @@ export class damageReport {
@Column({ type: "text" })
description: string;
@Column({ nullable: true })
@Column({ nullable: true, default: null })
equipmentId: string;
@Column({ nullable: true })
@Column({ nullable: true, default: null })
vehicleId: string;
@Column({ nullable: true })
@Column({ nullable: true, default: null })
wearableId: string;
@ManyToOne(() => equipment, {

View file

@ -8,7 +8,7 @@ export class equipment {
@PrimaryGeneratedColumn("uuid")
id: string;
@Column({ type: "varchar", length: 255, nullable: true, unique: true })
@Column({ type: "varchar", length: 255, nullable: true, default: null, unique: true })
code?: string;
@Column({ type: "varchar", length: 255 })
@ -20,7 +20,7 @@ export class equipment {
@Column({ type: getTypeByORM("datetime").type as ColumnType })
commissioned: Date;
@Column({ type: getTypeByORM("datetime").type as ColumnType, nullable: true })
@Column({ type: getTypeByORM("datetime").type as ColumnType, nullable: true, default: null })
decommissioned?: Date;
@Column()

View file

@ -6,7 +6,7 @@ export class equipmentType {
@PrimaryGeneratedColumn("uuid")
id: string;
@Column({ type: "varchar", length: 255 })
@Column({ type: "varchar", length: 255, unique: true })
type: string;
@Column({ type: "text", nullable: true })

View file

@ -16,21 +16,37 @@ export class inspection {
@CreateDateColumn()
createdAt: Date;
@Column({ type: getTypeByORM("date").type as ColumnType, nullable: true })
@Column({ type: getTypeByORM("date").type as ColumnType, nullable: true, default: null })
finishedAt?: Date;
@Column({ type: getTypeByORM("date").type as ColumnType, nullable: true })
@Column({ type: getTypeByORM("date").type as ColumnType, nullable: true, default: null })
nextInspection?: Date;
@ManyToOne(() => inspectionPlan)
@ManyToOne(() => inspectionPlan, {
nullable: false,
onDelete: "RESTRICT",
onUpdate: "RESTRICT",
})
inspectionPlan: inspectionPlan;
@ManyToOne(() => inspectionVersionedPlan)
@ManyToOne(() => inspectionVersionedPlan, {
nullable: false,
onDelete: "RESTRICT",
onUpdate: "RESTRICT",
})
inspectionVersionedPlan: inspectionVersionedPlan;
@ManyToOne(() => equipment)
@ManyToOne(() => equipment, {
nullable: true,
onDelete: "CASCADE",
onUpdate: "RESTRICT",
})
equipment: equipment;
@ManyToOne(() => vehicle)
@ManyToOne(() => vehicle, {
nullable: true,
onDelete: "CASCADE",
onUpdate: "RESTRICT",
})
vehicle: vehicle;
}

View file

@ -19,7 +19,7 @@ export class inspectionPlan {
remindTime: PlanTimeDefinition;
@CreateDateColumn()
created: Date;
createdAt: Date;
@Column()
equipmentId: string;

View file

@ -27,9 +27,15 @@ export class inspectionPoint {
})
type: InspectionPointEnum;
@Column({ type: "int", default: 0 })
@Column({ type: "int", nullable: true, default: null })
min: number;
@Column({ type: "int", nullable: true, default: null })
max: number;
@Column()
versionedPlanId: string;
@ManyToOne(() => inspectionVersionedPlan, {
nullable: false,
onDelete: "CASCADE",

View file

@ -10,9 +10,17 @@ export class inspectionPointResult {
@Column({ type: "text" })
value: string;
@ManyToOne(() => inspection)
@ManyToOne(() => inspection, {
nullable: false,
onDelete: "CASCADE",
onUpdate: "RESTRICT",
})
inspection: inspection;
@ManyToOne(() => inspectionPoint)
@ManyToOne(() => inspectionPoint, {
nullable: false,
onDelete: "RESTRICT",
onUpdate: "RESTRICT",
})
inspectionPoint: inspectionPoint;
}

View file

@ -8,7 +8,7 @@ export class vehicle {
@PrimaryGeneratedColumn("uuid")
id: string;
@Column({ type: "varchar", length: 255, nullable: true, unique: true })
@Column({ type: "varchar", length: 255, nullable: true, default: null, unique: true })
code?: string;
@Column({ type: "varchar", length: 255 })
@ -20,7 +20,7 @@ export class vehicle {
@Column({ type: getTypeByORM("datetime").type as ColumnType })
commissioned: Date;
@Column({ type: getTypeByORM("datetime").type as ColumnType, nullable: true })
@Column({ type: getTypeByORM("datetime").type as ColumnType, nullable: true, default: null })
decommissioned?: Date;
@Column()

View file

@ -6,7 +6,7 @@ export class vehicleType {
@PrimaryGeneratedColumn("uuid")
id: string;
@Column({ type: "varchar", length: 255 })
@Column({ type: "varchar", length: 255, unique: true })
type: string;
@Column({ type: "text", nullable: true })

View file

@ -9,7 +9,7 @@ export class wearable {
@PrimaryGeneratedColumn("uuid")
id: string;
@Column({ type: "varchar", length: 255, nullable: true, unique: true })
@Column({ type: "varchar", length: 255, nullable: true, default: null, unique: true })
code?: string;
@Column({ type: "varchar", length: 255 })
@ -21,7 +21,7 @@ export class wearable {
@Column({ type: getTypeByORM("datetime").type as ColumnType })
commissioned: Date;
@Column({ type: getTypeByORM("datetime").type as ColumnType, nullable: true })
@Column({ type: getTypeByORM("datetime").type as ColumnType, nullable: true, default: null })
decommissioned?: Date;
@Column()

View file

@ -6,7 +6,7 @@ export class wearableType {
@PrimaryGeneratedColumn("uuid")
id: string;
@Column({ type: "varchar", length: 255 })
@Column({ type: "varchar", length: 255, unique: true })
type: string;
@Column({ type: "text", nullable: true })

View file

@ -0,0 +1,57 @@
import { MigrationInterface, QueryRunner } from "typeorm";
import {
equipment_table,
equipment_type_table,
vehicle_table,
vehicle_type_table,
wearable_table,
wearable_type_table,
} from "./baseSchemaTables/unit";
import { damage_report_table } from "./baseSchemaTables/unit_extend";
import {
inspection_plan_table,
inspection_point_result_table,
inspection_point_table,
inspection_table,
inspection_versioned_plan_table,
} from "./baseSchemaTables/inspection";
export class UnitBase1748261477410 implements MigrationInterface {
name = "UnitBase1748261477410";
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.createTable(equipment_type_table, true, true, true);
await queryRunner.createTable(equipment_table, true, true, true);
await queryRunner.createTable(vehicle_type_table, true, true, true);
await queryRunner.createTable(vehicle_table, true, true, true);
await queryRunner.createTable(wearable_type_table, true, true, true);
await queryRunner.createTable(wearable_table, true, true, true);
await queryRunner.createTable(damage_report_table, true, true, true);
await queryRunner.createTable(inspection_plan_table, true, true, true);
await queryRunner.createTable(inspection_versioned_plan_table, true, true, true);
await queryRunner.createTable(inspection_point_table, true, true, true);
await queryRunner.createTable(inspection_table, true, true, true);
await queryRunner.createTable(inspection_point_result_table, true, true, true);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropTable(inspection_point_result_table, true, true, true);
await queryRunner.dropTable(inspection_table, true, true, true);
await queryRunner.dropTable(inspection_point_table, true, true, true);
await queryRunner.dropTable(inspection_versioned_plan_table, true, true, true);
await queryRunner.dropTable(inspection_plan_table, true, true, true);
await queryRunner.dropTable(damage_report_table, true, true, true);
await queryRunner.dropTable(wearable_table, true, true, true);
await queryRunner.dropTable(wearable_type_table, true, true, true);
await queryRunner.dropTable(vehicle_table, true, true, true);
await queryRunner.dropTable(vehicle_type_table, true, true, true);
await queryRunner.dropTable(equipment_table, true, true, true);
await queryRunner.dropTable(equipment_type_table, true, true, true);
}
}

View file

@ -0,0 +1,149 @@
import { Table, TableForeignKey, TableUnique, Unique } from "typeorm";
import { getTypeByORM, isUUIDPrimary, getDefaultByORM } from "../ormHelper";
export const inspection_plan_table = new Table({
name: "inspection_plan",
columns: [
{ name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
{ name: "title", ...getTypeByORM("varchar") },
{ name: "inspectionInterval", ...getTypeByORM("varchar") },
{ name: "remindTime", ...getTypeByORM("varchar") },
{ name: "createdAt", ...getTypeByORM("date"), default: getDefaultByORM("currentTimestamp") },
{ name: "equipmentId", ...getTypeByORM("uuid", true), default: getDefaultByORM("null") },
{ name: "vehicleId", ...getTypeByORM("uuid", true), default: getDefaultByORM("null") },
],
foreignKeys: [
new TableForeignKey({
columnNames: ["equipmentId"],
referencedColumnNames: ["id"],
referencedTableName: "equipment",
onDelete: "CASCADE",
onUpdate: "RESTRICT",
}),
new TableForeignKey({
columnNames: ["vehicleId"],
referencedColumnNames: ["id"],
referencedTableName: "vehicle",
onDelete: "CASCADE",
onUpdate: "RESTRICT",
}),
],
});
export const inspection_versioned_plan_table = new Table({
name: "inspection_versioned_plan",
columns: [
{ name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
{ name: "version", ...getTypeByORM("int"), default: getDefaultByORM("number", 0) },
{ name: "createdAt", ...getTypeByORM("date"), default: getDefaultByORM("currentTimestamp") },
{ name: "inspectionPlanId", ...getTypeByORM("uuid") },
],
foreignKeys: [
new TableForeignKey({
columnNames: ["inspectionPlanId"],
referencedColumnNames: ["id"],
referencedTableName: "inspection_plan",
onDelete: "CASCADE",
onUpdate: "RESTRICT",
}),
],
uniques: [
new TableUnique({
name: "unique_version",
columnNames: ["version", "inspectionPlanId"],
}),
],
});
export const inspection_point_table = new Table({
name: "inspection_point",
columns: [
{ name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
{ name: "title", ...getTypeByORM("varchar") },
{ name: "description", ...getTypeByORM("text") },
{ name: "type", ...getTypeByORM("varchar") },
{ name: "min", ...getTypeByORM("int", true), default: getDefaultByORM("null") },
{ name: "max", ...getTypeByORM("int", true), default: getDefaultByORM("null") },
{ name: "versionedPlanId", ...getTypeByORM("uuid") },
],
foreignKeys: [
new TableForeignKey({
columnNames: ["versionedPlanId"],
referencedColumnNames: ["id"],
referencedTableName: "inspection_versioned_plan",
onDelete: "CASCADE",
onUpdate: "RESTRICT",
}),
],
});
export const inspection_table = new Table({
name: "inspection",
columns: [
{ name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
{ name: "context", ...getTypeByORM("text") },
{ name: "createdAt", ...getTypeByORM("date"), default: getDefaultByORM("currentTimestamp") },
{ name: "finishedAt", ...getTypeByORM("date", true) },
{ name: "nextInspection", ...getTypeByORM("date", true) },
{ name: "inspectionPlanId", ...getTypeByORM("uuid") },
{ name: "inspectionVersionedPlanId", ...getTypeByORM("uuid") },
{ name: "equipmentId", ...getTypeByORM("uuid", true), default: getDefaultByORM("null") },
{ name: "vehicleId", ...getTypeByORM("uuid", true), default: getDefaultByORM("null") },
],
foreignKeys: [
new TableForeignKey({
columnNames: ["inspectionPlanId"],
referencedColumnNames: ["id"],
referencedTableName: "inspection_plan",
onDelete: "RESTRICT",
onUpdate: "RESTRICT",
}),
new TableForeignKey({
columnNames: ["inspectionVersionedPlanId"],
referencedColumnNames: ["id"],
referencedTableName: "inspection_versioned_plan",
onDelete: "RESTRICT",
onUpdate: "RESTRICT",
}),
new TableForeignKey({
columnNames: ["equipmentId"],
referencedColumnNames: ["id"],
referencedTableName: "equipment",
onDelete: "CASCADE",
onUpdate: "RESTRICT",
}),
new TableForeignKey({
columnNames: ["vehicleId"],
referencedColumnNames: ["id"],
referencedTableName: "vehicle",
onDelete: "CASCADE",
onUpdate: "RESTRICT",
}),
],
});
export const inspection_point_result_table = new Table({
name: "inspection_point_result",
columns: [
{ name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
{ name: "value", ...getTypeByORM("text") },
{ name: "inspectionId", ...getTypeByORM("uuid") },
{ name: "inspectionPointId", ...getTypeByORM("uuid") },
],
foreignKeys: [
new TableForeignKey({
columnNames: ["inspectionId"],
referencedColumnNames: ["id"],
referencedTableName: "inspection",
onDelete: "CASCADE",
onUpdate: "RESTRICT",
}),
new TableForeignKey({
columnNames: ["inspectionPointId"],
referencedColumnNames: ["id"],
referencedTableName: "inspection_point",
onDelete: "RESTRICT",
onUpdate: "RESTRICT",
}),
],
});

View file

@ -0,0 +1,103 @@
import { Table, TableForeignKey } from "typeorm";
import { getTypeByORM, isUUIDPrimary, getDefaultByORM } from "../ormHelper";
export const equipment_table = new Table({
name: "equipment",
columns: [
{ name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
{ name: "code", ...getTypeByORM("varchar", true), default: getDefaultByORM("null"), isUnique: true },
{ name: "name", ...getTypeByORM("varchar") },
{ name: "location", ...getTypeByORM("varchar") },
{ name: "commissioned", ...getTypeByORM("date") },
{ name: "decommissioned", ...getTypeByORM("date", true), default: getDefaultByORM("null") },
{ name: "equipmentTypeId", ...getTypeByORM("uuid") },
],
foreignKeys: [
new TableForeignKey({
columnNames: ["equipmentTypeId"],
referencedColumnNames: ["id"],
referencedTableName: "equipment_type",
onDelete: "RESTRICT",
onUpdate: "RESTRICT",
}),
],
});
export const equipment_type_table = new Table({
name: "equipment_type",
columns: [
{ name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
{ name: "type", ...getTypeByORM("varchar"), isUnique: true },
{ name: "description", ...getTypeByORM("text") },
],
});
export const vehicle_table = new Table({
name: "vehicle",
columns: [
{ name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
{ name: "code", ...getTypeByORM("varchar", true), default: getDefaultByORM("null"), isUnique: true },
{ name: "name", ...getTypeByORM("varchar") },
{ name: "location", ...getTypeByORM("varchar") },
{ name: "commissioned", ...getTypeByORM("date") },
{ name: "decommissioned", ...getTypeByORM("date", true), default: getDefaultByORM("null") },
{ name: "vehicleTypeId", ...getTypeByORM("uuid") },
],
foreignKeys: [
new TableForeignKey({
columnNames: ["vehicleTypeId"],
referencedColumnNames: ["id"],
referencedTableName: "vehicle_type",
onDelete: "RESTRICT",
onUpdate: "RESTRICT",
}),
],
});
export const vehicle_type_table = new Table({
name: "vehicle_type",
columns: [
{ name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
{ name: "type", ...getTypeByORM("varchar"), isUnique: true },
{ name: "description", ...getTypeByORM("text") },
],
});
export const wearable_table = new Table({
name: "wearable",
columns: [
{ name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
{ name: "code", ...getTypeByORM("varchar", true), default: getDefaultByORM("null"), isUnique: true },
{ name: "name", ...getTypeByORM("varchar") },
{ name: "location", ...getTypeByORM("varchar") },
{ name: "commissioned", ...getTypeByORM("date") },
{ name: "decommissioned", ...getTypeByORM("date", true), default: getDefaultByORM("null") },
{ name: "wearableTypeId", ...getTypeByORM("uuid") },
{ name: "wearerId", ...getTypeByORM("uuid", true), default: getDefaultByORM("null") },
],
foreignKeys: [
new TableForeignKey({
columnNames: ["wearableTypeId"],
referencedColumnNames: ["id"],
referencedTableName: "wearable_type",
onDelete: "RESTRICT",
onUpdate: "RESTRICT",
}),
new TableForeignKey({
columnNames: ["wearerId"],
referencedColumnNames: ["id"],
referencedTableName: "member",
onDelete: "SET NULL",
onUpdate: "RESTRICT",
}),
],
});
export const wearable_type_table = new Table({
name: "wearable_type",
columns: [
{ name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
{ name: "type", ...getTypeByORM("varchar"), isUnique: true },
{ name: "description", ...getTypeByORM("text") },
],
});

View file

@ -0,0 +1,39 @@
import { Table, TableForeignKey } from "typeorm";
import { getTypeByORM, isUUIDPrimary, getDefaultByORM } from "../ormHelper";
export const damage_report_table = new Table({
name: "damage_report",
columns: [
{ name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
{ name: "reportedAt", ...getTypeByORM("date"), default: getDefaultByORM("currentTimestamp") },
{ name: "status", ...getTypeByORM("varchar") },
{ name: "done", ...getTypeByORM("boolean"), default: getDefaultByORM("boolean", false) },
{ name: "description", ...getTypeByORM("text") },
{ name: "equipmentId", ...getTypeByORM("uuid", true), default: getDefaultByORM("null") },
{ name: "vehicleId", ...getTypeByORM("uuid", true), default: getDefaultByORM("null") },
{ name: "wearableId", ...getTypeByORM("uuid", true), default: getDefaultByORM("null") },
],
foreignKeys: [
new TableForeignKey({
columnNames: ["equipmentId"],
referencedColumnNames: ["id"],
referencedTableName: "equipment",
onDelete: "CASCADE",
onUpdate: "RESTRICT",
}),
new TableForeignKey({
columnNames: ["vehicleId"],
referencedColumnNames: ["id"],
referencedTableName: "vehicle",
onDelete: "CASCADE",
onUpdate: "RESTRICT",
}),
new TableForeignKey({
columnNames: ["wearableId"],
referencedColumnNames: ["id"],
referencedTableName: "wearable",
onDelete: "CASCADE",
onUpdate: "RESTRICT",
}),
],
});