atproto pastebin service: https://plonk.li

use local index for all views

Changed files
+56 -57
src
+52 -53
src/routes.ts
··· 132 132 133 133 router.get("/u/:authorDid", async (req, res) => { 134 134 const { authorDid } = req.params; 135 - const resolver = new DidResolver({}); 136 - const didDocument = await resolver.resolve(authorDid); 137 - if (!didDocument) { 138 - return res.status(404); 139 - } 140 - const pds = getPds(didDocument); 141 - if (!pds) { 142 - return res.status(404); 143 - } 144 - const agent = new Agent(pds); 145 - const response = await agent.com.atproto.repo.listRecords({ 146 - repo: authorDid, 147 - collection: "li.plonk.paste", 148 - limit: 99, 149 - }); 150 - const pastes = response.data.records; 135 + const pastes = await ctx.db 136 + .selectFrom("paste") 137 + .selectAll() 138 + .where("authorDid", "=", authorDid) 139 + .execute(); 151 140 let didHandleMap = {}; 152 141 didHandleMap[authorDid] = await ctx.resolver.resolveDidToHandle(authorDid); 153 142 const ownAgent = await getSessionAgent(req, res, ctx); ··· 164 153 const { shortUrl } = req.params; 165 154 const ret = await ctx.db 166 155 .selectFrom("paste") 156 + .leftJoin("comment", "comment.pasteUri", "paste.uri") 157 + .select([ 158 + "paste.uri as pasteUri", 159 + "comment.pasteCid as pasteCid", 160 + "paste.authorDid as pasteAuthorDid", 161 + "paste.code as pasteCode", 162 + "paste.lang as pasteLang", 163 + "paste.title as pasteTitle", 164 + "paste.createdAt as pasteCreatedAt", 165 + "comment.uri as commentUri", 166 + "comment.authorDid as commentAuthorDid", 167 + "comment.body as commentBody", 168 + "comment.createdAt as commentCreatedAt", 169 + ]) 167 170 .where("shortUrl", "=", shortUrl) 168 - .select(["authorDid", "uri"]) 169 - .executeTakeFirst(); 170 - if (!ret) { 171 + .execute(); 172 + if (ret.length === 0) { 171 173 return res.status(404); 172 174 } 173 - var comments = await ctx.db 174 - .selectFrom("comment") 175 - .selectAll() 176 - .where("pasteUri", "=", ret.uri) 177 - .execute(); 178 - const { authorDid: did, uri } = ret; 175 + const { 176 + pasteAuthorDid, 177 + pasteUri, 178 + pasteCode, 179 + pasteLang, 180 + pasteTitle, 181 + pasteCreatedAt, 182 + } = ret[0]; 179 183 let didHandleMap = await ctx.resolver.resolveDidsToHandles( 180 - comments.map((c) => c.authorDid).concat([did]), 184 + [ret[0].pasteAuthorDid].concat( 185 + ret.flatMap((row) => 186 + row.commentAuthorDid ? [row.commentAuthorDid] : [], 187 + ), 188 + ), 181 189 ); 182 - const resolver = new DidResolver({}); 183 - const didDocument = await resolver.resolve(did); 184 - if (!didDocument) { 185 - return res.status(404); 186 - } 187 - const pds = getPds(didDocument); 188 - if (!pds) { 189 - return res.status(404); 190 - } 191 - const agent = new Agent(pds); 192 - const aturi = new AtUri(uri); 193 - const response = await agent.com.atproto.repo.getRecord({ 194 - repo: aturi.hostname, 195 - collection: aturi.collection, 196 - rkey: aturi.rkey, 197 - }); 198 190 199 - const paste = 200 - Paste.isRecord(response.data.value) && 201 - Paste.validateRecord(response.data.value).success 202 - ? response.data.value 203 - : {}; 191 + const paste = { 192 + uri: pasteUri, 193 + code: pasteCode, 194 + title: pasteTitle, 195 + lang: pasteLang, 196 + shortUrl, 197 + createdAt: pasteCreatedAt, 198 + authorDid: pasteAuthorDid, 199 + }; 200 + 201 + const comments = ret.map((row) => { 202 + return { 203 + uri: row.commentUri, 204 + authorDid: row.commentAuthorDid, 205 + body: row.commentBody, 206 + createdAt: row.commentCreatedAt, 207 + }; 208 + }); 204 209 205 210 const ownAgent = await getSessionAgent(req, res, ctx); 206 211 if (!ownAgent) { 207 212 return res.render("paste", { 208 213 paste, 209 - authorDid: did, 210 - uri: response.data.uri, 211 214 didHandleMap, 212 - shortUrl, 213 215 comments, 214 216 }); 215 217 } else { ··· 217 219 didHandleMap[ownDid] = await ctx.resolver.resolveDidToHandle(ownDid); 218 220 return res.render("paste", { 219 221 paste, 220 - authorDid: did, 221 - uri: response.data.uri, 222 222 ownDid, 223 223 didHandleMap, 224 - shortUrl, 225 224 comments, 226 225 }); 227 226 }
+3 -3
src/views/paste.pug
··· 10 10 +header(ownDid, didHandleMap) 11 11 h1 #{paste.title} 12 12 p 13 - | by @#{didHandleMap[authorDid]} · 13 + | by @#{didHandleMap[paste.authorDid]} · 14 14 | #{timeDifference(now, Date.parse(paste.createdAt))} ago · 15 15 | #{paste.lang} · 16 16 | #{paste.code.split('\n').length} loc · 17 - a(href=`/r/${shortUrl}`) raw 17 + a(href=`/r/${paste.shortUrl}`) raw 18 18 pre 19 19 | #{paste.code} 20 20 hr ··· 29 29 | #{comment.body} 30 30 hr 31 31 32 - form(action=`/${encodeURIComponent(uri)}/comment` method="post").post-form 32 + form(action=`/${encodeURIComponent(paste.uri)}/comment` method="post").post-form 33 33 div.post-row 34 34 textarea#code(name="comment" rows="5" placeholder="add a comment" required).post-input-code 35 35
+1 -1
src/views/user.pug
··· 13 13 h1 plonks by @#{handle} 14 14 div.timeline 15 15 each paste in pastes 16 - +post(paste.value, handle, authorDid) 16 + +post(paste, handle, authorDid)