+52
-53
src/routes.ts
+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
+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