migration update

This commit is contained in:
Julian Krauser 2025-01-25 11:39:34 +01:00
parent 21cf811a56
commit b55d0554e4
5 changed files with 517 additions and 195 deletions

View file

@ -72,6 +72,8 @@ import { webapi } from "./entity/user/webapi";
import { webapiPermission } from "./entity/user/webapi_permission"; import { webapiPermission } from "./entity/user/webapi_permission";
import { AddWebapiTokens1737453096674 } from "./migrations/1737453096674-addwebapiTokens"; import { AddWebapiTokens1737453096674 } from "./migrations/1737453096674-addwebapiTokens";
import { salutation } from "./entity/settings/salutation"; import { salutation } from "./entity/settings/salutation";
import { SalutationAsTable1737796878058 } from "./migrations/1737796878058-salutationAsTable";
import { UpdateViews1737800468938 } from "./migrations/1737800468938-updateViews";
const dataSource = new DataSource({ const dataSource = new DataSource({
type: DB_TYPE as any, type: DB_TYPE as any,
@ -154,6 +156,8 @@ const dataSource = new DataSource({
FinishInternalIdTransfer1736505324488, FinishInternalIdTransfer1736505324488,
ProtocolPresenceExcuse1737287798828, ProtocolPresenceExcuse1737287798828,
AddWebapiTokens1737453096674, AddWebapiTokens1737453096674,
SalutationAsTable1737796878058,
UpdateViews1737800468938,
], ],
migrationsRun: true, migrationsRun: true,
migrationsTransactionMode: "each", migrationsTransactionMode: "each",

View file

@ -8,105 +8,105 @@ export class MemberDataViews1734520998539 implements MigrationInterface {
name = "MemberDataViews1734520998539"; name = "MemberDataViews1734520998539";
public async up(queryRunner: QueryRunner): Promise<void> { public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.createView( // await queryRunner.createView(
new View({ // new View({
name: "member_view", // name: "member_view",
expression: (datasource: DataSource) => // expression: (datasource: DataSource) =>
datasource // datasource
.getRepository(member) // .getRepository(member)
.createQueryBuilder("member") // .createQueryBuilder("member")
.select("member.id", "id") // .select("member.id", "id")
.addSelect("member.salutation", "salutation") // .addSelect("member.salutation", "salutation")
.addSelect("member.firstname", "firstname") // .addSelect("member.firstname", "firstname")
.addSelect("member.lastname", "lastname") // .addSelect("member.lastname", "lastname")
.addSelect("member.nameaffix", "nameaffix") // .addSelect("member.nameaffix", "nameaffix")
.addSelect("member.birthdate", "birthdate") // .addSelect("member.birthdate", "birthdate")
.addSelect("TIMESTAMPDIFF(YEAR, member.birthdate, CURDATE())", "todayAge") // .addSelect("TIMESTAMPDIFF(YEAR, member.birthdate, CURDATE())", "todayAge")
.addSelect("YEAR(CURDATE()) - YEAR(member.birthdate)", "ageThisYear"), // .addSelect("YEAR(CURDATE()) - YEAR(member.birthdate)", "ageThisYear"),
}), // }),
true // true
); // );
await queryRunner.createView( // await queryRunner.createView(
new View({ // new View({
name: "member_executive_positions_view", // name: "member_executive_positions_view",
expression: (datasource: DataSource) => // expression: (datasource: DataSource) =>
datasource // datasource
.getRepository(memberExecutivePositions) // .getRepository(memberExecutivePositions)
.createQueryBuilder("memberExecutivePositions") // .createQueryBuilder("memberExecutivePositions")
.select("executivePosition.id", "positionId") // .select("executivePosition.id", "positionId")
.addSelect("executivePosition.position", "position") // .addSelect("executivePosition.position", "position")
.addSelect("member.id", "memberId") // .addSelect("member.id", "memberId")
.addSelect("member.salutation", "memberSalutation") // .addSelect("member.salutation", "memberSalutation")
.addSelect("member.firstname", "memberFirstname") // .addSelect("member.firstname", "memberFirstname")
.addSelect("member.lastname", "memberLastname") // .addSelect("member.lastname", "memberLastname")
.addSelect("member.nameaffix", "memberNameaffix") // .addSelect("member.nameaffix", "memberNameaffix")
.addSelect("member.birthdate", "memberBirthdate") // .addSelect("member.birthdate", "memberBirthdate")
.addSelect( // .addSelect(
"SUM(TIMESTAMPDIFF(DAY, memberExecutivePositions.start, COALESCE(memberExecutivePositions.end, CURRENT_DATE)))", // "SUM(TIMESTAMPDIFF(DAY, memberExecutivePositions.start, COALESCE(memberExecutivePositions.end, CURRENT_DATE)))",
"durationInDays" // "durationInDays"
) // )
.leftJoin("memberExecutivePositions.executivePosition", "executivePosition") // .leftJoin("memberExecutivePositions.executivePosition", "executivePosition")
.leftJoin("memberExecutivePositions.member", "member") // .leftJoin("memberExecutivePositions.member", "member")
.groupBy("executivePosition.id"), // .groupBy("executivePosition.id"),
}), // }),
true // true
); // );
await queryRunner.createView( // await queryRunner.createView(
new View({ // new View({
name: "member_qualifications_view", // name: "member_qualifications_view",
expression: (datasource: DataSource) => // expression: (datasource: DataSource) =>
datasource // datasource
.getRepository(memberQualifications) // .getRepository(memberQualifications)
.createQueryBuilder("memberQualifications") // .createQueryBuilder("memberQualifications")
.select("qualification.id", "qualificationId") // .select("qualification.id", "qualificationId")
.addSelect("qualification.qualification", "qualification") // .addSelect("qualification.qualification", "qualification")
.addSelect("member.id", "memberId") // .addSelect("member.id", "memberId")
.addSelect("member.salutation", "memberSalutation") // .addSelect("member.salutation", "memberSalutation")
.addSelect("member.firstname", "memberFirstname") // .addSelect("member.firstname", "memberFirstname")
.addSelect("member.lastname", "memberLastname") // .addSelect("member.lastname", "memberLastname")
.addSelect("member.nameaffix", "memberNameaffix") // .addSelect("member.nameaffix", "memberNameaffix")
.addSelect("member.birthdate", "memberBirthdate") // .addSelect("member.birthdate", "memberBirthdate")
.addSelect( // .addSelect(
"SUM(TIMESTAMPDIFF(DAY, memberQualifications.start, COALESCE(memberQualifications.end, CURRENT_DATE)))", // "SUM(TIMESTAMPDIFF(DAY, memberQualifications.start, COALESCE(memberQualifications.end, CURRENT_DATE)))",
"durationInDays" // "durationInDays"
) // )
.leftJoin("memberQualifications.qualification", "qualification") // .leftJoin("memberQualifications.qualification", "qualification")
.leftJoin("memberQualifications.member", "member") // .leftJoin("memberQualifications.member", "member")
.groupBy("qualification.id"), // .groupBy("qualification.id"),
}), // }),
true // true
); // );
await queryRunner.createView( // await queryRunner.createView(
new View({ // new View({
name: "membership_view", // name: "membership_view",
expression: (datasource: DataSource) => // expression: (datasource: DataSource) =>
datasource // datasource
.getRepository(membership) // .getRepository(membership)
.createQueryBuilder("membership") // .createQueryBuilder("membership")
.select("status.id", "statusId") // .select("status.id", "statusId")
.addSelect("status.status", "status") // .addSelect("status.status", "status")
.addSelect("member.id", "memberId") // .addSelect("member.id", "memberId")
.addSelect("member.salutation", "memberSalutation") // .addSelect("member.salutation", "memberSalutation")
.addSelect("member.firstname", "memberFirstname") // .addSelect("member.firstname", "memberFirstname")
.addSelect("member.lastname", "memberLastname") // .addSelect("member.lastname", "memberLastname")
.addSelect("member.nameaffix", "memberNameaffix") // .addSelect("member.nameaffix", "memberNameaffix")
.addSelect("member.birthdate", "memberBirthdate") // .addSelect("member.birthdate", "memberBirthdate")
.addSelect( // .addSelect(
"SUM(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURRENT_DATE)))", // "SUM(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURRENT_DATE)))",
"durationInDays" // "durationInDays"
) // )
.leftJoin("membership.status", "status") // .leftJoin("membership.status", "status")
.leftJoin("membership.member", "member") // .leftJoin("membership.member", "member")
.groupBy("status.id"), // .groupBy("status.id"),
}), // }),
true // true
); // );
} }
public async down(queryRunner: QueryRunner): Promise<void> { public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropView("membership_view"); // await queryRunner.dropView("membership_view");
await queryRunner.dropView("member_qualifications_view"); // await queryRunner.dropView("member_qualifications_view");
await queryRunner.dropView("member_executive_positions_view"); // await queryRunner.dropView("member_executive_positions_view");
await queryRunner.dropView("member_view"); // await queryRunner.dropView("member_view");
} }
} }

View file

@ -8,106 +8,104 @@ export class ExtendViewValues1736084198860 implements MigrationInterface {
name = "ExtendViewValues1736084198860"; name = "ExtendViewValues1736084198860";
public async up(queryRunner: QueryRunner): Promise<void> { public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropView("membership_view"); // await queryRunner.dropView("membership_view");
await queryRunner.dropView("member_view"); // await queryRunner.dropView("member_view");
// await queryRunner.createView(
await queryRunner.createView( // new View({
new View({ // name: "member_view",
name: "member_view", // expression: (datasource: DataSource) =>
expression: (datasource: DataSource) => // datasource
datasource // .getRepository(member)
.getRepository(member) // .createQueryBuilder("member")
.createQueryBuilder("member") // .select("member.id", "id")
.select("member.id", "id") // .addSelect("member.salutation", "salutation")
.addSelect("member.salutation", "salutation") // .addSelect("member.firstname", "firstname")
.addSelect("member.firstname", "firstname") // .addSelect("member.lastname", "lastname")
.addSelect("member.lastname", "lastname") // .addSelect("member.nameaffix", "nameaffix")
.addSelect("member.nameaffix", "nameaffix") // .addSelect("member.birthdate", "birthdate")
.addSelect("member.birthdate", "birthdate") // .addSelect("TIMESTAMPDIFF(YEAR, member.birthdate, CURDATE())", "todayAge")
.addSelect("TIMESTAMPDIFF(YEAR, member.birthdate, CURDATE())", "todayAge") // .addSelect("YEAR(CURDATE()) - YEAR(member.birthdate)", "ageThisYear")
.addSelect("YEAR(CURDATE()) - YEAR(member.birthdate)", "ageThisYear") // .addSelect("CONCAT('_', FROM_DAYS(TIMESTAMPDIFF(DAY, member.birthdate, CURDATE())))", "exactAge"),
.addSelect("CONCAT('_', FROM_DAYS(TIMESTAMPDIFF(DAY, member.birthdate, CURDATE())))", "exactAge"), // }),
}), // true
true // );
); // await queryRunner.createView(
await queryRunner.createView( // new View({
new View({ // name: "membership_view",
name: "membership_view", // expression: (datasource: DataSource) =>
expression: (datasource: DataSource) => // datasource
datasource // .getRepository(membership)
.getRepository(membership) // .createQueryBuilder("membership")
.createQueryBuilder("membership") // .select("status.id", "statusId")
.select("status.id", "statusId") // .addSelect("status.status", "status")
.addSelect("status.status", "status") // .addSelect("member.id", "memberId")
.addSelect("member.id", "memberId") // .addSelect("member.salutation", "memberSalutation")
.addSelect("member.salutation", "memberSalutation") // .addSelect("member.firstname", "memberFirstname")
.addSelect("member.firstname", "memberFirstname") // .addSelect("member.lastname", "memberLastname")
.addSelect("member.lastname", "memberLastname") // .addSelect("member.nameaffix", "memberNameaffix")
.addSelect("member.nameaffix", "memberNameaffix") // .addSelect("member.birthdate", "memberBirthdate")
.addSelect("member.birthdate", "memberBirthdate") // .addSelect(
.addSelect( // "SUM(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURRENT_DATE)))",
"SUM(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURRENT_DATE)))", // "durationInDays"
"durationInDays" // )
) // .addSelect(
.addSelect( // "CONCAT('_', FROM_DAYS(SUM(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURRENT_DATE)))))",
"CONCAT('_', FROM_DAYS(SUM(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURRENT_DATE)))))", // "durationInYears"
"durationInYears" // )
) // .leftJoin("membership.status", "status")
.leftJoin("membership.status", "status") // .leftJoin("membership.member", "member")
.leftJoin("membership.member", "member") // .groupBy("status.id")
.groupBy("status.id") // .addGroupBy("member.id"),
.addGroupBy("member.id"), // }),
}), // true
true // );
);
} }
public async down(queryRunner: QueryRunner): Promise<void> { public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropView("membership_view"); // await queryRunner.dropView("membership_view");
await queryRunner.dropView("member_view"); // await queryRunner.dropView("member_view");
// await queryRunner.createView(
await queryRunner.createView( // new View({
new View({ // name: "member_view",
name: "member_view", // expression: (datasource: DataSource) =>
expression: (datasource: DataSource) => // datasource
datasource // .getRepository(member)
.getRepository(member) // .createQueryBuilder("member")
.createQueryBuilder("member") // .select("member.id", "id")
.select("member.id", "id") // .addSelect("member.salutation", "salutation")
.addSelect("member.salutation", "salutation") // .addSelect("member.firstname", "firstname")
.addSelect("member.firstname", "firstname") // .addSelect("member.lastname", "lastname")
.addSelect("member.lastname", "lastname") // .addSelect("member.nameaffix", "nameaffix")
.addSelect("member.nameaffix", "nameaffix") // .addSelect("member.birthdate", "birthdate")
.addSelect("member.birthdate", "birthdate") // .addSelect("TIMESTAMPDIFF(YEAR, member.birthdate, CURDATE())", "todayAge")
.addSelect("TIMESTAMPDIFF(YEAR, member.birthdate, CURDATE())", "todayAge") // .addSelect("YEAR(CURDATE()) - YEAR(member.birthdate)", "ageThisYear"),
.addSelect("YEAR(CURDATE()) - YEAR(member.birthdate)", "ageThisYear"), // }),
}), // true
true // );
); // await queryRunner.createView(
await queryRunner.createView( // new View({
new View({ // name: "membership_view",
name: "membership_view", // expression: (datasource: DataSource) =>
expression: (datasource: DataSource) => // datasource
datasource // .getRepository(membership)
.getRepository(membership) // .createQueryBuilder("membership")
.createQueryBuilder("membership") // .select("status.id", "statusId")
.select("status.id", "statusId") // .addSelect("status.status", "status")
.addSelect("status.status", "status") // .addSelect("member.id", "memberId")
.addSelect("member.id", "memberId") // .addSelect("member.salutation", "memberSalutation")
.addSelect("member.salutation", "memberSalutation") // .addSelect("member.firstname", "memberFirstname")
.addSelect("member.firstname", "memberFirstname") // .addSelect("member.lastname", "memberLastname")
.addSelect("member.lastname", "memberLastname") // .addSelect("member.nameaffix", "memberNameaffix")
.addSelect("member.nameaffix", "memberNameaffix") // .addSelect("member.birthdate", "memberBirthdate")
.addSelect("member.birthdate", "memberBirthdate") // .addSelect(
.addSelect( // "SUM(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURRENT_DATE)))",
"SUM(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURRENT_DATE)))", // "durationInDays"
"durationInDays" // )
) // .leftJoin("membership.status", "status")
.leftJoin("membership.status", "status") // .leftJoin("membership.member", "member")
.leftJoin("membership.member", "member") // .groupBy("status.id"),
.groupBy("status.id"), // }),
}), // true
true // );
);
} }
} }

