minor v1.3.0 #58
35 changed files with 95 additions and 2517 deletions
|
@ -16,66 +16,36 @@ import { executivePosition } from "./entity/settings/executivePosition";
|
||||||
import { membershipStatus } from "./entity/settings/membershipStatus";
|
import { membershipStatus } from "./entity/settings/membershipStatus";
|
||||||
import { qualification } from "./entity/settings/qualification";
|
import { qualification } from "./entity/settings/qualification";
|
||||||
|
|
||||||
import { Initial1724317398939 } from "./migrations/1724317398939-initial";
|
|
||||||
import { RefreshPrimaryChange1724573307851 } from "./migrations/1724573307851-refreshPrimaryChange";
|
|
||||||
import { Invite1724579024939 } from "./migrations/1724579024939-invite";
|
|
||||||
import { Permissions1724661484664 } from "./migrations/1724661484664-permissions";
|
|
||||||
import { RolePermission1724771491085 } from "./migrations/1724771491085-role_permission";
|
|
||||||
import { MemberBaseData1725435669492 } from "./migrations/1725435669492-member_base_data";
|
|
||||||
import { member } from "./entity/club/member/member";
|
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 { membership } from "./entity/club/member/membership";
|
import { membership } from "./entity/club/member/membership";
|
||||||
import { Memberdata1726301836849 } from "./migrations/1726301836849-memberdata";
|
|
||||||
import { CommunicationFields1727439800630 } from "./migrations/1727439800630-communicationFields";
|
|
||||||
import { Ownership1728313041449 } from "./migrations/1728313041449-ownership";
|
|
||||||
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";
|
||||||
import { protocolDecision } from "./entity/club/protocol/protocolDecision";
|
import { protocolDecision } from "./entity/club/protocol/protocolDecision";
|
||||||
import { protocolPresence } from "./entity/club/protocol/protocolPresence";
|
import { protocolPresence } from "./entity/club/protocol/protocolPresence";
|
||||||
import { protocolVoting } from "./entity/club/protocol/protocolVoting";
|
import { protocolVoting } from "./entity/club/protocol/protocolVoting";
|
||||||
import { protocolPrintout } from "./entity/club/protocol/protocolPrintout";
|
import { protocolPrintout } from "./entity/club/protocol/protocolPrintout";
|
||||||
import { Protocol1729347911107 } from "./migrations/1729347911107-protocol";
|
|
||||||
import { calendar } from "./entity/club/calendar";
|
import { calendar } from "./entity/club/calendar";
|
||||||
import { calendarType } from "./entity/settings/calendarType";
|
import { calendarType } from "./entity/settings/calendarType";
|
||||||
import { Calendar1729947763295 } from "./migrations/1729947763295-calendar";
|
|
||||||
import { reset } from "./entity/reset";
|
import { reset } from "./entity/reset";
|
||||||
import { ResetToken1732358596823 } from "./migrations/1732358596823-resetToken";
|
|
||||||
import { SMSAlarming1732696919191 } from "./migrations/1732696919191-SMSAlarming";
|
|
||||||
import { SecuringCalendarType1733249553766 } from "./migrations/1733249553766-securingCalendarType";
|
|
||||||
import { query } from "./entity/settings/query";
|
import { query } from "./entity/settings/query";
|
||||||
import { QueryStore1734187754677 } from "./migrations/1734187754677-queryStore";
|
|
||||||
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 { membershipView } from "./views/membershipsView";
|
import { membershipView } from "./views/membershipsView";
|
||||||
import { MemberDataViews1734520998539 } from "./migrations/1734520998539-memberDataViews";
|
|
||||||
import { template } from "./entity/settings/template";
|
import { template } from "./entity/settings/template";
|
||||||
import { Template1734854680201 } from "./migrations/1734854680201-template";
|
|
||||||
import { templateUsage } from "./entity/settings/templateUsage";
|
import { templateUsage } from "./entity/settings/templateUsage";
|
||||||
import { TemplateUsage1734949173739 } from "./migrations/1734949173739-templateUsage";
|
|
||||||
import { newsletter } from "./entity/club/newsletter/newsletter";
|
import { newsletter } from "./entity/club/newsletter/newsletter";
|
||||||
import { newsletterDates } from "./entity/club/newsletter/newsletterDates";
|
import { newsletterDates } from "./entity/club/newsletter/newsletterDates";
|
||||||
import { newsletterRecipients } from "./entity/club/newsletter/newsletterRecipients";
|
import { newsletterRecipients } from "./entity/club/newsletter/newsletterRecipients";
|
||||||
import { Newsletter1735118780511 } from "./migrations/1735118780511-newsletter";
|
|
||||||
import { newsletterConfig } from "./entity/settings/newsletterConfig";
|
import { newsletterConfig } from "./entity/settings/newsletterConfig";
|
||||||
import { NewsletterConfig1735207446910 } from "./migrations/1735207446910-newsletterConfig";
|
|
||||||
import { InternalId1735822722235 } from "./migrations/1735822722235-internalId";
|
|
||||||
import { PostalCode1735927918979 } from "./migrations/1735927918979-postalCode";
|
|
||||||
import { ProtocolAbsent1736072179716 } from "./migrations/1736072179716-protocolAbsent";
|
|
||||||
import { Memberlist1736079005086 } from "./migrations/1736079005086-memberlist";
|
|
||||||
import { ExtendViewValues1736084198860 } from "./migrations/1736084198860-extendViewValues";
|
|
||||||
import { FinishInternalIdTransfer1736505324488 } from "./migrations/1736505324488-finishInternalIdTransfer";
|
|
||||||
import { ProtocolPresenceExcuse1737287798828 } from "./migrations/1737287798828-protocolPresenceExcuse";
|
|
||||||
import { webapi } from "./entity/user/webapi";
|
import { webapi } from "./entity/user/webapi";
|
||||||
import { webapiPermission } from "./entity/user/webapi_permission";
|
import { webapiPermission } from "./entity/user/webapi_permission";
|
||||||
import { AddWebapiTokens1737453096674 } from "./migrations/1737453096674-addwebapiTokens";
|
|
||||||
import { salutation } from "./entity/settings/salutation";
|
import { salutation } from "./entity/settings/salutation";
|
||||||
import { SalutationAsTable1737796878058 } from "./migrations/1737796878058-salutationAsTable";
|
|
||||||
import { UpdateViews1737800468938 } from "./migrations/1737800468938-updateViews";
|
import { BackupAndResetDatabase1738166124200 } from "./migrations/1738166124200-BackupAndResetDatabase";
|
||||||
import { MoveSendNewsletterFlag1737816852011 } from "./migrations/1737816852011-moveSendNewsletterFlag";
|
|
||||||
import { UniqueFields1738057119384 } from "./migrations/1738057119384-UniqueFields";
|
|
||||||
|
|
||||||
const dataSource = new DataSource({
|
const dataSource = new DataSource({
|
||||||
type: DB_TYPE as any,
|
type: DB_TYPE as any,
|
||||||
|
@ -129,43 +99,47 @@ const dataSource = new DataSource({
|
||||||
webapi,
|
webapi,
|
||||||
webapiPermission,
|
webapiPermission,
|
||||||
],
|
],
|
||||||
migrations: [
|
migrations: [BackupAndResetDatabase1738166124200],
|
||||||
Initial1724317398939,
|
|
||||||
RefreshPrimaryChange1724573307851,
|
|
||||||
Invite1724579024939,
|
|
||||||
Permissions1724661484664,
|
|
||||||
RolePermission1724771491085,
|
|
||||||
MemberBaseData1725435669492,
|
|
||||||
Memberdata1726301836849,
|
|
||||||
CommunicationFields1727439800630,
|
|
||||||
Ownership1728313041449,
|
|
||||||
Protocol1729347911107,
|
|
||||||
Calendar1729947763295,
|
|
||||||
ResetToken1732358596823,
|
|
||||||
SMSAlarming1732696919191,
|
|
||||||
SecuringCalendarType1733249553766,
|
|
||||||
QueryStore1734187754677,
|
|
||||||
MemberDataViews1734520998539,
|
|
||||||
Template1734854680201,
|
|
||||||
TemplateUsage1734949173739,
|
|
||||||
Newsletter1735118780511,
|
|
||||||
NewsletterConfig1735207446910,
|
|
||||||
InternalId1735822722235,
|
|
||||||
PostalCode1735927918979,
|
|
||||||
ProtocolAbsent1736072179716,
|
|
||||||
Memberlist1736079005086,
|
|
||||||
ExtendViewValues1736084198860,
|
|
||||||
FinishInternalIdTransfer1736505324488,
|
|
||||||
ProtocolPresenceExcuse1737287798828,
|
|
||||||
AddWebapiTokens1737453096674,
|
|
||||||
SalutationAsTable1737796878058,
|
|
||||||
UpdateViews1737800468938,
|
|
||||||
MoveSendNewsletterFlag1737816852011,
|
|
||||||
UniqueFields1738057119384,
|
|
||||||
],
|
|
||||||
migrationsRun: true,
|
migrationsRun: true,
|
||||||
migrationsTransactionMode: "each",
|
migrationsTransactionMode: "each",
|
||||||
subscribers: [],
|
subscribers: [],
|
||||||
});
|
});
|
||||||
|
|
||||||
export { dataSource };
|
type ORMType = "int" | "bigint" | "boolean" | "date" | "datetime" | "text" | "varchar";
|
||||||
|
function getTypeByORM(type: ORMType): string {
|
||||||
|
const dbType = process.env.DB_TYPE;
|
||||||
|
|
||||||
|
const typeMap: Record<string, Record<ORMType, string>> = {
|
||||||
|
mysql: {
|
||||||
|
int: "int",
|
||||||
|
bigint: "bigint",
|
||||||
|
boolean: "tinyint",
|
||||||
|
date: "date",
|
||||||
|
datetime: "datetime",
|
||||||
|
text: "text",
|
||||||
|
varchar: "varchar",
|
||||||
|
},
|
||||||
|
postgres: {
|
||||||
|
int: "integer",
|
||||||
|
bigint: "bigint",
|
||||||
|
boolean: "boolean",
|
||||||
|
date: "date",
|
||||||
|
datetime: "timestamp",
|
||||||
|
text: "text",
|
||||||
|
varchar: "varchar",
|
||||||
|
},
|
||||||
|
sqlite: {
|
||||||
|
int: "integer",
|
||||||
|
bigint: "integer",
|
||||||
|
boolean: "integer",
|
||||||
|
date: "text",
|
||||||
|
datetime: "text",
|
||||||
|
text: "text",
|
||||||
|
varchar: "text",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
return typeMap[dbType]?.[type] || type;
|
||||||
|
}
|
||||||
|
|
||||||
|
export { dataSource, getTypeByORM };
|
||||||
|
|
|
@ -21,7 +21,7 @@ declare global {
|
||||||
import { dataSource } from "./data-source";
|
import { dataSource } from "./data-source";
|
||||||
import BackupHelper from "./helpers/backupHelper";
|
import BackupHelper from "./helpers/backupHelper";
|
||||||
dataSource.initialize().then(async () => {
|
dataSource.initialize().then(async () => {
|
||||||
if ((BACKUP_AUTO_RESTORE as "true" | "false") == "true") {
|
if ((BACKUP_AUTO_RESTORE as "true" | "false") == "true" && (await dataSource.createQueryRunner().hasTable("user"))) {
|
||||||
await BackupHelper.autoRestoreBackup().catch((err) => {
|
await BackupHelper.autoRestoreBackup().catch((err) => {
|
||||||
console.log(`${new Date().toISOString()}: failed auto-restoring database`);
|
console.log(`${new Date().toISOString()}: failed auto-restoring database`);
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,55 +0,0 @@
|
||||||
import { MigrationInterface, QueryRunner, Table, TableForeignKey } from "typeorm";
|
|
||||||
import { DB_TYPE } from "../env.defaults";
|
|
||||||
|
|
||||||
export class Initial1724317398939 implements MigrationInterface {
|
|
||||||
name = "Initial1724317398939";
|
|
||||||
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
const variableType_int = DB_TYPE == "mysql" ? "int" : "integer";
|
|
||||||
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: "user",
|
|
||||||
columns: [
|
|
||||||
{ name: "id", type: variableType_int, isPrimary: true, isGenerated: true, generationStrategy: "increment" },
|
|
||||||
{ name: "mail", type: "varchar", length: "255", isNullable: false },
|
|
||||||
{ name: "username", type: "varchar", length: "255", isNullable: false },
|
|
||||||
{ name: "secret", type: "varchar", length: "255", isNullable: false },
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
true
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: "refresh",
|
|
||||||
columns: [
|
|
||||||
{ name: "id", type: variableType_int, isPrimary: true, isGenerated: true, generationStrategy: "increment" },
|
|
||||||
{ name: "token", type: "varchar", length: "255", isNullable: false },
|
|
||||||
{ name: "expiry", type: "datetime", isNullable: false },
|
|
||||||
{ name: "userId", type: variableType_int, isNullable: false },
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
true
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
"refresh",
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ["userId"],
|
|
||||||
referencedColumnNames: ["id"],
|
|
||||||
referencedTableName: "user",
|
|
||||||
onDelete: "CASCADE",
|
|
||||||
onUpdate: "RESTRICT",
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
const table = await queryRunner.getTable("refresh");
|
|
||||||
const foreignKey = table.foreignKeys.find((fk) => fk.columnNames.indexOf("userId") !== -1);
|
|
||||||
await queryRunner.dropForeignKey("refresh", foreignKey);
|
|
||||||
await queryRunner.dropTable("refresh");
|
|
||||||
await queryRunner.dropTable("user");
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,28 +0,0 @@
|
||||||
import { MigrationInterface, QueryRunner, TableColumn } from "typeorm";
|
|
||||||
import { DB_TYPE } from "../env.defaults";
|
|
||||||
|
|
||||||
export class RefreshPrimaryChange1724573307851 implements MigrationInterface {
|
|
||||||
name = "RefreshPrimaryChange1724573307851";
|
|
||||||
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropColumn("refresh", "id");
|
|
||||||
await queryRunner.createPrimaryKey("refresh", ["token", "userId"]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
const variableType_int = DB_TYPE == "mysql" ? "int" : "integer";
|
|
||||||
|
|
||||||
await queryRunner.dropPrimaryKey("refresh");
|
|
||||||
await queryRunner.addColumn(
|
|
||||||
"refresh",
|
|
||||||
new TableColumn({
|
|
||||||
name: "id",
|
|
||||||
type: variableType_int,
|
|
||||||
isPrimary: true,
|
|
||||||
isNullable: false,
|
|
||||||
isGenerated: true,
|
|
||||||
generationStrategy: "increment",
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,42 +0,0 @@
|
||||||
import { MigrationInterface, QueryRunner, Table, TableColumn } from "typeorm";
|
|
||||||
|
|
||||||
export class Invite1724579024939 implements MigrationInterface {
|
|
||||||
name = "Invite1724579024939";
|
|
||||||
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: "invite",
|
|
||||||
columns: [
|
|
||||||
{ name: "mail", type: "varchar", length: "255", isPrimary: true, isNullable: false },
|
|
||||||
{ name: "token", type: "varchar", length: "255", isNullable: false },
|
|
||||||
{ name: "username", type: "varchar", length: "255", isNullable: false },
|
|
||||||
{ name: "firstname", type: "varchar", length: "255", isNullable: false },
|
|
||||||
{ name: "lastname", type: "varchar", length: "255", isNullable: false },
|
|
||||||
{ name: "secret", type: "varchar", length: "255", isNullable: false },
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
true
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.addColumns("user", [
|
|
||||||
new TableColumn({
|
|
||||||
name: "firstname",
|
|
||||||
type: "varchar",
|
|
||||||
length: "255",
|
|
||||||
isNullable: false,
|
|
||||||
}),
|
|
||||||
new TableColumn({
|
|
||||||
name: "lastname",
|
|
||||||
type: "varchar",
|
|
||||||
length: "255",
|
|
||||||
isNullable: false,
|
|
||||||
}),
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
await queryRunner.dropColumns("user", ["lastname", "firstname"]);
|
|
||||||
await queryRunner.dropTable("invite");
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,45 +0,0 @@
|
||||||
import { MigrationInterface, QueryRunner, Table, TableForeignKey } from "typeorm";
|
|
||||||
import { DB_TYPE } from "../env.defaults";
|
|
||||||
|
|
||||||
export class Permissions1724661484664 implements MigrationInterface {
|
|
||||||
name = "Permissions1724661484664";
|
|
||||||
|
|
||||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
const variableType_int = DB_TYPE == "mysql" ? "int" : "integer";
|
|
||||||
|
|
||||||
await queryRunner.createTable(
|
|
||||||
new Table({
|
|
||||||
name: "permission",
|
|
||||||
columns: [
|
|
||||||
{
|
|
||||||
name: "permission",
|
|
||||||
type: "varchar",
|
|
||||||
length: "255",
|
|
||||||
isPrimary: true,
|
|
||||||
isNullable: false,
|
|
||||||
},
|
|
||||||
{ name: "userId", type: variableType_int, isPrimary: true, isNullable: false },
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
true
|
|
||||||
);
|
|
||||||
|
|
||||||
await queryRunner.createForeignKey(
|
|
||||||
"permission",
|
|
||||||
new TableForeignKey({
|
|
||||||
columnNames: ["userId"],
|
|
||||||
referencedColumnNames: ["id"],
|
|
||||||
referencedTableName: "user",
|
|
||||||
onDelete: "CASCADE",
|
|
||||||
onUpdate: "RESTRICT",
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
||||||
const table = await queryRunner.getTable("permission");
|
|
||||||
const foreignKey = table.foreignKeys.find |