@atproto/ozone 0.2.8 → 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 +33 -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,140 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert'
|
|
2
|
-
import { ComAtprotoAdminDefs } from '@atproto/api'
|
|
3
|
-
import {
|
|
4
|
-
ModeratorClient,
|
|
5
|
-
SeedClient,
|
|
6
|
-
TestNetwork,
|
|
7
|
-
basicSeed,
|
|
8
|
-
} from '@atproto/dev-env'
|
|
9
|
-
import { REASONSPAM } from '../src/lexicon/types/com/atproto/moderation/defs.js'
|
|
10
|
-
|
|
11
|
-
describe('moderation-status-tags', () => {
|
|
12
|
-
let network: TestNetwork
|
|
13
|
-
let sc: SeedClient
|
|
14
|
-
let modClient: ModeratorClient
|
|
15
|
-
|
|
16
|
-
beforeAll(async () => {
|
|
17
|
-
network = await TestNetwork.create({
|
|
18
|
-
dbPostgresSchema: 'ozone_moderation_status_tags',
|
|
19
|
-
})
|
|
20
|
-
sc = network.getSeedClient()
|
|
21
|
-
modClient = network.ozone.getModClient()
|
|
22
|
-
await basicSeed(sc)
|
|
23
|
-
await network.processAll()
|
|
24
|
-
})
|
|
25
|
-
|
|
26
|
-
afterAll(async () => {
|
|
27
|
-
await network?.close()
|
|
28
|
-
})
|
|
29
|
-
|
|
30
|
-
describe('manage tags on subject status', () => {
|
|
31
|
-
it('adds and removes tags on a subject', async () => {
|
|
32
|
-
const bobsAccount = {
|
|
33
|
-
$type: 'com.atproto.admin.defs#repoRef',
|
|
34
|
-
did: sc.dids.bob,
|
|
35
|
-
}
|
|
36
|
-
await sc.createReport({
|
|
37
|
-
reasonType: REASONSPAM,
|
|
38
|
-
reason: 'X',
|
|
39
|
-
subject: bobsAccount,
|
|
40
|
-
reportedBy: sc.dids.alice,
|
|
41
|
-
})
|
|
42
|
-
await modClient.emitEvent({
|
|
43
|
-
subject: bobsAccount,
|
|
44
|
-
event: {
|
|
45
|
-
$type: 'tools.ozone.moderation.defs#modEventTag',
|
|
46
|
-
add: ['interaction-churn'],
|
|
47
|
-
remove: [],
|
|
48
|
-
},
|
|
49
|
-
})
|
|
50
|
-
const statusAfterInteractionTag = await modClient.queryStatuses({
|
|
51
|
-
subject: bobsAccount.did,
|
|
52
|
-
})
|
|
53
|
-
expect(statusAfterInteractionTag.subjectStatuses[0].tags).toContain(
|
|
54
|
-
'interaction-churn',
|
|
55
|
-
)
|
|
56
|
-
|
|
57
|
-
await modClient.emitEvent({
|
|
58
|
-
subject: bobsAccount,
|
|
59
|
-
event: {
|
|
60
|
-
$type: 'tools.ozone.moderation.defs#modEventTag',
|
|
61
|
-
remove: ['interaction-churn'],
|
|
62
|
-
add: ['follow-churn'],
|
|
63
|
-
},
|
|
64
|
-
})
|
|
65
|
-
const statusAfterFollowTag = await modClient.queryStatuses({
|
|
66
|
-
subject: bobsAccount.did,
|
|
67
|
-
})
|
|
68
|
-
|
|
69
|
-
expect(statusAfterFollowTag.subjectStatuses[0].tags).not.toContain(
|
|
70
|
-
'interaction-churn',
|
|
71
|
-
)
|
|
72
|
-
expect(statusAfterFollowTag.subjectStatuses[0].tags).toContain(
|
|
73
|
-
'follow-churn',
|
|
74
|
-
)
|
|
75
|
-
})
|
|
76
|
-
|
|
77
|
-
it('allows filtering by tags', async () => {
|
|
78
|
-
await modClient.emitEvent({
|
|
79
|
-
subject: {
|
|
80
|
-
$type: 'com.atproto.admin.defs#repoRef',
|
|
81
|
-
did: sc.dids.alice,
|
|
82
|
-
},
|
|
83
|
-
event: {
|
|
84
|
-
$type: 'tools.ozone.moderation.defs#modEventTag',
|
|
85
|
-
add: ['report:spam', 'lang:ja', 'lang:en'],
|
|
86
|
-
remove: [],
|
|
87
|
-
},
|
|
88
|
-
})
|
|
89
|
-
const [englishAndJapaneseQueue, englishOrJapaneseQueue] =
|
|
90
|
-
await Promise.all([
|
|
91
|
-
modClient.queryStatuses({
|
|
92
|
-
tags: ['lang:ja&&lang:en'],
|
|
93
|
-
}),
|
|
94
|
-
modClient.queryStatuses({
|
|
95
|
-
tags: ['report:ja', 'lang:en'],
|
|
96
|
-
}),
|
|
97
|
-
])
|
|
98
|
-
|
|
99
|
-
// Verify that the queue only contains 1 item with both en and ja tags which is alice's account
|
|
100
|
-
expect(englishAndJapaneseQueue.subjectStatuses.length).toEqual(1)
|
|
101
|
-
const { subject } = englishAndJapaneseQueue.subjectStatuses[0]
|
|
102
|
-
assert(ComAtprotoAdminDefs.isRepoRef(subject))
|
|
103
|
-
expect(subject.did).toEqual(sc.dids.alice)
|
|
104
|
-
|
|
105
|
-
// Verify that when querying for either en or ja tags, both alice and bob are returned
|
|
106
|
-
expect(englishOrJapaneseQueue.subjectStatuses.length).toEqual(2)
|
|
107
|
-
const englishOrJapaneseDids = englishOrJapaneseQueue.subjectStatuses.map(
|
|
108
|
-
({ subject }) => {
|
|
109
|
-
assert(ComAtprotoAdminDefs.isRepoRef(subject))
|
|
110
|
-
return subject.did
|
|
111
|
-
},
|
|
112
|
-
)
|
|
113
|
-
expect(englishOrJapaneseDids).toContain(sc.dids.alice)
|
|
114
|
-
expect(englishOrJapaneseDids).toContain(sc.dids.bob)
|
|
115
|
-
})
|
|
116
|
-
|
|
117
|
-
it('adds tag to conversation', async () => {
|
|
118
|
-
const subject = {
|
|
119
|
-
$type: 'chat.bsky.convo.defs#convoRef',
|
|
120
|
-
did: sc.dids.alice,
|
|
121
|
-
convoId: '123',
|
|
122
|
-
}
|
|
123
|
-
await modClient.emitEvent({
|
|
124
|
-
subject: subject,
|
|
125
|
-
event: {
|
|
126
|
-
$type: 'tools.ozone.moderation.defs#modEventTag',
|
|
127
|
-
add: ['interaction-churn'],
|
|
128
|
-
remove: [],
|
|
129
|
-
},
|
|
130
|
-
})
|
|
131
|
-
const status = await network.ozone.ctx.db.db
|
|
132
|
-
.selectFrom('moderation_subject_status')
|
|
133
|
-
.selectAll()
|
|
134
|
-
.where('did', '=', subject.did)
|
|
135
|
-
.where('convoId', '=', subject.convoId)
|
|
136
|
-
.executeTakeFirstOrThrow()
|
|
137
|
-
expect(status.tags).toContain('interaction-churn')
|
|
138
|
-
})
|
|
139
|
-
})
|
|
140
|
-
})
|
|
@@ -1,495 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert'
|
|
2
|
-
import {
|
|
3
|
-
ToolsOzoneModerationDefs,
|
|
4
|
-
ToolsOzoneModerationQueryStatuses,
|
|
5
|
-
} from '@atproto/api'
|
|
6
|
-
import {
|
|
7
|
-
ModeratorClient,
|
|
8
|
-
SeedClient,
|
|
9
|
-
TestNetwork,
|
|
10
|
-
basicSeed,
|
|
11
|
-
} from '@atproto/dev-env'
|
|
12
|
-
import { isRepoRef } from '../src/lexicon/types/com/atproto/admin/defs.js'
|
|
13
|
-
import {
|
|
14
|
-
REASONMISLEADING,
|
|
15
|
-
REASONSPAM,
|
|
16
|
-
} from '../src/lexicon/types/com/atproto/moderation/defs.js'
|
|
17
|
-
import { isMain as isStrongRef } from '../src/lexicon/types/com/atproto/repo/strongRef.js'
|
|
18
|
-
import {
|
|
19
|
-
REVIEWNONE,
|
|
20
|
-
REVIEWOPEN,
|
|
21
|
-
} from '../src/lexicon/types/tools/ozone/moderation/defs.js'
|
|
22
|
-
import { forSnapshot } from './_util.js'
|
|
23
|
-
|
|
24
|
-
describe('moderation-statuses', () => {
|
|
25
|
-
let network: TestNetwork
|
|
26
|
-
let sc: SeedClient
|
|
27
|
-
let modClient: ModeratorClient
|
|
28
|
-
|
|
29
|
-
const seedEvents = async () => {
|
|
30
|
-
const bobsAccount = {
|
|
31
|
-
$type: 'com.atproto.admin.defs#repoRef',
|
|
32
|
-
did: sc.dids.bob,
|
|
33
|
-
}
|
|
34
|
-
const carlasAccount = {
|
|
35
|
-
$type: 'com.atproto.admin.defs#repoRef',
|
|
36
|
-
did: sc.dids.alice,
|
|
37
|
-
}
|
|
38
|
-
const bobsPost = {
|
|
39
|
-
$type: 'com.atproto.repo.strongRef',
|
|
40
|
-
uri: sc.posts[sc.dids.bob][0].ref.uriStr,
|
|
41
|
-
cid: sc.posts[sc.dids.bob][0].ref.cidStr,
|
|
42
|
-
}
|
|
43
|
-
const alicesPost = {
|
|
44
|
-
$type: 'com.atproto.repo.strongRef',
|
|
45
|
-
uri: sc.posts[sc.dids.alice][1].ref.uriStr,
|
|
46
|
-
cid: sc.posts[sc.dids.alice][1].ref.cidStr,
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
for (let i = 0; i < 4; i++) {
|
|
50
|
-
await sc.createReport({
|
|
51
|
-
reasonType: i % 2 ? REASONSPAM : REASONMISLEADING,
|
|
52
|
-
reason: 'X',
|
|
53
|
-
// Report bob's account by alice and vice versa
|
|
54
|
-
subject: i % 2 ? bobsAccount : carlasAccount,
|
|
55
|
-
reportedBy: i % 2 ? sc.dids.alice : sc.dids.bob,
|
|
56
|
-
})
|
|
57
|
-
await sc.createReport({
|
|
58
|
-
reasonType: REASONSPAM,
|
|
59
|
-
reason: 'X',
|
|
60
|
-
// Report bob's post by alice and vice versa
|
|
61
|
-
subject: i % 2 ? bobsPost : alicesPost,
|
|
62
|
-
reportedBy: i % 2 ? sc.dids.alice : sc.dids.bob,
|
|
63
|
-
})
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
beforeAll(async () => {
|
|
68
|
-
network = await TestNetwork.create({
|
|
69
|
-
dbPostgresSchema: 'ozone_moderation_statuses',
|
|
70
|
-
})
|
|
71
|
-
sc = network.getSeedClient()
|
|
72
|
-
modClient = network.ozone.getModClient()
|
|
73
|
-
await basicSeed(sc)
|
|
74
|
-
await network.processAll()
|
|
75
|
-
await seedEvents()
|
|
76
|
-
})
|
|
77
|
-
|
|
78
|
-
beforeEach(async () => {
|
|
79
|
-
await network.processAll()
|
|
80
|
-
})
|
|
81
|
-
|
|
82
|
-
afterAll(async () => {
|
|
83
|
-
await network?.close()
|
|
84
|
-
})
|
|
85
|
-
|
|
86
|
-
describe('query statuses', () => {
|
|
87
|
-
it('returns statuses for subjects that received moderation events', async () => {
|
|
88
|
-
const response = await modClient.queryStatuses({})
|
|
89
|
-
|
|
90
|
-
expect(forSnapshot(response.subjectStatuses)).toMatchSnapshot()
|
|
91
|
-
})
|
|
92
|
-
|
|
93
|
-
it('returns statuses filtered by subject language', async () => {
|
|
94
|
-
const klingonQueue = await modClient.queryStatuses({
|
|
95
|
-
tags: ['lang:i'],
|
|
96
|
-
})
|
|
97
|
-
|
|
98
|
-
expect(forSnapshot(klingonQueue.subjectStatuses)).toMatchSnapshot()
|
|
99
|
-
|
|
100
|
-
const nonKlingonQueue = await modClient.queryStatuses({
|
|
101
|
-
excludeTags: ['lang:i'],
|
|
102
|
-
})
|
|
103
|
-
|
|
104
|
-
// Verify that the klingon tagged subject is not returned when excluding klingon
|
|
105
|
-
expect(nonKlingonQueue.subjectStatuses.map((s) => s.id)).not.toContain(
|
|
106
|
-
klingonQueue.subjectStatuses[0].id,
|
|
107
|
-
)
|
|
108
|
-
|
|
109
|
-
// Verify multi lang tag exclusion
|
|
110
|
-
Promise.all(
|
|
111
|
-
nonKlingonQueue.subjectStatuses.map((s, i) => {
|
|
112
|
-
return modClient.emitEvent({
|
|
113
|
-
subject: s.subject,
|
|
114
|
-
event: {
|
|
115
|
-
$type: 'tools.ozone.moderation.defs#modEventTag',
|
|
116
|
-
add: [i % 2 ? 'lang:jp' : 'lang:it'],
|
|
117
|
-
remove: [],
|
|
118
|
-
comment: 'Adding custom lang tag',
|
|
119
|
-
},
|
|
120
|
-
createdBy: sc.dids.alice,
|
|
121
|
-
})
|
|
122
|
-
}),
|
|
123
|
-
)
|
|
124
|
-
|
|
125
|
-
const queueWithoutKlingonAndItalian = await modClient.queryStatuses({
|
|
126
|
-
excludeTags: ['lang:i', 'lang:it'],
|
|
127
|
-
})
|
|
128
|
-
|
|
129
|
-
queueWithoutKlingonAndItalian.subjectStatuses
|
|
130
|
-
.map((s) => s.tags)
|
|
131
|
-
.flat()
|
|
132
|
-
.forEach((tag) => {
|
|
133
|
-
expect(['lang:it', 'lang:i']).not.toContain(tag)
|
|
134
|
-
})
|
|
135
|
-
})
|
|
136
|
-
|
|
137
|
-
it('returns paginated statuses', async () => {
|
|
138
|
-
// We know there will be exactly 4 statuses in db
|
|
139
|
-
const getPaginatedStatuses = async (
|
|
140
|
-
params: ToolsOzoneModerationQueryStatuses.QueryParams,
|
|
141
|
-
) => {
|
|
142
|
-
let cursor: string | undefined = ''
|
|
143
|
-
const statuses: ToolsOzoneModerationDefs.SubjectStatusView[] = []
|
|
144
|
-
let count = 0
|
|
145
|
-
do {
|
|
146
|
-
const results = await modClient.queryStatuses({
|
|
147
|
-
limit: 1,
|
|
148
|
-
cursor,
|
|
149
|
-
...params,
|
|
150
|
-
})
|
|
151
|
-
cursor = results.cursor
|
|
152
|
-
statuses.push(...results.subjectStatuses)
|
|
153
|
-
count++
|
|
154
|
-
// The count is just a brake-check to prevent infinite loop
|
|
155
|
-
} while (cursor && count < 10)
|
|
156
|
-
|
|
157
|
-
return statuses
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
const list = await getPaginatedStatuses({})
|
|
161
|
-
expect(list[0].id).toEqual(7)
|
|
162
|
-
expect(list[list.length - 1].id).toEqual(1)
|
|
163
|
-
|
|
164
|
-
await modClient.emitEvent({
|
|
165
|
-
subject: list[1].subject,
|
|
166
|
-
event: {
|
|
167
|
-
$type: 'tools.ozone.moderation.defs#modEventAcknowledge',
|
|
168
|
-
comment: 'X',
|
|
169
|
-
},
|
|
170
|
-
})
|
|
171
|
-
|
|
172
|
-
const listReviewedFirst = await getPaginatedStatuses({
|
|
173
|
-
sortDirection: 'desc',
|
|
174
|
-
sortField: 'lastReviewedAt',
|
|
175
|
-
})
|
|
176
|
-
|
|
177
|
-
// Verify that the item that was recently reviewed comes up first when sorted descendingly
|
|
178
|
-
// while the result set always contains same number of items regardless of sorting
|
|
179
|
-
expect(listReviewedFirst[0].id).toEqual(list[1].id)
|
|
180
|
-
expect(listReviewedFirst.length).toEqual(list.length)
|
|
181
|
-
})
|
|
182
|
-
|
|
183
|
-
it('returns statuses for specified collections', async () => {
|
|
184
|
-
const sp = await sc.createStarterPack(
|
|
185
|
-
sc.dids.alice,
|
|
186
|
-
"alice's about to get blocked starter pack",
|
|
187
|
-
[sc.dids.bob, sc.dids.carol],
|
|
188
|
-
[],
|
|
189
|
-
)
|
|
190
|
-
await sc.createReport({
|
|
191
|
-
reasonType: REASONSPAM,
|
|
192
|
-
reason: 'X',
|
|
193
|
-
subject: {
|
|
194
|
-
$type: 'com.atproto.repo.strongRef',
|
|
195
|
-
...sp.raw,
|
|
196
|
-
},
|
|
197
|
-
reportedBy: sc.dids.bob,
|
|
198
|
-
})
|
|
199
|
-
|
|
200
|
-
const [
|
|
201
|
-
onlyStarterPackStatuses,
|
|
202
|
-
onlyAlicesStarterPackStatuses,
|
|
203
|
-
onlyBobsStarterPackStatuses,
|
|
204
|
-
onlyPostStatuses,
|
|
205
|
-
] = await Promise.all([
|
|
206
|
-
modClient.queryStatuses({
|
|
207
|
-
collections: ['app.bsky.graph.starterpack'],
|
|
208
|
-
}),
|
|
209
|
-
modClient.queryStatuses({
|
|
210
|
-
subject: sc.dids.alice,
|
|
211
|
-
includeAllUserRecords: true,
|
|
212
|
-
collections: ['app.bsky.graph.starterpack'],
|
|
213
|
-
}),
|
|
214
|
-
modClient.queryStatuses({
|
|
215
|
-
subject: sc.dids.bob,
|
|
216
|
-
includeAllUserRecords: true,
|
|
217
|
-
collections: ['app.bsky.graph.starterpack'],
|
|
218
|
-
}),
|
|
219
|
-
modClient.queryStatuses({
|
|
220
|
-
collections: ['app.bsky.feed.post'],
|
|
221
|
-
}),
|
|
222
|
-
])
|
|
223
|
-
|
|
224
|
-
expect(onlyStarterPackStatuses.subjectStatuses.length).toEqual(1)
|
|
225
|
-
assert(isStrongRef(onlyStarterPackStatuses.subjectStatuses[0].subject))
|
|
226
|
-
expect(onlyStarterPackStatuses.subjectStatuses[0].subject.uri).toContain(
|
|
227
|
-
'app.bsky.graph.starterpack',
|
|
228
|
-
)
|
|
229
|
-
expect(onlyAlicesStarterPackStatuses.subjectStatuses.length).toEqual(1)
|
|
230
|
-
assert(
|
|
231
|
-
isStrongRef(onlyAlicesStarterPackStatuses.subjectStatuses[0].subject),
|
|
232
|
-
)
|
|
233
|
-
expect(
|
|
234
|
-
onlyAlicesStarterPackStatuses.subjectStatuses[0].subject.uri,
|
|
235
|
-
).toEqual(sp.uriStr)
|
|
236
|
-
expect(onlyBobsStarterPackStatuses.subjectStatuses.length).toEqual(0)
|
|
237
|
-
expect(onlyPostStatuses.subjectStatuses.length).toEqual(2)
|
|
238
|
-
})
|
|
239
|
-
|
|
240
|
-
it('returns statuses for account or records', async () => {
|
|
241
|
-
const [
|
|
242
|
-
onlyAccountStatuses,
|
|
243
|
-
onlyRecordStatuses,
|
|
244
|
-
onlyStatusesOnBobsAccount,
|
|
245
|
-
] = await Promise.all([
|
|
246
|
-
modClient.queryStatuses({
|
|
247
|
-
subjectType: 'account',
|
|
248
|
-
}),
|
|
249
|
-
modClient.queryStatuses({
|
|
250
|
-
subjectType: 'record',
|
|
251
|
-
}),
|
|
252
|
-
modClient.queryStatuses({
|
|
253
|
-
subject: sc.dids.bob,
|
|
254
|
-
subjectType: 'record',
|
|
255
|
-
}),
|
|
256
|
-
])
|
|
257
|
-
|
|
258
|
-
assert(
|
|
259
|
-
onlyAccountStatuses.subjectStatuses.every(
|
|
260
|
-
(e) => !isStrongRef(e.subject),
|
|
261
|
-
),
|
|
262
|
-
'only account statuses are returned, no event has a uri',
|
|
263
|
-
)
|
|
264
|
-
|
|
265
|
-
assert(
|
|
266
|
-
onlyRecordStatuses.subjectStatuses.every(
|
|
267
|
-
(e) => isStrongRef(e.subject) && e.subject.uri,
|
|
268
|
-
),
|
|
269
|
-
'only record statuses are returned, all events have a uri',
|
|
270
|
-
)
|
|
271
|
-
|
|
272
|
-
assert(
|
|
273
|
-
onlyStatusesOnBobsAccount.subjectStatuses.every(
|
|
274
|
-
(e) => isRepoRef(e.subject) && e.subject.did === sc.dids.bob,
|
|
275
|
-
),
|
|
276
|
-
"only bob's account statuses are returned, no events have a URI even though the subjectType is record",
|
|
277
|
-
)
|
|
278
|
-
})
|
|
279
|
-
|
|
280
|
-
it('returns statuses for conversations', async () => {
|
|
281
|
-
const convoId1 = 'test-convo-123'
|
|
282
|
-
const convoId2 = 'test-convo-456'
|
|
283
|
-
|
|
284
|
-
// Create reports for conversation 1
|
|
285
|
-
await sc.createReport({
|
|
286
|
-
reasonType: REASONSPAM,
|
|
287
|
-
reason: 'spam in convo 1',
|
|
288
|
-
subject: {
|
|
289
|
-
$type: 'chat.bsky.convo.defs#convoRef',
|
|
290
|
-
did: sc.dids.carol,
|
|
291
|
-
convoId: convoId1,
|
|
292
|
-
},
|
|
293
|
-
reportedBy: sc.dids.alice,
|
|
294
|
-
})
|
|
295
|
-
|
|
296
|
-
// Create another report for conversation 1
|
|
297
|
-
await sc.createReport({
|
|
298
|
-
reasonType: REASONMISLEADING,
|
|
299
|
-
reason: 'misleading in convo 1',
|
|
300
|
-
subject: {
|
|
301
|
-
$type: 'chat.bsky.convo.defs#convoRef',
|
|
302
|
-
did: sc.dids.carol,
|
|
303
|
-
convoId: convoId1,
|
|
304
|
-
},
|
|
305
|
-
reportedBy: sc.dids.bob,
|
|
306
|
-
})
|
|
307
|
-
|
|
308
|
-
// Create report for conversation 2
|
|
309
|
-
await sc.createReport({
|
|
310
|
-
reasonType: REASONSPAM,
|
|
311
|
-
reason: 'spam in convo 2',
|
|
312
|
-
subject: {
|
|
313
|
-
$type: 'chat.bsky.convo.defs#convoRef',
|
|
314
|
-
did: sc.dids.carol,
|
|
315
|
-
convoId: convoId2,
|
|
316
|
-
},
|
|
317
|
-
reportedBy: sc.dids.alice,
|
|
318
|
-
})
|
|
319
|
-
|
|
320
|
-
// Query statuses for conversation 1 using AT URI format
|
|
321
|
-
const convo1Statuses = await modClient.queryStatuses({
|
|
322
|
-
subject: `at://${sc.dids.carol}/chat.bsky.convo/${convoId1}`,
|
|
323
|
-
})
|
|
324
|
-
|
|
325
|
-
// Query statuses for conversation 2
|
|
326
|
-
const convo2Statuses = await modClient.queryStatuses({
|
|
327
|
-
subject: `at://${sc.dids.carol}/chat.bsky.convo/${convoId2}`,
|
|
328
|
-
})
|
|
329
|
-
|
|
330
|
-
// Query all conversation statuses for carol
|
|
331
|
-
const allCarolConvoStatuses = await modClient.queryStatuses({
|
|
332
|
-
subject: sc.dids.carol,
|
|
333
|
-
includeAllUserRecords: true,
|
|
334
|
-
})
|
|
335
|
-
|
|
336
|
-
// Verify conversation 1 has exactly 1 status (multiple reports create one status)
|
|
337
|
-
expect(convo1Statuses.subjectStatuses.length).toEqual(1)
|
|
338
|
-
expect(convo1Statuses.subjectStatuses[0].subject.$type).toEqual(
|
|
339
|
-
'chat.bsky.convo.defs#convoRef',
|
|
340
|
-
)
|
|
341
|
-
expect(convo1Statuses.subjectStatuses[0].reviewState).toEqual(REVIEWOPEN)
|
|
342
|
-
|
|
343
|
-
// Verify conversation 2 has exactly 1 status
|
|
344
|
-
expect(convo2Statuses.subjectStatuses.length).toEqual(1)
|
|
345
|
-
expect(convo2Statuses.subjectStatuses[0].subject.$type).toEqual(
|
|
346
|
-
'chat.bsky.convo.defs#convoRef',
|
|
347
|
-
)
|
|
348
|
-
|
|
349
|
-
// Verify statuses are properly isolated by conversation
|
|
350
|
-
const convo1Subject = convo1Statuses.subjectStatuses[0].subject as any
|
|
351
|
-
const convo2Subject = convo2Statuses.subjectStatuses[0].subject as any
|
|
352
|
-
expect(convo1Subject.convoId).toEqual(convoId1)
|
|
353
|
-
expect(convo2Subject.convoId).toEqual(convoId2)
|
|
354
|
-
|
|
355
|
-
// Verify includeAllUserRecords includes conversations
|
|
356
|
-
const convoStatuses = allCarolConvoStatuses.subjectStatuses.filter(
|
|
357
|
-
(s) => s.subject.$type === 'chat.bsky.convo.defs#convoRef',
|
|
358
|
-
)
|
|
359
|
-
expect(convoStatuses.length).toBeGreaterThanOrEqual(2)
|
|
360
|
-
})
|
|
361
|
-
})
|
|
362
|
-
|
|
363
|
-
describe('reviewState changes', () => {
|
|
364
|
-
it('only sets state to #reviewNone on first non-impactful event', async () => {
|
|
365
|
-
const bobsAccount = {
|
|
366
|
-
$type: 'com.atproto.admin.defs#repoRef',
|
|
367
|
-
did: sc.dids.bob,
|
|
368
|
-
}
|
|
369
|
-
const alicesPost = {
|
|
370
|
-
$type: 'com.atproto.repo.strongRef',
|
|
371
|
-
uri: sc.posts[sc.dids.alice][0].ref.uriStr,
|
|
372
|
-
cid: sc.posts[sc.dids.alice][0].ref.cidStr,
|
|
373
|
-
}
|
|
374
|
-
const getBobsAccountStatus = async () => {
|
|
375
|
-
const data = await modClient.queryStatuses({
|
|
376
|
-
subject: bobsAccount.did,
|
|
377
|
-
})
|
|
378
|
-
|
|
379
|
-
return data.subjectStatuses[0]
|
|
380
|
-
}
|
|
381
|
-
// Since bob's account already had a reviewState, it won't be changed by non-impactful events
|
|
382
|
-
const bobsAccountStatusBeforeTag = await getBobsAccountStatus()
|
|
383
|
-
|
|
384
|
-
await Promise.all([
|
|
385
|
-
modClient.emitEvent({
|
|
386
|
-
subject: bobsAccount,
|
|
387
|
-
event: {
|
|
388
|
-
$type: 'tools.ozone.moderation.defs#modEventTag',
|
|
389
|
-
add: ['newTag'],
|
|
390
|
-
remove: [],
|
|
391
|
-
comment: 'X',
|
|
392
|
-
},
|
|
393
|
-
createdBy: sc.dids.alice,
|
|
394
|
-
}),
|
|
395
|
-
modClient.emitEvent({
|
|
396
|
-
subject: bobsAccount,
|
|
397
|
-
event: {
|
|
398
|
-
$type: 'tools.ozone.moderation.defs#modEventComment',
|
|
399
|
-
comment: 'X',
|
|
400
|
-
},
|
|
401
|
-
createdBy: sc.dids.alice,
|
|
402
|
-
}),
|
|
403
|
-
])
|
|
404
|
-
const bobsAccountStatusAfterTag = await getBobsAccountStatus()
|
|
405
|
-
|
|
406
|
-
expect(bobsAccountStatusBeforeTag.reviewState).toEqual(
|
|
407
|
-
bobsAccountStatusAfterTag.reviewState,
|
|
408
|
-
)
|
|
409
|
-
|
|
410
|
-
// Since alice's post didn't have a reviewState it is set to reviewNone on first non-impactful event
|
|
411
|
-
const getAlicesPostStatus = async () => {
|
|
412
|
-
const data = await modClient.queryStatuses({
|
|
413
|
-
subject: alicesPost.uri,
|
|
414
|
-
})
|
|
415
|
-
|
|
416
|
-
return data.subjectStatuses[0]
|
|
417
|
-
}
|
|
418
|
-
|
|
419
|
-
const alicesPostStatusBeforeTag = await getAlicesPostStatus()
|
|
420
|
-
expect(alicesPostStatusBeforeTag).toBeUndefined()
|
|
421
|
-
|
|
422
|
-
await modClient.emitEvent({
|
|
423
|
-
subject: alicesPost,
|
|
424
|
-
event: {
|
|
425
|
-
$type: 'tools.ozone.moderation.defs#modEventComment',
|
|
426
|
-
comment: 'X',
|
|
427
|
-
},
|
|
428
|
-
createdBy: sc.dids.alice,
|
|
429
|
-
})
|
|
430
|
-
const alicesPostStatusAfterTag = await getAlicesPostStatus()
|
|
431
|
-
expect(alicesPostStatusAfterTag.reviewState).toEqual(REVIEWNONE)
|
|
432
|
-
|
|
433
|
-
await modClient.emitEvent({
|
|
434
|
-
subject: alicesPost,
|
|
435
|
-
event: {
|
|
436
|
-
$type: 'tools.ozone.moderation.defs#modEventReport',
|
|
437
|
-
reportType: REASONMISLEADING,
|
|
438
|
-
comment: 'X',
|
|
439
|
-
},
|
|
440
|
-
createdBy: sc.dids.alice,
|
|
441
|
-
})
|
|
442
|
-
const alicesPostStatusAfterReport = await getAlicesPostStatus()
|
|
443
|
-
expect(alicesPostStatusAfterReport.reviewState).toEqual(REVIEWOPEN)
|
|
444
|
-
})
|
|
445
|
-
})
|
|
446
|
-
|
|
447
|
-
describe('blobs', () => {
|
|
448
|
-
it('are tracked on takendown subject', async () => {
|
|
449
|
-
const post = sc.posts[sc.dids.carol][0]
|
|
450
|
-
assert(post.images.length > 1)
|
|
451
|
-
await modClient.emitEvent({
|
|
452
|
-
event: {
|
|
453
|
-
$type: 'tools.ozone.moderation.defs#modEventTakedown',
|
|
454
|
-
},
|
|
455
|
-
subject: {
|
|
456
|
-
$type: 'com.atproto.repo.strongRef',
|
|
457
|
-
uri: post.ref.uriStr,
|
|
458
|
-
cid: post.ref.cidStr,
|
|
459
|
-
},
|
|
460
|
-
subjectBlobCids: [post.images[0].image.ref.toString()],
|
|
461
|
-
createdBy: sc.dids.alice,
|
|
462
|
-
})
|
|
463
|
-
const result = await modClient.queryStatuses({
|
|
464
|
-
subject: post.ref.uriStr,
|
|
465
|
-
})
|
|
466
|
-
expect(result.subjectStatuses.length).toBe(1)
|
|
467
|
-
expect(result.subjectStatuses[0]).toMatchObject({
|
|
468
|
-
takendown: true,
|
|
469
|
-
subjectBlobCids: [post.images[0].image.ref.toString()],
|
|
470
|
-
})
|
|
471
|
-
})
|
|
472
|
-
|
|
473
|
-
it('are tracked on reverse-takendown subject based on previous status', async () => {
|
|
474
|
-
const post = sc.posts[sc.dids.carol][0]
|
|
475
|
-
await modClient.emitEvent({
|
|
476
|
-
event: {
|
|
477
|
-
$type: 'tools.ozone.moderation.defs#modEventReverseTakedown',
|
|
478
|
-
},
|
|
479
|
-
subject: {
|
|
480
|
-
$type: 'com.atproto.repo.strongRef',
|
|
481
|
-
uri: post.ref.uriStr,
|
|
482
|
-
cid: post.ref.cidStr,
|
|
483
|
-
},
|
|
484
|
-
})
|
|
485
|
-
const result = await modClient.queryStatuses({
|
|
486
|
-
subject: post.ref.uriStr,
|
|
487
|
-
})
|
|
488
|
-
expect(result.subjectStatuses.length).toBe(1)
|
|
489
|
-
expect(result.subjectStatuses[0]).toMatchObject({
|
|
490
|
-
takendown: false,
|
|
491
|
-
subjectBlobCids: [post.images[0].image.ref.toString()],
|
|
492
|
-
})
|
|
493
|
-
})
|
|
494
|
-
})
|
|
495
|
-
})
|