View file

@ -0,0 +1,91 @@
import { MigrationInterface, QueryRunner, Table, TableForeignKey } from "typeorm";
import { DB_TYPE } from "../env.defaults";
import { member } from "../entity/club/member/member";
import { salutation } from "../entity/settings/salutation";
export class SalutationAsTable1737796878058 implements MigrationInterface {
name = "SalutationAsTable1737796878058";
public async up(queryRunner: QueryRunner): Promise<void> {
const variableType_int = DB_TYPE == "mysql" ? "int" : "integer";
await queryRunner.createTable(
new Table({
name: "salutation",
columns: [
{ name: "id", type: variableType_int, isPrimary: true, isGenerated: true, generationStrategy: "increment" },
{ name: "salutation", type: "varchar", length: "255", isUnique: true, isNullable: false },
],
}),
true
);
// ! has to be sql. Else the column would be dropped and created - resulting in data loss.
await queryRunner.query(
`ALTER TABLE \`member\` CHANGE \`salutation\` \`salutationId\` varchar(255) NOT NULL DEFAULT ''`
);
// ! has to be sql. Else no data is returned.
const existing_salutations = await queryRunner.query(
"SELECT DISTINCT salutationId FROM `member` `member` GROUP BY salutationId"
);
for (let s of existing_salutations.map((s: any) => s.salutationId) as Array<string>) {
await queryRunner.manager.getRepository(salutation).save({ salutation: s });
}
const salutations = await queryRunner.manager.getRepository(salutation).find();
for (let salutation of salutations) {
await queryRunner.manager
.getRepository(member)
.createQueryBuilder("member")
.update({ salutationId: salutation.id })
.where({ salutationId: salutation.salutation })
.execute();
}
await queryRunner.query(
`ALTER TABLE \`member\` CHANGE \`salutationId\` \`salutationId\` ${variableType_int} NOT NULL`
);
await queryRunner.createForeignKey(
"member",
new TableForeignKey({
columnNames: ["salutationId"],
referencedColumnNames: ["id"],
referencedTableName: "salutation",
onDelete: "RESTRICT",
onUpdate: "RESTRICT",
})
);
}
public async down(queryRunner: QueryRunner): Promise<void> {
const table = await queryRunner.getTable("member");
const foreignKey = table.foreignKeys.find((fk) => fk.columnNames.indexOf("salutationId") !== -1);
await queryRunner.dropForeignKey("member", foreignKey);
// ! has to be sql. Else the column would be dropped and created - resulting in data loss.
await queryRunner.query(
`ALTER TABLE \`member\` CHANGE \`salutationId\` \`salutationId\` varchar(255) NOT NULL DEFAULT ''`
);
const salutations = await queryRunner.manager.getRepository(salutation).find();
for (let salutation of salutations) {
await queryRunner.manager
.getRepository(member)
.createQueryBuilder("member")
.update({ salutationId: salutation.salutation as unknown as number })
.where({ salutationId: salutation.id })
.execute();
}
await queryRunner.query(
`ALTER TABLE \`member\` CHANGE \`salutationId\` \`salutation\` varchar(255) NOT NULL DEFAULT 'none'`
);
await queryRunner.dropTable("webapi");
}
}

