76 lines
2.2 KiB
TypeScript
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));
|
|
}
|