responsive
This commit is contained in:
@@ -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(/ /g, " ")
|
||||
.replace(/&/g, "&")
|
||||
.replace(/</g, "<")
|
||||
.replace(/>/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];
|
||||
|
||||
Reference in New Issue
Block a user