View file

@ -0,0 +1,229 @@
import { DataSource, MigrationInterface, QueryRunner, View } from "typeorm";
import { member } from "../entity/club/member/member";
import { memberExecutivePositions } from "../entity/club/member/memberExecutivePositions";
import { memberQualifications } from "../entity/club/member/memberQualifications";
import { membership } from "../entity/club/member/membership";
export class UpdateViews1737800468938 implements MigrationInterface {
name = "UpdateViews1737800468938";
public async up(queryRunner: QueryRunner): Promise<void> {
// await queryRunner.dropView("membership_view");
// await queryRunner.dropView("member_executive_positions_view");
// await queryRunner.dropView("member_qualifications_view");
// await queryRunner.dropView("member_view");
await queryRunner.createView(
new View({
name: "member_view",
expression: (datasource: DataSource) =>
datasource
.getRepository(member)
.createQueryBuilder("member")
.select("member.id", "id")
.addSelect("member.firstname", "firstname")
.addSelect("member.lastname", "lastname")
.addSelect("member.nameaffix", "nameaffix")
.addSelect("member.birthdate", "birthdate")
.addSelect("salutation.salutation", "salutation")
.addSelect("TIMESTAMPDIFF(YEAR, member.birthdate, CURDATE())", "todayAge")
.addSelect("YEAR(CURDATE()) - YEAR(member.birthdate)", "ageThisYear")
.addSelect("CONCAT('_', FROM_DAYS(TIMESTAMPDIFF(DAY, member.birthdate, CURDATE())))", "exactAge")
.leftJoin("member.salutation", "salutation"),
}),
true
);
await queryRunner.createView(
new View({
name: "member_executive_positions_view",
expression: (datasource: DataSource) =>
datasource
.getRepository(memberExecutivePositions)
.createQueryBuilder("memberExecutivePositions")
.select("executivePosition.id", "positionId")
.addSelect("executivePosition.position", "position")
.addSelect("member.id", "memberId")
.addSelect("member.firstname", "memberFirstname")
.addSelect("member.lastname", "memberLastname")
.addSelect("member.nameaffix", "memberNameaffix")
.addSelect("member.birthdate", "memberBirthdate")
.addSelect("salutation.salutation", "memberSalutation")
.addSelect(
"SUM(TIMESTAMPDIFF(DAY, memberExecutivePositions.start, COALESCE(memberExecutivePositions.end, CURRENT_DATE)))",
"durationInDays"
)
.leftJoin("memberExecutivePositions.executivePosition", "executivePosition")
.leftJoin("memberExecutivePositions.member", "member")
.leftJoin("member.salutation", "salutation")
.groupBy("executivePosition.id")
.addGroupBy("member.id"),
}),
true
);
await queryRunner.createView(
new View({
name: "member_qualifications_view",
expression: (datasource: DataSource) =>
datasource
.getRepository(memberQualifications)
.createQueryBuilder("memberQualifications")
.select("qualification.id", "qualificationId")
.addSelect("qualification.qualification", "qualification")
.addSelect("member.id", "memberId")
.addSelect("member.firstname", "memberFirstname")
.addSelect("member.lastname", "memberLastname")
.addSelect("member.nameaffix", "memberNameaffix")
.addSelect("member.birthdate", "memberBirthdate")
.addSelect("salutation.salutation", "memberSalutation")
.addSelect(
"SUM(TIMESTAMPDIFF(DAY, memberQualifications.start, COALESCE(memberQualifications.end, CURRENT_DATE)))",
"durationInDays"
)
.leftJoin("memberQualifications.qualification", "qualification")
.leftJoin("memberQualifications.member", "member")
.leftJoin("member.salutation", "salutation")
.groupBy("qualification.id")
.addGroupBy("member.id"),
}),
true
);
await queryRunner.createView(
new View({
name: "membership_view",
expression: (datasource: DataSource) =>
datasource
.getRepository(membership)
.createQueryBuilder("membership")
.select("status.id", "statusId")
.addSelect("status.status", "status")
.addSelect("member.id", "memberId")
.addSelect("member.firstname", "memberFirstname")
.addSelect("member.lastname", "memberLastname")
.addSelect("member.nameaffix", "memberNameaffix")
.addSelect("member.birthdate", "memberBirthdate")
.addSelect("salutation.salutation", "memberSalutation")
.addSelect(
"SUM(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURRENT_DATE)))",
"durationInDays"
)
.addSelect(
"CONCAT('_', FROM_DAYS(SUM(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURRENT_DATE)))))",
"durationInYears"
)
.leftJoin("membership.status", "status")
.leftJoin("membership.member", "member")
.leftJoin("member.salutation", "salutation")
.groupBy("status.id")
.addGroupBy("member.id"),
}),
true
);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.dropView("membership_view");
await queryRunner.dropView("member_executive_positions_view");
await queryRunner.dropView("member_qualifications_view");
await queryRunner.dropView("member_view");
await queryRunner.createView(
new View({
name: "member_view",
expression: (datasource: DataSource) =>
datasource
.getRepository(member)
.createQueryBuilder("member")
.select("member.id", "id")
.addSelect("member.salutation", "salutation")
.addSelect("member.firstname", "firstname")
.addSelect("member.lastname", "lastname")
.addSelect("member.nameaffix", "nameaffix")
.addSelect("member.birthdate", "birthdate")
.addSelect("TIMESTAMPDIFF(YEAR, member.birthdate, CURDATE())", "todayAge")
.addSelect("YEAR(CURDATE()) - YEAR(member.birthdate)", "ageThisYear")
.addSelect("CONCAT('_', FROM_DAYS(TIMESTAMPDIFF(DAY, member.birthdate, CURDATE())))", "exactAge"),
}),
true
);
await queryRunner.createView(
new View({
name: "member_executive_positions_view",
expression: (datasource: DataSource) =>
datasource
.getRepository(memberExecutivePositions)
.createQueryBuilder("memberExecutivePositions")
.select("executivePosition.id", "positionId")
.addSelect("executivePosition.position", "position")
.addSelect("member.id", "memberId")
.addSelect("member.salutation", "memberSalutation")
.addSelect("member.firstname", "memberFirstname")
.addSelect("member.lastname", "memberLastname")
.addSelect("member.nameaffix", "memberNameaffix")
.addSelect("member.birthdate", "memberBirthdate")
.addSelect(
"SUM(TIMESTAMPDIFF(DAY, memberExecutivePositions.start, COALESCE(memberExecutivePositions.end, CURRENT_DATE)))",
"durationInDays"
)
.leftJoin("memberExecutivePositions.executivePosition", "executivePosition")
.leftJoin("memberExecutivePositions.member", "member")
.groupBy("executivePosition.id"),
}),
true
);
await queryRunner.createView(
new View({
name: "member_qualifications_view",
expression: (datasource: DataSource) =>
datasource
.getRepository(memberQualifications)
.createQueryBuilder("memberQualifications")
.select("qualification.id", "qualificationId")
.addSelect("qualification.qualification", "qualification")
.addSelect("member.id", "memberId")
.addSelect("member.salutation", "memberSalutation")
.addSelect("member.firstname", "memberFirstname")
.addSelect("member.lastname", "memberLastname")
.addSelect("member.nameaffix", "memberNameaffix")
.addSelect("member.birthdate", "memberBirthdate")
.addSelect(
"SUM(TIMESTAMPDIFF(DAY, memberQualifications.start, COALESCE(memberQualifications.end, CURRENT_DATE)))",
"durationInDays"
)
.leftJoin("memberQualifications.qualification", "qualification")
.leftJoin("memberQualifications.member", "member")
.groupBy("qualification.id"),
}),
true
);
await queryRunner.createView(
new View({
name: "membership_view",
expression: (datasource: DataSource) =>
datasource
.getRepository(membership)
.createQueryBuilder("membership")
.select("status.id", "statusId")
.addSelect("status.status", "status")
.addSelect("member.id", "memberId")
.addSelect("member.salutation", "memberSalutation")
.addSelect("member.firstname", "memberFirstname")
.addSelect("member.lastname", "memberLastname")
.addSelect("member.nameaffix", "memberNameaffix")
.addSelect("member.birthdate", "memberBirthdate")
.addSelect(
"SUM(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURRENT_DATE)))",
"durationInDays"
)
.addSelect(
"CONCAT('_', FROM_DAYS(SUM(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURRENT_DATE)))))",
"durationInYears"
)
.leftJoin("membership.status", "status")
.leftJoin("membership.member", "member")
.groupBy("status.id")
.addGroupBy("member.id"),
}),
true
);
}
}