Compare commits
No commits in common. "f11ed83afc10beb95c8d8223a29bce420bdc9b7d" and "e3db523a0e314a90a3832a045ead8a3d30cf7221" have entirely different histories.
f11ed83afc
...
e3db523a0e
74 changed files with 1555 additions and 1841 deletions
838
package-lock.json
generated
838
package-lock.json
generated
File diff suppressed because it is too large
Load diff
33
package.json
33
package.json
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "ff-admin-server",
|
"name": "ff-admin-server",
|
||||||
"version": "1.6.0",
|
"version": "1.5.3",
|
||||||
"description": "Feuerwehr/Verein Mitgliederverwaltung Server",
|
"description": "Feuerwehr/Verein Mitgliederverwaltung Server",
|
||||||
"main": "dist/index.js",
|
"main": "dist/index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
@ -41,41 +41,44 @@
|
||||||
"moment": "^2.30.1",
|
"moment": "^2.30.1",
|
||||||
"morgan": "^1.10.0",
|
"morgan": "^1.10.0",
|
||||||
"ms": "^2.1.3",
|
"ms": "^2.1.3",
|
||||||
"multer": "^2.0.1",
|
"multer": "^1.4.5-lts.2",
|
||||||
|
"mysql": "^2.18.1",
|
||||||
"node-schedule": "^2.1.1",
|
"node-schedule": "^2.1.1",
|
||||||
"nodemailer": "^7.0.3",
|
"nodemailer": "^7.0.2",
|
||||||
"pdf-lib": "^1.17.1",
|
"pdf-lib": "^1.17.1",
|
||||||
"pg": "^8.16.0",
|
"pg": "^8.15.6",
|
||||||
"puppeteer": "^24.10.0",
|
"puppeteer": "^24.8.0",
|
||||||
"qrcode": "^1.5.4",
|
"qrcode": "^1.5.4",
|
||||||
"reflect-metadata": "^0.2.2",
|
"reflect-metadata": "^0.2.2",
|
||||||
"rss-parser": "^3.13.0",
|
"rss-parser": "^3.13.0",
|
||||||
"sharp": "^0.34.2",
|
"sharp": "^0.34.1",
|
||||||
"sharp-ico": "^0.1.5",
|
"sharp-ico": "^0.1.5",
|
||||||
"socket.io": "^4.8.1",
|
"socket.io": "^4.8.1",
|
||||||
"speakeasy": "^2.0.0",
|
"speakeasy": "^2.0.0",
|
||||||
"typeorm": "^0.3.24",
|
"sqlite3": "^5.1.7",
|
||||||
|
"typeorm": "^0.3.22",
|
||||||
"uuid": "^11.1.0",
|
"uuid": "^11.1.0",
|
||||||
"validator": "^13.15.15"
|
"validator": "^13.15.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/cors": "^2.8.19",
|
"@types/cors": "^2.8.17",
|
||||||
"@types/express": "^5.0.3",
|
"@types/express": "^5.0.1",
|
||||||
"@types/ip": "^1.1.3",
|
"@types/ip": "^1.1.3",
|
||||||
"@types/jsonwebtoken": "^9.0.9",
|
"@types/jsonwebtoken": "^9.0.9",
|
||||||
"@types/lodash.clonedeep": "^4.5.9",
|
"@types/lodash.clonedeep": "^4.5.9",
|
||||||
"@types/lodash.uniqby": "^4.7.9",
|
"@types/lodash.uniqby": "^4.7.9",
|
||||||
"@types/morgan": "^1.9.10",
|
"@types/morgan": "^1.9.9",
|
||||||
"@types/ms": "^2.1.0",
|
"@types/ms": "^2.1.0",
|
||||||
"@types/multer": "^1.4.13",
|
"@types/multer": "^1.4.12",
|
||||||
"@types/node": "^22.15.30",
|
"@types/mysql": "^2.15.27",
|
||||||
|
"@types/node": "^22.15.12",
|
||||||
"@types/node-schedule": "^2.1.7",
|
"@types/node-schedule": "^2.1.7",
|
||||||
"@types/nodemailer": "^6.4.17",
|
"@types/nodemailer": "^6.4.17",
|
||||||
"@types/pg": "~8.15.4",
|
"@types/pg": "~8.12.0",
|
||||||
"@types/qrcode": "~1.5.5",
|
"@types/qrcode": "~1.5.5",
|
||||||
"@types/speakeasy": "^2.0.10",
|
"@types/speakeasy": "^2.0.10",
|
||||||
"@types/uuid": "^10.0.0",
|
"@types/uuid": "^10.0.0",
|
||||||
"@types/validator": "^13.15.1",
|
"@types/validator": "^13.15.0",
|
||||||
"ts-node": "10.9.2",
|
"ts-node": "10.9.2",
|
||||||
"typescript": "^5.8.3"
|
"typescript": "^5.8.3"
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,6 @@ export interface CreateMemberCommand {
|
||||||
nameaffix: string;
|
nameaffix: string;
|
||||||
birthdate: Date;
|
birthdate: Date;
|
||||||
internalId?: string;
|
internalId?: string;
|
||||||
note?: string;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface UpdateMemberCommand {
|
export interface UpdateMemberCommand {
|
||||||
|
@ -16,7 +15,6 @@ export interface UpdateMemberCommand {
|
||||||
nameaffix: string;
|
nameaffix: string;
|
||||||
birthdate: Date;
|
birthdate: Date;
|
||||||
internalId?: string;
|
internalId?: string;
|
||||||
note?: string;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface DeleteMemberCommand {
|
export interface DeleteMemberCommand {
|
||||||
|
|
|
@ -23,7 +23,6 @@ export default abstract class MemberCommandHandler {
|
||||||
nameaffix: createMember.nameaffix,
|
nameaffix: createMember.nameaffix,
|
||||||
birthdate: createMember.birthdate,
|
birthdate: createMember.birthdate,
|
||||||
internalId: createMember.internalId,
|
internalId: createMember.internalId,
|
||||||
note: createMember.note,
|
|
||||||
})
|
})
|
||||||
.execute()
|
.execute()
|
||||||
.then((result) => {
|
.then((result) => {
|
||||||
|
@ -50,7 +49,6 @@ export default abstract class MemberCommandHandler {
|
||||||
nameaffix: updateMember.nameaffix,
|
nameaffix: updateMember.nameaffix,
|
||||||
birthdate: updateMember.birthdate,
|
birthdate: updateMember.birthdate,
|
||||||
internalId: updateMember.internalId,
|
internalId: updateMember.internalId,
|
||||||
note: updateMember.note,
|
|
||||||
})
|
})
|
||||||
.where("id = :id", { id: updateMember.id })
|
.where("id = :id", { id: updateMember.id })
|
||||||
.execute()
|
.execute()
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
export interface CreateMemberEducationCommand {
|
|
||||||
start: Date;
|
|
||||||
end?: Date;
|
|
||||||
note?: string;
|
|
||||||
place?: string;
|
|
||||||
memberId: string;
|
|
||||||
educationId: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface UpdateMemberEducationCommand {
|
|
||||||
id: number;
|
|
||||||
start: Date;
|
|
||||||
end?: Date;
|
|
||||||
note?: string;
|
|
||||||
place?: string;
|
|
||||||
memberId: string;
|
|
||||||
educationId: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface DeleteMemberEducationCommand {
|
|
||||||
id: number;
|
|
||||||
memberId: string;
|
|
||||||
}
|
|
|
@ -1,82 +0,0 @@
|
||||||
import { dataSource } from "../../../data-source";
|
|
||||||
import { memberEducations } from "../../../entity/club/member/memberEducations";
|
|
||||||
import DatabaseActionException from "../../../exceptions/databaseActionException";
|
|
||||||
import InternalException from "../../../exceptions/internalException";
|
|
||||||
import {
|
|
||||||
CreateMemberEducationCommand,
|
|
||||||
DeleteMemberEducationCommand,
|
|
||||||
UpdateMemberEducationCommand,
|
|
||||||
} from "./memberEducationCommand";
|
|
||||||
|
|
||||||
export default abstract class MemberEducationCommandHandler {
|
|
||||||
/**
|
|
||||||
* @description create memberEducation
|
|
||||||
* @param {CreateMemberEducationCommand} createMemberEducation
|
|
||||||
* @returns {Promise<number>}
|
|
||||||
*/
|
|
||||||
static async create(createMemberEducation: CreateMemberEducationCommand): Promise<number> {
|
|
||||||
return await dataSource
|
|
||||||
.createQueryBuilder()
|
|
||||||
.insert()
|
|
||||||
.into(memberEducations)
|
|
||||||
.values({
|
|
||||||
note: createMemberEducation.note,
|
|
||||||
place: createMemberEducation.place,
|
|
||||||
start: createMemberEducation.start,
|
|
||||||
end: createMemberEducation.end,
|
|
||||||
memberId: createMemberEducation.memberId,
|
|
||||||
educationId: createMemberEducation.educationId,
|
|
||||||
})
|
|
||||||
.execute()
|
|
||||||
.then((result) => {
|
|
||||||
return result.identifiers[0].id;
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
throw new DatabaseActionException("CREATE", "memberEducation", err);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description update memberEducation
|
|
||||||
* @param {UpdateMemberEducationCommand} updateMemberEducation
|
|
||||||
* @returns {Promise<void>}
|
|
||||||
*/
|
|
||||||
static async update(updateMemberEducation: UpdateMemberEducationCommand): Promise<void> {
|
|
||||||
return await dataSource
|
|
||||||
.createQueryBuilder()
|
|
||||||
.update(memberEducations)
|
|
||||||
.set({
|
|
||||||
note: updateMemberEducation.note,
|
|
||||||
start: updateMemberEducation.start,
|
|
||||||
end: updateMemberEducation.end,
|
|
||||||
place: updateMemberEducation.place,
|
|
||||||
educationId: updateMemberEducation.educationId,
|
|
||||||
})
|
|
||||||
.where("id = :id", { id: updateMemberEducation.id })
|
|
||||||
.andWhere("memberId = :memberId", { memberId: updateMemberEducation.memberId })
|
|
||||||
.execute()
|
|
||||||
.then(() => {})
|
|
||||||
.catch((err) => {
|
|
||||||
throw new DatabaseActionException("UPDATE", "memberEducation", err);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description delete memberEducation
|
|
||||||
* @param {DeleteMemberEducationCommand} deleteMemberEducation
|
|
||||||
* @returns {Promise<void>}
|
|
||||||
*/
|
|
||||||
static async delete(deleteMemberEducation: DeleteMemberEducationCommand): Promise<void> {
|
|
||||||
return await dataSource
|
|
||||||
.createQueryBuilder()
|
|
||||||
.delete()
|
|
||||||
.from(memberEducations)
|
|
||||||
.where("id = :id", { id: deleteMemberEducation.id })
|
|
||||||
.andWhere("memberId = :memberId", { memberId: deleteMemberEducation.memberId })
|
|
||||||
.execute()
|
|
||||||
.then(() => {})
|
|
||||||
.catch((err) => {
|
|
||||||
throw new DatabaseActionException("DELETE", "memberEducation", err);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,14 +0,0 @@
|
||||||
export interface CreateEducationCommand {
|
|
||||||
education: string;
|
|
||||||
description?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface UpdateEducationCommand {
|
|
||||||
id: number;
|
|
||||||
education: string;
|
|
||||||
description?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface DeleteEducationCommand {
|
|
||||||
id: number;
|
|
||||||
}
|
|
|
@ -1,68 +0,0 @@
|
||||||
import { dataSource } from "../../../data-source";
|
|
||||||
import { education } from "../../../entity/configuration/education";
|
|
||||||
import DatabaseActionException from "../../../exceptions/databaseActionException";
|
|
||||||
import { CreateEducationCommand, DeleteEducationCommand, UpdateEducationCommand } from "./educationCommand";
|
|
||||||
|
|
||||||
export default abstract class EducationCommandHandler {
|
|
||||||
/**
|
|
||||||
* @description create education
|
|
||||||
* @param {CreateEducationCommand} createEducation
|
|
||||||
* @returns {Promise<number>}
|
|
||||||
*/
|
|
||||||
static async create(createEducation: CreateEducationCommand): Promise<number> {
|
|
||||||
return await dataSource
|
|
||||||
.createQueryBuilder()
|
|
||||||
.insert()
|
|
||||||
.into(education)
|
|
||||||
.values({
|
|
||||||
education: createEducation.education,
|
|
||||||
description: createEducation.description,
|
|
||||||
})
|
|
||||||
.execute()
|
|
||||||
.then((result) => {
|
|
||||||
return result.identifiers[0].id;
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
throw new DatabaseActionException("CREATE", "education", err);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description update education
|
|
||||||
* @param {UpdateEducationCommand} updateEducation
|
|
||||||
* @returns {Promise<void>}
|
|
||||||
*/
|
|
||||||
static async update(updateEducation: UpdateEducationCommand): Promise<void> {
|
|
||||||
return await dataSource
|
|
||||||
.createQueryBuilder()
|
|
||||||
.update(education)
|
|
||||||
.set({
|
|
||||||
education: updateEducation.education,
|
|
||||||
description: updateEducation.description,
|
|
||||||
})
|
|
||||||
.where("id = :id", { id: updateEducation.id })
|
|
||||||
.execute()
|
|
||||||
.then(() => {})
|
|
||||||
.catch((err) => {
|
|
||||||
throw new DatabaseActionException("UPDATE", "education", err);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description delete education
|
|
||||||
* @param {DeleteEducationCommand} deleteEducation
|
|
||||||
* @returns {Promise<void>}
|
|
||||||
*/
|
|
||||||
static async delete(deleteEducation: DeleteEducationCommand): Promise<void> {
|
|
||||||
return await dataSource
|
|
||||||
.createQueryBuilder()
|
|
||||||
.delete()
|
|
||||||
.from(education)
|
|
||||||
.where("id = :id", { id: deleteEducation.id })
|
|
||||||
.execute()
|
|
||||||
.then(() => {})
|
|
||||||
.catch((err) => {
|
|
||||||
throw new DatabaseActionException("DELETE", "education", err);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -26,7 +26,7 @@ export default abstract class InviteCommandHandler {
|
||||||
lastname: createInvite.lastname,
|
lastname: createInvite.lastname,
|
||||||
secret: createInvite.secret,
|
secret: createInvite.secret,
|
||||||
})
|
})
|
||||||
.orUpdate(["firstname", "lastname", "token", "secret"], ["mail"])
|
.orUpdate(["firstName", "lastName", "token", "secret"], ["mail"])
|
||||||
.execute()
|
.execute()
|
||||||
.then((result) => {
|
.then((result) => {
|
||||||
return token;
|
return token;
|
||||||
|
|
|
@ -49,14 +49,6 @@ import {
|
||||||
import CommunicationCommandHandler from "../../../command/club/member/communicationCommandHandler";
|
import CommunicationCommandHandler from "../../../command/club/member/communicationCommandHandler";
|
||||||
import { PdfExport } from "../../../helpers/pdfExport";
|
import { PdfExport } from "../../../helpers/pdfExport";
|
||||||
import { PermissionModule } from "../../../type/permissionTypes";
|
import { PermissionModule } from "../../../type/permissionTypes";
|
||||||
import MemberEducationFactory from "../../../factory/admin/club/member/memberEducation";
|
|
||||||
import MemberEducationService from "../../../service/club/member/memberEducationService";
|
|
||||||
import {
|
|
||||||
CreateMemberEducationCommand,
|
|
||||||
DeleteMemberEducationCommand,
|
|
||||||
UpdateMemberEducationCommand,
|
|
||||||
} from "../../../command/club/member/memberEducationCommand";
|
|
||||||
import MemberEducationCommandHandler from "../../../command/club/member/memberEducationCommandHandler";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description get all members
|
* @description get all members
|
||||||
|
@ -152,7 +144,6 @@ export async function getMemberPrintoutById(req: Request, res: Response): Promis
|
||||||
let qualifications = await MemberQualificationService.getAll(memberId);
|
let qualifications = await MemberQualificationService.getAll(memberId);
|
||||||
let positions = await MemberExecutivePositionService.getAll(memberId);
|
let positions = await MemberExecutivePositionService.getAll(memberId);
|
||||||
let communications = await CommunicationService.getAll(memberId);
|
let communications = await CommunicationService.getAll(memberId);
|
||||||
let educations = await MemberEducationService.getAll(memberId);
|
|
||||||
|
|
||||||
let pdf = await PdfExport.renderFile({
|
let pdf = await PdfExport.renderFile({
|
||||||
title: "Mitglieder-Ausdruck",
|
title: "Mitglieder-Ausdruck",
|
||||||
|
@ -166,7 +157,6 @@ export async function getMemberPrintoutById(req: Request, res: Response): Promis
|
||||||
qualifications,
|
qualifications,
|
||||||
positions,
|
positions,
|
||||||
communications,
|
communications,
|
||||||
educations,
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -205,19 +195,6 @@ export async function getMembershipStatisticsById(req: Request, res: Response):
|
||||||
res.json(MembershipFactory.mapToBaseStatistics(member));
|
res.json(MembershipFactory.mapToBaseStatistics(member));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @description get member total statistics by id
|
|
||||||
* @param req {Request} Express req object
|
|
||||||
* @param res {Response} Express res object
|
|
||||||
* @returns {Promise<*>}
|
|
||||||
*/
|
|
||||||
export async function getMembershipTotalStatisticsById(req: Request, res: Response): Promise<any> {
|
|
||||||
const memberId = req.params.memberId;
|
|
||||||
let member = await MembershipService.getTotalStatisticsById(memberId);
|
|
||||||
|
|
||||||
res.json(MembershipFactory.mapToSingleTotalStatistic(member));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description get membership by member and record
|
* @description get membership by member and record
|
||||||
* @param req {Request} Express req object
|
* @param req {Request} Express req object
|
||||||
|
@ -286,33 +263,6 @@ export async function getQualificationByMemberAndRecord(req: Request, res: Respo
|
||||||
res.json(MemberQualificationFactory.mapToSingle(qualification));
|
res.json(MemberQualificationFactory.mapToSingle(qualification));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @description get educations by member
|
|
||||||
* @param req {Request} Express req object
|
|
||||||
* @param res {Response} Express res object
|
|
||||||
* @returns {Promise<*>}
|
|
||||||
*/
|
|
||||||
export async function getEducationsByMember(req: Request, res: Response): Promise<any> {
|
|
||||||
const memberId = req.params.memberId;
|
|
||||||
let educations = await MemberEducationService.getAll(memberId);
|
|
||||||
|
|
||||||
res.json(MemberEducationFactory.mapToBase(educations));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description get education by member and record
|
|
||||||
* @param req {Request} Express req object
|
|
||||||
* @param res {Response} Express res object
|
|
||||||
* @returns {Promise<*>}
|
|
||||||
*/
|
|
||||||
export async function getEducationByMemberAndRecord(req: Request, res: Response): Promise<any> {
|
|
||||||
const memberId = req.params.memberId;
|
|
||||||
const recordId = parseInt(req.params.id);
|
|
||||||
let education = await MemberEducationService.getById(memberId, recordId);
|
|
||||||
|
|
||||||
res.json(MemberEducationFactory.mapToSingle(education));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description get executive positions by member
|
* @description get executive positions by member
|
||||||
* @param req {Request} Express req object
|
* @param req {Request} Express req object
|
||||||
|
@ -380,7 +330,6 @@ export async function createMember(req: Request, res: Response): Promise<any> {
|
||||||
const nameaffix = req.body.nameaffix;
|
const nameaffix = req.body.nameaffix;
|
||||||
const birthdate = req.body.birthdate;
|
const birthdate = req.body.birthdate;
|
||||||
const internalId = req.body.internalId || null;
|
const internalId = req.body.internalId || null;
|
||||||
const note = req.body.note || null;
|
|
||||||
|
|
||||||
let createMember: CreateMemberCommand = {
|
let createMember: CreateMemberCommand = {
|
||||||
salutationId,
|
salutationId,
|
||||||
|
@ -389,7 +338,6 @@ export async function createMember(req: Request, res: Response): Promise<any> {
|
||||||
nameaffix,
|
nameaffix,
|
||||||
birthdate,
|
birthdate,
|
||||||
internalId,
|
internalId,
|
||||||
note,
|
|
||||||
};
|
};
|
||||||
let memberId = await MemberCommandHandler.create(createMember);
|
let memberId = await MemberCommandHandler.create(createMember);
|
||||||
|
|
||||||
|
@ -465,33 +413,6 @@ export async function addQualificationToMember(req: Request, res: Response): Pro
|
||||||
res.sendStatus(204);
|
res.sendStatus(204);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @description add education to member
|
|
||||||
* @param req {Request} Express req object
|
|
||||||
* @param res {Response} Express res object
|
|
||||||
* @returns {Promise<*>}
|
|
||||||
*/
|
|
||||||
export async function addEducationToMember(req: Request, res: Response): Promise<any> {
|
|
||||||
const memberId = req.params.memberId;
|
|
||||||
const note = req.body.note;
|
|
||||||
const place = req.body.place;
|
|
||||||
const start = req.body.start;
|
|
||||||
const end = req.body.end || null;
|
|
||||||
const educationId = req.body.educationId;
|
|
||||||
|
|
||||||
let createMemberEducation: CreateMemberEducationCommand = {
|
|
||||||
note,
|
|
||||||
start,
|
|
||||||
end,
|
|
||||||
place,
|
|
||||||
memberId,
|
|
||||||
educationId,
|
|
||||||
};
|
|
||||||
await MemberEducationCommandHandler.create(createMemberEducation);
|
|
||||||
|
|
||||||
res.sendStatus(204);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description add executive positions to member
|
* @description add executive positions to member
|
||||||
* @param req {Request} Express req object
|
* @param req {Request} Express req object
|
||||||
|
@ -570,7 +491,6 @@ export async function updateMemberById(req: Request, res: Response): Promise<any
|
||||||
const nameaffix = req.body.nameaffix;
|
const nameaffix = req.body.nameaffix;
|
||||||
const birthdate = req.body.birthdate;
|
const birthdate = req.body.birthdate;
|
||||||
const internalId = req.body.internalId || null;
|
const internalId = req.body.internalId || null;
|
||||||
const note = req.body.note || null;
|
|
||||||
|
|
||||||
let updateMember: UpdateMemberCommand = {
|
let updateMember: UpdateMemberCommand = {
|
||||||
id: memberId,
|
id: memberId,
|
||||||
|
@ -580,7 +500,6 @@ export async function updateMemberById(req: Request, res: Response): Promise<any
|
||||||
nameaffix,
|
nameaffix,
|
||||||
birthdate,
|
birthdate,
|
||||||
internalId,
|
internalId,
|
||||||
note,
|
|
||||||
};
|
};
|
||||||
await MemberCommandHandler.update(updateMember);
|
await MemberCommandHandler.update(updateMember);
|
||||||
|
|
||||||
|
@ -670,35 +589,6 @@ export async function updateQualificationOfMember(req: Request, res: Response):
|
||||||
res.sendStatus(204);
|
res.sendStatus(204);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @description update education of member
|
|
||||||
* @param req {Request} Express req object
|
|
||||||
* @param res {Response} Express res object
|
|
||||||
* @returns {Promise<*>}
|
|
||||||
*/
|
|
||||||
export async function updateEducationOfMember(req: Request, res: Response): Promise<any> {
|
|
||||||
const memberId = req.params.memberId;
|
|
||||||
const recordId = parseInt(req.params.recordId);
|
|
||||||
const start = req.body.start;
|
|
||||||
const end = req.body.end || null;
|
|
||||||
const note = req.body.note;
|
|
||||||
const place = req.body.place;
|
|
||||||
const educationId = req.body.educationId;
|
|
||||||
|
|
||||||
let updateMemberEducation: UpdateMemberEducationCommand = {
|
|
||||||
id: recordId,
|
|
||||||
start,
|
|
||||||
end,
|
|
||||||
note,
|
|
||||||
place,
|
|
||||||
memberId,
|
|
||||||
educationId,
|
|
||||||
};
|
|
||||||
await MemberEducationCommandHandler.update(updateMemberEducation);
|
|
||||||
|
|
||||||
res.sendStatus(204);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description update executive position of member
|
* @description update executive position of member
|
||||||
* @param req {Request} Express req object
|
* @param req {Request} Express req object
|
||||||
|
@ -839,25 +729,6 @@ export async function deleteQualificationOfMember(req: Request, res: Response):
|
||||||
res.sendStatus(204);
|
res.sendStatus(204);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @description delete education from member
|
|
||||||
* @param req {Request} Express req object
|
|
||||||
* @param res {Response} Express res object
|
|
||||||
* @returns {Promise<*>}
|
|
||||||
*/
|
|
||||||
export async function deleteEducationsOfMember(req: Request, res: Response): Promise<any> {
|
|
||||||
const memberId = req.params.memberId;
|
|
||||||
const recordId = parseInt(req.params.recordId);
|
|
||||||
|
|
||||||
let deleteMemberEducation: DeleteMemberEducationCommand = {
|
|
||||||
id: recordId,
|
|
||||||
memberId,
|
|
||||||
};
|
|
||||||
await MemberEducationCommandHandler.delete(deleteMemberEducation);
|
|
||||||
|
|
||||||
res.sendStatus(204);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description delete executive position from member
|
* @description delete executive position from member
|
||||||
* @param req {Request} Express req object
|
* @param req {Request} Express req object
|
||||||
|
|
|
@ -1,91 +0,0 @@
|
||||||
import { Request, Response } from "express";
|
|
||||||
import EducationService from "../../../service/configuration/education";
|
|
||||||
import EducationFactory from "../../../factory/admin/configuration/education";
|
|
||||||
import {
|
|
||||||
CreateEducationCommand,
|
|
||||||
DeleteEducationCommand,
|
|
||||||
UpdateEducationCommand,
|
|
||||||
} from "../../../command/configuration/education/educationCommand";
|
|
||||||
import EducationCommandHandler from "../../../command/configuration/education/educationCommandHandler";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description get all educations
|
|
||||||
* @param req {Request} Express req object
|
|
||||||
* @param res {Response} Express res object
|
|
||||||
* @returns {Promise<*>}
|
|
||||||
*/
|
|
||||||
export async function getAllEducations(req: Request, res: Response): Promise<any> {
|
|
||||||
let educations = await EducationService.getAll();
|
|
||||||
|
|
||||||
res.json(EducationFactory.mapToBase(educations));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description get education by id
|
|
||||||
* @param req {Request} Express req object
|
|
||||||
* @param res {Response} Express res object
|
|
||||||
* @returns {Promise<*>}
|
|
||||||
*/
|
|
||||||
export async function getEducationById(req: Request, res: Response): Promise<any> {
|
|
||||||
const id = parseInt(req.params.id);
|
|
||||||
let education = await EducationService.getById(id);
|
|
||||||
|
|
||||||
res.json(EducationFactory.mapToSingle(education));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description create new education
|
|
||||||
* @param req {Request} Express req object
|
|
||||||
* @param res {Response} Express res object
|
|
||||||
* @returns {Promise<*>}
|
|
||||||
*/
|
|
||||||
export async function createEducation(req: Request, res: Response): Promise<any> {
|
|
||||||
const education = req.body.education;
|
|
||||||
const description = req.body.description;
|
|
||||||
|
|
||||||
let createEducation: CreateEducationCommand = {
|
|
||||||
education: education,
|
|
||||||
description: description,
|
|
||||||
};
|
|
||||||
await EducationCommandHandler.create(createEducation);
|
|
||||||
|
|
||||||
res.sendStatus(204);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description update education
|
|
||||||
* @param req {Request} Express req object
|
|
||||||
* @param res {Response} Express res object
|
|
||||||
* @returns {Promise<*>}
|
|
||||||
*/
|
|
||||||
export async function updateEducation(req: Request, res: Response): Promise<any> {
|
|
||||||
const id = parseInt(req.params.id);
|
|
||||||
const education = req.body.education;
|
|
||||||
const description = req.body.description;
|
|
||||||
|
|
||||||
let updateEducation: UpdateEducationCommand = {
|
|
||||||
id: id,
|
|
||||||
education: education,
|
|
||||||
description: description,
|
|
||||||
};
|
|
||||||
await EducationCommandHandler.update(updateEducation);
|
|
||||||
|
|
||||||
res.sendStatus(204);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description delete education
|
|
||||||
* @param req {Request} Express req object
|
|
||||||
* @param res {Response} Express res object
|
|
||||||
* @returns {Promise<*>}
|
|
||||||
*/
|
|
||||||
export async function deleteEducation(req: Request, res: Response): Promise<any> {
|
|
||||||
const id = parseInt(req.params.id);
|
|
||||||
|
|
||||||
let deleteEducation: DeleteEducationCommand = {
|
|
||||||
id: id,
|
|
||||||
};
|
|
||||||
await EducationCommandHandler.delete(deleteEducation);
|
|
||||||
|
|
||||||
res.sendStatus(204);
|
|
||||||
}
|
|
|
@ -1,7 +1,7 @@
|
||||||
import "dotenv/config";
|
import "dotenv/config";
|
||||||
import "reflect-metadata";
|
import "reflect-metadata";
|
||||||
import { DataSource } from "typeorm";
|
import { DataSource } from "typeorm";
|
||||||
import { configCheck, DB_HOST, DB_NAME, DB_PASSWORD, DB_PORT, DB_USERNAME } from "./env.defaults";
|
import { configCheck, DB_HOST, DB_NAME, DB_PASSWORD, DB_PORT, DB_TYPE, DB_USERNAME } from "./env.defaults";
|
||||||
|
|
||||||
import { user } from "./entity/management/user";
|
import { user } from "./entity/management/user";
|
||||||
import { refresh } from "./entity/refresh";
|
import { refresh } from "./entity/refresh";
|
||||||
|
@ -20,7 +20,6 @@ import { member } from "./entity/club/member/member";
|
||||||
import { memberAwards } from "./entity/club/member/memberAwards";
|
import { memberAwards } from "./entity/club/member/memberAwards";
|
||||||
import { memberExecutivePositions } from "./entity/club/member/memberExecutivePositions";
|
import { memberExecutivePositions } from "./entity/club/member/memberExecutivePositions";
|
||||||
import { memberQualifications } from "./entity/club/member/memberQualifications";
|
import { memberQualifications } from "./entity/club/member/memberQualifications";
|
||||||
import { memberEducations } from "./entity/club/member/memberEducations";
|
|
||||||
import { membership } from "./entity/club/member/membership";
|
import { membership } from "./entity/club/member/membership";
|
||||||
import { protocol } from "./entity/club/protocol/protocol";
|
import { protocol } from "./entity/club/protocol/protocol";
|
||||||
import { protocolAgenda } from "./entity/club/protocol/protocolAgenda";
|
import { protocolAgenda } from "./entity/club/protocol/protocolAgenda";
|
||||||
|
@ -35,7 +34,7 @@ import { query } from "./entity/configuration/query";
|
||||||
import { memberView } from "./views/memberView";
|
import { memberView } from "./views/memberView";
|
||||||
import { memberExecutivePositionsView } from "./views/memberExecutivePositionView";
|
import { memberExecutivePositionsView } from "./views/memberExecutivePositionView";
|
||||||
import { memberQualificationsView } from "./views/memberQualificationsView";
|
import { memberQualificationsView } from "./views/memberQualificationsView";
|
||||||
import { membershipTotalView, membershipView } from "./views/membershipsView";
|
import { membershipView } from "./views/membershipsView";
|
||||||
import { template } from "./entity/configuration/template";
|
import { template } from "./entity/configuration/template";
|
||||||
import { templateUsage } from "./entity/configuration/templateUsage";
|
import { templateUsage } from "./entity/configuration/templateUsage";
|
||||||
import { newsletter } from "./entity/club/newsletter/newsletter";
|
import { newsletter } from "./entity/club/newsletter/newsletter";
|
||||||
|
@ -46,8 +45,17 @@ import { webapi } from "./entity/management/webapi";
|
||||||
import { webapiPermission } from "./entity/management/webapi_permission";
|
import { webapiPermission } from "./entity/management/webapi_permission";
|
||||||
import { salutation } from "./entity/configuration/salutation";
|
import { salutation } from "./entity/configuration/salutation";
|
||||||
import { setting } from "./entity/management/setting";
|
import { setting } from "./entity/management/setting";
|
||||||
import { education } from "./entity/configuration/education";
|
|
||||||
|
|
||||||
|
import { BackupAndResetDatabase1738166124200 } from "./migrations/1738166124200-BackupAndResetDatabase";
|
||||||
|
import { CreateSchema1738166167472 } from "./migrations/1738166167472-CreateSchema";
|
||||||
|
import { TemplatesAndProtocolSort1742549956787 } from "./migrations/1742549956787-templatesAndProtocolSort";
|
||||||
|
import { QueryToUUID1742922178643 } from "./migrations/1742922178643-queryToUUID";
|
||||||
|
import { NewsletterColumnType1744351418751 } from "./migrations/1744351418751-newsletterColumnType";
|
||||||
|
import { QueryUpdatedAt1744795756230 } from "./migrations/1744795756230-QueryUpdatedAt";
|
||||||
|
import { SettingsFromEnv1745059495807 } from "./migrations/1745059495807-settingsFromEnv";
|
||||||
|
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 { equipmentType } from "./entity/unit/equipment/equipmentType";
|
||||||
import { equipment } from "./entity/unit/equipment/equipment";
|
import { equipment } from "./entity/unit/equipment/equipment";
|
||||||
import { vehicleType } from "./entity/unit/vehicle/vehicleType";
|
import { vehicleType } from "./entity/unit/vehicle/vehicleType";
|
||||||
|
@ -60,16 +68,13 @@ import { inspectionVersionedPlan } from "./entity/unit/inspection/inspectionVers
|
||||||
import { inspectionPoint } from "./entity/unit/inspection/inspectionPoint";
|
import { inspectionPoint } from "./entity/unit/inspection/inspectionPoint";
|
||||||
import { inspection } from "./entity/unit/inspection/inspection";
|
import { inspection } from "./entity/unit/inspection/inspection";
|
||||||
import { inspectionPointResult } from "./entity/unit/inspection/inspectionPointResult";
|
import { inspectionPointResult } from "./entity/unit/inspection/inspectionPointResult";
|
||||||
|
import { UnitBase1748261477410 } from "./migrations/1748261477410-unitBase";
|
||||||
import { maintenance } from "./entity/unit/maintenance";
|
import { maintenance } from "./entity/unit/maintenance";
|
||||||
|
|
||||||
import { BackupAndResetDatabase1749296262915 } from "./migrations/1749296262915-BackupAndResetDatabase";
|
|
||||||
import { CreateSchema1749296280721 } from "./migrations/1749296280721-CreateSchema";
|
|
||||||
import { UnitBase1749361405703 } from "./migrations/1749361405703-UnitBase";
|
|
||||||
|
|
||||||
configCheck();
|
configCheck();
|
||||||
|
|
||||||
const dataSource = new DataSource({
|
const dataSource = new DataSource({
|
||||||
type: "postgres",
|
type: DB_TYPE as any,
|
||||||
host: DB_HOST,
|
host: DB_HOST,
|
||||||
port: DB_PORT,
|
port: DB_PORT,
|
||||||
username: DB_USERNAME,
|
username: DB_USERNAME,
|
||||||
|
@ -77,6 +82,7 @@ const dataSource = new DataSource({
|
||||||
database: DB_NAME,
|
database: DB_NAME,
|
||||||
synchronize: false,
|
synchronize: false,
|
||||||
logging: process.env.NODE_ENV ? true : ["schema", "error", "warn", "log", "migration"],
|
logging: process.env.NODE_ENV ? true : ["schema", "error", "warn", "log", "migration"],
|
||||||
|
bigNumberStrings: false,
|
||||||
entities: [
|
entities: [
|
||||||
user,
|
user,
|
||||||
refresh,
|
refresh,
|
||||||
|
@ -90,7 +96,6 @@ const dataSource = new DataSource({
|
||||||
communicationType,
|
communicationType,
|
||||||
executivePosition,
|
executivePosition,
|
||||||
membershipStatus,
|
membershipStatus,
|
||||||
education,
|
|
||||||
qualification,
|
qualification,
|
||||||
salutation,
|
salutation,
|
||||||
member,
|
member,
|
||||||
|
@ -98,7 +103,6 @@ const dataSource = new DataSource({
|
||||||
memberExecutivePositions,
|
memberExecutivePositions,
|
||||||
memberQualifications,
|
memberQualifications,
|
||||||
membership,
|
membership,
|
||||||
memberEducations,
|
|
||||||
protocol,
|
protocol,
|
||||||
protocolAgenda,
|
protocolAgenda,
|
||||||
protocolDecision,
|
protocolDecision,
|
||||||
|
@ -118,7 +122,6 @@ const dataSource = new DataSource({
|
||||||
memberExecutivePositionsView,
|
memberExecutivePositionsView,
|
||||||
memberQualificationsView,
|
memberQualificationsView,
|
||||||
membershipView,
|
membershipView,
|
||||||
membershipTotalView,
|
|
||||||
webapi,
|
webapi,
|
||||||
webapiPermission,
|
webapiPermission,
|
||||||
setting,
|
setting,
|
||||||
|
@ -136,7 +139,19 @@ const dataSource = new DataSource({
|
||||||
inspection,
|
inspection,
|
||||||
inspectionPointResult,
|
inspectionPointResult,
|
||||||
],
|
],
|
||||||
migrations: [BackupAndResetDatabase1749296262915, CreateSchema1749296280721, UnitBase1749361405703],
|
migrations: [
|
||||||
|
BackupAndResetDatabase1738166124200,
|
||||||
|
CreateSchema1738166167472,
|
||||||
|
TemplatesAndProtocolSort1742549956787,
|
||||||
|
QueryToUUID1742922178643,
|
||||||
|
NewsletterColumnType1744351418751,
|
||||||
|
QueryUpdatedAt1744795756230,
|
||||||
|
SettingsFromEnv1745059495807,
|
||||||
|
SettingsFromEnv_SET1745059495808,
|
||||||
|
MemberCreatedAt1746006549262,
|
||||||
|
UserLoginRoutine1746252454922,
|
||||||
|
UnitBase1748261477410,
|
||||||
|
],
|
||||||
migrationsRun: true,
|
migrationsRun: true,
|
||||||
migrationsTransactionMode: "each",
|
migrationsTransactionMode: "each",
|
||||||
subscribers: [],
|
subscribers: [],
|
||||||
|
|
|
@ -45,7 +45,7 @@ export class calendar {
|
||||||
@UpdateDateColumn()
|
@UpdateDateColumn()
|
||||||
updatedAt: Date;
|
updatedAt: Date;
|
||||||
|
|
||||||
@Column({ type: "varchar", length: "255", nullable: true, default: null, unique: true })
|
@Column({ type: "varchar", nullable: true, default: null, unique: true })
|
||||||
webpageId: string;
|
webpageId: string;
|
||||||
|
|
||||||
@ManyToOne(() => calendarType, (t) => t.calendar, {
|
@ManyToOne(() => calendarType, (t) => t.calendar, {
|
||||||
|
|
|
@ -8,7 +8,6 @@ import {
|
||||||
OneToMany,
|
OneToMany,
|
||||||
OneToOne,
|
OneToOne,
|
||||||
PrimaryColumn,
|
PrimaryColumn,
|
||||||
PrimaryGeneratedColumn,
|
|
||||||
} from "typeorm";
|
} from "typeorm";
|
||||||
import { membership } from "./membership";
|
import { membership } from "./membership";
|
||||||
import { memberAwards } from "./memberAwards";
|
import { memberAwards } from "./memberAwards";
|
||||||
|
@ -17,11 +16,10 @@ import { memberExecutivePositions } from "./memberExecutivePositions";
|
||||||
import { communication } from "./communication";
|
import { communication } from "./communication";
|
||||||
import { salutation } from "../../configuration/salutation";
|
import { salutation } from "../../configuration/salutation";
|
||||||
import { getTypeByORM } from "../../../migrations/ormHelper";
|
import { getTypeByORM } from "../../../migrations/ormHelper";
|
||||||
import { memberEducations } from "./memberEducations";
|
|
||||||
|
|
||||||
@Entity()
|
@Entity()
|
||||||
export class member {
|
export class member {
|
||||||
@PrimaryGeneratedColumn("uuid")
|
@PrimaryColumn({ generated: "uuid", type: "varchar" })
|
||||||
id: string;
|
id: string;
|
||||||
|
|
||||||
@Column({ type: "varchar", length: 255 })
|
@Column({ type: "varchar", length: 255 })
|
||||||
|
@ -39,9 +37,6 @@ export class member {
|
||||||
@Column({ type: "varchar", length: 255, unique: true, nullable: true })
|
@Column({ type: "varchar", length: 255, unique: true, nullable: true })
|
||||||
internalId?: string;
|
internalId?: string;
|
||||||
|
|
||||||
@Column({ type: "varchar", length: 255, nullable: true })
|
|
||||||
note?: string;
|
|
||||||
|
|
||||||
@Column()
|
@Column()
|
||||||
salutationId: number;
|
salutationId: number;
|
||||||
|
|
||||||
|
@ -71,9 +66,6 @@ export class member {
|
||||||
@OneToMany(() => memberQualifications, (qualifications) => qualifications.member, { cascade: ["insert"] })
|
@OneToMany(() => memberQualifications, (qualifications) => qualifications.member, { cascade: ["insert"] })
|
||||||
qualifications: memberQualifications[];
|
qualifications: memberQualifications[];
|
||||||
|
|
||||||
@OneToMany(() => memberEducations, (educations) => educations.member, { cascade: ["insert"] })
|
|
||||||
educations: memberEducations[];
|
|
||||||
|
|
||||||
firstMembershipEntry?: membership;
|
firstMembershipEntry?: membership;
|
||||||
lastMembershipEntry?: membership;
|
lastMembershipEntry?: membership;
|
||||||
preferredCommunication?: Array<communication>;
|
preferredCommunication?: Array<communication>;
|
||||||
|
|
|
@ -1,43 +0,0 @@
|
||||||
import { Column, ColumnType, Entity, ManyToOne, PrimaryColumn } from "typeorm";
|
|
||||||
import { member } from "./member";
|
|
||||||
import { education } from "../../configuration/education";
|
|
||||||
import { getTypeByORM } from "../../../migrations/ormHelper";
|
|
||||||
|
|
||||||
@Entity()
|
|
||||||
export class memberEducations {
|
|
||||||
@PrimaryColumn({ generated: "increment", type: "int" })
|
|
||||||
id: number;
|
|
||||||
|
|
||||||
@Column({ type: getTypeByORM("date").type as ColumnType })
|
|
||||||
start: Date;
|
|
||||||
|
|
||||||
@Column({ type: getTypeByORM("date").type as ColumnType, nullable: true })
|
|
||||||
end?: Date;
|
|
||||||
|
|
||||||
@Column({ type: "varchar", length: 255, nullable: true })
|
|
||||||
note?: string;
|
|
||||||
|
|
||||||
@Column({ type: "varchar", length: 255, nullable: true })
|
|
||||||
place?: string;
|
|
||||||
|
|
||||||
@Column()
|
|
||||||
memberId: string;
|
|
||||||
|
|
||||||
@Column()
|
|
||||||
educationId: number;
|
|
||||||
|
|
||||||
@ManyToOne(() => member, (member) => member.awards, {
|
|
||||||
nullable: false,
|
|
||||||
onDelete: "CASCADE",
|
|
||||||
onUpdate: "RESTRICT",
|
|
||||||
})
|
|
||||||
member: member;
|
|
||||||
|
|
||||||
@ManyToOne(() => education, (education) => education.members, {
|
|
||||||
nullable: false,
|
|
||||||
onDelete: "RESTRICT",
|
|
||||||
onUpdate: "RESTRICT",
|
|
||||||
cascade: ["insert"],
|
|
||||||
})
|
|
||||||
education: education;
|
|
||||||
}
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { Column, CreateDateColumn, Entity, ManyToOne, OneToMany, PrimaryColumn } from "typeorm";
|
import { Column, Entity, ManyToOne, OneToMany, PrimaryColumn } from "typeorm";
|
||||||
import { newsletterDates } from "./newsletterDates";
|
import { newsletterDates } from "./newsletterDates";
|
||||||
import { newsletterRecipients } from "./newsletterRecipients";
|
import { newsletterRecipients } from "./newsletterRecipients";
|
||||||
import { query } from "../../configuration/query";
|
import { query } from "../../configuration/query";
|
||||||
|
@ -14,9 +14,6 @@ export class newsletter {
|
||||||
@Column({ type: "varchar", length: 255, default: "" })
|
@Column({ type: "varchar", length: 255, default: "" })
|
||||||
description: string;
|
description: string;
|
||||||
|
|
||||||
@CreateDateColumn()
|
|
||||||
createdAt: Date;
|
|
||||||
|
|
||||||
@Column({ type: "text", default: "" })
|
@Column({ type: "text", default: "" })
|
||||||
newsletterTitle: string;
|
newsletterTitle: string;
|
||||||
|
|
||||||
|
|
|
@ -1,17 +0,0 @@
|
||||||
import { Column, Entity, OneToMany, PrimaryColumn } from "typeorm";
|
|
||||||
import { memberEducations } from "../club/member/memberEducations";
|
|
||||||
|
|
||||||
@Entity()
|
|
||||||
export class education {
|
|
||||||
@PrimaryColumn({ generated: "increment", type: "int" })
|
|
||||||
id: number;
|
|
||||||
|
|
||||||
@Column({ type: "varchar", length: 255, unique: true })
|
|
||||||
education: string;
|
|
||||||
|
|
||||||
@Column({ type: "varchar", length: 255, nullable: true })
|
|
||||||
description?: string;
|
|
||||||
|
|
||||||
@OneToMany(() => memberEducations, (memberEducations) => memberEducations.education)
|
|
||||||
members: memberEducations[];
|
|
||||||
}
|
|
|
@ -1,8 +1,8 @@
|
||||||
import { Column, Entity, PrimaryColumn, PrimaryGeneratedColumn, UpdateDateColumn } from "typeorm";
|
import { Column, Entity, PrimaryColumn, UpdateDateColumn } from "typeorm";
|
||||||
|
|
||||||
@Entity()
|
@Entity()
|
||||||
export class query {
|
export class query {
|
||||||
@PrimaryGeneratedColumn("uuid")
|
@PrimaryColumn({ generated: "uuid", type: "varchar" })
|
||||||
id: string;
|
id: string;
|
||||||
|
|
||||||
@Column({ type: "varchar", length: 255, unique: true })
|
@Column({ type: "varchar", length: 255, unique: true })
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { Column, Entity, JoinTable, ManyToMany, OneToMany, PrimaryColumn, PrimaryGeneratedColumn } from "typeorm";
|
import { Column, Entity, JoinTable, ManyToMany, OneToMany, PrimaryColumn } from "typeorm";
|
||||||
import { role } from "./role";
|
import { role } from "./role";
|
||||||
import { userPermission } from "./user_permission";
|
import { userPermission } from "./user_permission";
|
||||||
import { LoginRoutineEnum } from "../../enums/loginRoutineEnum";
|
import { LoginRoutineEnum } from "../../enums/loginRoutineEnum";
|
||||||
|
@ -7,7 +7,7 @@ import { APPLICATION_SECRET } from "../../env.defaults";
|
||||||
|
|
||||||
@Entity()
|
@Entity()
|
||||||
export class user {
|
export class user {
|
||||||
@PrimaryGeneratedColumn("uuid")
|
@PrimaryColumn({ generated: "uuid", type: "varchar" })
|
||||||
id: string;
|
id: string;
|
||||||
|
|
||||||
@Column({ type: "varchar", unique: true, length: 255 })
|
@Column({ type: "varchar", unique: true, length: 255 })
|
||||||
|
|
|
@ -29,10 +29,10 @@ export class inspection {
|
||||||
@Column()
|
@Column()
|
||||||
inspectionVersionedPlanId: string;
|
inspectionVersionedPlanId: string;
|
||||||
|
|
||||||
@Column({ nullable: true, default: null })
|
@Column()
|
||||||
equipmentId?: string;
|
equipmentId?: string;
|
||||||
|
|
||||||
@Column({ nullable: true, default: null })
|
@Column()
|
||||||
vehicleId?: string;
|
vehicleId?: string;
|
||||||
|
|
||||||
@ManyToOne(() => inspectionPlan, {
|
@ManyToOne(() => inspectionPlan, {
|
||||||
|
|
|
@ -21,10 +21,10 @@ export class inspectionPlan {
|
||||||
@CreateDateColumn()
|
@CreateDateColumn()
|
||||||
createdAt: Date;
|
createdAt: Date;
|
||||||
|
|
||||||
@Column({ nullable: true, default: null })
|
@Column()
|
||||||
equipmentTypeId?: string;
|
equipmentTypeId?: string;
|
||||||
|
|
||||||
@Column({ nullable: true, default: null })
|
@Column()
|
||||||
vehicleTypeId?: string;
|
vehicleTypeId?: string;
|
||||||
|
|
||||||
@ManyToOne(() => equipmentType, {
|
@ManyToOne(() => equipmentType, {
|
||||||
|
|
|
@ -28,7 +28,7 @@ export class wearable {
|
||||||
@Column()
|
@Column()
|
||||||
wearableTypeId: string;
|
wearableTypeId: string;
|
||||||
|
|
||||||
@Column({ nullable: true, default: null })
|
@Column()
|
||||||
wearerId?: string;
|
wearerId?: string;
|
||||||
|
|
||||||
@ManyToOne(() => wearableType, {
|
@ManyToOne(() => wearableType, {
|
||||||
|
|
|
@ -2,8 +2,9 @@ import "dotenv/config";
|
||||||
import ms from "ms";
|
import ms from "ms";
|
||||||
import ip from "ip";
|
import ip from "ip";
|
||||||
|
|
||||||
|
export const DB_TYPE = process.env.DB_TYPE ?? "mysql";
|
||||||
export const DB_HOST = process.env.DB_HOST ?? "";
|
export const DB_HOST = process.env.DB_HOST ?? "";
|
||||||
export const DB_PORT = Number(process.env.DB_PORT ?? 5432);
|
export const DB_PORT = Number(process.env.DB_PORT ?? 3306);
|
||||||
export const DB_NAME = process.env.DB_NAME ?? "";
|
export const DB_NAME = process.env.DB_NAME ?? "";
|
||||||
export const DB_USERNAME = process.env.DB_USERNAME ?? "";
|
export const DB_USERNAME = process.env.DB_USERNAME ?? "";
|
||||||
export const DB_PASSWORD = process.env.DB_PASSWORD ?? "";
|
export const DB_PASSWORD = process.env.DB_PASSWORD ?? "";
|
||||||
|
@ -38,6 +39,7 @@ export const TRUST_PROXY = ((): Array<string> | string | boolean | number | null
|
||||||
})();
|
})();
|
||||||
|
|
||||||
export function configCheck() {
|
export function configCheck() {
|
||||||
|
if (DB_TYPE != "mysql" && DB_TYPE != "postgres") throw new Error("set valid value to DB_TYPE (mysql|postgres)");
|
||||||
if (DB_HOST == "" || typeof DB_HOST != "string") throw new Error("set valid value to DB_HOST");
|
if (DB_HOST == "" || typeof DB_HOST != "string") throw new Error("set valid value to DB_HOST");
|
||||||
if (DB_NAME == "" || typeof DB_NAME != "string") throw new Error("set valid value to DB_NAME");
|
if (DB_NAME == "" || typeof DB_NAME != "string") throw new Error("set valid value to DB_NAME");
|
||||||
if (DB_USERNAME == "" || typeof DB_USERNAME != "string") throw new Error("set valid value to DB_USERNAME");
|
if (DB_USERNAME == "" || typeof DB_USERNAME != "string") throw new Error("set valid value to DB_USERNAME");
|
||||||
|
|
|
@ -1,5 +1,14 @@
|
||||||
|
import { DB_TYPE } from "../../../../env.defaults";
|
||||||
|
|
||||||
export default abstract class DateMappingHelper {
|
export default abstract class DateMappingHelper {
|
||||||
static mapDate(entry: any) {
|
static mapDate(entry: any) {
|
||||||
|
switch (DB_TYPE) {
|
||||||
|
case "postgres":
|
||||||
return `${entry?.years ?? 0} years ${entry?.months ?? 0} months ${entry?.days ?? 0} days`;
|
return `${entry?.years ?? 0} years ${entry?.months ?? 0} months ${entry?.days ?? 0} days`;
|
||||||
|
case "mysql":
|
||||||
|
return entry.toString();
|
||||||
|
case "sqlite":
|
||||||
|
return entry;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,8 +20,7 @@ export default abstract class MemberFactory {
|
||||||
lastname: record?.lastname,
|
lastname: record?.lastname,
|
||||||
nameaffix: record?.nameaffix,
|
nameaffix: record?.nameaffix,
|
||||||
birthdate: record?.birthdate,
|
birthdate: record?.birthdate,
|
||||||
internalId: record?.internalId,
|
internalId: record.internalId,
|
||||||
note: record?.note,
|
|
||||||
firstMembershipEntry: record?.firstMembershipEntry
|
firstMembershipEntry: record?.firstMembershipEntry
|
||||||
? MembershipFactory.mapToSingle(record.firstMembershipEntry)
|
? MembershipFactory.mapToSingle(record.firstMembershipEntry)
|
||||||
: null,
|
: null,
|
||||||
|
|
|
@ -1,30 +0,0 @@
|
||||||
import { memberEducations } from "../../../../entity/club/member/memberEducations";
|
|
||||||
import { MemberEducationViewModel } from "../../../../viewmodel/admin/club/member/memberEducation.models";
|
|
||||||
|
|
||||||
export default abstract class MemberEducationFactory {
|
|
||||||
/**
|
|
||||||
* @description map record to memberEducation
|
|
||||||
* @param {memberEducation} record
|
|
||||||
* @returns {MemberEducationViewModel}
|
|
||||||
*/
|
|
||||||
public static mapToSingle(record: memberEducations): MemberEducationViewModel {
|
|
||||||
return {
|
|
||||||
id: record.id,
|
|
||||||
start: record.start,
|
|
||||||
end: record.end,
|
|
||||||
note: record.note,
|
|
||||||
place: record.place,
|
|
||||||
education: record.education.education,
|
|
||||||
educationId: record.education.id,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description map records to memberEducation
|
|
||||||
* @param {Array<memberEducation>} records
|
|
||||||
* @returns {Array<MemberEducationViewModel>}
|
|
||||||
*/
|
|
||||||
public static mapToBase(records: Array<memberEducations>): Array<MemberEducationViewModel> {
|
|
||||||
return records.map((r) => this.mapToSingle(r));
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,10 +1,9 @@
|
||||||
import { membership } from "../../../../entity/club/member/membership";
|
import { membership } from "../../../../entity/club/member/membership";
|
||||||
import {
|
import {
|
||||||
MembershipStatisticsViewModel,
|
MembershipStatisticsViewModel,
|
||||||
MembershipTotalStatisticsViewModel,
|
|
||||||
MembershipViewModel,
|
MembershipViewModel,
|
||||||
} from "../../../../viewmodel/admin/club/member/membership.models";
|
} from "../../../../viewmodel/admin/club/member/membership.models";
|
||||||
import { membershipTotalView, membershipView } from "../../../../views/membershipsView";
|
import { membershipView } from "../../../../views/membershipsView";
|
||||||
import DateMappingHelper from "./dateMappingHelper";
|
import DateMappingHelper from "./dateMappingHelper";
|
||||||
|
|
||||||
export default abstract class MembershipFactory {
|
export default abstract class MembershipFactory {
|
||||||
|
@ -54,25 +53,6 @@ export default abstract class MembershipFactory {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @description map view record to MembershipTotalStatisticsViewModel
|
|
||||||
* @param {membershipTotalView} record
|
|
||||||
* @returns {MembershipTotalStatisticsViewModel}
|
|
||||||
*/
|
|
||||||
public static mapToSingleTotalStatistic(record: membershipTotalView): MembershipTotalStatisticsViewModel {
|
|
||||||
return {
|
|
||||||
durationInDays: record.durationInDays,
|
|
||||||
durationInYears: record.durationInYears,
|
|
||||||
exactDuration: DateMappingHelper.mapDate(record.exactDuration),
|
|
||||||
memberId: record.memberId,
|
|
||||||
memberSalutation: record.memberSalutation,
|
|
||||||
memberFirstname: record.memberFirstname,
|
|
||||||
memberLastname: record.memberLastname,
|
|
||||||
memberNameaffix: record.memberNameaffix,
|
|
||||||
memberBirthdate: record.memberBirthdate,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description map records to MembershipStatisticsViewModel
|
* @description map records to MembershipStatisticsViewModel
|
||||||
* @param {Array<membershipView>} records
|
* @param {Array<membershipView>} records
|
||||||
|
|
|
@ -18,7 +18,6 @@ export default abstract class NewsletterFactory {
|
||||||
newsletterSignatur: record.newsletterSignatur,
|
newsletterSignatur: record.newsletterSignatur,
|
||||||
isSent: record.isSent,
|
isSent: record.isSent,
|
||||||
recipientsByQueryId: record?.recipientsByQuery ? record.recipientsByQuery.id : null,
|
recipientsByQueryId: record?.recipientsByQuery ? record.recipientsByQuery.id : null,
|
||||||
createdAt: record.createdAt,
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,26 +0,0 @@
|
||||||
import { education } from "../../../entity/configuration/education";
|
|
||||||
import { EducationViewModel } from "../../../viewmodel/admin/configuration/education.models";
|
|
||||||
|
|
||||||
export default abstract class EducationFactory {
|
|
||||||
/**
|
|
||||||
* @description map record to education
|
|
||||||
* @param {education} record
|
|
||||||
* @returns {AwardViewModel}
|
|
||||||
*/
|
|
||||||
public static mapToSingle(record: education): EducationViewModel {
|
|
||||||
return {
|
|
||||||
id: record.id,
|
|
||||||
education: record.education,
|
|
||||||
description: record.description,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description map records to education
|
|
||||||
* @param {Array<education>} records
|
|
||||||
* @returns {Array<AwardViewModel>}
|
|
||||||
*/
|
|
||||||
public static mapToBase(records: Array<education>): Array<EducationViewModel> {
|
|
||||||
return records.map((r) => this.mapToSingle(r));
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -8,7 +8,6 @@ import DatabaseActionException from "../exceptions/databaseActionException";
|
||||||
import { availableTemplates } from "../type/templateTypes";
|
import { availableTemplates } from "../type/templateTypes";
|
||||||
import SettingHelper from "./settingsHelper";
|
import SettingHelper from "./settingsHelper";
|
||||||
import { LoginRoutineEnum } from "../enums/loginRoutineEnum";
|
import { LoginRoutineEnum } from "../enums/loginRoutineEnum";
|
||||||
import { education } from "../entity/configuration/education";
|
|
||||||
|
|
||||||
export type BackupSection =
|
export type BackupSection =
|
||||||
| "member"
|
| "member"
|
||||||
|
@ -56,7 +55,6 @@ export default abstract class BackupHelper {
|
||||||
"member_executive_positions",
|
"member_executive_positions",
|
||||||
"membership",
|
"membership",
|
||||||
"communication",
|
"communication",
|
||||||
"member_educations",
|
|
||||||
],
|
],
|
||||||
memberBase: [
|
memberBase: [
|
||||||
"award",
|
"award",
|
||||||
|
@ -65,7 +63,6 @@ export default abstract class BackupHelper {
|
||||||
"membership_status",
|
"membership_status",
|
||||||
"communication_type",
|
"communication_type",
|
||||||
"salutation",
|
"salutation",
|
||||||
"education",
|
|
||||||
],
|
],
|
||||||
protocol: [
|
protocol: [
|
||||||
"protocol",
|
"protocol",
|
||||||
|
@ -249,8 +246,6 @@ export default abstract class BackupHelper {
|
||||||
.leftJoin("positions.executivePosition", "executivePosition")
|
.leftJoin("positions.executivePosition", "executivePosition")
|
||||||
.leftJoin("member.qualifications", "qualifications")
|
.leftJoin("member.qualifications", "qualifications")
|
||||||
.leftJoin("qualifications.qualification", "qualification")
|
.leftJoin("qualifications.qualification", "qualification")
|
||||||
.leftJoin("member.educations", "educations")
|
|
||||||
.leftJoin("educations.education", "education")
|
|
||||||
.select([
|
.select([
|
||||||
...(collectIds ? ["member.id"] : []),
|
...(collectIds ? ["member.id"] : []),
|
||||||
"member.firstname",
|
"member.firstname",
|
||||||
|
@ -258,7 +253,6 @@ export default abstract class BackupHelper {
|
||||||
"member.nameaffix",
|
"member.nameaffix",
|
||||||
"member.birthdate",
|
"member.birthdate",
|
||||||
"member.internalId",
|
"member.internalId",
|
||||||
"member.note",
|
|
||||||
])
|
])
|
||||||
.addSelect(["salutation.salutation"])
|
.addSelect(["salutation.salutation"])
|
||||||
.addSelect([
|
.addSelect([
|
||||||
|
@ -286,14 +280,6 @@ export default abstract class BackupHelper {
|
||||||
"qualification.qualification",
|
"qualification.qualification",
|
||||||
"qualification.description",
|
"qualification.description",
|
||||||
])
|
])
|
||||||
.addSelect([
|
|
||||||
"educations.start",
|
|
||||||
"educations.end",
|
|
||||||
"educations.place",
|
|
||||||
"educations.note",
|
|
||||||
"education.education",
|
|
||||||
"education.description",
|
|
||||||
])
|
|
||||||
.getMany();
|
.getMany();
|
||||||
}
|
}
|
||||||
private static async getMemberBase(): Promise<{ [key: string]: Array<any> }> {
|
private static async getMemberBase(): Promise<{ [key: string]: Array<any> }> {
|
||||||
|
@ -308,7 +294,6 @@ export default abstract class BackupHelper {
|
||||||
qualification: await dataSource
|
qualification: await dataSource
|
||||||
.getRepository("qualification")
|
.getRepository("qualification")
|
||||||
.find({ select: { qualification: true, description: true } }),
|
.find({ select: { qualification: true, description: true } }),
|
||||||
education: await dataSource.getRepository("education").find({ select: { education: true, description: true } }),
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
private static async getProtocol(collectIds: boolean): Promise<Array<any>> {
|
private static async getProtocol(collectIds: boolean): Promise<Array<any>> {
|
||||||
|
@ -359,7 +344,6 @@ export default abstract class BackupHelper {
|
||||||
"newsletter.newsletterText",
|
"newsletter.newsletterText",
|
||||||
"newsletter.newsletterSignatur",
|
"newsletter.newsletterSignatur",
|
||||||
"newsletter.isSent",
|
"newsletter.isSent",
|
||||||
"newsletter.createdAt",
|
|
||||||
])
|
])
|
||||||
.addSelect(["dates.calendarId", "dates.diffTitle", "dates.diffDescription"])
|
.addSelect(["dates.calendarId", "dates.diffTitle", "dates.diffDescription"])
|
||||||
.addSelect(["recipients.memberId"])
|
.addSelect(["recipients.memberId"])
|
||||||
|
@ -550,13 +534,6 @@ export default abstract class BackupHelper {
|
||||||
.map((d) => ({ ...d, id: undefined })),
|
.map((d) => ({ ...d, id: undefined })),
|
||||||
"qualification"
|
"qualification"
|
||||||
),
|
),
|
||||||
education: uniqBy(
|
|
||||||
data
|
|
||||||
.map((d) => (d.education ?? []).map((c: any) => c.education))
|
|
||||||
.flat()
|
|
||||||
.map((d) => ({ ...d, id: undefined })),
|
|
||||||
"education"
|
|
||||||
),
|
|
||||||
});
|
});
|
||||||
|
|
||||||
let salutation = await this.transactionManager.getRepository("salutation").find();
|
let salutation = await this.transactionManager.getRepository("salutation").find();
|
||||||
|
@ -564,7 +541,6 @@ export default abstract class BackupHelper {
|
||||||
let membership = await this.transactionManager.getRepository("membership_status").find();
|
let membership = await this.transactionManager.getRepository("membership_status").find();
|
||||||
let award = await this.transactionManager.getRepository("award").find();
|
let award = await this.transactionManager.getRepository("award").find();
|
||||||
let qualification = await this.transactionManager.getRepository("qualification").find();
|
let qualification = await this.transactionManager.getRepository("qualification").find();
|
||||||
let education = await this.transactionManager.getRepository("education").find();
|
|
||||||
let position = await this.transactionManager.getRepository("executive_position").find();
|
let position = await this.transactionManager.getRepository("executive_position").find();
|
||||||
let dataWithMappedIds = data.map((d) => ({
|
let dataWithMappedIds = data.map((d) => ({
|
||||||
...d,
|
...d,
|
||||||
|
@ -607,13 +583,6 @@ export default abstract class BackupHelper {
|
||||||
id: qualification.find((iq) => iq.qualification == q.qualification.qualification)?.id ?? undefined,
|
id: qualification.find((iq) => iq.qualification == q.qualification.qualification)?.id ?? undefined,
|
||||||
},
|
},
|
||||||
})),
|
})),
|
||||||
educations: (d.educations ?? []).map((e: any) => ({
|
|
||||||
...e,
|
|
||||||
education: {
|
|
||||||
...e.education,
|
|
||||||
id: education.find((id) => id.education == e.education.education)?.id ?? undefined,
|
|
||||||
},
|
|
||||||
})),
|
|
||||||
}));
|
}));
|
||||||
await this.transactionManager.getRepository("member").save(dataWithMappedIds);
|
await this.transactionManager.getRepository("member").save(dataWithMappedIds);
|
||||||
}
|
}
|
||||||
|
@ -624,7 +593,6 @@ export default abstract class BackupHelper {
|
||||||
let award = await this.transactionManager.getRepository("award").find();
|
let award = await this.transactionManager.getRepository("award").find();
|
||||||
let qualification = await this.transactionManager.getRepository("qualification").find();
|
let qualification = await this.transactionManager.getRepository("qualification").find();
|
||||||
let position = await this.transactionManager.getRepository("executive_position").find();
|
let position = await this.transactionManager.getRepository("executive_position").find();
|
||||||
let education = await this.transactionManager.getRepository("education").find();
|
|
||||||
|
|
||||||
await this.transactionManager
|
await this.transactionManager
|
||||||
.createQueryBuilder()
|
.createQueryBuilder()
|
||||||
|
@ -666,17 +634,8 @@ export default abstract class BackupHelper {
|
||||||
.insert()
|
.insert()
|
||||||
.into("qualification")
|
.into("qualification")
|
||||||
.values(
|
.values(
|
||||||
(data?.["qualification"] ?? []).filter(
|
(data?.["qualification"] ?? []).filter((d) => !qualification.map((q) => q.award).includes(d.qualification))
|
||||||
(d) => !qualification.map((q) => q.qualification).includes(d.qualification)
|
|
||||||
)
|
)
|
||||||
)
|
|
||||||
.orIgnore()
|
|
||||||
.execute();
|
|
||||||
await this.transactionManager
|
|
||||||
.createQueryBuilder()
|
|
||||||
.insert()
|
|
||||||
.into("education")
|
|
||||||
.values((data?.["education"] ?? []).filter((d) => !education.map((q) => q.education).includes(d.education)))
|
|
||||||
.orIgnore()
|
.orIgnore()
|
||||||
.execute();
|
.execute();
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,16 +12,6 @@ export abstract class DemoDataHelper {
|
||||||
return newsletterDemoData;
|
return newsletterDemoData;
|
||||||
case "member":
|
case "member":
|
||||||
return memberDemoData;
|
return memberDemoData;
|
||||||
case "listprint":
|
|
||||||
return {
|
|
||||||
today: new Date(),
|
|
||||||
list: [memberDemoData.memberships],
|
|
||||||
};
|
|
||||||
case "listprint.member":
|
|
||||||
return {
|
|
||||||
today: new Date(),
|
|
||||||
list: [memberDemoData.member],
|
|
||||||
};
|
|
||||||
default:
|
default:
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,13 +17,11 @@ export default abstract class DynamicQueryBuilder {
|
||||||
"memberAwards",
|
"memberAwards",
|
||||||
"memberExecutivePositions",
|
"memberExecutivePositions",
|
||||||
"memberQualifications",
|
"memberQualifications",
|
||||||
"memberEducations",
|
|
||||||
"membership",
|
"membership",
|
||||||
"memberView",
|
"memberView",
|
||||||
"memberExecutivePositionsView",
|
"memberExecutivePositionsView",
|
||||||
"memberQualificationsView",
|
"memberQualificationsView",
|
||||||
"membershipView",
|
"membershipView",
|
||||||
"membershipTotalView",
|
|
||||||
];
|
];
|
||||||
|
|
||||||
public static getTableMeta(tableName: string): TableMeta {
|
public static getTableMeta(tableName: string): TableMeta {
|
||||||
|
@ -228,19 +226,19 @@ export default abstract class DynamicQueryBuilder {
|
||||||
query += ` IS NOT NULL`;
|
query += ` IS NOT NULL`;
|
||||||
break;
|
break;
|
||||||
case "contains":
|
case "contains":
|
||||||
query += ` ILIKE :${parameterKey}`;
|
query += ` LIKE :${parameterKey}`;
|
||||||
parameters[parameterKey] = `%${condition.value}%`;
|
parameters[parameterKey] = `%${condition.value}%`;
|
||||||
break;
|
break;
|
||||||
case "notContains":
|
case "notContains":
|
||||||
query += ` NOT ILIKE :${parameterKey}`;
|
query += ` NOT LIKE :${parameterKey}`;
|
||||||
parameters[parameterKey] = `%${condition.value}%`;
|
parameters[parameterKey] = `%${condition.value}%`;
|
||||||
break;
|
break;
|
||||||
case "startsWith":
|
case "startsWith":
|
||||||
query += ` ILIKE :${parameterKey}`;
|
query += ` LIKE :${parameterKey}`;
|
||||||
parameters[parameterKey] = `${condition.value}%`;
|
parameters[parameterKey] = `${condition.value}%`;
|
||||||
break;
|
break;
|
||||||
case "endsWith":
|
case "endsWith":
|
||||||
query += ` ILIKE :${parameterKey}`;
|
query += ` LIKE :${parameterKey}`;
|
||||||
parameters[parameterKey] = `%${condition.value}`;
|
parameters[parameterKey] = `%${condition.value}`;
|
||||||
break;
|
break;
|
||||||
case "timespanEq":
|
case "timespanEq":
|
||||||
|
@ -294,12 +292,7 @@ export default abstract class DynamicQueryBuilder {
|
||||||
results.forEach((res) => {
|
results.forEach((res) => {
|
||||||
if (typeof value === "object" && value instanceof Date) {
|
if (typeof value === "object" && value instanceof Date) {
|
||||||
res[newKey] = new Date(value).toISOString();
|
res[newKey] = new Date(value).toISOString();
|
||||||
} else if (
|
} else if (typeof value === "object" && !Array.isArray(value) && !(value instanceof Buffer)) {
|
||||||
typeof value === "object" &&
|
|
||||||
!Array.isArray(value) &&
|
|
||||||
!(value instanceof Buffer) &&
|
|
||||||
value !== null
|
|
||||||
) {
|
|
||||||
let string = "";
|
let string = "";
|
||||||
for (const key of Object.keys(value)) {
|
for (const key of Object.keys(value)) {
|
||||||
string += `${value[key]} ${key} `;
|
string += `${value[key]} ${key} `;
|
||||||
|
@ -308,7 +301,7 @@ export default abstract class DynamicQueryBuilder {
|
||||||
|
|
||||||
// JSON.stringify(value).replace(/["\\{}]/g, "").replaceAll(",", ", ");
|
// JSON.stringify(value).replace(/["\\{}]/g, "").replaceAll(",", ", ");
|
||||||
} else if (String(value) != "undefined") {
|
} else if (String(value) != "undefined") {
|
||||||
res[newKey] = value !== null ? String(value) : "";
|
res[newKey] = String(value);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -76,7 +76,7 @@ export default abstract class SettingHelper {
|
||||||
* @param value The value to set
|
* @param value The value to set
|
||||||
*/
|
*/
|
||||||
public static async setSetting<K extends SettingString>(key: K, value: SettingValueMapping[K]): Promise<void> {
|
public static async setSetting<K extends SettingString>(key: K, value: SettingValueMapping[K]): Promise<void> {
|
||||||
if (value === undefined || value === null || value === "") {
|
if (value === undefined || value === null || value == "") {
|
||||||
if (key != "mail.password") this.resetSetting(key);
|
if (key != "mail.password") this.resetSetting(key);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,19 +1,21 @@
|
||||||
import { MigrationInterface, QueryRunner, Table } from "typeorm";
|
import { MigrationInterface, QueryRunner, Table } from "typeorm";
|
||||||
import InternalException from "../exceptions/internalException";
|
|
||||||
import BackupHelper from "../helpers/backupHelper";
|
import BackupHelper from "../helpers/backupHelper";
|
||||||
import { getTypeByORM, isIncrementPrimary, getDefaultByORM } from "./ormHelper";
|
import { getDefaultByORM, getTypeByORM, isIncrementPrimary } from "./ormHelper";
|
||||||
|
import InternalException from "../exceptions/internalException";
|
||||||
|
import { DB_TYPE } from "../env.defaults";
|
||||||
|
|
||||||
export class BackupAndResetDatabase1749296262915 implements MigrationInterface {
|
export class BackupAndResetDatabase1738166124200 implements MigrationInterface {
|
||||||
name = "BackupAndResetDatabase1749296262915";
|
name = "BackupAndResetDatabase1738166124200";
|
||||||
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
let migrations = await queryRunner.query("SELECT name FROM migrations");
|
let query = DB_TYPE == "postgres" ? "SELECT name FROM migrations" : "SELECT `name` FROM `migrations`";
|
||||||
|
let migrations = await queryRunner.query(query);
|
||||||
if (
|
if (
|
||||||
(await queryRunner.hasTable("user")) &&
|
(await queryRunner.hasTable("user")) &&
|
||||||
migrations.findIndex((m: any) => m.name == "MemberExtendData1748953828644") == -1
|
migrations.findIndex((m: any) => m.name == "MoveSendNewsletterFlag1737816852011") == -1
|
||||||
) {
|
) {
|
||||||
throw new InternalException(
|
throw new InternalException(
|
||||||
"Cannot update due to skiped version. Update to v1.6.0 Version first to prevent data loss and get access to the newer Versions."
|
"Cannot update due to skiped version. Update to v1.2.2 Version first to prevent data loss and get access to the newer Versions."
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
177
src/migrations/1738166167472-CreateSchema.ts
Normal file
177
src/migrations/1738166167472-CreateSchema.ts
Normal file
|
@ -0,0 +1,177 @@
|
||||||
|
import { MigrationInterface, QueryRunner } from "typeorm";
|
||||||
|
import {
|
||||||
|
invite_table,
|
||||||
|
refresh_table,
|
||||||
|
reset_table,
|
||||||
|
role_permission_table,
|
||||||
|
role_table,
|
||||||
|
user_permission_table,
|
||||||
|
user_roles_table,
|
||||||
|
user_table,
|
||||||
|
webapi_permission_table,
|
||||||
|
webapi_table,
|
||||||
|
} from "./baseSchemaTables/admin";
|
||||||
|
import { templateUsage } from "../entity/configuration/templateUsage";
|
||||||
|
import {
|
||||||
|
award_table,
|
||||||
|
communication_type_table,
|
||||||
|
executive_position_table,
|
||||||
|
member_awards_table,
|
||||||
|
member_communication_table,
|
||||||
|
member_executive_positions_table,
|
||||||
|
member_executive_positions_view_mysql,
|
||||||
|
member_executive_positions_view_postgres,
|
||||||
|
member_executive_positions_view_sqlite,
|
||||||
|
member_qualifications_table,
|
||||||
|
member_qualifications_view_mysql,
|
||||||
|
member_qualifications_view_postgres,
|
||||||
|
member_qualifications_view_sqlite,
|
||||||
|
member_table,
|
||||||
|
member_view_mysql,
|
||||||
|
member_view_postgres,
|
||||||
|
member_view_sqlite,
|
||||||
|
membership_status_table,
|
||||||
|
membership_table,
|
||||||
|
membership_view_mysql,
|
||||||
|
membership_view_postgres,
|
||||||
|
membership_view_sqlite,
|
||||||
|
qualification_table,
|
||||||
|
salutation_table,
|
||||||
|
} from "./baseSchemaTables/member";
|
||||||
|
import { query_table, template_table, template_usage_table } from "./baseSchemaTables/query_template";
|
||||||
|
import {
|
||||||
|
protocol_agenda_table,
|
||||||
|
protocol_decision_table,
|
||||||
|
protocol_presence_table,
|
||||||
|
protocol_printout_table,
|
||||||
|
protocol_table,
|
||||||
|
protocol_voting_table,
|
||||||
|
} from "./baseSchemaTables/protocol";
|
||||||
|
import { calendar_table, calendar_type_table } from "./baseSchemaTables/calendar";
|
||||||
|
import {
|
||||||
|
newsletter_config_table,
|
||||||
|
newsletter_dates_table,
|
||||||
|
newsletter_recipients_table,
|
||||||
|
newsletter_table,
|
||||||
|
} from "./baseSchemaTables/newsletter";
|
||||||
|
import { DB_TYPE } from "../env.defaults";
|
||||||
|
|
||||||
|
export class CreateSchema1738166167472 implements MigrationInterface {
|
||||||
|
name = "CreateSchema1738166167472";
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.createTable(reset_table, true, true, true);
|
||||||
|
await queryRunner.createTable(invite_table, true, true, true);
|
||||||
|
await queryRunner.createTable(role_table, true, true, true);
|
||||||
|
await queryRunner.createTable(role_permission_table, true, true, true);
|
||||||
|
await queryRunner.createTable(user_table, true, true, true);
|
||||||
|
await queryRunner.createTable(user_roles_table, true, true, true);
|
||||||
|
await queryRunner.createTable(user_permission_table, true, true, true);
|
||||||
|
await queryRunner.createTable(refresh_table, true, true, true);
|
||||||
|
await queryRunner.createTable(webapi_table, true, true, true);
|
||||||
|
await queryRunner.createTable(webapi_permission_table, true, true, true);
|
||||||
|
|
||||||
|
await queryRunner.createTable(salutation_table, true, true, true);
|
||||||
|
await queryRunner.createTable(award_table, true, true, true);
|
||||||
|
await queryRunner.createTable(communication_type_table, true, true, true);
|
||||||
|
await queryRunner.createTable(membership_status_table, true, true, true);
|
||||||
|
await queryRunner.createTable(executive_position_table, true, true, true);
|
||||||
|
await queryRunner.createTable(qualification_table, true, true, true);
|
||||||
|
await queryRunner.createTable(member_table, true, true, true);
|
||||||
|
await queryRunner.createTable(member_awards_table, true, true, true);
|
||||||
|
await queryRunner.createTable(member_communication_table, true, true, true);
|
||||||
|
await queryRunner.createTable(membership_table, true, true, true);
|
||||||
|
await queryRunner.createTable(member_executive_positions_table, true, true, true);
|
||||||
|
await queryRunner.createTable(member_qualifications_table, true, true, true);
|
||||||
|
|
||||||
|
if (DB_TYPE == "postgres") await queryRunner.createView(member_view_postgres, true);
|
||||||
|
else if (DB_TYPE == "mysql") await queryRunner.createView(member_view_mysql, true);
|
||||||
|
else if (DB_TYPE == "sqlite") await queryRunner.createView(member_view_sqlite, true);
|
||||||
|
if (DB_TYPE == "postgres") await queryRunner.createView(membership_view_postgres, true);
|
||||||
|
else if (DB_TYPE == "mysql") await queryRunner.createView(membership_view_mysql, true);
|
||||||
|
else if (DB_TYPE == "sqlite") await queryRunner.createView(membership_view_sqlite, true);
|
||||||
|
if (DB_TYPE == "postgres") await queryRunner.createView(member_qualifications_view_postgres, true);
|
||||||
|
else if (DB_TYPE == "mysql") await queryRunner.createView(member_qualifications_view_mysql, true);
|
||||||
|
else if (DB_TYPE == "sqlite") await queryRunner.createView(member_qualifications_view_sqlite, true);
|
||||||
|
if (DB_TYPE == "postgres") await queryRunner.createView(member_executive_positions_view_postgres, true);
|
||||||
|
else if (DB_TYPE == "mysql") await queryRunner.createView(member_executive_positions_view_mysql, true);
|
||||||
|
else if (DB_TYPE == "sqlite") await queryRunner.createView(member_executive_positions_view_sqlite, true);
|
||||||
|
|
||||||
|
await queryRunner.createTable(query_table, true, true, true);
|
||||||
|
await queryRunner.createTable(template_table, true, true, true);
|
||||||
|
await queryRunner.createTable(template_usage_table, true, true, true);
|
||||||
|
|
||||||
|
await queryRunner.manager
|
||||||
|
.createQueryBuilder()
|
||||||
|
.insert()
|
||||||
|
.into(templateUsage)
|
||||||
|
.values([{ scope: "newsletter" }, { scope: "protocol" }, { scope: "member.list" }])
|
||||||
|
.orIgnore()
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
await queryRunner.createTable(protocol_table, true, true, true);
|
||||||
|
await queryRunner.createTable(protocol_agenda_table, true, true, true);
|
||||||
|
await queryRunner.createTable(protocol_decision_table, true, true, true);
|
||||||
|
await queryRunner.createTable(protocol_presence_table, true, true, true);
|
||||||
|
await queryRunner.createTable(protocol_voting_table, true, true, true);
|
||||||
|
await queryRunner.createTable(protocol_printout_table, true, true, true);
|
||||||
|
|
||||||
|
await queryRunner.createTable(calendar_type_table, true, true, true);
|
||||||
|
await queryRunner.createTable(calendar_table, true, true, true);
|
||||||
|
|
||||||
|
await queryRunner.createTable(newsletter_config_table, true, true, true);
|
||||||
|
await queryRunner.createTable(newsletter_table, true, true, true);
|
||||||
|
await queryRunner.createTable(newsletter_dates_table, true, true, true);
|
||||||
|
await queryRunner.createTable(newsletter_recipients_table, true, true, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.dropTable("newsletter_dates", true, true, true);
|
||||||
|
await queryRunner.dropTable("newsletter_recipients", true, true, true);
|
||||||
|
await queryRunner.dropTable("newsletter", true, true, true);
|
||||||
|
await queryRunner.dropTable("newsletter_config", true, true, true);
|
||||||
|
|
||||||
|
await queryRunner.dropTable("calendar", true, true, true);
|
||||||
|
await queryRunner.dropTable("calendar_type", true, true, true);
|
||||||
|
|
||||||
|
await queryRunner.dropTable("protocol_agenda", true, true, true);
|
||||||
|
await queryRunner.dropTable("protocol_decision", true, true, true);
|
||||||
|
await queryRunner.dropTable("protocol_presence", true, true, true);
|
||||||
|
await queryRunner.dropTable("protocol_voting", true, true, true);
|
||||||
|
await queryRunner.dropTable("protocol_printout", true, true, true);
|
||||||
|
await queryRunner.dropTable("protocol", true, true, true);
|
||||||
|
|
||||||
|
await queryRunner.dropTable("template_usage", true, true, true);
|
||||||
|
await queryRunner.dropTable("template", true, true, true);
|
||||||
|
await queryRunner.dropTable("query", true, true, true);
|
||||||
|
|
||||||
|
await queryRunner.dropView("member_view");
|
||||||
|
await queryRunner.dropView("membership_view");
|
||||||
|
await queryRunner.dropView("member_qualifications_view");
|
||||||
|
await queryRunner.dropView("member_executive_positions_view");
|
||||||
|
|
||||||
|
await queryRunner.dropTable("member_awards", true, true, true);
|
||||||
|
await queryRunner.dropTable("communication", true, true, true);
|
||||||
|
await queryRunner.dropTable("membership", true, true, true);
|
||||||
|
await queryRunner.dropTable("member_executive_positions", true, true, true);
|
||||||
|
await queryRunner.dropTable("member_qualifications", true, true, true);
|
||||||
|
await queryRunner.dropTable("member", true, true, true);
|
||||||
|
await queryRunner.dropTable("salutation", true, true, true);
|
||||||
|
await queryRunner.dropTable("award", true, true, true);
|
||||||
|
await queryRunner.dropTable("communication_type", true, true, true);
|
||||||
|
await queryRunner.dropTable("membership_status", true, true, true);
|
||||||
|
await queryRunner.dropTable("executive_position", true, true, true);
|
||||||
|
await queryRunner.dropTable("qualification", true, true, true);
|
||||||
|
|
||||||
|
await queryRunner.dropTable("webapi_permission", true, true, true);
|
||||||
|
await queryRunner.dropTable("webapi", true, true, true);
|
||||||
|
await queryRunner.dropTable("refresh", true, true, true);
|
||||||
|
await queryRunner.dropTable("user_permission", true, true, true);
|
||||||
|
await queryRunner.dropTable("user_roles", true, true, true);
|
||||||
|
await queryRunner.dropTable("user", true, true, true);
|
||||||
|
await queryRunner.dropTable("role_permission", true, true, true);
|
||||||
|
await queryRunner.dropTable("role", true, true, true);
|
||||||
|
await queryRunner.dropTable("invite", true, true, true);
|
||||||
|
await queryRunner.dropTable("reset", true, true, true);
|
||||||
|
}
|
||||||
|
}
|
55
src/migrations/1742549956787-templatesAndProtocolSort.ts
Normal file
55
src/migrations/1742549956787-templatesAndProtocolSort.ts
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
import { MigrationInterface, QueryRunner, TableColumn } from "typeorm";
|
||||||
|
import { templateUsage } from "../entity/configuration/templateUsage";
|
||||||
|
import { getTypeByORM, getDefaultByORM } from "./ormHelper";
|
||||||
|
|
||||||
|
export class TemplatesAndProtocolSort1742549956787 implements MigrationInterface {
|
||||||
|
name = "TemplatesAndProtocolSort1742549956787";
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.manager
|
||||||
|
.createQueryBuilder()
|
||||||
|
.insert()
|
||||||
|
.into(templateUsage)
|
||||||
|
.values([{ scope: "member" }])
|
||||||
|
.orIgnore()
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
await queryRunner.manager
|
||||||
|
.createQueryBuilder()
|
||||||
|
.delete()
|
||||||
|
.from(templateUsage)
|
||||||
|
.where({ scope: "member.list" })
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
await queryRunner.addColumn(
|
||||||
|
"protocol_agenda",
|
||||||
|
new TableColumn({ name: "sort", ...getTypeByORM("int"), default: getDefaultByORM("number", 0) })
|
||||||
|
);
|
||||||
|
|
||||||
|
await queryRunner.addColumn(
|
||||||
|
"protocol_decision",
|
||||||
|
new TableColumn({ name: "sort", ...getTypeByORM("int"), default: getDefaultByORM("number", 0) })
|
||||||
|
);
|
||||||
|
|
||||||
|
await queryRunner.addColumn(
|
||||||
|
"protocol_voting",
|
||||||
|
new TableColumn({ name: "sort", ...getTypeByORM("int"), default: getDefaultByORM("number", 0) })
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.dropColumn("protocol_agenda", "sort");
|
||||||
|
await queryRunner.dropColumn("protocol_decision", "sort");
|
||||||
|
await queryRunner.dropColumn("protocol_voting", "sort");
|
||||||
|
|
||||||
|
await queryRunner.manager
|
||||||
|
.createQueryBuilder()
|
||||||
|
.insert()
|
||||||
|
.into(templateUsage)
|
||||||
|
.values([{ scope: "member.list" }])
|
||||||
|
.orIgnore()
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
await queryRunner.manager.createQueryBuilder().delete().from(templateUsage).where({ scope: "member" }).execute();
|
||||||
|
}
|
||||||
|
}
|
94
src/migrations/1742922178643-queryToUUID.ts
Normal file
94
src/migrations/1742922178643-queryToUUID.ts
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
import { MigrationInterface, QueryRunner, TableColumn, TableForeignKey } from "typeorm";
|
||||||
|
import { getTypeByORM, isIncrementPrimary, isUUIDPrimary } from "./ormHelper";
|
||||||
|
import { query } from "../entity/configuration/query";
|
||||||
|
|
||||||
|
export class QueryToUUID1742922178643 implements MigrationInterface {
|
||||||
|
name = "QueryToUUID1742922178643";
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
const table = await queryRunner.getTable("newsletter");
|
||||||
|
const foreignKey = table.foreignKeys.find((fk) => fk.columnNames.indexOf("recipientsByQueryId") !== -1);
|
||||||
|
await queryRunner.dropForeignKey("newsletter", foreignKey);
|
||||||
|
|
||||||
|
// const entries = await queryRunner.manager.getRepository("query").find({ select: { title: true, query: true } });
|
||||||
|
// await queryRunner.clearTable("query");
|
||||||
|
|
||||||
|
await queryRunner.dropColumn("newsletter", "recipientsByQueryId");
|
||||||
|
await queryRunner.dropColumn("query", "id");
|
||||||
|
|
||||||
|
await queryRunner.addColumn(
|
||||||
|
"query",
|
||||||
|
new TableColumn({
|
||||||
|
name: "id",
|
||||||
|
...getTypeByORM("uuid"),
|
||||||
|
...isUUIDPrimary,
|
||||||
|
})
|
||||||
|
);
|
||||||
|
await queryRunner.addColumn(
|
||||||
|
"newsletter",
|
||||||
|
new TableColumn({
|
||||||
|
name: "recipientsByQueryId",
|
||||||
|
...getTypeByORM("uuid", true),
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
// await queryRunner.manager.getRepository("query").save(entries);
|
||||||
|
|
||||||
|
await queryRunner.createForeignKey(
|
||||||
|
"newsletter",
|
||||||
|
new TableForeignKey({
|
||||||
|
columnNames: ["recipientsByQueryId"],
|
||||||
|
referencedColumnNames: ["id"],
|
||||||
|
referencedTableName: "query",
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
onUpdate: "RESTRICT",
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
const table = await queryRunner.getTable("newsletter");
|
||||||
|
const foreignKey = table.foreignKeys.find((fk) => fk.columnNames.indexOf("recipientsByQueryId") !== -1);
|
||||||
|
await queryRunner.dropForeignKey("newsletter", foreignKey);
|
||||||
|
|
||||||
|
const entries = await queryRunner.manager.getRepository(query).find({ select: { title: true, query: true } });
|
||||||
|
await queryRunner.clearTable("query");
|
||||||
|
|
||||||
|
await queryRunner.dropColumn("newsletter", "recipientsByQueryId");
|
||||||
|
await queryRunner.dropColumn("query", "id");
|
||||||
|
|
||||||
|
await queryRunner.addColumn(
|
||||||
|
"query",
|
||||||
|
new TableColumn({
|
||||||
|
name: "id",
|
||||||
|
...getTypeByORM("int"),
|
||||||
|
...isIncrementPrimary,
|
||||||
|
})
|
||||||
|
);
|
||||||
|
await queryRunner.addColumn(
|
||||||
|
"newsletter",
|
||||||
|
new TableColumn({
|
||||||
|
name: "recipientsByQueryId",
|
||||||
|
...getTypeByORM("int", true),
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
await queryRunner.manager
|
||||||
|
.createQueryBuilder()
|
||||||
|
.insert()
|
||||||
|
.into("query")
|
||||||
|
.values(entries.map((e, i) => ({ ...e, id: i + 1 })))
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
await queryRunner.createForeignKey(
|
||||||
|
"newsletter",
|
||||||
|
new TableForeignKey({
|
||||||
|
columnNames: ["recipientsByQueryId"],
|
||||||
|
referencedColumnNames: ["id"],
|
||||||
|
referencedTableName: "query",
|
||||||
|
onDelete: "CASCADE",
|
||||||
|
onUpdate: "RESTRICT",
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
43
src/migrations/1744351418751-newsletterColumnType.ts
Normal file
43
src/migrations/1744351418751-newsletterColumnType.ts
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
import { MigrationInterface, QueryRunner, TableColumn } from "typeorm";
|
||||||
|
import { getDefaultByORM, getTypeByORM } from "./ormHelper";
|
||||||
|
import { newsletter } from "../entity/club/newsletter/newsletter";
|
||||||
|
|
||||||
|
export class NewsletterColumnType1744351418751 implements MigrationInterface {
|
||||||
|
name = "NewsletterColumnType1744351418751";
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
let newsletters = await queryRunner.manager.getRepository("newsletter").find();
|
||||||
|
|
||||||
|
await queryRunner.dropColumn("newsletter", "newsletterTitle");
|
||||||
|
await queryRunner.dropColumn("newsletter", "newsletterSignatur");
|
||||||
|
|
||||||
|
await queryRunner.addColumn(
|
||||||
|
"newsletter",
|
||||||
|
new TableColumn({ name: "newsletterTitle", ...getTypeByORM("text"), default: getDefaultByORM("string") })
|
||||||
|
);
|
||||||
|
await queryRunner.addColumn(
|
||||||
|
"newsletter",
|
||||||
|
new TableColumn({ name: "newsletterSignatur", ...getTypeByORM("text"), default: getDefaultByORM("string") })
|
||||||
|
);
|
||||||
|
|
||||||
|
await queryRunner.manager.getRepository("newsletter").save(newsletters);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
let newsletters = await queryRunner.manager.getRepository("newsletter").find();
|
||||||
|
|
||||||
|
await queryRunner.dropColumn("newsletter", "newsletterTitle");
|
||||||
|
await queryRunner.dropColumn("newsletter", "newsletterSignatur");
|
||||||
|
|
||||||
|
await queryRunner.addColumn(
|
||||||
|
"newsletter",
|
||||||
|
new TableColumn({ name: "newsletterTitle", ...getTypeByORM("varchar"), default: getDefaultByORM("string") })
|
||||||
|
);
|
||||||
|
await queryRunner.addColumn(
|
||||||
|
"newsletter",
|
||||||
|
new TableColumn({ name: "newsletterSignatur", ...getTypeByORM("varchar"), default: getDefaultByORM("string") })
|
||||||
|
);
|
||||||
|
|
||||||
|
await queryRunner.manager.getRepository("newsletter").save(newsletters);
|
||||||
|
}
|
||||||
|
}
|
22
src/migrations/1744795756230-QueryUpdatedAt.ts
Normal file
22
src/migrations/1744795756230-QueryUpdatedAt.ts
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
import { MigrationInterface, QueryRunner, TableColumn } from "typeorm";
|
||||||
|
import { getTypeByORM, getDefaultByORM } from "./ormHelper";
|
||||||
|
|
||||||
|
export class QueryUpdatedAt1744795756230 implements MigrationInterface {
|
||||||
|
name = "QueryUpdatedAt1744795756230";
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.addColumn(
|
||||||
|
"query",
|
||||||
|
new TableColumn({
|
||||||
|
name: "updatedAt",
|
||||||
|
...getTypeByORM("datetime", false, 6),
|
||||||
|
default: getDefaultByORM("currentTimestamp", 6),
|
||||||
|
onUpdate: getDefaultByORM<string>("currentTimestamp", 6),
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.dropColumn("query", "updatedAt");
|
||||||
|
}
|
||||||
|
}
|
16
src/migrations/1745059495807-settingsFromEnv.ts
Normal file
16
src/migrations/1745059495807-settingsFromEnv.ts
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
import { MigrationInterface, QueryRunner } from "typeorm";
|
||||||
|
import { setting_table } from "./baseSchemaTables/admin";
|
||||||
|
import SettingHelper from "../helpers/settingsHelper";
|
||||||
|
import ms from "ms";
|
||||||
|
|
||||||
|
export class SettingsFromEnv1745059495807 implements MigrationInterface {
|
||||||
|
name = "SettingsFromEnv1745059495807";
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.createTable(setting_table, true, true, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.dropTable(setting_table.name, true, true, true);
|
||||||
|
}
|
||||||
|
}
|
29
src/migrations/1745059495808-settingsFromEnv_set.ts
Normal file
29
src/migrations/1745059495808-settingsFromEnv_set.ts
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
import { MigrationInterface, QueryRunner } from "typeorm";
|
||||||
|
import { setting_table } from "./baseSchemaTables/admin";
|
||||||
|
import SettingHelper from "../helpers/settingsHelper";
|
||||||
|
import ms from "ms";
|
||||||
|
|
||||||
|
export class SettingsFromEnv_SET1745059495808 implements MigrationInterface {
|
||||||
|
name = "SettingsFromEnv_SET1745059495808";
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
// transfer settings of env to database
|
||||||
|
await SettingHelper.setSetting("club.name", process.env.CLUB_NAME);
|
||||||
|
await SettingHelper.setSetting("club.website", process.env.CLUB_WEBSITE);
|
||||||
|
await SettingHelper.setSetting("session.jwt_expiration", process.env.JWT_EXPIRATION as ms.StringValue);
|
||||||
|
await SettingHelper.setSetting("session.refresh_expiration", process.env.REFRESH_EXPIRATION as ms.StringValue);
|
||||||
|
await SettingHelper.setSetting(
|
||||||
|
"session.pwa_refresh_expiration",
|
||||||
|
process.env.PWA_REFRESH_EXPIRATION as ms.StringValue
|
||||||
|
);
|
||||||
|
await SettingHelper.setSetting("mail.username", process.env.MAIL_USERNAME);
|
||||||
|
await SettingHelper.setSetting("mail.password", process.env.MAIL_PASSWORD);
|
||||||
|
await SettingHelper.setSetting("mail.host", process.env.MAIL_HOST);
|
||||||
|
await SettingHelper.setSetting("mail.port", Number(process.env.MAIL_PORT ?? "578"));
|
||||||
|
await SettingHelper.setSetting("mail.secure", process.env.MAIL_SECURE == "true");
|
||||||
|
await SettingHelper.setSetting("backup.interval", Number(process.env.BACKUP_INTERVAL ?? "1"));
|
||||||
|
await SettingHelper.setSetting("backup.copies", Number(process.env.BACKUP_COPIES ?? "7"));
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {}
|
||||||
|
}
|
21
src/migrations/1746006549262-memberCreatedAt.ts
Normal file
21
src/migrations/1746006549262-memberCreatedAt.ts
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
import { MigrationInterface, QueryRunner, TableColumn } from "typeorm";
|
||||||
|
import { getTypeByORM, getDefaultByORM } from "./ormHelper";
|
||||||
|
|
||||||
|
export class MemberCreatedAt1746006549262 implements MigrationInterface {
|
||||||
|
name = "MemberCreatedAt1746006549262";
|
||||||
|
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.addColumn(
|
||||||
|
"member",
|
||||||
|
new TableColumn({
|
||||||
|
name: "createdAt",
|
||||||
|
...getTypeByORM("datetime", false, 6),
|
||||||
|
default: getDefaultByORM("currentTimestamp", 6),
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
await queryRunner.dropColumn("member", "createdAt");
|
||||||
|
}
|
||||||
|
}
|
39
src/migrations/1746252454922-UserLoginRoutine.ts
Normal file
39
src/migrations/1746252454922-UserLoginRoutine.ts
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
import { MigrationInterface, QueryRunner, TableColumn } from "typeorm";
|
||||||
|
import { getDefaultByORM, getTypeByORM } from "./ormHelper";
|
||||||
|
import { LoginRoutineEnum } from "../enums/loginRoutineEnum";
|
||||||
|
import { CodingHelper } from "../helpers/codingHelper";
|
||||||
|
import { APPLICATION_SECRET } from "../env.defaults";
|
||||||
|
|
||||||
|
export class UserLoginRoutine1746252454922 implements MigrationInterface {
|
||||||
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
let users = await queryRunner.manager.getRepository("user").find({ select: ["id", "secret"] });
|
||||||
|
|
||||||
|
await queryRunner.dropColumns("user", ["secret", "static"]);
|
||||||
|
|
||||||
|
await queryRunner.addColumns("user", [
|
||||||
|
new TableColumn({ name: "secret", ...getTypeByORM("text"), default: getDefaultByORM("string") }),
|
||||||
|
new TableColumn({
|
||||||
|
name: "routine",
|
||||||
|
...getTypeByORM("varchar"),
|
||||||
|
default: getDefaultByORM("string", LoginRoutineEnum.totp),
|
||||||
|
}),
|
||||||
|
]);
|
||||||
|
|
||||||
|
await queryRunner.manager.getRepository("user").save(users.map((u) => ({ id: u.id, secret: u.secret })));
|
||||||
|
}
|
||||||
|
|
||||||
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||||
|
let users = await queryRunner.manager.getRepository("user").find({ select: ["id", "secret"] });
|
||||||
|
|
||||||
|
await queryRunner.dropColumn("user", "secret");
|
||||||
|
|
||||||
|
await queryRunner.addColumns("user", [
|
||||||
|
new TableColumn({ name: "secret", ...getTypeByORM("varchar"), default: getDefaultByORM("string") }),
|
||||||
|
new TableColumn({ name: "static", ...getTypeByORM("boolean"), default: getDefaultByORM("boolean", false) }),
|
||||||
|
]);
|
||||||
|
|
||||||
|
await queryRunner.manager.getRepository("user").save(users.map((u) => ({ id: u.id, secret: u.secret })));
|
||||||
|
|
||||||
|
await queryRunner.dropColumn("user", "routine");
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,23 +1,23 @@
|
||||||
import { MigrationInterface, QueryRunner } from "typeorm";
|
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, maintenance_table } from "./baseSchemaTables/unit_extend";
|
||||||
import {
|
import {
|
||||||
inspection_plan_table,
|
inspection_plan_table,
|
||||||
inspection_versioned_plan_table,
|
inspection_point_result_table,
|
||||||
inspection_point_table,
|
inspection_point_table,
|
||||||
inspection_table,
|
inspection_table,
|
||||||
inspection_point_result_table,
|
inspection_versioned_plan_table,
|
||||||
} from "./baseSchemaTables/inspection";
|
} from "./baseSchemaTables/inspection";
|
||||||
import {
|
|
||||||
equipment_type_table,
|
|
||||||
equipment_table,
|
|
||||||
vehicle_type_table,
|
|
||||||
vehicle_table,
|
|
||||||
wearable_type_table,
|
|
||||||
wearable_table,
|
|
||||||
} from "./baseSchemaTables/unit";
|
|
||||||
import { maintenance_table, damage_report_table } from "./baseSchemaTables/unit_extend";
|
|
||||||
|
|
||||||
export class UnitBase1749361405703 implements MigrationInterface {
|
export class UnitBase1748261477410 implements MigrationInterface {
|
||||||
name = "UnitBase1749361405703";
|
name = "UnitBase1748261477410";
|
||||||
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||||
await queryRunner.createTable(equipment_type_table, true, true, true);
|
await queryRunner.createTable(equipment_type_table, true, true, true);
|
|
@ -1,176 +0,0 @@
|
||||||
import { MigrationInterface, QueryRunner } from "typeorm";
|
|
||||||
import {
|
|
||||||
reset_table,
|
|
||||||
invite_table,
|
|
||||||
role_table,
|
|
||||||
role_permission_table,
|
|
||||||
user_table,
|
|
||||||
user_roles_table,
|
|
||||||
user_permission_table,
|
|
||||||
refresh_table,
|
|
||||||
webapi_table,
|
|
||||||
webapi_permission_table,
|
|
||||||
setting_table,
|
|
||||||
} from "./baseSchemaTables/admin";
|
|
||||||
import { calendar_type_table, calendar_table } from "./baseSchemaTables/calendar";
|
|
||||||
import {
|
|
||||||
salutation_table,
|
|
||||||
award_table,
|
|
||||||
communication_type_table,
|
|
||||||
membership_status_table,
|
|
||||||
executive_position_table,
|
|
||||||
qualification_table,
|
|
||||||
member_table,
|
|
||||||
member_awards_table,
|
|
||||||
member_communication_table,
|
|
||||||
membership_table,
|
|
||||||
member_executive_positions_table,
|
|
||||||
member_qualifications_table,
|
|
||||||
member_view,
|
|
||||||
membership_view,
|
|
||||||
member_qualifications_view,
|
|
||||||
member_executive_positions_view,
|
|
||||||
education_table,
|
|
||||||
member_educations_table,
|
|
||||||
membership_total_view,
|
|
||||||
} from "./baseSchemaTables/member";
|
|
||||||
import {
|
|
||||||
newsletter_config_table,
|
|
||||||
newsletter_table,
|
|
||||||
newsletter_dates_table,
|
|
||||||
newsletter_recipients_table,
|
|
||||||
} from "./baseSchemaTables/newsletter";
|
|
||||||
import {
|
|
||||||
protocol_table,
|
|
||||||
protocol_agenda_table,
|
|
||||||
protocol_decision_table,
|
|
||||||
protocol_presence_table,
|
|
||||||
protocol_voting_table,
|
|
||||||
protocol_printout_table,
|
|
||||||
} from "./baseSchemaTables/protocol";
|
|
||||||
import { query_table, template_table, template_usage_table } from "./baseSchemaTables/query_template";
|
|
||||||
import { availableTemplates } from "../type/templateTypes";
|
|
||||||
|
|
||||||
export class CreateSchema1749296280721 implements MigrationInterface {
|
|
||||||
name = "CreateSchema1749296280721";
|
|
||||||
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(reset_table, true, true, true);
|
|
||||||
await queryRunner.createTable(invite_table, true, true, true);
|
|
||||||
await queryRunner.createTable(role_table, true, true, true);
|
|
||||||
await queryRunner.createTable(role_permission_table, true, true, true);
|
|
||||||
await queryRunner.createTable(user_table, true, true, true);
|
|
||||||
await queryRunner.createTable(user_roles_table, true, true, true);
|
|
||||||
await queryRunner.createTable(user_permission_table, true, true, true);
|
|
||||||
await queryRunner.createTable(refresh_table, true, true, true);
|
|
||||||
await queryRunner.createTable(webapi_table, true, true, true);
|
|
||||||
await queryRunner.createTable(webapi_permission_table, true, true, true);
|
|
||||||
await queryRunner.createTable(setting_table, true, true, true);
|
|
||||||
|
|
||||||
await queryRunner.createTable(salutation_table, true, true, true);
|
|
||||||
await queryRunner.createTable(award_table, true, true, true);
|
|
||||||
await queryRunner.createTable(communication_type_table, true, true, true);
|
|
||||||
await queryRunner.createTable(membership_status_table, true, true, true);
|
|
||||||
await queryRunner.createTable(executive_position_table, true, true, true);
|
|
||||||
await queryRunner.createTable(qualification_table, true, true, true);
|
|
||||||
await queryRunner.createTable(education_table, true, true, true);
|
|
||||||
await queryRunner.createTable(member_table, true, true, true);
|
|
||||||
await queryRunner.createTable(member_awards_table, true, true, true);
|
|
||||||
await queryRunner.createTable(member_communication_table, true, true, true);
|
|
||||||
await queryRunner.createTable(membership_table, true, true, true);
|
|
||||||
await queryRunner.createTable(member_executive_positions_table, true, true, true);
|
|
||||||
await queryRunner.createTable(member_qualifications_table, true, true, true);
|
|
||||||
await queryRunner.createTable(member_educations_table, true, true, true);
|
|
||||||
|
|
||||||
await queryRunner.createView(member_view, true);
|
|
||||||
await queryRunner.createView(membership_view, true);
|
|
||||||
await queryRunner.createView(membership_total_view, true);
|
|
||||||
await queryRunner.createView(member_qualifications_view, true);
|
|
||||||
await queryRunner.createView(member_executive_positions_view, true);
|
|
||||||
|
|
||||||
await queryRunner.createTable(query_table, true, true, true);
|
|
||||||
await queryRunner.createTable(template_table, true, true, true);
|
|
||||||
await queryRunner.createTable(template_usage_table, true, true, true);
|
|
||||||
|
|
||||||
await queryRunner.manager
|
|
||||||
.createQueryBuilder()
|
|
||||||
.insert()
|
|
||||||
.into(template_usage_table.name)
|
|
||||||
.values(
|
|
||||||
availableTemplates.map((at) => ({
|
|
||||||
scope: at,
|
|
||||||
}))
|
|
||||||
)
|
|
||||||
.orIgnore()
|
|
||||||
.execute();
|
|
||||||
|
|
||||||
await queryRunner.createTable(protocol_table, true, true, true);
|
|
||||||
await queryRunner.createTable(protocol_agenda_table, true, true, true);
|
|
||||||
await queryRunner.createTable(protocol_decision_table, true, true, true);
|
|
||||||
await queryRunner.createTable(protocol_presence_table, true, true, true);
|
|
||||||
await queryRunner.createTable(protocol_voting_table, true, true, true);
|
|
||||||
await queryRunner.createTable(protocol_printout_table, true, true, true);
|
|
||||||
|
|
||||||
await queryRunner.createTable(calendar_type_table, true, true, true);
|
|
||||||
await queryRunner.createTable(calendar_table, true, true, true);
|
|
||||||
|
|
||||||
await queryRunner.createTable(newsletter_config_table, true, true, true);
|
|
||||||
await queryRunner.createTable(newsletter_table, true, true, true);
|
|
||||||
await queryRunner.createTable(newsletter_dates_table, true, true, true);
|
|
||||||
await queryRunner.createTable(newsletter_recipients_table, true, true, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropTable(newsletter_dates_table, true, true, true);
|
|
||||||
await queryRunner.dropTable(newsletter_recipients_table, true, true, true);
|
|
||||||
await queryRunner.dropTable(newsletter_table, true, true, true);
|
|
||||||
await queryRunner.dropTable(newsletter_config_table, true, true, true);
|
|
||||||
|
|
||||||
await queryRunner.dropTable(calendar_table, true, true, true);
|
|
||||||
await queryRunner.dropTable(calendar_type_table, true, true, true);
|
|
||||||
|
|
||||||
await queryRunner.dropTable(protocol_agenda_table, true, true, true);
|
|
||||||
await queryRunner.dropTable(protocol_decision_table, true, true, true);
|
|
||||||
await queryRunner.dropTable(protocol_presence_table, true, true, true);
|
|
||||||
await queryRunner.dropTable(protocol_voting_table, true, true, true);
|
|
||||||
await queryRunner.dropTable(protocol_printout_table, true, true, true);
|
|
||||||
await queryRunner.dropTable(protocol_table, true, true, true);
|
|
||||||
|
|
||||||
await queryRunner.dropTable(template_usage_table, true, true, true);
|
|
||||||
await queryRunner.dropTable(template_table, true, true, true);
|
|
||||||
await queryRunner.dropTable(query_table, true, true, true);
|
|
||||||
|
|
||||||
await queryRunner.dropView(member_view);
|
|
||||||
await queryRunner.dropView(membership_view);
|
|
||||||
await queryRunner.dropView(membership_total_view);
|
|
||||||
await queryRunner.dropView(member_qualifications_view);
|
|
||||||
await queryRunner.dropView(member_executive_positions_view);
|
|
||||||
|
|
||||||
await queryRunner.dropTable(member_awards_table, true, true, true);
|
|
||||||
await queryRunner.dropTable(member_communication_table, true, true, true);
|
|
||||||
await queryRunner.dropTable(membership_table, true, true, true);
|
|
||||||
await queryRunner.dropTable(member_executive_positions_table, true, true, true);
|
|
||||||
await queryRunner.dropTable(member_qualifications_table, true, true, true);
|
|
||||||
await queryRunner.dropTable(member_educations_table, true, true, true);
|
|
||||||
await queryRunner.dropTable(member_table, true, true, true);
|
|
||||||
await queryRunner.dropTable(salutation_table, true, true, true);
|
|
||||||
await queryRunner.dropTable(award_table, true, true, true);
|
|
||||||
await queryRunner.dropTable(communication_type_table, true, true, true);
|
|
||||||
await queryRunner.dropTable(membership_status_table, true, true, true);
|
|
||||||
await queryRunner.dropTable(executive_position_table, true, true, true);
|
|
||||||
await queryRunner.dropTable(qualification_table, true, true, true);
|
|
||||||
await queryRunner.dropTable(education_table, true, true, true);
|
|
||||||
|
|
||||||
await queryRunner.dropTable(setting_table, true, true, true);
|
|
||||||
await queryRunner.dropTable(webapi_permission_table, true, true, true);
|
|
||||||
await queryRunner.dropTable(webapi_table, true, true, true);
|
|
||||||
await queryRunner.dropTable(refresh_table, true, true, true);
|
|
||||||
await queryRunner.dropTable(user_permission_table, true, true, true);
|
|
||||||
await queryRunner.dropTable(user_roles_table, true, true, true);
|
|
||||||
await queryRunner.dropTable(user_table, true, true, true);
|
|
||||||
await queryRunner.dropTable(role_permission_table, true, true, true);
|
|
||||||
await queryRunner.dropTable(role_table, true, true, true);
|
|
||||||
await queryRunner.dropTable(invite_table, true, true, true);
|
|
||||||
await queryRunner.dropTable(reset_table, true, true, true);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,6 +1,5 @@
|
||||||
import { Table, TableForeignKey, TableIndex, TableUnique } from "typeorm";
|
import { Table, TableForeignKey } from "typeorm";
|
||||||
import { getDefaultByORM, getTypeByORM, isIncrementPrimary, isUUIDPrimary } from "../ormHelper";
|
import { getDefaultByORM, getTypeByORM, isIncrementPrimary, isUUIDPrimary } from "../ormHelper";
|
||||||
import { LoginRoutineEnum } from "../../enums/loginRoutineEnum";
|
|
||||||
|
|
||||||
export const invite_table = new Table({
|
export const invite_table = new Table({
|
||||||
name: "invite",
|
name: "invite",
|
||||||
|
@ -17,12 +16,7 @@ export const role_table = new Table({
|
||||||
name: "role",
|
name: "role",
|
||||||
columns: [
|
columns: [
|
||||||
{ name: "id", ...getTypeByORM("int"), ...isIncrementPrimary },
|
{ name: "id", ...getTypeByORM("int"), ...isIncrementPrimary },
|
||||||
{ name: "role", ...getTypeByORM("varchar") },
|
{ name: "role", ...getTypeByORM("varchar"), isUnique: true },
|
||||||
],
|
|
||||||
uniques: [
|
|
||||||
new TableUnique({
|
|
||||||
columnNames: ["role"],
|
|
||||||
}),
|
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -51,8 +45,8 @@ export const user_table = new Table({
|
||||||
{ name: "username", ...getTypeByORM("varchar"), isUnique: true },
|
{ name: "username", ...getTypeByORM("varchar"), isUnique: true },
|
||||||
{ name: "firstname", ...getTypeByORM("varchar") },
|
{ name: "firstname", ...getTypeByORM("varchar") },
|
||||||
{ name: "lastname", ...getTypeByORM("varchar") },
|
{ name: "lastname", ...getTypeByORM("varchar") },
|
||||||
{ name: "secret", ...getTypeByORM("text") },
|
{ name: "secret", ...getTypeByORM("varchar") },
|
||||||
{ name: "routine", ...getTypeByORM("varchar"), default: getDefaultByORM("string", LoginRoutineEnum.totp) },
|
{ name: "static", ...getTypeByORM("boolean"), default: getDefaultByORM("boolean", false) },
|
||||||
{ name: "isOwner", ...getTypeByORM("boolean"), default: getDefaultByORM("boolean", false) },
|
{ name: "isOwner", ...getTypeByORM("boolean"), default: getDefaultByORM("boolean", false) },
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
@ -79,14 +73,6 @@ export const user_roles_table = new Table({
|
||||||
onUpdate: "RESTRICT",
|
onUpdate: "RESTRICT",
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
indices: [
|
|
||||||
new TableIndex({
|
|
||||||
columnNames: ["userId"],
|
|
||||||
}),
|
|
||||||
new TableIndex({
|
|
||||||
columnNames: ["roleId"],
|
|
||||||
}),
|
|
||||||
],
|
|
||||||
});
|
});
|
||||||
|
|
||||||
export const user_permission_table = new Table({
|
export const user_permission_table = new Table({
|
||||||
|
@ -128,19 +114,11 @@ export const webapi_table = new Table({
|
||||||
name: "webapi",
|
name: "webapi",
|
||||||
columns: [
|
columns: [
|
||||||
{ name: "id", ...getTypeByORM("int"), ...isIncrementPrimary },
|
{ name: "id", ...getTypeByORM("int"), ...isIncrementPrimary },
|
||||||
{ name: "token", ...getTypeByORM("text") },
|
{ name: "token", ...getTypeByORM("varchar"), isUnique: true },
|
||||||
{ name: "title", ...getTypeByORM("varchar") },
|
{ name: "title", ...getTypeByORM("varchar"), isUnique: true },
|
||||||
{ name: "createdAt", ...getTypeByORM("datetime", false, 6), default: getDefaultByORM("currentTimestamp", 6) },
|
{ name: "createdAt", ...getTypeByORM("datetime", false, 6), default: getDefaultByORM("currentTimestamp", 6) },
|
||||||
{ name: "lastUsage", ...getTypeByORM("datetime", true, 6) },
|
{ name: "lastUsage", ...getTypeByORM("datetime", true, 6), default: getDefaultByORM("null") },
|
||||||
{ name: "expiry", ...getTypeByORM("date", true) },
|
{ name: "expiry", ...getTypeByORM("date", true), default: getDefaultByORM("null") },
|
||||||
],
|
|
||||||
uniques: [
|
|
||||||
new TableUnique({
|
|
||||||
columnNames: ["token"],
|
|
||||||
}),
|
|
||||||
new TableUnique({
|
|
||||||
columnNames: ["title"],
|
|
||||||
}),
|
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { Table, TableForeignKey, TableUnique } from "typeorm";
|
import { Table, TableForeignKey } from "typeorm";
|
||||||
import { getDefaultByORM, getTypeByORM, isIncrementPrimary, isUUIDPrimary } from "../ormHelper";
|
import { getDefaultByORM, getTypeByORM, isIncrementPrimary, isUUIDPrimary } from "../ormHelper";
|
||||||
|
|
||||||
export const calendar_type_table = new Table({
|
export const calendar_type_table = new Table({
|
||||||
|
@ -32,7 +32,7 @@ export const calendar_table = new Table({
|
||||||
default: getDefaultByORM("currentTimestamp", 6),
|
default: getDefaultByORM("currentTimestamp", 6),
|
||||||
onUpdate: getDefaultByORM<string>("currentTimestamp", 6),
|
onUpdate: getDefaultByORM<string>("currentTimestamp", 6),
|
||||||
},
|
},
|
||||||
{ name: "webpageId", ...getTypeByORM("varchar", true) },
|
{ name: "webpageId", ...getTypeByORM("varchar", true), default: getDefaultByORM("null"), isUnique: true },
|
||||||
{ name: "typeId", ...getTypeByORM("int") },
|
{ name: "typeId", ...getTypeByORM("int") },
|
||||||
],
|
],
|
||||||
foreignKeys: [
|
foreignKeys: [
|
||||||
|
@ -44,9 +44,4 @@ export const calendar_table = new Table({
|
||||||
onUpdate: "RESTRICT",
|
onUpdate: "RESTRICT",
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
uniques: [
|
|
||||||
new TableUnique({
|
|
||||||
columnNames: ["webpageId"],
|
|
||||||
}),
|
|
||||||
],
|
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { Table, TableForeignKey, TableUnique } from "typeorm";
|
import { Table, TableForeignKey, TableUnique, Unique } from "typeorm";
|
||||||
import { getTypeByORM, isUUIDPrimary, getDefaultByORM } from "../ormHelper";
|
import { getTypeByORM, isUUIDPrimary, getDefaultByORM } from "../ormHelper";
|
||||||
|
|
||||||
export const inspection_plan_table = new Table({
|
export const inspection_plan_table = new Table({
|
||||||
|
@ -8,9 +8,9 @@ export const inspection_plan_table = new Table({
|
||||||
{ name: "title", ...getTypeByORM("varchar") },
|
{ name: "title", ...getTypeByORM("varchar") },
|
||||||
{ name: "inspectionInterval", ...getTypeByORM("varchar") },
|
{ name: "inspectionInterval", ...getTypeByORM("varchar") },
|
||||||
{ name: "remindTime", ...getTypeByORM("varchar") },
|
{ name: "remindTime", ...getTypeByORM("varchar") },
|
||||||
{ name: "createdAt", ...getTypeByORM("datetime"), default: getDefaultByORM("currentTimestamp") },
|
{ name: "createdAt", ...getTypeByORM("date"), default: getDefaultByORM("currentTimestamp") },
|
||||||
{ name: "equipmentTypeId", ...getTypeByORM("uuid", true) },
|
{ name: "equipmentTypeId", ...getTypeByORM("uuid", true), default: getDefaultByORM("null") },
|
||||||
{ name: "vehicleTypeId", ...getTypeByORM("uuid", true) },
|
{ name: "vehicleTypeId", ...getTypeByORM("uuid", true), default: getDefaultByORM("null") },
|
||||||
],
|
],
|
||||||
foreignKeys: [
|
foreignKeys: [
|
||||||
new TableForeignKey({
|
new TableForeignKey({
|
||||||
|
@ -35,7 +35,7 @@ export const inspection_versioned_plan_table = new Table({
|
||||||
columns: [
|
columns: [
|
||||||
{ name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
|
{ name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
|
||||||
{ name: "version", ...getTypeByORM("int"), default: getDefaultByORM("number", 0) },
|
{ name: "version", ...getTypeByORM("int"), default: getDefaultByORM("number", 0) },
|
||||||
{ name: "createdAt", ...getTypeByORM("datetime"), default: getDefaultByORM("currentTimestamp") },
|
{ name: "createdAt", ...getTypeByORM("date"), default: getDefaultByORM("currentTimestamp") },
|
||||||
{ name: "inspectionPlanId", ...getTypeByORM("uuid") },
|
{ name: "inspectionPlanId", ...getTypeByORM("uuid") },
|
||||||
],
|
],
|
||||||
foreignKeys: [
|
foreignKeys: [
|
||||||
|
@ -62,8 +62,8 @@ export const inspection_point_table = new Table({
|
||||||
{ name: "title", ...getTypeByORM("varchar") },
|
{ name: "title", ...getTypeByORM("varchar") },
|
||||||
{ name: "description", ...getTypeByORM("text") },
|
{ name: "description", ...getTypeByORM("text") },
|
||||||
{ name: "type", ...getTypeByORM("varchar") },
|
{ name: "type", ...getTypeByORM("varchar") },
|
||||||
{ name: "min", ...getTypeByORM("int", true) },
|
{ name: "min", ...getTypeByORM("int", true), default: getDefaultByORM("null") },
|
||||||
{ name: "max", ...getTypeByORM("int", true) },
|
{ name: "max", ...getTypeByORM("int", true), default: getDefaultByORM("null") },
|
||||||
{ name: "sort", ...getTypeByORM("int"), default: getDefaultByORM("number", 0) },
|
{ name: "sort", ...getTypeByORM("int"), default: getDefaultByORM("number", 0) },
|
||||||
{ name: "versionedPlanId", ...getTypeByORM("uuid") },
|
{ name: "versionedPlanId", ...getTypeByORM("uuid") },
|
||||||
],
|
],
|
||||||
|
@ -83,13 +83,13 @@ export const inspection_table = new Table({
|
||||||
columns: [
|
columns: [
|
||||||
{ name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
|
{ name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
|
||||||
{ name: "context", ...getTypeByORM("text") },
|
{ name: "context", ...getTypeByORM("text") },
|
||||||
{ name: "createdAt", ...getTypeByORM("datetime"), default: getDefaultByORM("currentTimestamp") },
|
{ name: "createdAt", ...getTypeByORM("date"), default: getDefaultByORM("currentTimestamp") },
|
||||||
{ name: "finishedAt", ...getTypeByORM("date", true) },
|
{ name: "finishedAt", ...getTypeByORM("date", true) },
|
||||||
{ name: "nextInspection", ...getTypeByORM("date", true) },
|
{ name: "nextInspection", ...getTypeByORM("date", true) },
|
||||||
{ name: "inspectionPlanId", ...getTypeByORM("uuid") },
|
{ name: "inspectionPlanId", ...getTypeByORM("uuid") },
|
||||||
{ name: "inspectionVersionedPlanId", ...getTypeByORM("uuid") },
|
{ name: "inspectionVersionedPlanId", ...getTypeByORM("uuid") },
|
||||||
{ name: "equipmentId", ...getTypeByORM("uuid", true) },
|
{ name: "equipmentId", ...getTypeByORM("uuid", true), default: getDefaultByORM("null") },
|
||||||
{ name: "vehicleId", ...getTypeByORM("uuid", true) },
|
{ name: "vehicleId", ...getTypeByORM("uuid", true), default: getDefaultByORM("null") },
|
||||||
],
|
],
|
||||||
foreignKeys: [
|
foreignKeys: [
|
||||||
new TableForeignKey({
|
new TableForeignKey({
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { Table, TableForeignKey, TableUnique, View } from "typeorm";
|
import { Table, TableForeignKey, View } from "typeorm";
|
||||||
import { getDefaultByORM, getTypeByORM, isIncrementPrimary, isUUIDPrimary } from "../ormHelper";
|
import { getDefaultByORM, getTypeByORM, isIncrementPrimary, isUUIDPrimary } from "../ormHelper";
|
||||||
|
|
||||||
export const salutation_table = new Table({
|
export const salutation_table = new Table({
|
||||||
|
@ -51,28 +51,17 @@ export const qualification_table = new Table({
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
export const education_table = new Table({
|
|
||||||
name: "education",
|
|
||||||
columns: [
|
|
||||||
{ name: "id", ...getTypeByORM("int"), ...isIncrementPrimary },
|
|
||||||
{ name: "education", ...getTypeByORM("varchar"), isUnique: true },
|
|
||||||
{ name: "description", ...getTypeByORM("varchar"), isNullable: true },
|
|
||||||
],
|
|
||||||
});
|
|
||||||
|
|
||||||
/** member and relations */
|
/** member and relations */
|
||||||
export const member_table = new Table({
|
export const member_table = new Table({
|
||||||
name: "member",
|
name: "member",
|
||||||
columns: [
|
columns: [
|
||||||
{ name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
|
{ name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
|
||||||
{ name: "salutationId", ...getTypeByORM("int") },
|
{ name: "salutationId", ...getTypeByORM("int") },
|
||||||
{ name: "internalId", ...getTypeByORM("varchar", true) },
|
{ name: "internalId", ...getTypeByORM("varchar", true), default: getDefaultByORM("null"), isUnique: true },
|
||||||
{ name: "firstname", ...getTypeByORM("varchar") },
|
{ name: "firstname", ...getTypeByORM("varchar") },
|
||||||
{ name: "lastname", ...getTypeByORM("varchar") },
|
{ name: "lastname", ...getTypeByORM("varchar") },
|
||||||
{ name: "nameaffix", ...getTypeByORM("varchar") },
|
{ name: "nameaffix", ...getTypeByORM("varchar") },
|
||||||
{ name: "birthdate", ...getTypeByORM("date") },
|
{ name: "birthdate", ...getTypeByORM("date") },
|
||||||
{ name: "createdAt", ...getTypeByORM("datetime", false, 6), default: getDefaultByORM("currentTimestamp", 6) },
|
|
||||||
{ name: "note", ...getTypeByORM("varchar", true) },
|
|
||||||
],
|
],
|
||||||
foreignKeys: [
|
foreignKeys: [
|
||||||
new TableForeignKey({
|
new TableForeignKey({
|
||||||
|
@ -83,11 +72,6 @@ export const member_table = new Table({
|
||||||
onUpdate: "RESTRICT",
|
onUpdate: "RESTRICT",
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
uniques: [
|
|
||||||
new TableUnique({
|
|
||||||
columnNames: ["internalId"],
|
|
||||||
}),
|
|
||||||
],
|
|
||||||
});
|
});
|
||||||
|
|
||||||
export const membership_table = new Table({
|
export const membership_table = new Table({
|
||||||
|
@ -179,7 +163,7 @@ export const member_awards_table = new Table({
|
||||||
name: "member_awards",
|
name: "member_awards",
|
||||||
columns: [
|
columns: [
|
||||||
{ name: "id", ...getTypeByORM("int"), ...isIncrementPrimary },
|
{ name: "id", ...getTypeByORM("int"), ...isIncrementPrimary },
|
||||||
{ name: "given", ...getTypeByORM("boolean"), default: getDefaultByORM("boolean", true) },
|
{ name: "given", ...getTypeByORM("boolean"), default: getDefaultByORM("boolean", false) },
|
||||||
{ name: "note", ...getTypeByORM("varchar"), isNullable: true },
|
{ name: "note", ...getTypeByORM("varchar"), isNullable: true },
|
||||||
{ name: "date", ...getTypeByORM("date") },
|
{ name: "date", ...getTypeByORM("date") },
|
||||||
{ name: "memberId", ...getTypeByORM("uuid") },
|
{ name: "memberId", ...getTypeByORM("uuid") },
|
||||||
|
@ -210,13 +194,13 @@ export const member_communication_table = new Table({
|
||||||
{ name: "preferred", ...getTypeByORM("boolean"), default: getDefaultByORM("boolean", false) },
|
{ name: "preferred", ...getTypeByORM("boolean"), default: getDefaultByORM("boolean", false) },
|
||||||
{ name: "isSendNewsletter", ...getTypeByORM("boolean"), default: getDefaultByORM("boolean", false) },
|
{ name: "isSendNewsletter", ...getTypeByORM("boolean"), default: getDefaultByORM("boolean", false) },
|
||||||
{ name: "isSMSAlarming", ...getTypeByORM("boolean"), default: getDefaultByORM("boolean", false) },
|
{ name: "isSMSAlarming", ...getTypeByORM("boolean"), default: getDefaultByORM("boolean", false) },
|
||||||
{ name: "mobile", ...getTypeByORM("varchar", true) },
|
{ name: "mobile", ...getTypeByORM("varchar"), isNullable: true },
|
||||||
{ name: "email", ...getTypeByORM("varchar", true) },
|
{ name: "email", ...getTypeByORM("varchar"), isNullable: true },
|
||||||
{ name: "postalCode", ...getTypeByORM("varchar", true) },
|
{ name: "postalCode", ...getTypeByORM("varchar"), default: getDefaultByORM("null"), isNullable: true },
|
||||||
{ name: "city", ...getTypeByORM("varchar", true) },
|
{ name: "city", ...getTypeByORM("varchar"), isNullable: true },
|
||||||
{ name: "street", ...getTypeByORM("varchar", true) },
|
{ name: "street", ...getTypeByORM("varchar"), isNullable: true },
|
||||||
{ name: "streetNumber", ...getTypeByORM("int", true) },
|
{ name: "streetNumber", ...getTypeByORM("int", true) },
|
||||||
{ name: "streetNumberAddition", ...getTypeByORM("varchar", true) },
|
{ name: "streetNumberAddition", ...getTypeByORM("varchar"), isNullable: true },
|
||||||
{ name: "memberId", ...getTypeByORM("uuid") },
|
{ name: "memberId", ...getTypeByORM("uuid") },
|
||||||
{ name: "typeId", ...getTypeByORM("int") },
|
{ name: "typeId", ...getTypeByORM("int") },
|
||||||
],
|
],
|
||||||
|
@ -238,60 +222,108 @@ export const member_communication_table = new Table({
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
export const member_educations_table = new Table({
|
/** views */
|
||||||
name: "member_educations",
|
export const member_view_mysql = new View({
|
||||||
columns: [
|
name: "member_view",
|
||||||
{ name: "id", ...getTypeByORM("int"), ...isIncrementPrimary },
|
expression: `
|
||||||
{ name: "start", ...getTypeByORM("date") },
|
SELECT
|
||||||
{ name: "end", ...getTypeByORM("date", true), default: getDefaultByORM("null") },
|
\`member\`.\`id\` AS \`id\`,
|
||||||
{ name: "note", ...getTypeByORM("varchar"), isNullable: true },
|
\`member\`.\`internalId\` AS \`internalId\`,
|
||||||
{ name: "place", ...getTypeByORM("varchar"), isNullable: true },
|
\`member\`.\`firstname\` AS \`firstname\`,
|
||||||
{ name: "memberId", ...getTypeByORM("uuid") },
|
\`member\`.\`lastname\` AS \`lastname\`,
|
||||||
{ name: "educationId", ...getTypeByORM("int") },
|
\`member\`.\`nameaffix\` AS \`nameaffix\`,
|
||||||
],
|
\`member\`.\`birthdate\` AS \`birthdate\`,
|
||||||
foreignKeys: [
|
\`salutation\`.\`salutation\` AS \`salutation\`,
|
||||||
new TableForeignKey({
|
TIMESTAMPDIFF(YEAR, \`member\`.\`birthdate\`, CURDATE()) AS \`todayAge\`,
|
||||||
columnNames: ["memberId"],
|
YEAR(CURDATE()) - YEAR(\`member\`.\`birthdate\`) AS \`ageThisYear\`,
|
||||||
referencedTableName: "member",
|
CONCAT(
|
||||||
referencedColumnNames: ["id"],
|
TIMESTAMPDIFF(YEAR, \`member\`.\`birthdate\`, CURDATE()), ' years ',
|
||||||
onDelete: "CASCADE",
|
TIMESTAMPDIFF(MONTH, \`member\`.\`birthdate\`, CURDATE()) % 12, ' months ',
|
||||||
onUpdate: "RESTRICT",
|
TIMESTAMPDIFF(DAY,
|
||||||
}),
|
DATE_ADD(
|
||||||
new TableForeignKey({
|
\`member\`.\`birthdate\`,
|
||||||
columnNames: ["educationId"],
|
INTERVAL TIMESTAMPDIFF(MONTH, \`member\`.\`birthdate\`, CURDATE()) MONTH
|
||||||
referencedTableName: "education",
|
),
|
||||||
referencedColumnNames: ["id"],
|
CURDATE()
|
||||||
onDelete: "RESTRICT",
|
), ' days'
|
||||||
onUpdate: "RESTRICT",
|
) AS \`exactAge\`
|
||||||
}),
|
FROM \`member\` \`member\`
|
||||||
],
|
LEFT JOIN \`salutation\` \`salutation\` ON \`salutation\`.\`id\`=\`member\`.\`salutationId\`
|
||||||
|
`,
|
||||||
});
|
});
|
||||||
|
|
||||||
/** views */
|
export const member_view_postgres = new View({
|
||||||
|
|
||||||
export const member_view = new View({
|
|
||||||
name: "member_view",
|
name: "member_view",
|
||||||
expression: `
|
expression: `
|
||||||
SELECT
|
SELECT
|
||||||
"member"."id" AS "id",
|
"member"."id" AS "id",
|
||||||
|
"member"."internalId" AS "internalId",
|
||||||
"member"."firstname" AS "firstname",
|
"member"."firstname" AS "firstname",
|
||||||
"member"."lastname" AS "lastname",
|
"member"."lastname" AS "lastname",
|
||||||
"member"."nameaffix" AS "nameaffix",
|
"member"."nameaffix" AS "nameaffix",
|
||||||
"member"."birthdate" AS "birthdate",
|
"member"."birthdate" AS "birthdate",
|
||||||
"member"."internalId" AS "internalId",
|
|
||||||
"member"."note" AS "note",
|
|
||||||
"salutation"."salutation" AS "salutation",
|
"salutation"."salutation" AS "salutation",
|
||||||
DATE_PART('year', AGE(CURRENT_DATE, "member"."birthdate")) AS "todayAge",
|
DATE_PART('year', AGE(CURRENT_DATE, member.birthdate)) AS "todayAge",
|
||||||
EXTRACT(YEAR FROM CURRENT_DATE) - EXTRACT(YEAR FROM "member"."birthdate") AS "ageThisYear",
|
EXTRACT(YEAR FROM CURRENT_DATE) - EXTRACT(YEAR FROM member.birthdate) AS "ageThisYear",
|
||||||
AGE(CURRENT_DATE, "member"."birthdate") AS "exactAge"
|
AGE(CURRENT_DATE, member.birthdate) AS "exactAge"
|
||||||
FROM "member" "member"
|
FROM "member" "member"
|
||||||
LEFT JOIN "salutation" "salutation" ON "salutation"."id"="member"."salutationId"
|
LEFT JOIN "salutation" "salutation" ON "salutation"."id"="member"."salutationId"
|
||||||
`
|
`,
|
||||||
.replace(/\s+/g, " ")
|
|
||||||
.trim(),
|
|
||||||
});
|
});
|
||||||
|
|
||||||
export const member_executive_positions_view = new View({
|
export const member_view_sqlite = new View({
|
||||||
|
name: "member_view",
|
||||||
|
expression: `
|
||||||
|
SELECT
|
||||||
|
member.id AS id,
|
||||||
|
member.internalId AS internalId,
|
||||||
|
member.firstname AS firstname,
|
||||||
|
member.lastname AS lastname,
|
||||||
|
member.nameaffix AS nameaffix,
|
||||||
|
member.birthdate AS birthdate,
|
||||||
|
salutation.salutation AS salutation,
|
||||||
|
(strftime('%Y', 'now') - strftime('%Y', member.birthdate) - (strftime('%m-%d', 'now') < strftime('%m-%d', member.birthdate))) AS todayAge,
|
||||||
|
FLOOR(strftime('%Y', 'now') - strftime('%Y', member.birthdate)) AS ageThisYear,
|
||||||
|
(strftime('%Y', 'now') - strftime('%Y', member.birthdate)) || ' years ' ||
|
||||||
|
(strftime('%m', 'now') - strftime('%m', member.birthdate)) || ' months ' ||
|
||||||
|
(strftime('%d', 'now') - strftime('%d', member.birthdate)) || ' days'
|
||||||
|
AS exactAge
|
||||||
|
FROM member member
|
||||||
|
LEFT JOIN salutation salutation ON salutation.id=member.salutationId
|
||||||
|
`,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const member_executive_positions_view_mysql = new View({
|
||||||
|
name: "member_executive_positions_view",
|
||||||
|
expression: `
|
||||||
|
SELECT
|
||||||
|
\`executivePosition\`.\`id\` AS \`positionId\`,
|
||||||
|
\`executivePosition\`.\`position\` AS \`position\`,
|
||||||
|
\`member\`.\`id\` AS \`memberId\`,
|
||||||
|
\`member\`.\`firstname\` AS \`memberFirstname\`,
|
||||||
|
\`member\`.\`lastname\` AS \`memberLastname\`,
|
||||||
|
\`member\`.\`nameaffix\` AS \`memberNameaffix\`,
|
||||||
|
\`member\`.\`birthdate\` AS \`memberBirthdate\`,
|
||||||
|
\`salutation\`.\`salutation\` AS \`memberSalutation\`,
|
||||||
|
SUM(DATEDIFF(COALESCE(\`memberExecutivePositions\`.\`end\`, CURDATE()), \`memberExecutivePositions\`.\`start\`)) AS \`durationInDays\`,
|
||||||
|
SUM(TIMESTAMPDIFF(YEAR, \`memberExecutivePositions\`.\`start\`, COALESCE(\`memberExecutivePositions\`.\`end\`, CURDATE()))) AS \`durationInYears\`,
|
||||||
|
CONCAT(
|
||||||
|
SUM(FLOOR(TIMESTAMPDIFF(DAY, \`memberExecutivePositions\`.\`start\`, COALESCE(\`memberExecutivePositions\`.\`end\`, CURDATE())) / 365.25)),
|
||||||
|
' years ',
|
||||||
|
SUM(FLOOR(MOD(TIMESTAMPDIFF(MONTH, \`memberExecutivePositions\`.\`start\`, COALESCE(\`memberExecutivePositions\`.\`end\`, CURDATE())), 12))),
|
||||||
|
' months ',
|
||||||
|
SUM(FLOOR(MOD(TIMESTAMPDIFF(DAY, \`memberExecutivePositions\`.\`start\`, COALESCE(\`memberExecutivePositions\`.\`end\`, CURDATE())), 30))),
|
||||||
|
' days'
|
||||||
|
) AS \`exactDuration\`
|
||||||
|
FROM \`member_executive_positions\` \`memberExecutivePositions\`
|
||||||
|
LEFT JOIN \`executive_position\` \`executivePosition\` ON \`executivePosition\`.\`id\`=\`memberExecutivePositions\`.\`executivePositionId\`
|
||||||
|
LEFT JOIN \`member\` \`member\` ON \`member\`.\`id\`=\`memberExecutivePositions\`.\`memberId\`
|
||||||
|
LEFT JOIN \`salutation\` \`salutation\` ON \`salutation\`.\`id\`=\`member\`.\`salutationId\`
|
||||||
|
GROUP BY \`executivePosition\`.\`id\`, \`member\`.\`id\`, \`salutation\`.\`id\`
|
||||||
|
`,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const member_executive_positions_view_postgres = new View({
|
||||||
name: "member_executive_positions_view",
|
name: "member_executive_positions_view",
|
||||||
expression: `
|
expression: `
|
||||||
SELECT
|
SELECT
|
||||||
|
@ -311,12 +343,66 @@ export const member_executive_positions_view = new View({
|
||||||
LEFT JOIN "member" "member" ON "member"."id"="memberExecutivePositions"."memberId"
|
LEFT JOIN "member" "member" ON "member"."id"="memberExecutivePositions"."memberId"
|
||||||
LEFT JOIN "salutation" "salutation" ON "salutation"."id"="member"."salutationId"
|
LEFT JOIN "salutation" "salutation" ON "salutation"."id"="member"."salutationId"
|
||||||
GROUP BY "executivePosition"."id", "member"."id", "salutation"."id"
|
GROUP BY "executivePosition"."id", "member"."id", "salutation"."id"
|
||||||
`
|
`,
|
||||||
.replace(/\s+/g, " ")
|
|
||||||
.trim(),
|
|
||||||
});
|
});
|
||||||
|
|
||||||
export const member_qualifications_view = new View({
|
export const member_executive_positions_view_sqlite = new View({
|
||||||
|
name: "member_executive_positions_view",
|
||||||
|
expression: `
|
||||||
|
SELECT
|
||||||
|
executivePosition.id AS positionId,
|
||||||
|
executivePosition.position AS position,
|
||||||
|
member.id AS memberId,
|
||||||
|
member.firstname AS memberFirstname,
|
||||||
|
member.lastname AS memberLastname,
|
||||||
|
member.nameaffix AS memberNameaffix,
|
||||||
|
member.birthdate AS memberBirthdate,
|
||||||
|
salutation.salutation AS memberSalutation,
|
||||||
|
SUM(JULIANDAY(COALESCE(memberExecutivePositions.end, DATE('now'))) - JULIANDAY(memberExecutivePositions.start)) AS durationInDays,
|
||||||
|
SUM(FLOOR((JULIANDAY(COALESCE(memberExecutivePositions.end, DATE('now'))) - JULIANDAY(memberExecutivePositions.start)) / 365.25)) AS durationInYears,
|
||||||
|
SUM((strftime('%Y', COALESCE(memberExecutivePositions.end, DATE('now'))) - strftime('%Y', memberExecutivePositions.start))) || ' years ' ||
|
||||||
|
SUM((strftime('%m', COALESCE(memberExecutivePositions.end, DATE('now'))) - strftime('%m', memberExecutivePositions.start))) || ' months ' ||
|
||||||
|
SUM((strftime('%d', COALESCE(memberExecutivePositions.end, DATE('now'))) - strftime('%d', memberExecutivePositions.start))) || ' days'
|
||||||
|
AS exactDuration
|
||||||
|
FROM member_executive_positions memberExecutivePositions
|
||||||
|
LEFT JOIN executive_position executivePosition ON executivePosition.id=memberExecutivePositions.executivePositionId
|
||||||
|
LEFT JOIN member member ON member.id=memberExecutivePositions.memberId
|
||||||
|
LEFT JOIN salutation salutation ON salutation.id=member.salutationId
|
||||||
|
GROUP BY executivePosition.id, member.id, salutation.id
|
||||||
|
`,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const member_qualifications_view_mysql = new View({
|
||||||
|
name: "member_qualifications_view",
|
||||||
|
expression: `
|
||||||
|
SELECT
|
||||||
|
\`qualification\`.\`id\` AS \`qualificationId\`,
|
||||||
|
\`qualification\`.\`qualification\` AS \`qualification\`,
|
||||||
|
\`member\`.\`id\` AS \`memberId\`,
|
||||||
|
\`member\`.\`firstname\` AS \`memberFirstname\`,
|
||||||
|
\`member\`.\`lastname\` AS \`memberLastname\`,
|
||||||
|
\`member\`.\`nameaffix\` AS \`memberNameaffix\`,
|
||||||
|
\`member\`.\`birthdate\` AS \`memberBirthdate\`,
|
||||||
|
\`salutation\`.\`salutation\` AS \`memberSalutation\`,
|
||||||
|
SUM(DATEDIFF(COALESCE(\`memberQualifications\`.\`end\`, CURDATE()), \`memberQualifications\`.\`start\`)) AS \`durationInDays\`,
|
||||||
|
SUM(TIMESTAMPDIFF(YEAR, \`memberQualifications\`.\`start\`, COALESCE(\`memberQualifications\`.\`end\`, CURDATE()))) AS \`durationInYears\`,
|
||||||
|
CONCAT(
|
||||||
|
SUM(FLOOR(TIMESTAMPDIFF(DAY, \`memberQualifications\`.\`start\`, COALESCE(\`memberQualifications\`.\`end\`, CURDATE())) / 365.25)),
|
||||||
|
' years ',
|
||||||
|
SUM(FLOOR(MOD(TIMESTAMPDIFF(MONTH, \`memberQualifications\`.\`start\`, COALESCE(\`memberQualifications\`.\`end\`, CURDATE())), 12))),
|
||||||
|
' months ',
|
||||||
|
SUM(FLOOR(MOD(TIMESTAMPDIFF(DAY, \`memberQualifications\`.\`start\`, COALESCE(\`memberQualifications\`.\`end\`, CURDATE())), 30))),
|
||||||
|
' days'
|
||||||
|
) AS \`exactDuration\`
|
||||||
|
FROM \`member_qualifications\` \`memberQualifications\`
|
||||||
|
LEFT JOIN \`qualification\` \`qualification\` ON \`qualification\`.\`id\`=\`memberQualifications\`.\`qualificationId\`
|
||||||
|
LEFT JOIN \`member\` \`member\` ON \`member\`.\`id\`=\`memberQualifications\`.\`memberId\`
|
||||||
|
LEFT JOIN \`salutation\` \`salutation\` ON \`salutation\`.\`id\`=\`member\`.\`salutationId\`
|
||||||
|
GROUP BY \`qualification\`.\`id\`, \`member\`.\`id\`, \`salutation\`.\`id\`
|
||||||
|
`,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const member_qualifications_view_postgres = new View({
|
||||||
name: "member_qualifications_view",
|
name: "member_qualifications_view",
|
||||||
expression: `
|
expression: `
|
||||||
SELECT
|
SELECT
|
||||||
|
@ -336,12 +422,66 @@ export const member_qualifications_view = new View({
|
||||||
LEFT JOIN "member" "member" ON "member"."id"="memberQualifications"."memberId"
|
LEFT JOIN "member" "member" ON "member"."id"="memberQualifications"."memberId"
|
||||||
LEFT JOIN "salutation" "salutation" ON "salutation"."id"="member"."salutationId"
|
LEFT JOIN "salutation" "salutation" ON "salutation"."id"="member"."salutationId"
|
||||||
GROUP BY "qualification"."id", "member"."id", "salutation"."id"
|
GROUP BY "qualification"."id", "member"."id", "salutation"."id"
|
||||||
`
|
`,
|
||||||
.replace(/\s+/g, " ")
|
|
||||||
.trim(),
|
|
||||||
});
|
});
|
||||||
|
|
||||||
export const membership_view = new View({
|
export const member_qualifications_view_sqlite = new View({
|
||||||
|
name: "member_qualifications_view",
|
||||||
|
expression: `
|
||||||
|
SELECT
|
||||||
|
qualification.id AS qualificationId,
|
||||||
|
qualification.qualification AS qualification,
|
||||||
|
member.id AS memberId,
|
||||||
|
member.firstname AS memberFirstname,
|
||||||
|
member.lastname AS memberLastname,
|
||||||
|
member.nameaffix AS memberNameaffix,
|
||||||
|
member.birthdate AS memberBirthdate,
|
||||||
|
salutation.salutation AS memberSalutation,
|
||||||
|
SUM(JULIANDAY(COALESCE(memberQualifications.end, DATE('now'))) - JULIANDAY(memberQualifications.start)) AS durationInDays,
|
||||||
|
SUM(FLOOR((JULIANDAY(COALESCE(memberQualifications.end, DATE('now'))) - JULIANDAY(memberQualifications.start)) / 365.25)) AS durationInYears,
|
||||||
|
SUM((strftime('%Y', COALESCE(memberQualifications.end, DATE('now'))) - strftime('%Y', memberQualifications.start))) || ' years ' ||
|
||||||
|
SUM((strftime('%m', COALESCE(memberQualifications.end, DATE('now'))) - strftime('%m', memberQualifications.start))) || ' months ' ||
|
||||||
|
SUM((strftime('%d', COALESCE(memberQualifications.end, DATE('now'))) - strftime('%d', memberQualifications.start))) || ' days'
|
||||||
|
AS exactDuration
|
||||||
|
FROM member_qualifications memberQualifications
|
||||||
|
LEFT JOIN qualification qualification ON qualification.id=memberQualifications.qualificationId
|
||||||
|
LEFT JOIN member member ON member.id=memberQualifications.memberId
|
||||||
|
LEFT JOIN salutation salutation ON salutation.id=member.salutationId
|
||||||
|
GROUP BY qualification.id, member.id, salutation.id
|
||||||
|
`,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const membership_view_mysql = new View({
|
||||||
|
name: "membership_view",
|
||||||
|
expression: `
|
||||||
|
SELECT
|
||||||
|
\`status\`.\`id\` AS \`statusId\`,
|
||||||
|
\`status\`.\`status\` AS \`status\`,
|
||||||
|
\`member\`.\`id\` AS \`memberId\`,
|
||||||
|
\`member\`.\`firstname\` AS \`memberFirstname\`,
|
||||||
|
\`member\`.\`lastname\` AS \`memberLastname\`,
|
||||||
|
\`member\`.\`nameaffix\` AS \`memberNameaffix\`,
|
||||||
|
\`member\`.\`birthdate\` AS \`memberBirthdate\`,
|
||||||
|
\`salutation\`.\`salutation\` AS \`memberSalutation\`,
|
||||||
|
SUM(DATEDIFF(COALESCE(\`membership\`.\`end\`, CURDATE()), \`membership\`.\`start\`)) AS \`durationInDays\`,
|
||||||
|
SUM(TIMESTAMPDIFF(YEAR, \`membership\`.\`start\`, COALESCE(\`membership\`.\`end\`, CURDATE()))) AS \`durationInYears\`,
|
||||||
|
CONCAT(
|
||||||
|
SUM(FLOOR(TIMESTAMPDIFF(DAY, \`membership\`.\`start\`, COALESCE(\`membership\`.\`end\`, CURDATE())) / 365.25)),
|
||||||
|
' years ',
|
||||||
|
SUM(FLOOR(MOD(TIMESTAMPDIFF(MONTH, \`membership\`.\`start\`, COALESCE(\`membership\`.\`end\`, CURDATE())), 12))),
|
||||||
|
' months ',
|
||||||
|
SUM(FLOOR(MOD(TIMESTAMPDIFF(DAY, \`membership\`.\`start\`, COALESCE(\`membership\`.\`end\`, CURDATE())), 30))),
|
||||||
|
' days'
|
||||||
|
) AS \`exactDuration\`
|
||||||
|
FROM \`membership\` \`membership\`
|
||||||
|
LEFT JOIN \`membership_status\` \`status\` ON \`status\`.\`id\`=\`membership\`.\`statusId\`
|
||||||
|
LEFT JOIN \`member\` \`member\` ON \`member\`.\`id\`=\`membership\`.\`memberId\`
|
||||||
|
LEFT JOIN \`salutation\` \`salutation\` ON \`salutation\`.\`id\`=\`member\`.\`salutationId\`
|
||||||
|
GROUP BY \`status\`.\`id\`, \`member\`.\`id\`, \`salutation\`.\`id\`
|
||||||
|
`,
|
||||||
|
});
|
||||||
|
|
||||||
|
export const membership_view_postgres = new View({
|
||||||
name: "membership_view",
|
name: "membership_view",
|
||||||
expression: `
|
expression: `
|
||||||
SELECT
|
SELECT
|
||||||
|
@ -360,31 +500,32 @@ export const membership_view = new View({
|
||||||
LEFT JOIN "membership_status" "status" ON "status"."id"="membership"."statusId"
|
LEFT JOIN "membership_status" "status" ON "status"."id"="membership"."statusId"
|
||||||
LEFT JOIN "member" "member" ON "member"."id"="membership"."memberId"
|
LEFT JOIN "member" "member" ON "member"."id"="membership"."memberId"
|
||||||
LEFT JOIN "salutation" "salutation" ON "salutation"."id"="member"."salutationId"
|
LEFT JOIN "salutation" "salutation" ON "salutation"."id"="member"."salutationId"
|
||||||
GROUP BY "status"."id", "member"."id", "salutation"."id"
|
GROUP BY "status"."id","member"."id", "salutation"."id"
|
||||||
`
|
`,
|
||||||
.replace(/\s+/g, " ")
|
|
||||||
.trim(),
|
|
||||||
});
|
});
|
||||||
|
|
||||||
export const membership_total_view = new View({
|
export const membership_view_sqlite = new View({
|
||||||
name: "membership_total_view",
|
name: "membership_view",
|
||||||
expression: `
|
expression: `
|
||||||
SELECT
|
SELECT
|
||||||
"member"."id" AS "memberId",
|
status.id AS statusId,
|
||||||
"member"."firstname" AS "memberFirstname",
|
status.status AS status,
|
||||||
"member"."lastname" AS "memberLastname",
|
member.id AS memberId,
|
||||||
"member"."nameaffix" AS "memberNameaffix",
|
member.firstname AS memberFirstname,
|
||||||
"member"."birthdate" AS "memberBirthdate",
|
member.lastname AS memberLastname,
|
||||||
"salutation"."salutation" AS "memberSalutation",
|
member.nameaffix AS memberNameaffix,
|
||||||
SUM(COALESCE("membership"."end", CURRENT_DATE) - "membership"."start") AS "durationInDays",
|
member.birthdate AS memberBirthdate,
|
||||||
SUM(EXTRACT(YEAR FROM AGE(COALESCE("membership"."end", CURRENT_DATE), "membership"."start"))) AS "durationInYears",
|
salutation.salutation AS memberSalutation,
|
||||||
SUM(AGE(COALESCE("membership"."end", CURRENT_DATE), "membership"."start")) AS "exactDuration"
|
SUM(JULIANDAY(COALESCE(membership.end, DATE('now'))) - JULIANDAY(membership.start)) AS durationInDays,
|
||||||
FROM "membership" "membership"
|
SUM(FLOOR((JULIANDAY(COALESCE(membership.end, DATE('now'))) - JULIANDAY(membership.start)) / 365.25)) AS durationInYears,
|
||||||
LEFT JOIN "membership_status" "status" ON "status"."id"="membership"."statusId"
|
SUM((strftime('%Y', COALESCE(membership.end, DATE('now'))) - strftime('%Y', membership.start))) || ' years ' ||
|
||||||
LEFT JOIN "member" "member" ON "member"."id"="membership"."memberId"
|
SUM((strftime('%m', COALESCE(membership.end, DATE('now'))) - strftime('%m', membership.start))) || ' months ' ||
|
||||||
LEFT JOIN "salutation" "salutation" ON "salutation"."id"="member"."salutationId"
|
SUM((strftime('%d', COALESCE(membership.end, DATE('now'))) - strftime('%d', membership.start))) || ' days'
|
||||||
GROUP BY "member"."id", "salutation"."id"
|
AS exactDuration
|
||||||
`
|
FROM membership membership
|
||||||
.replace(/\s+/g, " ")
|
LEFT JOIN membership_status status ON status.id=membership.statusId
|
||||||
.trim(),
|
LEFT JOIN member member ON member.id=membership.memberId
|
||||||
|
LEFT JOIN salutation salutation ON salutation.id=member.salutationId
|
||||||
|
GROUP BY status.id, member.id, salutation.id
|
||||||
|
`,
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { Table, TableForeignKey, TableUnique } from "typeorm";
|
import { Table, TableForeignKey } from "typeorm";
|
||||||
import { getDefaultByORM, getTypeByORM, isIncrementPrimary } from "../ormHelper";
|
import { getDefaultByORM, getTypeByORM, isIncrementPrimary } from "../ormHelper";
|
||||||
|
|
||||||
export const newsletter_table = new Table({
|
export const newsletter_table = new Table({
|
||||||
|
@ -7,12 +7,11 @@ export const newsletter_table = new Table({
|
||||||
{ name: "id", ...getTypeByORM("int"), ...isIncrementPrimary },
|
{ name: "id", ...getTypeByORM("int"), ...isIncrementPrimary },
|
||||||
{ name: "title", ...getTypeByORM("varchar") },
|
{ name: "title", ...getTypeByORM("varchar") },
|
||||||
{ name: "description", ...getTypeByORM("varchar"), default: getDefaultByORM("string") },
|
{ name: "description", ...getTypeByORM("varchar"), default: getDefaultByORM("string") },
|
||||||
{ name: "newsletterTitle", ...getTypeByORM("text"), default: getDefaultByORM("string") },
|
{ name: "newsletterTitle", ...getTypeByORM("varchar"), default: getDefaultByORM("string") },
|
||||||
{ name: "newsletterText", ...getTypeByORM("text"), default: getDefaultByORM("string") },
|
{ name: "newsletterText", ...getTypeByORM("text"), default: getDefaultByORM("string") },
|
||||||
{ name: "newsletterSignatur", ...getTypeByORM("text"), default: getDefaultByORM("string") },
|
{ name: "newsletterSignatur", ...getTypeByORM("varchar"), default: getDefaultByORM("string") },
|
||||||
{ name: "isSent", ...getTypeByORM("boolean"), default: getDefaultByORM("boolean", false) },
|
{ name: "isSent", ...getTypeByORM("boolean"), default: getDefaultByORM("boolean", false) },
|
||||||
{ name: "recipientsByQueryId", ...getTypeByORM("uuid", true) },
|
{ name: "recipientsByQueryId", ...getTypeByORM("int", true) },
|
||||||
{ name: "createdAt", ...getTypeByORM("datetime", false, 6), default: getDefaultByORM("currentTimestamp", 6) },
|
|
||||||
],
|
],
|
||||||
foreignKeys: [
|
foreignKeys: [
|
||||||
new TableForeignKey({
|
new TableForeignKey({
|
||||||
|
@ -23,11 +22,6 @@ export const newsletter_table = new Table({
|
||||||
onUpdate: "RESTRICT",
|
onUpdate: "RESTRICT",
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
uniques: [
|
|
||||||
new TableUnique({
|
|
||||||
columnNames: ["title"],
|
|
||||||
}),
|
|
||||||
],
|
|
||||||
});
|
});
|
||||||
|
|
||||||
export const newsletter_dates_table = new Table({
|
export const newsletter_dates_table = new Table({
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
import { Table, TableForeignKey, TableUnique } from "typeorm";
|
import { Table, TableForeignKey } from "typeorm";
|
||||||
import { getDefaultByORM, getTypeByORM, isIncrementPrimary } from "../ormHelper";
|
import { getDefaultByORM, getTypeByORM, isIncrementPrimary } from "../ormHelper";
|
||||||
|
|
||||||
export const protocol_table = new Table({
|
export const protocol_table = new Table({
|
||||||
name: "protocol",
|
name: "protocol",
|
||||||
columns: [
|
columns: [
|
||||||
{ name: "id", ...getTypeByORM("int"), ...isIncrementPrimary },
|
{ name: "id", ...getTypeByORM("int"), ...isIncrementPrimary },
|
||||||
{ name: "title", ...getTypeByORM("varchar"), isUnique: true },
|
{ name: "title", ...getTypeByORM("varchar") },
|
||||||
{ name: "date", ...getTypeByORM("date") },
|
{ name: "date", ...getTypeByORM("date") },
|
||||||
{ name: "starttime", ...getTypeByORM("time", true) },
|
{ name: "starttime", ...getTypeByORM("time", true) },
|
||||||
{ name: "endtime", ...getTypeByORM("time", true) },
|
{ name: "endtime", ...getTypeByORM("time", true) },
|
||||||
|
@ -19,7 +19,6 @@ export const protocol_agenda_table = new Table({
|
||||||
{ name: "id", ...getTypeByORM("int"), ...isIncrementPrimary },
|
{ name: "id", ...getTypeByORM("int"), ...isIncrementPrimary },
|
||||||
{ name: "topic", ...getTypeByORM("varchar") },
|
{ name: "topic", ...getTypeByORM("varchar") },
|
||||||
{ name: "context", ...getTypeByORM("text"), default: getDefaultByORM("string") },
|
{ name: "context", ...getTypeByORM("text"), default: getDefaultByORM("string") },
|
||||||
{ name: "sort", ...getTypeByORM("int"), default: getDefaultByORM("number", 0) },
|
|
||||||
{ name: "protocolId", ...getTypeByORM("int") },
|
{ name: "protocolId", ...getTypeByORM("int") },
|
||||||
],
|
],
|
||||||
foreignKeys: [
|
foreignKeys: [
|
||||||
|
@ -39,7 +38,6 @@ export const protocol_decision_table = new Table({
|
||||||
{ name: "id", ...getTypeByORM("int"), ...isIncrementPrimary },
|
{ name: "id", ...getTypeByORM("int"), ...isIncrementPrimary },
|
||||||
{ name: "topic", ...getTypeByORM("varchar") },
|
{ name: "topic", ...getTypeByORM("varchar") },
|
||||||
{ name: "context", ...getTypeByORM("text"), default: getDefaultByORM("string") },
|
{ name: "context", ...getTypeByORM("text"), default: getDefaultByORM("string") },
|
||||||
{ name: "sort", ...getTypeByORM("int"), default: getDefaultByORM("number", 0) },
|
|
||||||
{ name: "protocolId", ...getTypeByORM("int") },
|
{ name: "protocolId", ...getTypeByORM("int") },
|
||||||
],
|
],
|
||||||
foreignKeys: [
|
foreignKeys: [
|
||||||
|
@ -88,7 +86,6 @@ export const protocol_voting_table = new Table({
|
||||||
{ name: "favour", ...getTypeByORM("int"), default: getDefaultByORM("number", 0) },
|
{ name: "favour", ...getTypeByORM("int"), default: getDefaultByORM("number", 0) },
|
||||||
{ name: "abstain", ...getTypeByORM("int"), default: getDefaultByORM("number", 0) },
|
{ name: "abstain", ...getTypeByORM("int"), default: getDefaultByORM("number", 0) },
|
||||||
{ name: "against", ...getTypeByORM("int"), default: getDefaultByORM("number", 0) },
|
{ name: "against", ...getTypeByORM("int"), default: getDefaultByORM("number", 0) },
|
||||||
{ name: "sort", ...getTypeByORM("int"), default: getDefaultByORM("number", 0) },
|
|
||||||
{ name: "protocolId", ...getTypeByORM("int") },
|
{ name: "protocolId", ...getTypeByORM("int") },
|
||||||
],
|
],
|
||||||
foreignKeys: [
|
foreignKeys: [
|
||||||
|
|
|
@ -1,18 +1,12 @@
|
||||||
import { Table, TableForeignKey } from "typeorm";
|
import { Table, TableForeignKey } from "typeorm";
|
||||||
import { getDefaultByORM, getTypeByORM, isIncrementPrimary, isUUIDPrimary } from "../ormHelper";
|
import { getDefaultByORM, getTypeByORM, isIncrementPrimary } from "../ormHelper";
|
||||||
|
|
||||||
export const query_table = new Table({
|
export const query_table = new Table({
|
||||||
name: "query",
|
name: "query",
|
||||||
columns: [
|
columns: [
|
||||||
{ name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
|
{ name: "id", ...getTypeByORM("int"), ...isIncrementPrimary },
|
||||||
{ name: "title", ...getTypeByORM("varchar"), isUnique: true },
|
{ name: "title", ...getTypeByORM("varchar"), isUnique: true },
|
||||||
{ name: "query", ...getTypeByORM("text"), default: getDefaultByORM("string") },
|
{ name: "query", ...getTypeByORM("text"), default: getDefaultByORM("string") },
|
||||||
{
|
|
||||||
name: "updatedAt",
|
|
||||||
...getTypeByORM("datetime", false, 6),
|
|
||||||
default: getDefaultByORM("currentTimestamp", 6),
|
|
||||||
onUpdate: getDefaultByORM<string>("currentTimestamp", 6),
|
|
||||||
},
|
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -5,11 +5,11 @@ export const equipment_table = new Table({
|
||||||
name: "equipment",
|
name: "equipment",
|
||||||
columns: [
|
columns: [
|
||||||
{ name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
|
{ name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
|
||||||
{ name: "code", ...getTypeByORM("varchar", true), isUnique: true },
|
{ name: "code", ...getTypeByORM("varchar", true), default: getDefaultByORM("null"), isUnique: true },
|
||||||
{ name: "name", ...getTypeByORM("varchar") },
|
{ name: "name", ...getTypeByORM("varchar") },
|
||||||
{ name: "location", ...getTypeByORM("varchar") },
|
{ name: "location", ...getTypeByORM("varchar") },
|
||||||
{ name: "commissioned", ...getTypeByORM("date") },
|
{ name: "commissioned", ...getTypeByORM("date") },
|
||||||
{ name: "decommissioned", ...getTypeByORM("date", true) },
|
{ name: "decommissioned", ...getTypeByORM("date", true), default: getDefaultByORM("null") },
|
||||||
{ name: "equipmentTypeId", ...getTypeByORM("uuid") },
|
{ name: "equipmentTypeId", ...getTypeByORM("uuid") },
|
||||||
],
|
],
|
||||||
foreignKeys: [
|
foreignKeys: [
|
||||||
|
@ -28,7 +28,7 @@ export const equipment_type_table = new Table({
|
||||||
columns: [
|
columns: [
|
||||||
{ name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
|
{ name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
|
||||||
{ name: "type", ...getTypeByORM("varchar"), isUnique: true },
|
{ name: "type", ...getTypeByORM("varchar"), isUnique: true },
|
||||||
{ name: "description", ...getTypeByORM("text", true) },
|
{ name: "description", ...getTypeByORM("text") },
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -36,11 +36,11 @@ export const vehicle_table = new Table({
|
||||||
name: "vehicle",
|
name: "vehicle",
|
||||||
columns: [
|
columns: [
|
||||||
{ name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
|
{ name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
|
||||||
{ name: "code", ...getTypeByORM("varchar", true), isUnique: true },
|
{ name: "code", ...getTypeByORM("varchar", true), default: getDefaultByORM("null"), isUnique: true },
|
||||||
{ name: "name", ...getTypeByORM("varchar") },
|
{ name: "name", ...getTypeByORM("varchar") },
|
||||||
{ name: "location", ...getTypeByORM("varchar") },
|
{ name: "location", ...getTypeByORM("varchar") },
|
||||||
{ name: "commissioned", ...getTypeByORM("date") },
|
{ name: "commissioned", ...getTypeByORM("date") },
|
||||||
{ name: "decommissioned", ...getTypeByORM("date", true) },
|
{ name: "decommissioned", ...getTypeByORM("date", true), default: getDefaultByORM("null") },
|
||||||
{ name: "vehicleTypeId", ...getTypeByORM("uuid") },
|
{ name: "vehicleTypeId", ...getTypeByORM("uuid") },
|
||||||
],
|
],
|
||||||
foreignKeys: [
|
foreignKeys: [
|
||||||
|
@ -59,7 +59,7 @@ export const vehicle_type_table = new Table({
|
||||||
columns: [
|
columns: [
|
||||||
{ name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
|
{ name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
|
||||||
{ name: "type", ...getTypeByORM("varchar"), isUnique: true },
|
{ name: "type", ...getTypeByORM("varchar"), isUnique: true },
|
||||||
{ name: "description", ...getTypeByORM("text", true) },
|
{ name: "description", ...getTypeByORM("text") },
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -67,13 +67,13 @@ export const wearable_table = new Table({
|
||||||
name: "wearable",
|
name: "wearable",
|
||||||
columns: [
|
columns: [
|
||||||
{ name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
|
{ name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
|
||||||
{ name: "code", ...getTypeByORM("varchar", true), isUnique: true },
|
{ name: "code", ...getTypeByORM("varchar", true), default: getDefaultByORM("null"), isUnique: true },
|
||||||
{ name: "name", ...getTypeByORM("varchar") },
|
{ name: "name", ...getTypeByORM("varchar") },
|
||||||
{ name: "location", ...getTypeByORM("varchar") },
|
{ name: "location", ...getTypeByORM("varchar") },
|
||||||
{ name: "commissioned", ...getTypeByORM("date") },
|
{ name: "commissioned", ...getTypeByORM("date") },
|
||||||
{ name: "decommissioned", ...getTypeByORM("date", true) },
|
{ name: "decommissioned", ...getTypeByORM("date", true), default: getDefaultByORM("null") },
|
||||||
{ name: "wearableTypeId", ...getTypeByORM("uuid") },
|
{ name: "wearableTypeId", ...getTypeByORM("uuid") },
|
||||||
{ name: "wearerId", ...getTypeByORM("uuid", true) },
|
{ name: "wearerId", ...getTypeByORM("uuid", true), default: getDefaultByORM("null") },
|
||||||
],
|
],
|
||||||
foreignKeys: [
|
foreignKeys: [
|
||||||
new TableForeignKey({
|
new TableForeignKey({
|
||||||
|
@ -98,6 +98,6 @@ export const wearable_type_table = new Table({
|
||||||
columns: [
|
columns: [
|
||||||
{ name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
|
{ name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
|
||||||
{ name: "type", ...getTypeByORM("varchar"), isUnique: true },
|
{ name: "type", ...getTypeByORM("varchar"), isUnique: true },
|
||||||
{ name: "description", ...getTypeByORM("text", true) },
|
{ name: "description", ...getTypeByORM("text") },
|
||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|
|
@ -5,16 +5,16 @@ export const damage_report_table = new Table({
|
||||||
name: "damage_report",
|
name: "damage_report",
|
||||||
columns: [
|
columns: [
|
||||||
{ name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
|
{ name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
|
||||||
{ name: "reportedAt", ...getTypeByORM("datetime"), default: getDefaultByORM("currentTimestamp") },
|
{ name: "reportedAt", ...getTypeByORM("date"), default: getDefaultByORM("currentTimestamp") },
|
||||||
{ name: "status", ...getTypeByORM("varchar") },
|
{ name: "status", ...getTypeByORM("varchar") },
|
||||||
{ name: "done", ...getTypeByORM("boolean"), default: getDefaultByORM("boolean", false) },
|
{ name: "done", ...getTypeByORM("boolean"), default: getDefaultByORM("boolean", false) },
|
||||||
{ name: "description", ...getTypeByORM("text") },
|
{ name: "description", ...getTypeByORM("text") },
|
||||||
{ name: "reportedBy", ...getTypeByORM("varchar") },
|
{ name: "reportedBy", ...getTypeByORM("varchar") },
|
||||||
{ name: "imageCount", ...getTypeByORM("int"), default: getDefaultByORM("number", 0) },
|
{ name: "imageCount", ...getTypeByORM("int"), default: getDefaultByORM("number", 0) },
|
||||||
{ name: "equipmentId", ...getTypeByORM("uuid", true) },
|
{ name: "equipmentId", ...getTypeByORM("uuid", true), default: getDefaultByORM("null") },
|
||||||
{ name: "vehicleId", ...getTypeByORM("uuid", true) },
|
{ name: "vehicleId", ...getTypeByORM("uuid", true), default: getDefaultByORM("null") },
|
||||||
{ name: "wearableId", ...getTypeByORM("uuid", true) },
|
{ name: "wearableId", ...getTypeByORM("uuid", true), default: getDefaultByORM("null") },
|
||||||
{ name: "maintenanceId", ...getTypeByORM("uuid", true) },
|
{ name: "maintenanceId", ...getTypeByORM("uuid", true), default: getDefaultByORM("null") },
|
||||||
],
|
],
|
||||||
foreignKeys: [
|
foreignKeys: [
|
||||||
new TableForeignKey({
|
new TableForeignKey({
|
||||||
|
@ -52,13 +52,13 @@ export const maintenance_table = new Table({
|
||||||
name: "maintenance",
|
name: "maintenance",
|
||||||
columns: [
|
columns: [
|
||||||
{ name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
|
{ name: "id", ...getTypeByORM("uuid"), ...isUUIDPrimary },
|
||||||
{ name: "createdAt", ...getTypeByORM("datetime"), default: getDefaultByORM("currentTimestamp") },
|
{ name: "createdAt", ...getTypeByORM("date"), default: getDefaultByORM("currentTimestamp") },
|
||||||
{ name: "status", ...getTypeByORM("varchar") },
|
{ name: "status", ...getTypeByORM("varchar") },
|
||||||
{ name: "done", ...getTypeByORM("boolean"), default: getDefaultByORM("boolean", false) },
|
{ name: "done", ...getTypeByORM("boolean"), default: getDefaultByORM("boolean", false) },
|
||||||
{ name: "description", ...getTypeByORM("text") },
|
{ name: "description", ...getTypeByORM("text") },
|
||||||
{ name: "equipmentId", ...getTypeByORM("uuid", true) },
|
{ name: "equipmentId", ...getTypeByORM("uuid", true), default: getDefaultByORM("null") },
|
||||||
{ name: "vehicleId", ...getTypeByORM("uuid", true) },
|
{ name: "vehicleId", ...getTypeByORM("uuid", true), default: getDefaultByORM("null") },
|
||||||
{ name: "wearableId", ...getTypeByORM("uuid", true) },
|
{ name: "wearableId", ...getTypeByORM("uuid", true), default: getDefaultByORM("null") },
|
||||||
],
|
],
|
||||||
foreignKeys: [
|
foreignKeys: [
|
||||||
new TableForeignKey({
|
new TableForeignKey({
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
import { DB_TYPE } from "../env.defaults";
|
||||||
|
|
||||||
export type ORMType = "int" | "bigint" | "boolean" | "date" | "datetime" | "time" | "text" | "varchar" | "uuid";
|
export type ORMType = "int" | "bigint" | "boolean" | "date" | "datetime" | "time" | "text" | "varchar" | "uuid";
|
||||||
export type ORMDefault = "currentTimestamp" | "string" | "boolean" | "number" | "null";
|
export type ORMDefault = "currentTimestamp" | "string" | "boolean" | "number" | "null";
|
||||||
export type ColumnConfig = {
|
export type ColumnConfig = {
|
||||||
|
@ -13,7 +15,21 @@ export type Primary = {
|
||||||
};
|
};
|
||||||
|
|
||||||
export function getTypeByORM(type: ORMType, nullable: boolean = false, length: number = 255): ColumnConfig {
|
export function getTypeByORM(type: ORMType, nullable: boolean = false, length: number = 255): ColumnConfig {
|
||||||
const typeMap: Record<ORMType, string> = {
|
const dbType = DB_TYPE;
|
||||||
|
|
||||||
|
const typeMap: Record<string, Record<ORMType, string>> = {
|
||||||
|
mysql: {
|
||||||
|
int: "int",
|
||||||
|
bigint: "bigint",
|
||||||
|
boolean: "tinyint",
|
||||||
|
date: "date",
|
||||||
|
datetime: "datetime",
|
||||||
|
time: "time",
|
||||||
|
text: "text",
|
||||||
|
varchar: "varchar",
|
||||||
|
uuid: "varchar",
|
||||||
|
},
|
||||||
|
postgres: {
|
||||||
int: "integer",
|
int: "integer",
|
||||||
bigint: "bigint",
|
bigint: "bigint",
|
||||||
boolean: "boolean",
|
boolean: "boolean",
|
||||||
|
@ -23,28 +39,59 @@ export function getTypeByORM(type: ORMType, nullable: boolean = false, length: n
|
||||||
text: "text",
|
text: "text",
|
||||||
varchar: "character varying",
|
varchar: "character varying",
|
||||||
uuid: "uuid",
|
uuid: "uuid",
|
||||||
|
},
|
||||||
|
sqlite: {
|
||||||
|
int: "integer",
|
||||||
|
bigint: "integer",
|
||||||
|
boolean: "integer",
|
||||||
|
date: "date",
|
||||||
|
datetime: "datetime",
|
||||||
|
time: "text",
|
||||||
|
text: "text",
|
||||||
|
varchar: "varchar",
|
||||||
|
uuid: "varchar",
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
let obj: ColumnConfig = {
|
let obj: ColumnConfig = {
|
||||||
type: typeMap[type] || type,
|
type: typeMap[dbType]?.[type] || type,
|
||||||
isNullable: nullable,
|
isNullable: nullable,
|
||||||
};
|
};
|
||||||
if (type == "datetime") obj.precision = length;
|
if (type == "datetime") obj.precision = length;
|
||||||
else if (obj.type == "varchar" || type == "varchar") obj.length = `${length}`;
|
else if (dbType != "sqlite" && (obj.type == "varchar" || type == "varchar")) obj.length = `${length}`;
|
||||||
|
else if (dbType != "postgres" && type == "uuid") obj.length = "36";
|
||||||
|
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getDefaultByORM<T = string | null>(type: ORMDefault, data?: string | number | boolean): T {
|
export function getDefaultByORM<T = string | null>(type: ORMDefault, data?: string | number | boolean): T {
|
||||||
const typeMap: Record<ORMDefault, string | null> = {
|
const dbType = DB_TYPE;
|
||||||
|
|
||||||
|
const typeMap: Record<string, Record<ORMDefault, string | null>> = {
|
||||||
|
mysql: {
|
||||||
|
currentTimestamp: `CURRENT_TIMESTAMP(${data ?? 6})`,
|
||||||
|
string: `'${data ?? ""}'`,
|
||||||
|
boolean: Boolean(data).toString(),
|
||||||
|
number: Number(data).toString(),
|
||||||
|
null: null,
|
||||||
|
},
|
||||||
|
postgres: {
|
||||||
currentTimestamp: `now()`,
|
currentTimestamp: `now()`,
|
||||||
string: `'${data ?? ""}'`,
|
string: `'${data ?? ""}'`,
|
||||||
boolean: Boolean(data) == true ? "true" : "false",
|
boolean: Boolean(data) == true ? "true" : "false",
|
||||||
number: Number(data).toString(),
|
number: Number(data).toString(),
|
||||||
null: null,
|
null: null,
|
||||||
|
},
|
||||||
|
sqlite: {
|
||||||
|
currentTimestamp: `datetime('now')`,
|
||||||
|
string: `'${data ?? ""}'`,
|
||||||
|
boolean: Boolean(data) == true ? "1" : "0",
|
||||||
|
number: Number(data).toString(),
|
||||||
|
null: null,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
return (typeMap[type] || type) as T;
|
return (typeMap[dbType]?.[type] || type) as T;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const isIncrementPrimary: Primary = {
|
export const isIncrementPrimary: Primary = {
|
||||||
|
|
|
@ -2,14 +2,12 @@ import express, { Request, Response } from "express";
|
||||||
import {
|
import {
|
||||||
addAwardToMember,
|
addAwardToMember,
|
||||||
addCommunicationToMember,
|
addCommunicationToMember,
|
||||||
addEducationToMember,
|
|
||||||
addExecutivePositionToMember,
|
addExecutivePositionToMember,
|
||||||
addMembershipToMember,
|
addMembershipToMember,
|
||||||
addQualificationToMember,
|
addQualificationToMember,
|
||||||
createMember,
|
createMember,
|
||||||
deleteAwardOfMember,
|
deleteAwardOfMember,
|
||||||
deleteCommunicationOfMember,
|
deleteCommunicationOfMember,
|
||||||
deleteEducationsOfMember,
|
|
||||||
deleteExecutivePositionOfMember,
|
deleteExecutivePositionOfMember,
|
||||||
deleteMemberById,
|
deleteMemberById,
|
||||||
deleteMembershipOfMember,
|
deleteMembershipOfMember,
|
||||||
|
@ -19,8 +17,6 @@ import {
|
||||||
getAwardsByMember,
|
getAwardsByMember,
|
||||||
getCommunicationByMemberAndRecord,
|
getCommunicationByMemberAndRecord,
|
||||||
getCommunicationsByMember,
|
getCommunicationsByMember,
|
||||||
getEducationByMemberAndRecord,
|
|
||||||
getEducationsByMember,
|
|
||||||
getExecutivePositionByMemberAndRecord,
|
getExecutivePositionByMemberAndRecord,
|
||||||
getExecutivePositionsByMember,
|
getExecutivePositionsByMember,
|
||||||
getMemberById,
|
getMemberById,
|
||||||
|
@ -30,13 +26,11 @@ import {
|
||||||
getMembershipByMemberAndRecord,
|
getMembershipByMemberAndRecord,
|
||||||
getMembershipsByMember,
|
getMembershipsByMember,
|
||||||
getMembershipStatisticsById,
|
getMembershipStatisticsById,
|
||||||
getMembershipTotalStatisticsById,
|
|
||||||
getMemberStatisticsById,
|
getMemberStatisticsById,
|
||||||
getQualificationByMemberAndRecord,
|
getQualificationByMemberAndRecord,
|
||||||
getQualificationsByMember,
|
getQualificationsByMember,
|
||||||
updateAwardOfMember,
|
updateAwardOfMember,
|
||||||
updateCommunicationOfMember,
|
updateCommunicationOfMember,
|
||||||
updateEducationOfMember,
|
|
||||||
updateExecutivePositionOfMember,
|
updateExecutivePositionOfMember,
|
||||||
updateMemberById,
|
updateMemberById,
|
||||||
updateMembershipOfMember,
|
updateMembershipOfMember,
|
||||||
|
@ -78,10 +72,6 @@ router.get("/:memberId/memberships/statistics", async (req: Request, res: Respon
|
||||||
await getMembershipStatisticsById(req, res);
|
await getMembershipStatisticsById(req, res);
|
||||||
});
|
});
|
||||||
|
|
||||||
router.get("/:memberId/memberships/totalstatistics", async (req: Request, res: Response) => {
|
|
||||||
await getMembershipTotalStatisticsById(req, res);
|
|
||||||
});
|
|
||||||
|
|
||||||
router.get("/:memberId/membership/:id", async (req: Request, res: Response) => {
|
router.get("/:memberId/membership/:id", async (req: Request, res: Response) => {
|
||||||
await getMembershipByMemberAndRecord(req, res);
|
await getMembershipByMemberAndRecord(req, res);
|
||||||
});
|
});
|
||||||
|
@ -102,14 +92,6 @@ router.get("/:memberId/qualification/:id", async (req: Request, res: Response) =
|
||||||
await getQualificationByMemberAndRecord(req, res);
|
await getQualificationByMemberAndRecord(req, res);
|
||||||
});
|
});
|
||||||
|
|
||||||
router.get("/:memberId/educations", async (req: Request, res: Response) => {
|
|
||||||
await getEducationsByMember(req, res);
|
|
||||||
});
|
|
||||||
|
|
||||||
router.get("/:memberId/education/:id", async (req: Request, res: Response) => {
|
|
||||||
await getEducationByMemberAndRecord(req, res);
|
|
||||||
});
|
|
||||||
|
|
||||||
router.get("/:memberId/positions", async (req: Request, res: Response) => {
|
router.get("/:memberId/positions", async (req: Request, res: Response) => {
|
||||||
await getExecutivePositionsByMember(req, res);
|
await getExecutivePositionsByMember(req, res);
|
||||||
});
|
});
|
||||||
|
@ -158,14 +140,6 @@ router.post(
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
router.post(
|
|
||||||
"/:memberId/education",
|
|
||||||
PermissionHelper.passCheckMiddleware("create", "club", "member"),
|
|
||||||
async (req: Request, res: Response) => {
|
|
||||||
await addEducationToMember(req, res);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
router.post(
|
router.post(
|
||||||
"/:memberId/position",
|
"/:memberId/position",
|
||||||
PermissionHelper.passCheckMiddleware("create", "club", "member"),
|
PermissionHelper.passCheckMiddleware("create", "club", "member"),
|
||||||
|
@ -214,14 +188,6 @@ router.patch(
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
router.patch(
|
|
||||||
"/:memberId/education/:recordId",
|
|
||||||
PermissionHelper.passCheckMiddleware("update", "club", "member"),
|
|
||||||
async (req: Request, res: Response) => {
|
|
||||||
await updateEducationOfMember(req, res);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
router.patch(
|
router.patch(
|
||||||
"/:memberId/position/:recordId",
|
"/:memberId/position/:recordId",
|
||||||
PermissionHelper.passCheckMiddleware("update", "club", "member"),
|
PermissionHelper.passCheckMiddleware("update", "club", "member"),
|
||||||
|
@ -270,14 +236,6 @@ router.delete(
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
router.delete(
|
|
||||||
"/:memberId/education/:recordId",
|
|
||||||
PermissionHelper.passCheckMiddleware("delete", "club", "member"),
|
|
||||||
async (req: Request, res: Response) => {
|
|
||||||
await deleteEducationsOfMember(req, res);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
router.delete(
|
router.delete(
|
||||||
"/:memberId/position/:recordId",
|
"/:memberId/position/:recordId",
|
||||||
PermissionHelper.passCheckMiddleware("delete", "club", "member"),
|
PermissionHelper.passCheckMiddleware("delete", "club", "member"),
|
||||||
|
|
|
@ -1,45 +0,0 @@
|
||||||
import express, { Request, Response } from "express";
|
|
||||||
import {
|
|
||||||
createEducation,
|
|
||||||
deleteEducation,
|
|
||||||
getAllEducations,
|
|
||||||
getEducationById,
|
|
||||||
updateEducation,
|
|
||||||
} from "../../../controller/admin/configuration/educationController";
|
|
||||||
import PermissionHelper from "../../../helpers/permissionHelper";
|
|
||||||
|
|
||||||
var router = express.Router({ mergeParams: true });
|
|
||||||
|
|
||||||
router.get("/", async (req: Request, res: Response) => {
|
|
||||||
await getAllEducations(req, res);
|
|
||||||
});
|
|
||||||
|
|
||||||
router.get("/:id", async (req: Request, res: Response) => {
|
|
||||||
await getEducationById(req, res);
|
|
||||||
});
|
|
||||||
|
|
||||||
router.post(
|
|
||||||
"/",
|
|
||||||
PermissionHelper.passCheckMiddleware("create", "configuration", "education"),
|
|
||||||
async (req: Request, res: Response) => {
|
|
||||||
await createEducation(req, res);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
router.patch(
|
|
||||||
"/:id",
|
|
||||||
PermissionHelper.passCheckMiddleware("update", "configuration", "education"),
|
|
||||||
async (req: Request, res: Response) => {
|
|
||||||
await updateEducation(req, res);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
router.delete(
|
|
||||||
"/:id",
|
|
||||||
PermissionHelper.passCheckMiddleware("delete", "configuration", "education"),
|
|
||||||
async (req: Request, res: Response) => {
|
|
||||||
await deleteEducation(req, res);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
export default router;
|
|
|
@ -8,7 +8,6 @@ import communicationType from "./configuration/communicationType";
|
||||||
import executivePosition from "./configuration/executivePosition";
|
import executivePosition from "./configuration/executivePosition";
|
||||||
import membershipStatus from "./configuration/membershipStatus";
|
import membershipStatus from "./configuration/membershipStatus";
|
||||||
import qualification from "./configuration/qualification";
|
import qualification from "./configuration/qualification";
|
||||||
import education from "./configuration/education";
|
|
||||||
import salutation from "./configuration/salutation";
|
import salutation from "./configuration/salutation";
|
||||||
import calendarType from "./configuration/calendarType";
|
import calendarType from "./configuration/calendarType";
|
||||||
import queryStore from "./configuration/queryStore";
|
import queryStore from "./configuration/queryStore";
|
||||||
|
@ -86,14 +85,6 @@ router.use(
|
||||||
]),
|
]),
|
||||||
qualification
|
qualification
|
||||||
);
|
);
|
||||||
router.use(
|
|
||||||
"/education",
|
|
||||||
PermissionHelper.passCheckSomeMiddleware([
|
|
||||||
{ requiredPermission: "read", section: "configuration", module: "education" },
|
|
||||||
{ requiredPermission: "read", section: "club", module: "member" },
|
|
||||||
]),
|
|
||||||
education
|
|
||||||
);
|
|
||||||
router.use(
|
router.use(
|
||||||
"/salutation",
|
"/salutation",
|
||||||
PermissionHelper.passCheckSomeMiddleware([
|
PermissionHelper.passCheckSomeMiddleware([
|
||||||
|
|
|
@ -1,49 +0,0 @@
|
||||||
import { dataSource } from "../../../data-source";
|
|
||||||
import { memberEducations } from "../../../entity/club/member/memberEducations";
|
|
||||||
import DatabaseActionException from "../../../exceptions/databaseActionException";
|
|
||||||
import InternalException from "../../../exceptions/internalException";
|
|
||||||
|
|
||||||
export default abstract class MemberEducationService {
|
|
||||||
/**
|
|
||||||
* @description get all by member id
|
|
||||||
* @param {string} memberId
|
|
||||||
* @returns {Promise<Array<memberEducations>>}
|
|
||||||
*/
|
|
||||||
static async getAll(memberId: string): Promise<Array<memberEducations>> {
|
|
||||||
return await dataSource
|
|
||||||
.getRepository(memberEducations)
|
|
||||||
.createQueryBuilder("memberEducations")
|
|
||||||
.leftJoinAndSelect("memberEducations.education", "education")
|
|
||||||
.where("memberEducations.memberId = :memberId", { memberId: memberId })
|
|
||||||
.orderBy("education.education", "ASC")
|
|
||||||
.getMany()
|
|
||||||
.then((res) => {
|
|
||||||
return res;
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
throw new DatabaseActionException("SELECT", "memberEducations", err);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description get by memberId and recordId
|
|
||||||
* @param {string} memberId
|
|
||||||
* @param {number} recordId
|
|
||||||
* @returns {Promise<Array<member>>}
|
|
||||||
*/
|
|
||||||
static async getById(memberId: string, recordId: number): Promise<memberEducations> {
|
|
||||||
return await dataSource
|
|
||||||
.getRepository(memberEducations)
|
|
||||||
.createQueryBuilder("memberEducations")
|
|
||||||
.leftJoinAndSelect("memberEducations.education", "education")
|
|
||||||
.where("memberEducations.memberId = :memberId", { memberId: memberId })
|
|
||||||
.andWhere("memberEducations.id = :recordId", { recordId: recordId })
|
|
||||||
.getOneOrFail()
|
|
||||||
.then((res) => {
|
|
||||||
return res;
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
throw new DatabaseActionException("SELECT", "memberEducations", err);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,8 +1,9 @@
|
||||||
import { Brackets, ILike, Not, SelectQueryBuilder } from "typeorm";
|
import { Brackets, Like, Not, SelectQueryBuilder } from "typeorm";
|
||||||
import { dataSource } from "../../../data-source";
|
import { dataSource } from "../../../data-source";
|
||||||
import { member } from "../../../entity/club/member/member";
|
import { member } from "../../../entity/club/member/member";
|
||||||
import DatabaseActionException from "../../../exceptions/databaseActionException";
|
import DatabaseActionException from "../../../exceptions/databaseActionException";
|
||||||
import { memberView } from "../../../views/memberView";
|
import { memberView } from "../../../views/memberView";
|
||||||
|
import { DB_TYPE } from "../../../env.defaults";
|
||||||
|
|
||||||
export default abstract class MemberService {
|
export default abstract class MemberService {
|
||||||
/**
|
/**
|
||||||
|
@ -29,12 +30,10 @@ export default abstract class MemberService {
|
||||||
|
|
||||||
if (searchBits.length < 2) {
|
if (searchBits.length < 2) {
|
||||||
query = query.where(
|
query = query.where(
|
||||||
new Brackets((qb) =>
|
`member.firstname LIKE :searchQuery OR member.lastname LIKE :searchQuery OR member.internalId LIKE :searchQuery`,
|
||||||
qb
|
{
|
||||||
.where({ firstname: ILike(`%${searchBits[0]}%`) })
|
searchQuery: `%${searchBits[0]}%`,
|
||||||
.orWhere({ lastname: ILike(`%${searchBits[0]}%`) })
|
}
|
||||||
.orWhere({ internalId: ILike(`%${searchBits[0]}%`) })
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
searchBits
|
searchBits
|
||||||
|
@ -43,12 +42,12 @@ export default abstract class MemberService {
|
||||||
query = query
|
query = query
|
||||||
.orWhere(
|
.orWhere(
|
||||||
new Brackets((qb) =>
|
new Brackets((qb) =>
|
||||||
qb.where({ firstname: ILike(`%${term[0]}%`) }).andWhere({ lastname: ILike(`%${term[1]}%`) })
|
qb.where({ firstname: Like(`%${term[0]}%`) }).andWhere({ lastname: Like(`%${term[1]}%`) })
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
.orWhere(
|
.orWhere(
|
||||||
new Brackets((qb) =>
|
new Brackets((qb) =>
|
||||||
qb.where({ firstname: ILike(`%${term[1]}%`) }).andWhere({ lastname: ILike(`%${term[0]}%`) })
|
qb.where({ firstname: Like(`%${term[1]}%`) }).andWhere({ lastname: Like(`%${term[0]}%`) })
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
@ -193,13 +192,17 @@ export default abstract class MemberService {
|
||||||
"member.firstMembershipEntry",
|
"member.firstMembershipEntry",
|
||||||
"member.memberships",
|
"member.memberships",
|
||||||
"membership_first",
|
"membership_first",
|
||||||
'membership_first.memberId = member.id AND membership_first.start = (SELECT MIN("m_first"."start") FROM "membership" "m_first" WHERE "m_first"."memberId" = "member"."id")'
|
DB_TYPE == "postgres"
|
||||||
|
? 'membership_first.memberId = member.id AND membership_first.start = (SELECT MIN("m_first"."start") FROM "membership" "m_first" WHERE "m_first"."memberId" = "member"."id")'
|
||||||
|
: "membership_first.memberId = member.id AND membership_first.start = (SELECT MIN(m_first.start) FROM membership m_first WHERE m_first.memberId = member.id)"
|
||||||
)
|
)
|
||||||
.leftJoinAndMapOne(
|
.leftJoinAndMapOne(
|
||||||
"member.lastMembershipEntry",
|
"member.lastMembershipEntry",
|
||||||
"member.memberships",
|
"member.memberships",
|
||||||
"membership_last",
|
"membership_last",
|
||||||
'membership_last.memberId = member.id AND membership_last.start = (SELECT MAX("m_last"."start") FROM "membership" "m_last" WHERE "m_last"."memberId" = "member"."id")'
|
DB_TYPE == "postgres"
|
||||||
|
? 'membership_last.memberId = member.id AND membership_last.start = (SELECT MAX("m_last"."start") FROM "membership" "m_last" WHERE "m_last"."memberId" = "member"."id")'
|
||||||
|
: "membership_last.memberId = member.id AND membership_last.start = (SELECT MAX(m_last.start) FROM membership m_last WHERE m_last.memberId = member.id)"
|
||||||
)
|
)
|
||||||
.leftJoinAndSelect("membership_first.status", "status_first")
|
.leftJoinAndSelect("membership_first.status", "status_first")
|
||||||
.leftJoinAndSelect("membership_last.status", "status_last")
|
.leftJoinAndSelect("membership_last.status", "status_last")
|
||||||
|
|
|
@ -2,7 +2,7 @@ import { dataSource } from "../../../data-source";
|
||||||
import { membership } from "../../../entity/club/member/membership";
|
import { membership } from "../../../entity/club/member/membership";
|
||||||
import DatabaseActionException from "../../../exceptions/databaseActionException";
|
import DatabaseActionException from "../../../exceptions/databaseActionException";
|
||||||
import InternalException from "../../../exceptions/internalException";
|
import InternalException from "../../../exceptions/internalException";
|
||||||
import { membershipTotalView, membershipView } from "../../../views/membershipsView";
|
import { membershipView } from "../../../views/membershipsView";
|
||||||
|
|
||||||
export default abstract class MembershipService {
|
export default abstract class MembershipService {
|
||||||
/**
|
/**
|
||||||
|
@ -66,23 +66,4 @@ export default abstract class MembershipService {
|
||||||
throw new DatabaseActionException("SELECT", "membershipView", err);
|
throw new DatabaseActionException("SELECT", "membershipView", err);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @description get membership total statistics by memberId
|
|
||||||
* @param {string} memberId
|
|
||||||
* @returns {Promise<Array<membershipTotalView>>}
|
|
||||||
*/
|
|
||||||
static async getTotalStatisticsById(memberId: string): Promise<membershipTotalView> {
|
|
||||||
return await dataSource
|
|
||||||
.getRepository(membershipTotalView)
|
|
||||||
.createQueryBuilder("membershipTotalView")
|
|
||||||
.where("membershipTotalView.memberId = :memberId", { memberId: memberId })
|
|
||||||
.getOneOrFail()
|
|
||||||
.then((res) => {
|
|
||||||
return res;
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
throw new DatabaseActionException("SELECT", "membershipTotalView", err);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,6 @@ export default abstract class NewsletterService {
|
||||||
return await dataSource
|
return await dataSource
|
||||||
.getRepository(newsletter)
|
.getRepository(newsletter)
|
||||||
.createQueryBuilder("newsletter")
|
.createQueryBuilder("newsletter")
|
||||||
.orderBy("createdAt", "DESC")
|
|
||||||
.offset(offset)
|
.offset(offset)
|
||||||
.limit(count)
|
.limit(count)
|
||||||
.getManyAndCount()
|
.getManyAndCount()
|
||||||
|
|
|
@ -1,41 +0,0 @@
|
||||||
import { dataSource } from "../../data-source";
|
|
||||||
import { education } from "../../entity/configuration/education";
|
|
||||||
import DatabaseActionException from "../../exceptions/databaseActionException";
|
|
||||||
|
|
||||||
export default abstract class EducationService {
|
|
||||||
/**
|
|
||||||
* @description get all educations
|
|
||||||
* @returns {Promise<Array<education>>}
|
|
||||||
*/
|
|
||||||
static async getAll(): Promise<Array<education>> {
|
|
||||||
return await dataSource
|
|
||||||
.getRepository(education)
|
|
||||||
.createQueryBuilder("education")
|
|
||||||
.orderBy("education", "ASC")
|
|
||||||
.getMany()
|
|
||||||
.then((res) => {
|
|
||||||
return res;
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
throw new DatabaseActionException("SELECT", "education", err);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @description get education by id
|
|
||||||
* @returns {Promise<education>}
|
|
||||||
*/
|
|
||||||
static async getById(id: number): Promise<education> {
|
|
||||||
return await dataSource
|
|
||||||
.getRepository(education)
|
|
||||||
.createQueryBuilder("education")
|
|
||||||
.where("education.id = :id", { id: id })
|
|
||||||
.getOneOrFail()
|
|
||||||
.then((res) => {
|
|
||||||
return res;
|
|
||||||
})
|
|
||||||
.catch((err) => {
|
|
||||||
throw new DatabaseActionException("SELECT", "education", err);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -58,7 +58,7 @@
|
||||||
<br />
|
<br />
|
||||||
{{/each}} {{/if}} {{#if qualifications.length}}
|
{{/each}} {{/if}} {{#if qualifications.length}}
|
||||||
<br />
|
<br />
|
||||||
<h2>Qualifikationen / Funktionen</h2>
|
<h2>Qualifikationen</h2>
|
||||||
{{#each qualifications}}
|
{{#each qualifications}}
|
||||||
<div>
|
<div>
|
||||||
<h3>{{this.qualification.qualification}}: {{date this.date}}</h3>
|
<h3>{{this.qualification.qualification}}: {{date this.date}}</h3>
|
||||||
|
@ -69,19 +69,6 @@
|
||||||
{{/if}}
|
{{/if}}
|
||||||
</div>
|
</div>
|
||||||
<br />
|
<br />
|
||||||
{{/each}} {{/if}} {{#if educations.length}}
|
|
||||||
<br />
|
|
||||||
<h2>Aus-/Fortbildungen</h2>
|
|
||||||
{{#each educations}}
|
|
||||||
<div>
|
|
||||||
<h3>{{this.education.education}}: {{date this.start}}{{#if this.end}} bis {{date this.end}}{{/if}}</h3>
|
|
||||||
{{#if this.place}}
|
|
||||||
<p>Ausbildungsort: {{this.place}}</p>
|
|
||||||
{{/if}}{{#if this.note}}
|
|
||||||
<p>Notiz: {{this.note}}</p>
|
|
||||||
{{/if}}
|
|
||||||
</div>
|
|
||||||
<br />
|
|
||||||
{{/each}} {{/if}}
|
{{/each}} {{/if}}
|
||||||
</body>
|
</body>
|
||||||
<style>
|
<style>
|
||||||
|
|
|
@ -29,7 +29,6 @@ export type PermissionModule =
|
||||||
| "membership_status"
|
| "membership_status"
|
||||||
| "newsletter_config"
|
| "newsletter_config"
|
||||||
| "salutation"
|
| "salutation"
|
||||||
| "education"
|
|
||||||
| "calendar_type"
|
| "calendar_type"
|
||||||
| "query_store"
|
| "query_store"
|
||||||
| "template"
|
| "template"
|
||||||
|
@ -103,7 +102,6 @@ export const permissionModules: Array<PermissionModule> = [
|
||||||
"membership_status",
|
"membership_status",
|
||||||
"newsletter_config",
|
"newsletter_config",
|
||||||
"salutation",
|
"salutation",
|
||||||
"education",
|
|
||||||
"calendar_type",
|
"calendar_type",
|
||||||
"query_store",
|
"query_store",
|
||||||
"template",
|
"template",
|
||||||
|
@ -139,7 +137,6 @@ export const sectionsAndModules: SectionsAndModulesObject = {
|
||||||
"communication_type",
|
"communication_type",
|
||||||
"membership_status",
|
"membership_status",
|
||||||
"salutation",
|
"salutation",
|
||||||
"education",
|
|
||||||
"calendar_type",
|
"calendar_type",
|
||||||
"query_store",
|
"query_store",
|
||||||
"template",
|
"template",
|
||||||
|
|
|
@ -15,7 +15,6 @@ export interface MemberViewModel {
|
||||||
sendNewsletter?: CommunicationViewModel;
|
sendNewsletter?: CommunicationViewModel;
|
||||||
smsAlarming?: Array<CommunicationViewModel>;
|
smsAlarming?: Array<CommunicationViewModel>;
|
||||||
preferredCommunication?: Array<CommunicationViewModel>;
|
preferredCommunication?: Array<CommunicationViewModel>;
|
||||||
note?: string;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface MemberStatisticsViewModel {
|
export interface MemberStatisticsViewModel {
|
||||||
|
|
|
@ -1,26 +0,0 @@
|
||||||
export interface MemberEducationViewModel {
|
|
||||||
id: number;
|
|
||||||
start: Date;
|
|
||||||
end?: Date;
|
|
||||||
place?: string;
|
|
||||||
note?: string;
|
|
||||||
education: string;
|
|
||||||
educationId: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface CreateMemberEducationViewModel {
|
|
||||||
start: Date;
|
|
||||||
end?: Date;
|
|
||||||
place?: string;
|
|
||||||
note?: string;
|
|
||||||
educationId: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface UpdateMemberEducationViewModel {
|
|
||||||
id: number;
|
|
||||||
start: Date;
|
|
||||||
end?: Date;
|
|
||||||
place?: string;
|
|
||||||
note?: string;
|
|
||||||
educationId: number;
|
|
||||||
}
|
|
|
@ -20,15 +20,3 @@ export interface MembershipStatisticsViewModel {
|
||||||
memberNameaffix: string;
|
memberNameaffix: string;
|
||||||
memberBirthdate: Date;
|
memberBirthdate: Date;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface MembershipTotalStatisticsViewModel {
|
|
||||||
durationInDays: number;
|
|
||||||
durationInYears: number;
|
|
||||||
exactDuration: string;
|
|
||||||
memberId: string;
|
|
||||||
memberSalutation: string;
|
|
||||||
memberFirstname: string;
|
|
||||||
memberLastname: string;
|
|
||||||
memberNameaffix: string;
|
|
||||||
memberBirthdate: Date;
|
|
||||||
}
|
|
||||||
|
|
|
@ -7,5 +7,4 @@ export interface NewsletterViewModel {
|
||||||
newsletterSignatur: string;
|
newsletterSignatur: string;
|
||||||
isSent: boolean;
|
isSent: boolean;
|
||||||
recipientsByQueryId?: string;
|
recipientsByQueryId?: string;
|
||||||
createdAt: Date;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,16 +0,0 @@
|
||||||
export interface EducationViewModel {
|
|
||||||
id: number;
|
|
||||||
education: string;
|
|
||||||
description: string | null;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface CreateEducationViewModel {
|
|
||||||
education: string;
|
|
||||||
description: string | null;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface UpdateEducationViewModel {
|
|
||||||
id: number;
|
|
||||||
education: string;
|
|
||||||
description: string | null;
|
|
||||||
}
|
|
|
@ -1,5 +1,36 @@
|
||||||
import { DataSource, ViewColumn, ViewEntity } from "typeorm";
|
import { DataSource, ViewColumn, ViewEntity } from "typeorm";
|
||||||
import { memberExecutivePositions } from "../entity/club/member/memberExecutivePositions";
|
import { memberExecutivePositions } from "../entity/club/member/memberExecutivePositions";
|
||||||
|
import { DB_TYPE } from "../env.defaults";
|
||||||
|
|
||||||
|
let durationInDays: string;
|
||||||
|
let durationInYears: string;
|
||||||
|
let exactDuration: string;
|
||||||
|
if (DB_TYPE == "postgres") {
|
||||||
|
durationInDays = `SUM(COALESCE("memberExecutivePositions"."end", CURRENT_DATE) - "memberExecutivePositions"."start")`;
|
||||||
|
durationInYears = `SUM(EXTRACT(YEAR FROM AGE(COALESCE("memberExecutivePositions"."end", CURRENT_DATE), "memberExecutivePositions"."start")))`;
|
||||||
|
exactDuration = `SUM(AGE(COALESCE("memberExecutivePositions"."end", CURRENT_DATE), "memberExecutivePositions"."start"))`;
|
||||||
|
} else if (DB_TYPE == "mysql") {
|
||||||
|
durationInDays = `SUM(DATEDIFF(COALESCE(memberExecutivePositions.end, CURDATE()), memberExecutivePositions.start))`;
|
||||||
|
durationInYears = `SUM(TIMESTAMPDIFF(YEAR, memberExecutivePositions.start, COALESCE(memberExecutivePositions.end, CURDATE())))`;
|
||||||
|
exactDuration = `
|
||||||
|
CONCAT(
|
||||||
|
SUM(FLOOR(TIMESTAMPDIFF(DAY, memberExecutivePositions.start, COALESCE(memberExecutivePositions.end, CURDATE())) / 365.25)),
|
||||||
|
' years ',
|
||||||
|
SUM(FLOOR(MOD(TIMESTAMPDIFF(MONTH, memberExecutivePositions.start, COALESCE(memberExecutivePositions.end, CURDATE())), 12))),
|
||||||
|
' months ',
|
||||||
|
SUM(FLOOR(MOD(TIMESTAMPDIFF(DAY, memberExecutivePositions.start, COALESCE(memberExecutivePositions.end, CURDATE())), 30))),
|
||||||
|
' days'
|
||||||
|
)
|
||||||
|
`;
|
||||||
|
} else if (DB_TYPE == "sqlite") {
|
||||||
|
durationInDays = `SUM(JULIANDAY(COALESCE(memberExecutivePositions.end, DATE('now'))) - JULIANDAY(memberExecutivePositions.start))`;
|
||||||
|
durationInYears = `SUM(FLOOR((JULIANDAY(COALESCE(memberExecutivePositions.end, DATE('now'))) - JULIANDAY(memberExecutivePositions.start)) / 365.25))`;
|
||||||
|
exactDuration = `
|
||||||
|
SUM((strftime('%Y', COALESCE(memberExecutivePositions.end, DATE('now'))) - strftime('%Y', memberExecutivePositions.start))) || ' years ' ||
|
||||||
|
SUM((strftime('%m', COALESCE(memberExecutivePositions.end, DATE('now'))) - strftime('%m', memberExecutivePositions.start))) || ' months ' ||
|
||||||
|
SUM((strftime('%d', COALESCE(memberExecutivePositions.end, DATE('now'))) - strftime('%d', memberExecutivePositions.start))) || ' days'
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
@ViewEntity({
|
@ViewEntity({
|
||||||
expression: (datasource: DataSource) =>
|
expression: (datasource: DataSource) =>
|
||||||
|
@ -14,18 +45,9 @@ import { memberExecutivePositions } from "../entity/club/member/memberExecutiveP
|
||||||
.addSelect("member.nameaffix", "memberNameaffix")
|
.addSelect("member.nameaffix", "memberNameaffix")
|
||||||
.addSelect("member.birthdate", "memberBirthdate")
|
.addSelect("member.birthdate", "memberBirthdate")
|
||||||
.addSelect("salutation.salutation", "memberSalutation")
|
.addSelect("salutation.salutation", "memberSalutation")
|
||||||
.addSelect(
|
.addSelect(durationInDays, "durationInDays")
|
||||||
`SUM(COALESCE("memberExecutivePositions"."end", CURRENT_DATE) - "memberExecutivePositions"."start")`,
|
.addSelect(durationInYears, "durationInYears")
|
||||||
"durationInDays"
|
.addSelect(exactDuration, "exactDuration")
|
||||||
)
|
|
||||||
.addSelect(
|
|
||||||
`SUM(EXTRACT(YEAR FROM AGE(COALESCE("memberExecutivePositions"."end", CURRENT_DATE), "memberExecutivePositions"."start")))`,
|
|
||||||
"durationInYears"
|
|
||||||
)
|
|
||||||
.addSelect(
|
|
||||||
`SUM(AGE(COALESCE("memberExecutivePositions"."end", CURRENT_DATE), "memberExecutivePositions"."start"))`,
|
|
||||||
"exactDuration"
|
|
||||||
)
|
|
||||||
.leftJoin("memberExecutivePositions.executivePosition", "executivePosition")
|
.leftJoin("memberExecutivePositions.executivePosition", "executivePosition")
|
||||||
.leftJoin("memberExecutivePositions.member", "member")
|
.leftJoin("memberExecutivePositions.member", "member")
|
||||||
.leftJoin("member.salutation", "salutation")
|
.leftJoin("member.salutation", "salutation")
|
||||||
|
|
|
@ -1,5 +1,36 @@
|
||||||
import { DataSource, ViewColumn, ViewEntity } from "typeorm";
|
import { DataSource, ViewColumn, ViewEntity } from "typeorm";
|
||||||
import { memberQualifications } from "../entity/club/member/memberQualifications";
|
import { memberQualifications } from "../entity/club/member/memberQualifications";
|
||||||
|
import { DB_TYPE } from "../env.defaults";
|
||||||
|
|
||||||
|
let durationInDays: string;
|
||||||
|
let durationInYears: string;
|
||||||
|
let exactDuration: string;
|
||||||
|
if (DB_TYPE == "postgres") {
|
||||||
|
durationInDays = `SUM(COALESCE("memberQualifications"."end", CURRENT_DATE) - "memberQualifications"."start") `;
|
||||||
|
durationInYears = `SUM(EXTRACT(YEAR FROM AGE(COALESCE("memberQualifications"."end", CURRENT_DATE), "memberQualifications"."start")))`;
|
||||||
|
exactDuration = `SUM(AGE(COALESCE("memberQualifications"."end", CURRENT_DATE), "memberQualifications"."start"))`;
|
||||||
|
} else if (DB_TYPE == "mysql") {
|
||||||
|
durationInDays = `SUM(DATEDIFF(COALESCE(memberQualifications.end, CURDATE()), memberQualifications.start))`;
|
||||||
|
durationInYears = `SUM(TIMESTAMPDIFF(YEAR, memberQualifications.start, COALESCE(memberQualifications.end, CURDATE())))`;
|
||||||
|
exactDuration = `
|
||||||
|
CONCAT(
|
||||||
|
SUM(FLOOR(TIMESTAMPDIFF(DAY, memberQualifications.start, COALESCE(memberQualifications.end, CURDATE())) / 365.25)),
|
||||||
|
' years ',
|
||||||
|
SUM(FLOOR(MOD(TIMESTAMPDIFF(MONTH, memberQualifications.start, COALESCE(memberQualifications.end, CURDATE())), 12))),
|
||||||
|
' months ',
|
||||||
|
SUM(FLOOR(MOD(TIMESTAMPDIFF(DAY, memberQualifications.start, COALESCE(memberQualifications.end, CURDATE())), 30))),
|
||||||
|
' days'
|
||||||
|
)
|
||||||
|
`;
|
||||||
|
} else if (DB_TYPE == "sqlite") {
|
||||||
|
durationInDays = `SUM(JULIANDAY(COALESCE(memberQualifications.end, DATE('now'))) - JULIANDAY(memberQualifications.start))`;
|
||||||
|
durationInYears = `SUM(FLOOR((JULIANDAY(COALESCE(memberQualifications.end, DATE('now'))) - JULIANDAY(memberQualifications.start)) / 365.25))`;
|
||||||
|
exactDuration = `
|
||||||
|
SUM((strftime('%Y', COALESCE(memberQualifications.end, DATE('now'))) - strftime('%Y', memberQualifications.start))) || ' years ' ||
|
||||||
|
SUM((strftime('%m', COALESCE(memberQualifications.end, DATE('now'))) - strftime('%m', memberQualifications.start))) || ' months ' ||
|
||||||
|
SUM((strftime('%d', COALESCE(memberQualifications.end, DATE('now'))) - strftime('%d', memberQualifications.start))) || ' days'
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
@ViewEntity({
|
@ViewEntity({
|
||||||
expression: (datasource: DataSource) =>
|
expression: (datasource: DataSource) =>
|
||||||
|
@ -14,18 +45,9 @@ import { memberQualifications } from "../entity/club/member/memberQualifications
|
||||||
.addSelect("member.nameaffix", "memberNameaffix")
|
.addSelect("member.nameaffix", "memberNameaffix")
|
||||||
.addSelect("member.birthdate", "memberBirthdate")
|
.addSelect("member.birthdate", "memberBirthdate")
|
||||||
.addSelect("salutation.salutation", "memberSalutation")
|
.addSelect("salutation.salutation", "memberSalutation")
|
||||||
.addSelect(
|
.addSelect(durationInDays, "durationInDays")
|
||||||
`SUM(COALESCE("memberQualifications"."end", CURRENT_DATE) - "memberQualifications"."start")`,
|
.addSelect(durationInYears, "durationInYears")
|
||||||
"durationInDays"
|
.addSelect(exactDuration, "exactDuration")
|
||||||
)
|
|
||||||
.addSelect(
|
|
||||||
`SUM(EXTRACT(YEAR FROM AGE(COALESCE("memberQualifications"."end", CURRENT_DATE), "memberQualifications"."start")))`,
|
|
||||||
"durationInYears"
|
|
||||||
)
|
|
||||||
.addSelect(
|
|
||||||
`SUM(AGE(COALESCE("memberQualifications"."end", CURRENT_DATE), "memberQualifications"."start"))`,
|
|
||||||
"exactDuration"
|
|
||||||
)
|
|
||||||
.leftJoin("memberQualifications.qualification", "qualification")
|
.leftJoin("memberQualifications.qualification", "qualification")
|
||||||
.leftJoin("memberQualifications.member", "member")
|
.leftJoin("memberQualifications.member", "member")
|
||||||
.leftJoin("member.salutation", "salutation")
|
.leftJoin("member.salutation", "salutation")
|
||||||
|
|
|
@ -1,5 +1,39 @@
|
||||||
import { DataSource, ViewColumn, ViewEntity } from "typeorm";
|
import { DataSource, ViewColumn, ViewEntity } from "typeorm";
|
||||||
import { member } from "../entity/club/member/member";
|
import { member } from "../entity/club/member/member";
|
||||||
|
import { DB_TYPE } from "../env.defaults";
|
||||||
|
|
||||||
|
let todayAge: string;
|
||||||
|
let ageThisYear: string;
|
||||||
|
let exactAge: string;
|
||||||
|
if (DB_TYPE == "postgres") {
|
||||||
|
todayAge = `DATE_PART('year', AGE(CURRENT_DATE, member.birthdate))`;
|
||||||
|
ageThisYear = `EXTRACT(YEAR FROM CURRENT_DATE) - EXTRACT(YEAR FROM member.birthdate)`;
|
||||||
|
exactAge = `AGE(CURRENT_DATE, member.birthdate)`;
|
||||||
|
} else if (DB_TYPE == "mysql") {
|
||||||
|
todayAge = `TIMESTAMPDIFF(YEAR, member.birthdate, CURDATE()) AS todayAge`;
|
||||||
|
ageThisYear = `YEAR(CURDATE()) - YEAR(member.birthdate) AS ageThisYear`;
|
||||||
|
exactAge = `
|
||||||
|
CONCAT(
|
||||||
|
TIMESTAMPDIFF(YEAR, member.birthdate, CURDATE()), ' years ',
|
||||||
|
TIMESTAMPDIFF(MONTH, member.birthdate, CURDATE()) % 12, ' months ',
|
||||||
|
TIMESTAMPDIFF(DAY,
|
||||||
|
DATE_ADD(
|
||||||
|
member.birthdate,
|
||||||
|
INTERVAL TIMESTAMPDIFF(MONTH, member.birthdate, CURDATE()) MONTH
|
||||||
|
),
|
||||||
|
CURDATE()
|
||||||
|
), ' days'
|
||||||
|
)
|
||||||
|
`;
|
||||||
|
} else if (DB_TYPE == "sqlite") {
|
||||||
|
todayAge = `(strftime('%Y', 'now') - strftime('%Y', member.birthdate) - (strftime('%m-%d', 'now') < strftime('%m-%d', member.birthdate)))`;
|
||||||
|
ageThisYear = `strftime('%Y', 'now') - strftime('%Y', member.birthdate)`;
|
||||||
|
exactAge = `
|
||||||
|
(strftime('%Y', 'now') - strftime('%Y', member.birthdate)) || ' years ' ||
|
||||||
|
(strftime('%m', 'now') - strftime('%m', member.birthdate)) || ' months ' ||
|
||||||
|
(strftime('%d', 'now') - strftime('%d', member.birthdate)) || ' days'
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
@ViewEntity({
|
@ViewEntity({
|
||||||
expression: (datasource: DataSource) =>
|
expression: (datasource: DataSource) =>
|
||||||
|
@ -7,16 +41,15 @@ import { member } from "../entity/club/member/member";
|
||||||
.getRepository(member)
|
.getRepository(member)
|
||||||
.createQueryBuilder("member")
|
.createQueryBuilder("member")
|
||||||
.select("member.id", "id")
|
.select("member.id", "id")
|
||||||
.addSelect("member.internalId", "internalId")
|
.select("member.internalId", "internalId")
|
||||||
.addSelect("member.note", "note")
|
|
||||||
.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("salutation.salutation", "salutation")
|
.addSelect("salutation.salutation", "salutation")
|
||||||
.addSelect(`DATE_PART('year', AGE(CURRENT_DATE, member.birthdate))`, "todayAge")
|
.addSelect(todayAge, "todayAge")
|
||||||
.addSelect(`EXTRACT(YEAR FROM CURRENT_DATE) - EXTRACT(YEAR FROM member.birthdate)`, "ageThisYear")
|
.addSelect(ageThisYear, "ageThisYear")
|
||||||
.addSelect(`AGE(CURRENT_DATE, member.birthdate)`, "exactAge")
|
.addSelect(exactAge, "exactAge")
|
||||||
.leftJoin("member.salutation", "salutation"),
|
.leftJoin("member.salutation", "salutation"),
|
||||||
})
|
})
|
||||||
export class memberView {
|
export class memberView {
|
||||||
|
@ -29,9 +62,6 @@ export class memberView {
|
||||||
@ViewColumn()
|
@ViewColumn()
|
||||||
internalId: string;
|
internalId: string;
|
||||||
|
|
||||||
@ViewColumn()
|
|
||||||
note: string;
|
|
||||||
|
|
||||||
@ViewColumn()
|
@ViewColumn()
|
||||||
firstname: string;
|
firstname: string;
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,36 @@
|
||||||
import { DataSource, ViewColumn, ViewEntity } from "typeorm";
|
import { DataSource, ViewColumn, ViewEntity } from "typeorm";
|
||||||
import { membership } from "../entity/club/member/membership";
|
import { membership } from "../entity/club/member/membership";
|
||||||
|
import { DB_TYPE } from "../env.defaults";
|
||||||
|
|
||||||
|
let durationInDays: string;
|
||||||
|
let durationInYears: string;
|
||||||
|
let exactDuration: string;
|
||||||
|
if (DB_TYPE == "postgres") {
|
||||||
|
durationInDays = `SUM(COALESCE("membership"."end", CURRENT_DATE) - "membership"."start") `;
|
||||||
|
durationInYears = `SUM(EXTRACT(YEAR FROM AGE(COALESCE("membership"."end", CURRENT_DATE), "membership"."start")))`;
|
||||||
|
exactDuration = `SUM(AGE(COALESCE("membership"."end", CURRENT_DATE), "membership"."start"))`;
|
||||||
|
} else if (DB_TYPE == "mysql") {
|
||||||
|
durationInDays = `SUM(DATEDIFF(COALESCE(membership.end, CURDATE()), membership.start))`;
|
||||||
|
durationInYears = `SUM(TIMESTAMPDIFF(YEAR, membership.start, COALESCE(membership.end, CURDATE())))`;
|
||||||
|
exactDuration = `
|
||||||
|
CONCAT(
|
||||||
|
SUM(FLOOR(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURDATE())) / 365.25)),
|
||||||
|
' years ',
|
||||||
|
SUM(FLOOR(MOD(TIMESTAMPDIFF(MONTH, membership.start, COALESCE(membership.end, CURDATE())), 12))),
|
||||||
|
' months ',
|
||||||
|
SUM(FLOOR(MOD(TIMESTAMPDIFF(DAY, membership.start, COALESCE(membership.end, CURDATE())), 30))),
|
||||||
|
' days'
|
||||||
|
)
|
||||||
|
`;
|
||||||
|
} else if (DB_TYPE == "sqlite") {
|
||||||
|
durationInDays = `SUM(JULIANDAY(COALESCE(membership.end, DATE('now'))) - JULIANDAY(membership.start))`;
|
||||||
|
durationInYears = `SUM(FLOOR((JULIANDAY(COALESCE(membership.end, DATE('now'))) - JULIANDAY(membership.start)) / 365.25))`;
|
||||||
|
exactDuration = `
|
||||||
|
SUM((strftime('%Y', COALESCE(membership.end, DATE('now'))) - strftime('%Y', membership.start))) || ' years ' ||
|
||||||
|
SUM((strftime('%m', COALESCE(membership.end, DATE('now'))) - strftime('%m', membership.start))) || ' months ' ||
|
||||||
|
SUM((strftime('%d', COALESCE(membership.end, DATE('now'))) - strftime('%d', membership.start))) || ' days'
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
@ViewEntity({
|
@ViewEntity({
|
||||||
expression: (datasource: DataSource) =>
|
expression: (datasource: DataSource) =>
|
||||||
|
@ -14,12 +45,9 @@ import { membership } from "../entity/club/member/membership";
|
||||||
.addSelect("member.nameaffix", "memberNameaffix")
|
.addSelect("member.nameaffix", "memberNameaffix")
|
||||||
.addSelect("member.birthdate", "memberBirthdate")
|
.addSelect("member.birthdate", "memberBirthdate")
|
||||||
.addSelect("salutation.salutation", "memberSalutation")
|
.addSelect("salutation.salutation", "memberSalutation")
|
||||||
.addSelect(`SUM(COALESCE("membership"."end", CURRENT_DATE) - "membership"."start") `, "durationInDays")
|
.addSelect(durationInDays, "durationInDays")
|
||||||
.addSelect(
|
.addSelect(durationInYears, "durationInYears")
|
||||||
`SUM(EXTRACT(YEAR FROM AGE(COALESCE("membership"."end", CURRENT_DATE), "membership"."start")))`,
|
.addSelect(exactDuration, "exactDuration")
|
||||||
"durationInYears"
|
|
||||||
)
|
|
||||||
.addSelect(`SUM(AGE(COALESCE("membership"."end", CURRENT_DATE), "membership"."start"))`, "exactDuration")
|
|
||||||
.leftJoin("membership.status", "status")
|
.leftJoin("membership.status", "status")
|
||||||
.leftJoin("membership.member", "member")
|
.leftJoin("membership.member", "member")
|
||||||
.leftJoin("member.salutation", "salutation")
|
.leftJoin("member.salutation", "salutation")
|
||||||
|
@ -61,55 +89,3 @@ export class membershipView {
|
||||||
@ViewColumn()
|
@ViewColumn()
|
||||||
memberBirthdate: Date;
|
memberBirthdate: Date;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ViewEntity({
|
|
||||||
expression: (datasource: DataSource) =>
|
|
||||||
datasource
|
|
||||||
.getRepository(membership)
|
|
||||||
.createQueryBuilder("membership")
|
|
||||||
.select("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(COALESCE("membership"."end", CURRENT_DATE) - "membership"."start") `, "durationInDays")
|
|
||||||
.addSelect(
|
|
||||||
`SUM(EXTRACT(YEAR FROM AGE(COALESCE("membership"."end", CURRENT_DATE), "membership"."start")))`,
|
|
||||||
"durationInYears"
|
|
||||||
)
|
|
||||||
.addSelect(`SUM(AGE(COALESCE("membership"."end", CURRENT_DATE), "membership"."start"))`, "exactDuration")
|
|
||||||
.leftJoin("membership.status", "status")
|
|
||||||
.leftJoin("membership.member", "member")
|
|
||||||
.leftJoin("member.salutation", "salutation")
|
|
||||||
.groupBy("member.id")
|
|
||||||
.addGroupBy("salutation.id"),
|
|
||||||
})
|
|
||||||
export class membershipTotalView {
|
|
||||||
@ViewColumn()
|
|
||||||
durationInDays: number;
|
|
||||||
|
|
||||||
@ViewColumn()
|
|
||||||
durationInYears: number;
|
|
||||||
|
|
||||||
@ViewColumn()
|
|
||||||
exactDuration: string;
|
|
||||||
|
|
||||||
@ViewColumn()
|
|
||||||
memberId: string;
|
|
||||||
|
|
||||||
@ViewColumn()
|
|
||||||
memberSalutation: string;
|
|
||||||
|
|
||||||
@ViewColumn()
|
|
||||||
memberFirstname: string;
|
|
||||||
|
|
||||||
@ViewColumn()
|
|
||||||
memberLastname: string;
|
|
||||||
|
|
||||||
@ViewColumn()
|
|
||||||
memberNameaffix: string;
|
|
||||||
|
|
||||||
@ViewColumn()
|
|
||||||
memberBirthdate: Date;
|
|
||||||
}
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue