A simple AtProto app to read pet.mewsse.link records on my PDS.
at main 1.9 kB view raw
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}