@atproto/ozone 0.2.9 → 0.2.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +26 -0
- package/package.json +25 -21
- package/bin/migration-create.ts +0 -38
- package/jest.config.cjs +0 -22
- package/src/api/chat/getActorMetadata.ts +0 -23
- package/src/api/chat/getConvo.ts +0 -23
- package/src/api/chat/getConvoMembers.ts +0 -23
- package/src/api/chat/getConvos.ts +0 -23
- package/src/api/chat/getMessageContext.ts +0 -42
- package/src/api/chat/index.ts +0 -16
- package/src/api/communication/createTemplate.ts +0 -51
- package/src/api/communication/deleteTemplate.ts +0 -23
- package/src/api/communication/listTemplates.ts +0 -31
- package/src/api/communication/updateTemplate.ts +0 -51
- package/src/api/health.ts +0 -27
- package/src/api/index.ts +0 -146
- package/src/api/label/fetchLabels.ts +0 -32
- package/src/api/label/queryLabels.ts +0 -57
- package/src/api/label/subscribeLabels.ts +0 -25
- package/src/api/moderation/cancelScheduledActions.ts +0 -72
- package/src/api/moderation/emitEvent.ts +0 -475
- package/src/api/moderation/getAccountTimeline.ts +0 -160
- package/src/api/moderation/getEvent.ts +0 -19
- package/src/api/moderation/getRecord.ts +0 -40
- package/src/api/moderation/getRecords.ts +0 -50
- package/src/api/moderation/getRepo.ts +0 -34
- package/src/api/moderation/getReporterStats.ts +0 -18
- package/src/api/moderation/getRepos.ts +0 -41
- package/src/api/moderation/getSubjects.ts +0 -101
- package/src/api/moderation/listScheduledActions.ts +0 -45
- package/src/api/moderation/queryEvents.ts +0 -72
- package/src/api/moderation/queryStatuses.ts +0 -23
- package/src/api/moderation/scheduleAction.ts +0 -129
- package/src/api/moderation/searchRepos.ts +0 -46
- package/src/api/moderation/util.ts +0 -96
- package/src/api/proxied.ts +0 -327
- package/src/api/queue/assignModerator.ts +0 -31
- package/src/api/queue/createQueue.ts +0 -62
- package/src/api/queue/deleteQueue.ts +0 -56
- package/src/api/queue/getAssignments.ts +0 -19
- package/src/api/queue/listQueues.ts +0 -39
- package/src/api/queue/routeReports.ts +0 -44
- package/src/api/queue/unassignModerator.ts +0 -26
- package/src/api/queue/updateQueue.ts +0 -54
- package/src/api/report/assignModerator.ts +0 -36
- package/src/api/report/createActivity.ts +0 -57
- package/src/api/report/createReport.ts +0 -93
- package/src/api/report/getAssignments.ts +0 -20
- package/src/api/report/getHistoricalStats.ts +0 -41
- package/src/api/report/getLatestReport.ts +0 -44
- package/src/api/report/getLiveStats.ts +0 -26
- package/src/api/report/getReport.ts +0 -55
- package/src/api/report/listActivities.ts +0 -37
- package/src/api/report/queryActivities.ts +0 -64
- package/src/api/report/queryReports.ts +0 -44
- package/src/api/report/reassignQueue.ts +0 -68
- package/src/api/report/refreshStats.ts +0 -27
- package/src/api/report/unassignModerator.ts +0 -21
- package/src/api/safelink/addRule.ts +0 -48
- package/src/api/safelink/queryEvents.ts +0 -32
- package/src/api/safelink/queryRules.ts +0 -58
- package/src/api/safelink/removeRule.ts +0 -42
- package/src/api/safelink/updateRule.ts +0 -48
- package/src/api/server/getConfig.ts +0 -35
- package/src/api/set/addValues.ts +0 -28
- package/src/api/set/deleteSet.ts +0 -34
- package/src/api/set/deleteValues.ts +0 -31
- package/src/api/set/getValues.ts +0 -42
- package/src/api/set/querySets.ts +0 -36
- package/src/api/set/upsertSet.ts +0 -38
- package/src/api/setting/listOptions.ts +0 -44
- package/src/api/setting/removeOptions.ts +0 -64
- package/src/api/setting/upsertOption.ts +0 -156
- package/src/api/team/addMember.ts +0 -51
- package/src/api/team/deleteMember.ts +0 -29
- package/src/api/team/listMembers.ts +0 -20
- package/src/api/team/updateMember.ts +0 -47
- package/src/api/util.ts +0 -265
- package/src/api/verification/grantVerifications.ts +0 -90
- package/src/api/verification/listVerifications.ts +0 -44
- package/src/api/verification/revokeVerifications.ts +0 -43
- package/src/api/well-known.ts +0 -46
- package/src/assignment/index.ts +0 -728
- package/src/auth-verifier.ts +0 -227
- package/src/background.ts +0 -183
- package/src/communication-service/template.ts +0 -110
- package/src/communication-service/util.ts +0 -8
- package/src/config/config.ts +0 -211
- package/src/config/env.ts +0 -95
- package/src/config/index.ts +0 -3
- package/src/config/secrets.ts +0 -17
- package/src/context.ts +0 -399
- package/src/daemon/blob-diverter.ts +0 -186
- package/src/daemon/context.ts +0 -247
- package/src/daemon/event-pusher.ts +0 -363
- package/src/daemon/event-reverser.ts +0 -128
- package/src/daemon/index.ts +0 -33
- package/src/daemon/job-cursor.ts +0 -33
- package/src/daemon/materialized-view-refresher.ts +0 -33
- package/src/daemon/queue-router.ts +0 -101
- package/src/daemon/scheduled-action-processor.ts +0 -304
- package/src/daemon/stats-computer.ts +0 -101
- package/src/daemon/strike-expiry-processor.ts +0 -95
- package/src/daemon/team-profile-synchronizer.ts +0 -15
- package/src/daemon/verification-listener.ts +0 -169
- package/src/db/index.ts +0 -203
- package/src/db/migrations/20231219T205730722Z-init.ts +0 -170
- package/src/db/migrations/20240116T085607200Z-communication-template.ts +0 -23
- package/src/db/migrations/20240201T051104136Z-mod-event-blobs.ts +0 -15
- package/src/db/migrations/20240208T213404429Z-add-tags-column-to-moderation-subject.ts +0 -31
- package/src/db/migrations/20240228T003647759Z-add-label-sigs.ts +0 -25
- package/src/db/migrations/20240408T192432676Z-mute-reporting.ts +0 -15
- package/src/db/migrations/20240506T225055595Z-message-subject.ts +0 -21
- package/src/db/migrations/20240521T211332580Z-member.ts +0 -17
- package/src/db/migrations/20240814T003647759Z-event-created-at-index.ts +0 -13
- package/src/db/migrations/20240903T205730722Z-add-template-lang.ts +0 -12
- package/src/db/migrations/20240904T205730722Z-add-subject-did-index.ts +0 -13
- package/src/db/migrations/20241001T205730722Z-subject-status-review-state-index.ts +0 -15
- package/src/db/migrations/20241008T205730722Z-sets.ts +0 -53
- package/src/db/migrations/20241018T205730722Z-setting.ts +0 -27
- package/src/db/migrations/20241026T205730722Z-add-hosting-status-to-subject-status.ts +0 -57
- package/src/db/migrations/20241220T144630860Z-stats-materialized-views.ts +0 -215
- package/src/db/migrations/20250204T003647759Z-add-subject-priority-score.ts +0 -22
- package/src/db/migrations/20250211T003647759Z-add-reporter-stats-index.ts +0 -38
- package/src/db/migrations/20250211T132135150Z-moderation-event-message-partial-idx.ts +0 -26
- package/src/db/migrations/20250221T132135150Z-member-details.ts +0 -14
- package/src/db/migrations/20250404T201720309Z-subject-status-sort-idxs.ts +0 -18
- package/src/db/migrations/20250415T201720309Z-verification.ts +0 -34
- package/src/db/migrations/20250417T201720309Z-firehose-cursor.ts +0 -16
- package/src/db/migrations/20250609T110704000Z-safelink.ts +0 -53
- package/src/db/migrations/20250618T180246000Z-add-mod-tool-to-moderation-event.ts +0 -18
- package/src/db/migrations/20250701T000000000Z-add-age-assurance-state.ts +0 -25
- package/src/db/migrations/20250715T000000000Z-add-mod-event-external-id.ts +0 -15
- package/src/db/migrations/20250718T150931000Z-update-appeal-reason-stats.ts +0 -310
- package/src/db/migrations/20250813T000000000Z-mod-tool-batch-id-index.ts +0 -14
- package/src/db/migrations/20250923T000000000Z-scheduled-actions.ts +0 -56
- package/src/db/migrations/20251008T120000000Z-add-strike-system.ts +0 -87
- package/src/db/migrations/20260210T154806448Z-mod-event-created-by-indexes.ts +0 -22
- package/src/db/migrations/20260219T164523000Z-create-report-table.ts +0 -155
- package/src/db/migrations/20260219T165302248Z-moderator-assignment.ts +0 -42
- package/src/db/migrations/20260225T000000000Z-add-report-queue-table.ts +0 -41
- package/src/db/migrations/20260313T000000000Z-add-report-activity-table.ts +0 -48
- package/src/db/migrations/20260318T152058935Z-add-report-stat.ts +0 -35
- package/src/db/migrations/20260428T000000000Z-add-expiring-tag-table.ts +0 -32
- package/src/db/migrations/20260513T202941104Z-add-subject-convo-id.ts +0 -114
- package/src/db/migrations/20260602T120000000Z-add-report-activity-created-index.ts +0 -17
- package/src/db/migrations/index.ts +0 -44
- package/src/db/migrations/provider.ts +0 -26
- package/src/db/pagination.ts +0 -335
- package/src/db/schema/account_events_stats.ts +0 -16
- package/src/db/schema/account_record_events_stats.ts +0 -15
- package/src/db/schema/account_record_status_stats.ts +0 -15
- package/src/db/schema/account_strike.ts +0 -13
- package/src/db/schema/blob_push_event.ts +0 -21
- package/src/db/schema/communication_template.ts +0 -19
- package/src/db/schema/expiring_tag.ts +0 -18
- package/src/db/schema/firehose_cursor.ts +0 -13
- package/src/db/schema/index.ts +0 -60
- package/src/db/schema/job_cursor.ts +0 -13
- package/src/db/schema/label.ts +0 -22
- package/src/db/schema/member.ts +0 -22
- package/src/db/schema/moderation_event.ts +0 -61
- package/src/db/schema/moderation_subject_status.ts +0 -52
- package/src/db/schema/moderator_assignment.ts +0 -16
- package/src/db/schema/ozone_set.ts +0 -24
- package/src/db/schema/record_events_stats.ts +0 -15
- package/src/db/schema/record_push_event.ts +0 -21
- package/src/db/schema/repo_push_event.ts +0 -19
- package/src/db/schema/report.ts +0 -28
- package/src/db/schema/report_activity.ts +0 -22
- package/src/db/schema/report_queue.ts +0 -21
- package/src/db/schema/report_stat.ts +0 -27
- package/src/db/schema/safelink.ts +0 -39
- package/src/db/schema/scheduled-action.ts +0 -25
- package/src/db/schema/setting.ts +0 -24
- package/src/db/schema/signing_key.ts +0 -10
- package/src/db/schema/verification.ts +0 -21
- package/src/db/types.ts +0 -24
- package/src/error.ts +0 -12
- package/src/image-invalidator.ts +0 -7
- package/src/index.ts +0 -154
- package/src/jetstream/service.ts +0 -107
- package/src/logger.ts +0 -29
- package/src/mod-service/expiring-tags.ts +0 -104
- package/src/mod-service/index.ts +0 -1842
- package/src/mod-service/profile.ts +0 -139
- package/src/mod-service/report.ts +0 -429
- package/src/mod-service/status.ts +0 -549
- package/src/mod-service/strike.ts +0 -96
- package/src/mod-service/subject.ts +0 -311
- package/src/mod-service/types.ts +0 -96
- package/src/mod-service/util.ts +0 -99
- package/src/mod-service/views.ts +0 -912
- package/src/queue/service.ts +0 -603
- package/src/report/activity.ts +0 -281
- package/src/report/handle-report-update.ts +0 -209
- package/src/report/reassign.ts +0 -109
- package/src/report/stats.ts +0 -852
- package/src/report/views.ts +0 -239
- package/src/safelink/service.ts +0 -304
- package/src/scheduled-action/service.ts +0 -281
- package/src/scheduled-action/types.ts +0 -17
- package/src/sequencer/index.ts +0 -2
- package/src/sequencer/outbox.ts +0 -123
- package/src/sequencer/sequencer.ts +0 -147
- package/src/set/service.ts +0 -230
- package/src/setting/constants.ts +0 -3
- package/src/setting/service.ts +0 -148
- package/src/setting/types.ts +0 -3
- package/src/setting/validators.ts +0 -333
- package/src/tag-service/content-tagger.ts +0 -30
- package/src/tag-service/embed-tagger.ts +0 -70
- package/src/tag-service/index.ts +0 -70
- package/src/tag-service/language-data.ts +0 -561
- package/src/tag-service/language-tagger.ts +0 -101
- package/src/tag-service/util.ts +0 -13
- package/src/team/index.ts +0 -296
- package/src/util.ts +0 -230
- package/src/verification/issuer.ts +0 -146
- package/src/verification/service.ts +0 -208
- package/src/verification/util.ts +0 -53
- package/test.env +0 -2
- package/tests/3p-labeler.test.ts +0 -288
- package/tests/__snapshots__/account-strikes.test.ts.snap +0 -159
- package/tests/__snapshots__/age-assurance.test.ts.snap +0 -66
- package/tests/__snapshots__/blob-divert.test.ts.snap +0 -219
- package/tests/__snapshots__/get-account-timeline.test.ts.snap +0 -36
- package/tests/__snapshots__/get-record.test.ts.snap +0 -271
- package/tests/__snapshots__/get-records.test.ts.snap +0 -175
- package/tests/__snapshots__/get-repo.test.ts.snap +0 -91
- package/tests/__snapshots__/get-repos.test.ts.snap +0 -127
- package/tests/__snapshots__/get-starter-pack.test.ts.snap +0 -535
- package/tests/__snapshots__/get-subjects.test.ts.snap +0 -529
- package/tests/__snapshots__/moderation-events.test.ts.snap +0 -347
- package/tests/__snapshots__/moderation-statuses.test.ts.snap +0 -276
- package/tests/__snapshots__/moderation.test.ts.snap +0 -85
- package/tests/__snapshots__/report-reason.test.ts.snap +0 -14
- package/tests/__snapshots__/safelink.test.ts.snap +0 -179
- package/tests/__snapshots__/scheduled-action.test.ts.snap +0 -61
- package/tests/__snapshots__/sets.test.ts.snap +0 -46
- package/tests/__snapshots__/settings.test.ts.snap +0 -52
- package/tests/__snapshots__/team.test.ts.snap +0 -374
- package/tests/__snapshots__/verification-listener.test.ts.snap +0 -152
- package/tests/__snapshots__/verification.test.ts.snap +0 -302
- package/tests/_util.ts +0 -242
- package/tests/account-strikes.test.ts +0 -184
- package/tests/ack-all-subjects-of-account.test.ts +0 -177
- package/tests/age-assurance.test.ts +0 -372
- package/tests/blob-divert.test.ts +0 -106
- package/tests/communication-templates.test.ts +0 -149
- package/tests/content-tagger.test.ts +0 -170
- package/tests/db.test.ts +0 -184
- package/tests/expiring-label.test.ts +0 -72
- package/tests/expiring-tags.test.ts +0 -232
- package/tests/get-account-timeline.test.ts +0 -85
- package/tests/get-config.test.ts +0 -55
- package/tests/get-lists.test.ts +0 -111
- package/tests/get-profiles.test.ts +0 -70
- package/tests/get-record.test.ts +0 -130
- package/tests/get-records.test.ts +0 -91
- package/tests/get-repo.test.ts +0 -171
- package/tests/get-report.test.ts +0 -136
- package/tests/get-reporter-stats.test.ts +0 -132
- package/tests/get-repos.test.ts +0 -91
- package/tests/get-starter-pack.test.ts +0 -115
- package/tests/get-subjects.test.ts +0 -81
- package/tests/mod-tool.test.ts +0 -268
- package/tests/moderation-appeals.test.ts +0 -260
- package/tests/moderation-events.test.ts +0 -756
- package/tests/moderation-status-tags.test.ts +0 -140
- package/tests/moderation-statuses.test.ts +0 -495
- package/tests/moderation.test.ts +0 -992
- package/tests/protected-tags.test.ts +0 -218
- package/tests/query-labels.test.ts +0 -238
- package/tests/query-reports.test.ts +0 -608
- package/tests/queue-assignment.test.ts +0 -428
- package/tests/queue-router.test.ts +0 -306
- package/tests/queues.test.ts +0 -690
- package/tests/record-and-account-events.test.ts +0 -197
- package/tests/repo-search.test.ts +0 -136
- package/tests/report-action.test.ts +0 -308
- package/tests/report-activity.test.ts +0 -711
- package/tests/report-assignment.test.ts +0 -517
- package/tests/report-muting.test.ts +0 -100
- package/tests/report-reason.test.ts +0 -154
- package/tests/report-reassign-queue.test.ts +0 -340
- package/tests/report-routing.test.ts +0 -245
- package/tests/report-stats.test.ts +0 -545
- package/tests/revoke-account-credentials.test.ts +0 -54
- package/tests/safelink.test.ts +0 -534
- package/tests/scheduled-action-processor.test.ts +0 -488
- package/tests/scheduled-action.test.ts +0 -334
- package/tests/sequencer.test.ts +0 -227
- package/tests/server.test.ts +0 -62
- package/tests/sets.test.ts +0 -246
- package/tests/settings.test.ts +0 -308
- package/tests/strike-expiry-processor.test.ts +0 -299
- package/tests/subject-priority-score.test.ts +0 -96
- package/tests/takedown.test.ts +0 -105
- package/tests/team.test.ts +0 -216
- package/tests/verification-listener.test.ts +0 -129
- package/tests/verification.test.ts +0 -186
- package/tsconfig.build.json +0 -9
- package/tsconfig.build.tsbuildinfo +0 -1
- package/tsconfig.json +0 -7
- package/tsconfig.tests.json +0 -8
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { AuthRequiredError, InvalidRequestError } from '@atproto/xrpc-server'
|
|
2
|
-
import { AppContext } from '../../context.js'
|
|
3
|
-
import { Server } from '../../lexicon/index.js'
|
|
4
|
-
|
|
5
|
-
export default function (server: Server, ctx: AppContext) {
|
|
6
|
-
server.tools.ozone.queue.deleteQueue({
|
|
7
|
-
auth: ctx.authVerifier.modOrAdminToken,
|
|
8
|
-
handler: async ({ input, auth }) => {
|
|
9
|
-
const access = auth.credentials
|
|
10
|
-
|
|
11
|
-
if (!access.isModerator) {
|
|
12
|
-
throw new AuthRequiredError('Must be a moderator to delete a queue')
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
const { queueId, migrateToQueueId } = input.body
|
|
16
|
-
|
|
17
|
-
const queueService = ctx.queueService(ctx.db)
|
|
18
|
-
|
|
19
|
-
const existing = await queueService.getById(queueId)
|
|
20
|
-
if (!existing) {
|
|
21
|
-
throw new InvalidRequestError(
|
|
22
|
-
`Queue with id ${queueId} does not exist`,
|
|
23
|
-
'QueueNotFound',
|
|
24
|
-
)
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
if (migrateToQueueId !== undefined) {
|
|
28
|
-
const targetQueue = await queueService.getById(migrateToQueueId)
|
|
29
|
-
if (!targetQueue) {
|
|
30
|
-
throw new InvalidRequestError(
|
|
31
|
-
`Target queue with id ${migrateToQueueId} does not exist`,
|
|
32
|
-
'QueueNotFound',
|
|
33
|
-
)
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// Migrate non-closed reports before soft-deleting the queue.
|
|
38
|
-
// Closed reports are left assigned to the deleted queue — their history is preserved.
|
|
39
|
-
// Non-closed reports go to migrateToQueueId if specified, otherwise to -1 (unmatched).
|
|
40
|
-
const reportsMigrated = await queueService.migrateReports(
|
|
41
|
-
queueId,
|
|
42
|
-
migrateToQueueId,
|
|
43
|
-
)
|
|
44
|
-
|
|
45
|
-
await queueService.delete(queueId)
|
|
46
|
-
|
|
47
|
-
return {
|
|
48
|
-
encoding: 'application/json',
|
|
49
|
-
body: {
|
|
50
|
-
deleted: true,
|
|
51
|
-
reportsMigrated,
|
|
52
|
-
},
|
|
53
|
-
}
|
|
54
|
-
},
|
|
55
|
-
})
|
|
56
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { AppContext } from '../../context.js'
|
|
2
|
-
import { Server } from '../../lexicon/index.js'
|
|
3
|
-
|
|
4
|
-
export default function (server: Server, ctx: AppContext) {
|
|
5
|
-
server.tools.ozone.queue.getAssignments({
|
|
6
|
-
auth: ctx.authVerifier.modOrAdminToken,
|
|
7
|
-
handler: async ({ params }) => {
|
|
8
|
-
const result = await ctx.assignmentService.getQueueAssignments(params)
|
|
9
|
-
|
|
10
|
-
return {
|
|
11
|
-
encoding: 'application/json',
|
|
12
|
-
body: {
|
|
13
|
-
assignments: result.assignments,
|
|
14
|
-
cursor: result.cursor,
|
|
15
|
-
},
|
|
16
|
-
}
|
|
17
|
-
},
|
|
18
|
-
})
|
|
19
|
-
}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { AppContext } from '../../context.js'
|
|
2
|
-
import { Server } from '../../lexicon/index.js'
|
|
3
|
-
|
|
4
|
-
export default function (server: Server, ctx: AppContext) {
|
|
5
|
-
server.tools.ozone.queue.listQueues({
|
|
6
|
-
auth: ctx.authVerifier.modOrAdminToken,
|
|
7
|
-
handler: async ({ params }) => {
|
|
8
|
-
const {
|
|
9
|
-
limit = 50,
|
|
10
|
-
cursor,
|
|
11
|
-
enabled,
|
|
12
|
-
subjectType,
|
|
13
|
-
collection,
|
|
14
|
-
reportTypes,
|
|
15
|
-
} = params
|
|
16
|
-
|
|
17
|
-
const queueService = ctx.queueService(ctx.db)
|
|
18
|
-
|
|
19
|
-
const result = await queueService.list({
|
|
20
|
-
limit,
|
|
21
|
-
cursor,
|
|
22
|
-
enabled,
|
|
23
|
-
subjectType,
|
|
24
|
-
collection,
|
|
25
|
-
reportTypes,
|
|
26
|
-
})
|
|
27
|
-
|
|
28
|
-
const queues = await queueService.viewsWithStats(result.queues)
|
|
29
|
-
|
|
30
|
-
return {
|
|
31
|
-
encoding: 'application/json',
|
|
32
|
-
body: {
|
|
33
|
-
queues,
|
|
34
|
-
cursor: result.cursor,
|
|
35
|
-
},
|
|
36
|
-
}
|
|
37
|
-
},
|
|
38
|
-
})
|
|
39
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { AuthRequiredError, InvalidRequestError } from '@atproto/xrpc-server'
|
|
2
|
-
import { AppContext } from '../../context.js'
|
|
3
|
-
import { Server } from '../../lexicon/index.js'
|
|
4
|
-
|
|
5
|
-
const MAX_REPORTS = 5000
|
|
6
|
-
|
|
7
|
-
export default function (server: Server, ctx: AppContext) {
|
|
8
|
-
server.tools.ozone.queue.routeReports({
|
|
9
|
-
auth: ctx.authVerifier.modOrAdminToken,
|
|
10
|
-
handler: async ({ input, auth }) => {
|
|
11
|
-
const access = auth.credentials
|
|
12
|
-
const { startReportId, endReportId } = input.body
|
|
13
|
-
|
|
14
|
-
if (!access.isModerator) {
|
|
15
|
-
throw new AuthRequiredError('Must be an admin to re-route reports')
|
|
16
|
-
}
|
|
17
|
-
if (startReportId > endReportId) {
|
|
18
|
-
throw new InvalidRequestError(
|
|
19
|
-
'startReportId must be less than or equal to endReportId',
|
|
20
|
-
)
|
|
21
|
-
}
|
|
22
|
-
if (endReportId - startReportId + 1 > MAX_REPORTS) {
|
|
23
|
-
throw new InvalidRequestError(
|
|
24
|
-
`Cannot route more than ${MAX_REPORTS} reports at a time`,
|
|
25
|
-
'OutOfRange',
|
|
26
|
-
)
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const queueService = ctx.queueService(ctx.db)
|
|
30
|
-
const { assigned, unmatched } = await queueService.assignReportBatch(
|
|
31
|
-
{ start: startReportId, end: endReportId, limit: MAX_REPORTS },
|
|
32
|
-
{ includeUnmatched: true },
|
|
33
|
-
)
|
|
34
|
-
|
|
35
|
-
return {
|
|
36
|
-
encoding: 'application/json',
|
|
37
|
-
body: {
|
|
38
|
-
assigned,
|
|
39
|
-
unmatched,
|
|
40
|
-
},
|
|
41
|
-
}
|
|
42
|
-
},
|
|
43
|
-
})
|
|
44
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { ForbiddenError } from '@atproto/xrpc-server'
|
|
2
|
-
import { AppContext } from '../../context.js'
|
|
3
|
-
import { Server } from '../../lexicon/index.js'
|
|
4
|
-
import { getAuthDid } from '../util.js'
|
|
5
|
-
|
|
6
|
-
export default function (server: Server, ctx: AppContext) {
|
|
7
|
-
server.tools.ozone.queue.unassignModerator({
|
|
8
|
-
auth: ctx.authVerifier.modOrAdminToken,
|
|
9
|
-
handler: async ({ input, auth }) => {
|
|
10
|
-
const { queueId, did } = input.body
|
|
11
|
-
const authDid = getAuthDid(auth, ctx.cfg.service.did)
|
|
12
|
-
|
|
13
|
-
// RBAC
|
|
14
|
-
if (!auth.credentials.isModerator) {
|
|
15
|
-
throw new ForbiddenError('Unauthorized')
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
// RuBAC
|
|
19
|
-
if (did !== authDid && !auth.credentials.isAdmin) {
|
|
20
|
-
throw new ForbiddenError('Unauthorized')
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
await ctx.assignmentService.unassignQueue({ did, queueId })
|
|
24
|
-
},
|
|
25
|
-
})
|
|
26
|
-
}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { AuthRequiredError, InvalidRequestError } from '@atproto/xrpc-server'
|
|
2
|
-
import { AppContext } from '../../context.js'
|
|
3
|
-
import { Server } from '../../lexicon/index.js'
|
|
4
|
-
|
|
5
|
-
export default function (server: Server, ctx: AppContext) {
|
|
6
|
-
server.tools.ozone.queue.updateQueue({
|
|
7
|
-
auth: ctx.authVerifier.modOrAdminToken,
|
|
8
|
-
handler: async ({ input, auth }) => {
|
|
9
|
-
const access = auth.credentials
|
|
10
|
-
|
|
11
|
-
if (!access.isModerator) {
|
|
12
|
-
throw new AuthRequiredError('Must be a moderator to update a queue')
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
const { queueId, name, enabled, description } = input.body
|
|
16
|
-
|
|
17
|
-
if (
|
|
18
|
-
name === undefined &&
|
|
19
|
-
enabled === undefined &&
|
|
20
|
-
description === undefined
|
|
21
|
-
) {
|
|
22
|
-
throw new InvalidRequestError(
|
|
23
|
-
'At least one of name, enabled, or description must be provided',
|
|
24
|
-
)
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const queueService = ctx.queueService(ctx.db)
|
|
28
|
-
|
|
29
|
-
const existing = await queueService.getById(queueId)
|
|
30
|
-
if (!existing) {
|
|
31
|
-
throw new InvalidRequestError(
|
|
32
|
-
`Queue with id ${queueId} does not exist`,
|
|
33
|
-
'QueueNotFound',
|
|
34
|
-
)
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
const updates: {
|
|
38
|
-
name?: string
|
|
39
|
-
enabled?: boolean
|
|
40
|
-
description?: string
|
|
41
|
-
} = {}
|
|
42
|
-
if (name !== undefined) updates.name = name
|
|
43
|
-
if (enabled !== undefined) updates.enabled = enabled
|
|
44
|
-
if (description !== undefined) updates.description = description
|
|
45
|
-
|
|
46
|
-
const queue = await queueService.update(queueId, updates)
|
|
47
|
-
|
|
48
|
-
return {
|
|
49
|
-
encoding: 'application/json',
|
|
50
|
-
body: { queue: queueService.view(queue) },
|
|
51
|
-
}
|
|
52
|
-
},
|
|
53
|
-
})
|
|
54
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { ForbiddenError } from '@atproto/xrpc-server'
|
|
2
|
-
import { AppContext } from '../../context.js'
|
|
3
|
-
import { Server } from '../../lexicon/index.js'
|
|
4
|
-
import { getAuthDid } from '../util.js'
|
|
5
|
-
|
|
6
|
-
export default function (server: Server, ctx: AppContext) {
|
|
7
|
-
server.tools.ozone.report.assignModerator({
|
|
8
|
-
auth: ctx.authVerifier.modOrAdminToken,
|
|
9
|
-
handler: async ({ input, auth }) => {
|
|
10
|
-
const authDid = getAuthDid(auth, ctx.cfg.service.did)
|
|
11
|
-
const did = input.body.did ?? authDid
|
|
12
|
-
|
|
13
|
-
if (!did) {
|
|
14
|
-
throw new ForbiddenError('No one to assign report to')
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
// RuBAC: only admins can assign to a different user
|
|
18
|
-
if (did !== authDid && !auth.credentials.isAdmin) {
|
|
19
|
-
throw new ForbiddenError('Unauthorized')
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const result = await ctx.assignmentService.assignReport({
|
|
23
|
-
did,
|
|
24
|
-
createdBy: authDid,
|
|
25
|
-
reportId: input.body.reportId,
|
|
26
|
-
queueId: input.body.queueId,
|
|
27
|
-
isPermanent: input.body.isPermanent,
|
|
28
|
-
})
|
|
29
|
-
|
|
30
|
-
return {
|
|
31
|
-
encoding: 'application/json',
|
|
32
|
-
body: result,
|
|
33
|
-
}
|
|
34
|
-
},
|
|
35
|
-
})
|
|
36
|
-
}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { InvalidRequestError } from '@atproto/xrpc-server'
|
|
2
|
-
import { AppContext } from '../../context.js'
|
|
3
|
-
import { Server } from '../../lexicon/index.js'
|
|
4
|
-
import {
|
|
5
|
-
ActivityType,
|
|
6
|
-
createReportActivity,
|
|
7
|
-
formatActivityView,
|
|
8
|
-
} from '../../report/activity.js'
|
|
9
|
-
import { getAuthDid } from '../util.js'
|
|
10
|
-
|
|
11
|
-
const VALID_ACTIVITY_TYPES = new Set<ActivityType>([
|
|
12
|
-
'queueActivity',
|
|
13
|
-
'assignmentActivity',
|
|
14
|
-
'escalationActivity',
|
|
15
|
-
'closeActivity',
|
|
16
|
-
'reopenActivity',
|
|
17
|
-
'noteActivity',
|
|
18
|
-
])
|
|
19
|
-
|
|
20
|
-
const DEFS_PREFIX = 'tools.ozone.report.defs#'
|
|
21
|
-
|
|
22
|
-
export default function (server: Server, ctx: AppContext) {
|
|
23
|
-
server.tools.ozone.report.createActivity({
|
|
24
|
-
auth: ctx.authVerifier.modOrAdminToken,
|
|
25
|
-
handler: async ({ input, auth }) => {
|
|
26
|
-
const createdBy = getAuthDid(auth, ctx.cfg.service.did)
|
|
27
|
-
const { reportId, activity, internalNote, publicNote, isAutomated } =
|
|
28
|
-
input.body
|
|
29
|
-
|
|
30
|
-
const rawType = activity.$type ?? ''
|
|
31
|
-
const activityType = rawType.startsWith(DEFS_PREFIX)
|
|
32
|
-
? rawType.slice(DEFS_PREFIX.length)
|
|
33
|
-
: rawType
|
|
34
|
-
|
|
35
|
-
if (!VALID_ACTIVITY_TYPES.has(activityType as ActivityType)) {
|
|
36
|
-
throw new InvalidRequestError(
|
|
37
|
-
`Unknown activity type: ${rawType}`,
|
|
38
|
-
'InvalidActivityType',
|
|
39
|
-
)
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const row = await createReportActivity(ctx.db, {
|
|
43
|
-
reportId,
|
|
44
|
-
activityType: activityType as ActivityType,
|
|
45
|
-
internalNote: internalNote ?? undefined,
|
|
46
|
-
publicNote: publicNote ?? undefined,
|
|
47
|
-
isAutomated: isAutomated ?? false,
|
|
48
|
-
createdBy: createdBy ?? ctx.cfg.service.did,
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
return {
|
|
52
|
-
encoding: 'application/json',
|
|
53
|
-
body: { activity: formatActivityView(row) },
|
|
54
|
-
}
|
|
55
|
-
},
|
|
56
|
-
})
|
|
57
|
-
}
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import { ForbiddenError } from '@atproto/xrpc-server'
|
|
2
|
-
import { AppContext } from '../../context.js'
|
|
3
|
-
import { Server } from '../../lexicon/index.js'
|
|
4
|
-
import { ReasonType } from '../../lexicon/types/com/atproto/moderation/defs.js'
|
|
5
|
-
import { ModerationService } from '../../mod-service/index.js'
|
|
6
|
-
import { subjectFromInput } from '../../mod-service/subject.js'
|
|
7
|
-
import { TagService } from '../../tag-service/index.js'
|
|
8
|
-
import { getTagForReport } from '../../tag-service/util.js'
|
|
9
|
-
import { isAppealReport } from '../util.js'
|
|
10
|
-
|
|
11
|
-
export default function (server: Server, ctx: AppContext) {
|
|
12
|
-
server.com.atproto.moderation.createReport({
|
|
13
|
-
auth: ctx.authVerifier.standard,
|
|
14
|
-
handler: async ({ input, auth }) => {
|
|
15
|
-
const requester =
|
|
16
|
-
'iss' in auth.credentials ? auth.credentials.iss : ctx.cfg.service.did
|
|
17
|
-
const { reasonType, reason, modTool } = input.body
|
|
18
|
-
const subject = subjectFromInput(input.body.subject)
|
|
19
|
-
|
|
20
|
-
// If the report is an appeal, the requester must be the author of the subject
|
|
21
|
-
if (isAppealReport(reasonType) && requester !== subject.did) {
|
|
22
|
-
throw new ForbiddenError('You cannot appeal this report')
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const db = ctx.db
|
|
26
|
-
|
|
27
|
-
await ctx.moderationServiceProfile().validateReasonType(reasonType)
|
|
28
|
-
await assertValidReporter(ctx.modService(db), reasonType, requester)
|
|
29
|
-
|
|
30
|
-
const report = await db.transaction(async (dbTxn) => {
|
|
31
|
-
const moderationTxn = ctx.modService(dbTxn)
|
|
32
|
-
const { event: reportEvent, subjectStatus } =
|
|
33
|
-
await moderationTxn.report({
|
|
34
|
-
reason,
|
|
35
|
-
subject,
|
|
36
|
-
reasonType,
|
|
37
|
-
reportedBy: requester || ctx.cfg.service.did,
|
|
38
|
-
modTool,
|
|
39
|
-
})
|
|
40
|
-
|
|
41
|
-
const tagService = new TagService(
|
|
42
|
-
subject,
|
|
43
|
-
subjectStatus,
|
|
44
|
-
ctx.cfg.service.did,
|
|
45
|
-
moderationTxn,
|
|
46
|
-
)
|
|
47
|
-
await tagService.evaluateForSubject([getTagForReport(reasonType)])
|
|
48
|
-
|
|
49
|
-
return reportEvent
|
|
50
|
-
})
|
|
51
|
-
|
|
52
|
-
const body = ctx.modService(db).views.formatReport(report)
|
|
53
|
-
return {
|
|
54
|
-
encoding: 'application/json',
|
|
55
|
-
body,
|
|
56
|
-
}
|
|
57
|
-
},
|
|
58
|
-
})
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
const assertValidReporter = async (
|
|
62
|
-
modService: ModerationService,
|
|
63
|
-
reasonType: ReasonType,
|
|
64
|
-
did: string,
|
|
65
|
-
) => {
|
|
66
|
-
const reporterStatus = await modService.getCurrentStatus({ did })
|
|
67
|
-
|
|
68
|
-
// If we don't have a mod status for the reporter, no need to do further checks
|
|
69
|
-
if (!reporterStatus.length) {
|
|
70
|
-
return
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// For appeals, we just need to make sure that the account does not have pending appeal
|
|
74
|
-
if (isAppealReport(reasonType)) {
|
|
75
|
-
if (reporterStatus[0]?.appealed) {
|
|
76
|
-
throw new ForbiddenError(
|
|
77
|
-
'Awaiting decision on previous appeal',
|
|
78
|
-
'AlreadyAppealed',
|
|
79
|
-
)
|
|
80
|
-
}
|
|
81
|
-
return
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// For non appeals, we need to make sure the reporter account is not already in takendown status
|
|
85
|
-
// This is necessary because we allow takendown accounts call createReport but that's only meant for appeals
|
|
86
|
-
// and we need to make sure takendown accounts don't abuse this endpoint
|
|
87
|
-
if (reporterStatus[0]?.takendown) {
|
|
88
|
-
throw new ForbiddenError(
|
|
89
|
-
'Report not accepted from takendown account',
|
|
90
|
-
'AccountTakedown',
|
|
91
|
-
)
|
|
92
|
-
}
|
|
93
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { AppContext } from '../../context.js'
|
|
2
|
-
import { Server } from '../../lexicon/index.js'
|
|
3
|
-
|
|
4
|
-
export default function (server: Server, ctx: AppContext) {
|
|
5
|
-
server.tools.ozone.report.getAssignments({
|
|
6
|
-
auth: ctx.authVerifier.modOrAdminToken,
|
|
7
|
-
handler: async ({ params }) => {
|
|
8
|
-
const { assignments, cursor } =
|
|
9
|
-
await ctx.assignmentService.getReportAssignments(params)
|
|
10
|
-
|
|
11
|
-
return {
|
|
12
|
-
encoding: 'application/json',
|
|
13
|
-
body: {
|
|
14
|
-
assignments,
|
|
15
|
-
cursor,
|
|
16
|
-
},
|
|
17
|
-
}
|
|
18
|
-
},
|
|
19
|
-
})
|
|
20
|
-
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { AppContext } from '../../context.js'
|
|
2
|
-
import { Server } from '../../lexicon/index.js'
|
|
3
|
-
import { viewHistoricalStats } from '../../report/views.js'
|
|
4
|
-
|
|
5
|
-
export default function (server: Server, ctx: AppContext) {
|
|
6
|
-
server.tools.ozone.report.getHistoricalStats({
|
|
7
|
-
auth: ctx.authVerifier.modOrAdminToken,
|
|
8
|
-
handler: async ({ params }) => {
|
|
9
|
-
const {
|
|
10
|
-
queueId,
|
|
11
|
-
moderatorDid,
|
|
12
|
-
reportTypes,
|
|
13
|
-
startDate,
|
|
14
|
-
endDate,
|
|
15
|
-
limit,
|
|
16
|
-
cursor,
|
|
17
|
-
} = params
|
|
18
|
-
|
|
19
|
-
const reportStatsService = ctx.reportStatsService(ctx.db)
|
|
20
|
-
const result = await reportStatsService.getHistoricalStats({
|
|
21
|
-
group: {
|
|
22
|
-
queueId: queueId ?? null,
|
|
23
|
-
moderatorDid: moderatorDid ?? null,
|
|
24
|
-
reportTypes: reportTypes?.length ? reportTypes : null,
|
|
25
|
-
},
|
|
26
|
-
startDate,
|
|
27
|
-
endDate,
|
|
28
|
-
limit: limit ?? 30,
|
|
29
|
-
cursor,
|
|
30
|
-
})
|
|
31
|
-
|
|
32
|
-
return {
|
|
33
|
-
encoding: 'application/json',
|
|
34
|
-
body: {
|
|
35
|
-
stats: result.stats.map(viewHistoricalStats),
|
|
36
|
-
cursor: result.cursor,
|
|
37
|
-
},
|
|
38
|
-
}
|
|
39
|
-
},
|
|
40
|
-
})
|
|
41
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { InvalidRequestError } from '@atproto/xrpc-server'
|
|
2
|
-
import { AppContext } from '../../context.js'
|
|
3
|
-
import { Server } from '../../lexicon/index.js'
|
|
4
|
-
import { getLatestReport } from '../../mod-service/report.js'
|
|
5
|
-
import { buildReportView, hydrateReportInfo } from '../../report/views.js'
|
|
6
|
-
import { getPdsAccountInfos } from '../util.js'
|
|
7
|
-
|
|
8
|
-
export default function (server: Server, ctx: AppContext) {
|
|
9
|
-
server.tools.ozone.report.getLatestReport({
|
|
10
|
-
auth: ctx.authVerifier.modOrAdminToken,
|
|
11
|
-
handler: async ({ auth, req }) => {
|
|
12
|
-
const db = ctx.db
|
|
13
|
-
const modService = ctx.modService(db)
|
|
14
|
-
const labelers = ctx.reqLabelers(req)
|
|
15
|
-
|
|
16
|
-
const report = await getLatestReport(db)
|
|
17
|
-
if (!report) {
|
|
18
|
-
throw new InvalidRequestError('No report found', 'NotFound')
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
const queueService = ctx.queueService(db)
|
|
22
|
-
const teamService = ctx.teamService(db)
|
|
23
|
-
const hydrated = await hydrateReportInfo(
|
|
24
|
-
[report],
|
|
25
|
-
modService.views,
|
|
26
|
-
(dids) => getPdsAccountInfos(ctx, dids),
|
|
27
|
-
(queueIds) => queueService.getViewsByIds(queueIds),
|
|
28
|
-
(dids) => teamService.viewByDids(dids),
|
|
29
|
-
labelers,
|
|
30
|
-
)
|
|
31
|
-
|
|
32
|
-
return {
|
|
33
|
-
encoding: 'application/json',
|
|
34
|
-
body: {
|
|
35
|
-
report: buildReportView(
|
|
36
|
-
report,
|
|
37
|
-
hydrated,
|
|
38
|
-
auth.credentials.isModerator,
|
|
39
|
-
),
|
|
40
|
-
},
|
|
41
|
-
}
|
|
42
|
-
},
|
|
43
|
-
})
|
|
44
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { AppContext } from '../../context.js'
|
|
2
|
-
import { Server } from '../../lexicon/index.js'
|
|
3
|
-
import { viewLiveStats } from '../../report/views.js'
|
|
4
|
-
|
|
5
|
-
export default function (server: Server, ctx: AppContext) {
|
|
6
|
-
server.tools.ozone.report.getLiveStats({
|
|
7
|
-
auth: ctx.authVerifier.modOrAdminToken,
|
|
8
|
-
handler: async ({ params }) => {
|
|
9
|
-
const { queueId, moderatorDid, reportTypes } = params
|
|
10
|
-
|
|
11
|
-
const reportStatsService = ctx.reportStatsService(ctx.db)
|
|
12
|
-
const row = await reportStatsService.getLiveStats({
|
|
13
|
-
queueId: queueId ?? null,
|
|
14
|
-
moderatorDid: moderatorDid ?? null,
|
|
15
|
-
reportTypes: reportTypes?.length ? reportTypes : null,
|
|
16
|
-
})
|
|
17
|
-
|
|
18
|
-
return {
|
|
19
|
-
encoding: 'application/json',
|
|
20
|
-
body: {
|
|
21
|
-
stats: viewLiveStats(row),
|
|
22
|
-
},
|
|
23
|
-
}
|
|
24
|
-
},
|
|
25
|
-
})
|
|
26
|
-
}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { InvalidRequestError } from '@atproto/xrpc-server'
|
|
2
|
-
import { AppContext } from '../../context.js'
|
|
3
|
-
import { Server } from '../../lexicon/index.js'
|
|
4
|
-
import { getReportById } from '../../mod-service/report.js'
|
|
5
|
-
import { buildReportView, hydrateReportInfo } from '../../report/views.js'
|
|
6
|
-
import { getPdsAccountInfos } from '../util.js'
|
|
7
|
-
|
|
8
|
-
export default function (server: Server, ctx: AppContext) {
|
|
9
|
-
server.tools.ozone.report.getReport({
|
|
10
|
-
auth: ctx.authVerifier.modOrAdminToken,
|
|
11
|
-
handler: async ({ params, auth, req }) => {
|
|
12
|
-
const db = ctx.db
|
|
13
|
-
const modService = ctx.modService(db)
|
|
14
|
-
const labelers = ctx.reqLabelers(req)
|
|
15
|
-
|
|
16
|
-
const report = await getReportById(db, params.id)
|
|
17
|
-
if (!report) {
|
|
18
|
-
throw new InvalidRequestError(
|
|
19
|
-
`Report not found: ${params.id}`,
|
|
20
|
-
'NotFound',
|
|
21
|
-
)
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
const queueService = ctx.queueService(db)
|
|
25
|
-
const teamService = ctx.teamService(db)
|
|
26
|
-
const [hydrated, actionEvents] = await Promise.all([
|
|
27
|
-
hydrateReportInfo(
|
|
28
|
-
[report],
|
|
29
|
-
modService.views,
|
|
30
|
-
(dids) => getPdsAccountInfos(ctx, dids),
|
|
31
|
-
(queueIds) => queueService.getViewsByIds(queueIds),
|
|
32
|
-
(dids) => teamService.viewByDids(dids),
|
|
33
|
-
labelers,
|
|
34
|
-
),
|
|
35
|
-
Array.isArray(report.actionEventIds) && report.actionEventIds.length
|
|
36
|
-
? modService.getEventsByIds(report.actionEventIds as number[])
|
|
37
|
-
: Promise.resolve([]),
|
|
38
|
-
])
|
|
39
|
-
|
|
40
|
-
const actions = actionEvents.map((evt) =>
|
|
41
|
-
modService.views.formatEvent(evt),
|
|
42
|
-
)
|
|
43
|
-
|
|
44
|
-
return {
|
|
45
|
-
encoding: 'application/json',
|
|
46
|
-
body: buildReportView(
|
|
47
|
-
report,
|
|
48
|
-
hydrated,
|
|
49
|
-
auth.credentials.isModerator,
|
|
50
|
-
actions,
|
|
51
|
-
),
|
|
52
|
-
}
|
|
53
|
-
},
|
|
54
|
-
})
|
|
55
|
-
}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { AppContext } from '../../context.js'
|
|
2
|
-
import { Server } from '../../lexicon/index.js'
|
|
3
|
-
import {
|
|
4
|
-
formatActivityView,
|
|
5
|
-
listReportActivities,
|
|
6
|
-
} from '../../report/activity.js'
|
|
7
|
-
|
|
8
|
-
export default function (server: Server, ctx: AppContext) {
|
|
9
|
-
server.tools.ozone.report.listActivities({
|
|
10
|
-
auth: ctx.authVerifier.modOrAdminToken,
|
|
11
|
-
handler: async ({ params }) => {
|
|
12
|
-
const { reportId, limit, cursor } = params
|
|
13
|
-
|
|
14
|
-
const { activities, cursor: nextCursor } = await listReportActivities(
|
|
15
|
-
ctx.db,
|
|
16
|
-
{ reportId, limit, cursor },
|
|
17
|
-
)
|
|
18
|
-
|
|
19
|
-
// Fetch team members for all createdBy DIDs
|
|
20
|
-
const createdByDids = Array.from(
|
|
21
|
-
new Set(activities.map((a) => a.createdBy)),
|
|
22
|
-
)
|
|
23
|
-
const teamService = ctx.teamService(ctx.db)
|
|
24
|
-
const memberViews = await teamService.viewByDids(createdByDids)
|
|
25
|
-
|
|
26
|
-
return {
|
|
27
|
-
encoding: 'application/json',
|
|
28
|
-
body: {
|
|
29
|
-
activities: activities.map((activity) =>
|
|
30
|
-
formatActivityView(activity, memberViews),
|
|
31
|
-
),
|
|
32
|
-
cursor: nextCursor,
|
|
33
|
-
},
|
|
34
|
-
}
|
|
35
|
-
},
|
|
36
|
-
})
|
|
37
|
-
}
|