Files
varo-website/src/db/schema/feedback.ts
bytedream e47268111a
All checks were successful
deploy / build-and-deploy (push) Successful in 23s
refactor admin crud popups
2025-05-21 17:22:40 +02:00

76 lines
2.2 KiB
TypeScript

import { int, mysqlTable, text, timestamp, varchar } from 'drizzle-orm/mysql-core';
import { user } from './user.ts';
import type { MySql2Database } from 'drizzle-orm/mysql2';
import { eq, inArray } from 'drizzle-orm';
import { generateRandomString } from '@util/random.ts';
type Database = MySql2Database<{ feedback: typeof feedback }>;
export const feedback = mysqlTable('feedback', {
id: int('id').primaryKey().autoincrement(),
event: varchar('event', { length: 255 }).notNull(),
title: varchar('title', { length: 255 }),
content: text('content'),
urlHash: varchar('url_hash', { length: 255 }).unique().notNull(),
lastChanged: timestamp('last_changed', { mode: 'date' }).notNull().defaultNow(),
userId: int('user_id').references(() => user.id)
});
export type AddFeedbackReq = {
event: string;
content: string;
};
export type AddUserFeedbacksReq = {
event: string;
title: string;
uuids: string[];
};
export type GetFeedbacksReq = {};
export async function addFeedback(db: Database, values: AddFeedbackReq) {
return db.insert(feedback).values({
event: values.event,
content: values.content,
urlHash: generateRandomString(16)
});
}
export async function addUserFeedbacks(db: Database, values: AddUserFeedbacksReq) {
const users = await db.select({ id: user.id, uuid: user.uuid }).from(user).where(inArray(user.uuid, values.uuids));
const userFeedbacks = users.map((user) => ({
id: user.id,
uuid: user.uuid!,
urlHash: generateRandomString(16)
}));
await db.insert(feedback).values(
userFeedbacks.map((feedback) => ({
event: values.event,
title: values.title,
urlHash: feedback.urlHash,
userId: feedback.id
}))
);
return userFeedbacks;
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
export async function getFeedbacks(db: Database, values: GetFeedbacksReq) {
return db
.select({
id: feedback.id,
event: feedback.event,
title: feedback.title,
content: feedback.content,
urlHash: feedback.urlHash,
lastChanged: feedback.lastChanged,
username: user.username
})
.from(feedback)
.leftJoin(user, eq(feedback.userId, user.id));
}