A simple AtProto app to read pet.mewsse.link records on my PDS.
1
2import { IncomingMessage, ServerResponse } from "node:http"
3import path from "node:path"
4import { Eta } from "eta"
5
6import type { Context } from "./index.ts"
7
8export const createRoutes = (ctx: Context) => {
9 const eta = new Eta({ views: path.join(import.meta.dirname, "views") })
10 const itemPerPages = parseInt(process.env.ITEM_PER_PAGES || "10", 10)
11
12 async function renderPage (
13 req:IncomingMessage,
14 res:ServerResponse<IncomingMessage>,
15 params:{[key:string]: string} | undefined
16 ) {
17 const offset = params ? (parseInt(params?.page, 10) - 1) * itemPerPages : 0
18
19 const links = await ctx.db
20 .selectFrom("links")
21 .selectAll()
22 .orderBy("createdAt", "desc")
23 .offset(offset)
24 .limit(itemPerPages)
25 .execute()
26
27 const totalLink = await ctx.db
28 .selectFrom("links")
29 .select(ctx.db.fn.countAll().as("count"))
30 .executeTakeFirstOrThrow()
31
32 const pages = Math.ceil(parseInt(totalLink.count.toString(), 10) / itemPerPages)
33
34 const body = eta.render("./main", {
35 items: links,
36 pages: Array.from(Array(pages).keys()),
37 selected: parseInt(params?.page || "0", 10) - 1
38 })
39
40 res.writeHead(200, { 'Content-Type': 'text/html' })
41 res.end(body)
42 }
43
44 ctx.httpServer.get('/', async (req, res, params) => {
45 await renderPage(req, res, params)
46 })
47
48 ctx.httpServer.get('/page/{page:number}', async (req, res, params) => {
49 await renderPage(req, res, params)
50 })
51
52 ctx.httpServer.get('/feed.atom', async (req, res, params) => {
53 const links = await ctx.db
54 .selectFrom("links")
55 .selectAll()
56 .orderBy("createdAt", "desc")
57 .limit(20)
58 .execute()
59
60 const date = new Date(links[0].createdAt);
61
62 const body = eta.render("./feed", {
63 items: links,
64 date
65 })
66 res.writeHead(200, { 'Content-Type': 'application/atom+xml' })
67 res.end(body)
68
69 res.end()
70 })
71}