responsive

This commit is contained in:
HPL-JesusCastro
2026-05-23 01:21:15 +08:00
parent ae2d6fa158
commit 6446609119
8 changed files with 568 additions and 112 deletions

View File

@@ -14,17 +14,35 @@ export async function letterRoutes(app: FastifyInstance) {
// GET /api/letters
app.get("/api/letters", async () => {
return db
const rows = await db
.select({
id: letters.id,
letterDate: letters.letterDate,
createdAt: letters.createdAt,
deliverAt: letters.deliverAt,
readAt: letters.readAt,
content: letters.content,
})
.from(letters)
.where(sql`(${letters.deliverAt} IS NULL OR ${letters.deliverAt} <= ${utcDate()})`)
.orderBy(sql`COALESCE(${letters.letterDate}, DATE(${letters.createdAt})) DESC`);
return rows.map((r) => ({
id: r.id,
letterDate: r.letterDate,
createdAt: r.createdAt,
deliverAt: r.deliverAt,
readAt: r.readAt,
snippet: r.content
.replace(/<[^>]+>/g, "")
.replace(/&nbsp;/g, " ")
.replace(/&amp;/g, "&")
.replace(/&lt;/g, "<")
.replace(/&gt;/g, ">")
.replace(/\s+/g, " ")
.trim()
.slice(0, 120),
}));
});
// GET /api/letters/calendar
@@ -70,6 +88,19 @@ export async function letterRoutes(app: FastifyInstance) {
return { current, longest };
});
// POST /api/letters/:id/unread — reader marks a letter as unread
app.post<{ Params: { id: string } }>("/api/letters/:id/unread", async (req, reply) => {
const { role } = req.user as { role: string };
if (role !== "reader") {
return reply.code(403).send({ error: "Only readers can mark letters as unread" });
}
const id = parseInt(req.params.id, 10);
const rows = await db.select({ id: letters.id }).from(letters).where(eq(letters.id, id));
if (!rows[0]) return reply.code(404).send({ error: "Letter not found" });
await db.update(letters).set({ readAt: null }).where(eq(letters.id, id));
return { ok: true };
});
// GET /api/letters/:id
app.get<{ Params: { id: string } }>("/api/letters/:id", async (req, reply) => {
const id = parseInt(req.params.id, 10);
@@ -87,10 +118,9 @@ export async function letterRoutes(app: FastifyInstance) {
// Mark as read when the reader opens a letter for the first time
const { role } = req.user as { role: string };
if (role === "reader" && !rows[0].readAt) {
await db
.update(letters)
.set({ readAt: new Date().toISOString() })
.where(eq(letters.id, id));
const readAt = new Date().toISOString();
await db.update(letters).set({ readAt }).where(eq(letters.id, id));
return { ...rows[0], readAt };
}
return rows[0];