-
Notifications
You must be signed in to change notification settings - Fork 643
/
Copy pathunspecced.ts
90 lines (79 loc) · 2.78 KB
/
unspecced.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
import { Server } from '../../../../lexicon'
import { FeedKeyset, composeFeed } from './util/feed'
import { paginate } from '../../../../db/pagination'
import AppContext from '../../../../context'
import { FeedRow } from '../../../services/feed'
import { FeedViewPost } from '../../../../lexicon/types/app/bsky/feed/defs'
import { NotEmptyArray } from '@atproto/common'
const NO_WHATS_HOT_LABELS: NotEmptyArray<string> = [
'!no-promote',
'corpse',
'self-harm',
]
const NSFW_LABELS = ['porn', 'sexual']
// THIS IS A TEMPORARY UNSPECCED ROUTE
export default function (server: Server, ctx: AppContext) {
server.app.bsky.unspecced.getPopular({
auth: ctx.accessVerifier,
handler: async ({ params, auth }) => {
const { limit, cursor, includeNsfw } = params
const requester = auth.credentials.did
const db = ctx.db.db
const { ref } = db.dynamic
const feedService = ctx.services.appView.feed(ctx.db)
const actorService = ctx.services.appView.actor(ctx.db)
const labelService = ctx.services.appView.label(ctx.db)
const labelsToFilter = includeNsfw
? NO_WHATS_HOT_LABELS
: [...NO_WHATS_HOT_LABELS, ...NSFW_LABELS]
const postsQb = feedService
.selectPostQb()
.leftJoin('post_agg', 'post_agg.uri', 'post.uri')
.where('post_agg.likeCount', '>=', 12)
.whereNotExists((qb) =>
qb
.selectFrom('label')
.selectAll()
.where('val', 'in', labelsToFilter)
.where((clause) =>
clause
.whereRef('label.uri', '=', ref('post.creator'))
.orWhereRef('label.uri', '=', ref('post.uri')),
),
)
.whereNotExists(
db
.selectFrom('mute')
.selectAll()
.where('mutedByDid', '=', requester)
.whereRef('did', '=', ref('post.creator')),
)
.whereNotExists(actorService.blockQb(requester, [ref('post.creator')]))
const keyset = new FeedKeyset(ref('sortAt'), ref('cid'))
let feedQb = ctx.db.db.selectFrom(postsQb.as('feed_items')).selectAll()
feedQb = paginate(feedQb, { limit, cursor, keyset })
const feedItems: FeedRow[] = await feedQb.execute()
const feed: FeedViewPost[] = await composeFeed(
feedService,
labelService,
feedItems,
requester,
)
const noRecordEmbeds = feed.map((post) => {
delete post.post.record['embed']
if (post.reply) {
delete post.reply.parent.record['embed']
delete post.reply.root.record['embed']
}
return post
})
return {
encoding: 'application/json',
body: {
feed: noRecordEmbeds,
cursor: keyset.packFromResult(feedItems),
},
}
},
})
}