print pdfs and send mails with ics file

This commit is contained in:
Julian Krauser 2024-12-30 14:47:00 +01:00
parent 5f827fb177
commit 728c4e05fa
12 changed files with 461 additions and 183 deletions

View file

@ -279,4 +279,91 @@ export default abstract class DynamicQueryBuilder {
return flattenedResults;
}
public static async executeQuery(
query: string | DynamicQueryStructure,
offset: number,
count: number
): Promise<
| {
stats: "error";
sql: string;
code: string;
msg: string;
}
| {
stats: "success";
rows: Array<{ [key: string]: FieldType }>;
total: number;
offset: number;
count: number;
}
> {
if (typeof query == "string") {
const upperQuery = query.trim().toUpperCase();
if (!upperQuery.startsWith("SELECT") || /INSERT|UPDATE|DELETE|ALTER|DROP|CREATE|TRUNCATE/.test(upperQuery)) {
return {
stats: "error",
sql: query,
code: "UNALLOWED",
msg: "Not allowed to change rows",
};
}
try {
let data: Array<any> = [];
return await dataSource
.transaction(async (manager) => {
data = await manager.query(query);
throw new Error("AllwaysRollbackQuery");
})
.catch((error) => {
if (error.message === "AllwaysRollbackQuery") {
return {
stats: "success",
rows: data,
total: data.length,
offset: offset,
count: count,
};
} else {
return {
stats: "error",
sql: error.sql,
code: error.code,
msg: error.sqlMessage,
};
}
});
} catch (error) {
return {
stats: "error",
sql: error.sql,
code: error.code,
msg: error.sqlMessage,
};
}
} else {
try {
let [rows, total] = await this.buildQuery(query, offset, count).getManyAndCount();
return {
stats: "success",
rows: this.flattenQueryResult(rows),
total: total,
offset: offset,
count: count,
};
} catch (error) {
return {
stats: "error",
sql: error.sql,
code: error.code,
msg: error.sqlMessage,
};
}
}
}
}