change: make query id to uuid

This commit is contained in:
Julian Krauser 2025-03-26 09:10:08 +01:00
parent c0a0365406
commit df231d6462
12 changed files with 119 additions and 20 deletions

View file

@ -9,7 +9,7 @@ export interface SynchronizeNewsletterCommand {
newsletterTitle: string;
newsletterText: string;
newsletterSignatur: string;
recipientsByQueryId?: number;
recipientsByQueryId?: string;
}
export interface SendNewsletterCommand {

View file

@ -6,10 +6,10 @@ export interface CreateQueryStoreCommand {
}
export interface UpdateQueryStoreCommand {
id: number;
id: string;
query: string | DynamicQueryStructure;
}
export interface DeleteQueryStoreCommand {
id: number;
id: string;
}

View file

@ -328,7 +328,7 @@ export async function synchronizeNewsletterById(req: Request, res: Response): Pr
let newsletterTitle = req.body.newsletterTitle;
let newsletterText = req.body.newsletterText;
let newsletterSignatur = req.body.newsletterSignatur;
let recipientsByQueryId = req.body.recipientsByQueryId ?? null;
let recipientsByQueryId = req.body.recipientsByQueryId || null;
let syncNewsletter: SynchronizeNewsletterCommand = {
id,

View file

@ -27,7 +27,7 @@ export async function getAllQueryStores(req: Request, res: Response): Promise<an
* @returns {Promise<*>}
*/
export async function getQueryStoreById(req: Request, res: Response): Promise<any> {
const id = parseInt(req.params.id);
const id = req.params.id;
let queryStore = await QueryStoreService.getById(id);
@ -61,7 +61,7 @@ export async function createQueryStore(req: Request, res: Response): Promise<any
* @returns {Promise<*>}
*/
export async function updateQueryStore(req: Request, res: Response): Promise<any> {
const id = parseInt(req.params.id);
const id = req.params.id;
const query = req.body.query;
let updateQueryStore: UpdateQueryStoreCommand = {
@ -81,7 +81,7 @@ export async function updateQueryStore(req: Request, res: Response): Promise<any
* @returns {Promise<*>}
*/
export async function deleteQueryStore(req: Request, res: Response): Promise<any> {
const id = parseInt(req.params.id);
const id = req.params.id;
let deleteQueryStore: DeleteQueryStoreCommand = {
id: id,

View file

@ -48,6 +48,7 @@ import { salutation } from "./entity/configuration/salutation";
import { BackupAndResetDatabase1738166124200 } from "./migrations/1738166124200-BackupAndResetDatabase";
import { CreateSchema1738166167472 } from "./migrations/1738166167472-CreateSchema";
import { TemplatesAndProtocolSort1742549956787 } from "./migrations/1742549956787-templatesAndProtocolSort";
import { QueryToUUID1742922178643 } from "./migrations/1742922178643-queryToUUID";
const dataSource = new DataSource({
type: DB_TYPE as any,
@ -101,7 +102,12 @@ const dataSource = new DataSource({
webapi,
webapiPermission,
],
migrations: [BackupAndResetDatabase1738166124200, CreateSchema1738166167472, TemplatesAndProtocolSort1742549956787],
migrations: [
BackupAndResetDatabase1738166124200,
CreateSchema1738166167472,
TemplatesAndProtocolSort1742549956787,
QueryToUUID1742922178643,
],
migrationsRun: true,
migrationsTransactionMode: "each",
subscribers: [],

View file

@ -1,6 +1,5 @@
import { Column, Entity, ManyToOne, OneToMany, PrimaryColumn } from "typeorm";
import { newsletterDates } from "./newsletterDates";
import { member } from "../member/member";
import { newsletterRecipients } from "./newsletterRecipients";
import { query } from "../../configuration/query";
@ -27,8 +26,8 @@ export class newsletter {
@Column({ type: "boolean", default: false })
isSent: boolean;
@Column({ type: "int", nullable: true })
recipientsByQueryId?: number;
@Column({ nullable: true })
recipientsByQueryId?: string;
@OneToMany(() => newsletterDates, (dates) => dates.newsletter, { cascade: ["insert"] })
dates: newsletterDates[];

View file

@ -2,8 +2,8 @@ import { Column, Entity, PrimaryColumn } from "typeorm";
@Entity()
export class query {
@PrimaryColumn({ generated: "increment", type: "int" })
id: number;
@PrimaryColumn({ generated: "uuid", type: "varchar" })
id: string;
@Column({ type: "varchar", length: 255, unique: true })
title: string;

View file

@ -212,7 +212,7 @@ export default abstract class BackupHelper {
case "calendar":
return await this.getCalendar();
case "query":
return await this.getQueryStore();
return await this.getQueryStore(collectIds);
case "template":
return await this.getTemplate();
case "user":
@ -348,7 +348,7 @@ export default abstract class BackupHelper {
"member.birthdate",
"member.internalId",
])
.addSelect(["recipientsByQuery.title", "recipientsByQuery.query"])
.addSelect([...(collectIds ? ["query.id"] : []), "recipientsByQuery.title", "recipientsByQuery.query"])
.getMany()
.then((res: any) =>
res.map((n: any) => ({
@ -393,8 +393,8 @@ export default abstract class BackupHelper {
.getMany(),
};
}
private static async getQueryStore(): Promise<Array<any>> {
return await dataSource.getRepository("query").find({ select: { title: true, query: true } });
private static async getQueryStore(collectIds: boolean): Promise<Array<any>> {
return await dataSource.getRepository("query").find({ select: { id: collectIds, title: true, query: true } });
}
private static async getTemplate(): Promise<{ [key: string]: Array<any> }> {
return {

View 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.createQueryBuilder().insert().into("query").values(entries).execute();
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",
})
);
}
}

View file

@ -26,7 +26,7 @@ export default abstract class QueryStoreService {
* @description get queryStore by id
* @returns {Promise<query>}
*/
static async getById(id: number): Promise<query> {
static async getById(id: string): Promise<query> {
return await dataSource
.getRepository(query)
.createQueryBuilder("queryStore")

View file

@ -8,6 +8,6 @@ export interface NewsletterViewModel {
newsletterText: string;
newsletterSignatur: string;
isSent: boolean;
recipientsByQueryId?: number;
recipientsByQueryId?: string;
recipientsByQuery?: QueryStoreViewModel;
}

View file

@ -1,7 +1,7 @@
import { DynamicQueryStructure } from "../../../type/dynamicQueries";
export interface QueryStoreViewModel {
id: number;
id: string;
title: string;
query: string | DynamicQueryStructure;
}