@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,197 +0,0 @@
|
|
|
1
|
-
import assert from 'node:assert'
|
|
2
|
-
import {
|
|
3
|
-
ModeratorClient,
|
|
4
|
-
SeedClient,
|
|
5
|
-
TestNetwork,
|
|
6
|
-
basicSeed,
|
|
7
|
-
} from '@atproto/dev-env'
|
|
8
|
-
import { isRepoRef } from '../src/lexicon/types/com/atproto/admin/defs.js'
|
|
9
|
-
import { REASONMISLEADING } from '../src/lexicon/types/com/atproto/moderation/defs.js'
|
|
10
|
-
import { isMain as isStrongRef } from '../src/lexicon/types/com/atproto/repo/strongRef.js'
|
|
11
|
-
import {
|
|
12
|
-
REVIEWOPEN,
|
|
13
|
-
SubjectStatusView,
|
|
14
|
-
isAccountHosting,
|
|
15
|
-
isRecordHosting,
|
|
16
|
-
} from '../src/lexicon/types/tools/ozone/moderation/defs.js'
|
|
17
|
-
import { InputSchema } from '../src/lexicon/types/tools/ozone/moderation/emitEvent.js'
|
|
18
|
-
|
|
19
|
-
describe('record and account events on moderation subjects', () => {
|
|
20
|
-
let network: TestNetwork
|
|
21
|
-
let sc: SeedClient
|
|
22
|
-
let modClient: ModeratorClient
|
|
23
|
-
|
|
24
|
-
beforeAll(async () => {
|
|
25
|
-
network = await TestNetwork.create({
|
|
26
|
-
dbPostgresSchema: 'ozone_record_and_account_events',
|
|
27
|
-
})
|
|
28
|
-
sc = network.getSeedClient()
|
|
29
|
-
modClient = network.ozone.getModClient()
|
|
30
|
-
await basicSeed(sc)
|
|
31
|
-
await network.processAll()
|
|
32
|
-
})
|
|
33
|
-
|
|
34
|
-
afterAll(async () => {
|
|
35
|
-
await network?.close()
|
|
36
|
-
})
|
|
37
|
-
|
|
38
|
-
const getSubjectStatus = async (
|
|
39
|
-
subject: string,
|
|
40
|
-
): Promise<SubjectStatusView | undefined> => {
|
|
41
|
-
const res = await modClient.queryStatuses({
|
|
42
|
-
subject,
|
|
43
|
-
})
|
|
44
|
-
return res.subjectStatuses[0]
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
describe('record events', () => {
|
|
48
|
-
const emitRecordEvent = async (
|
|
49
|
-
subject: InputSchema['subject'],
|
|
50
|
-
op: 'create' | 'update' | 'delete',
|
|
51
|
-
) => {
|
|
52
|
-
return await modClient.emitEvent(
|
|
53
|
-
{
|
|
54
|
-
event: {
|
|
55
|
-
op,
|
|
56
|
-
timestamp: new Date().toISOString(),
|
|
57
|
-
$type: 'tools.ozone.moderation.defs#recordEvent',
|
|
58
|
-
},
|
|
59
|
-
subject,
|
|
60
|
-
createdBy: 'did:example:admin',
|
|
61
|
-
},
|
|
62
|
-
'admin',
|
|
63
|
-
)
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
it('saves updated and deleted timestamps and record status', async () => {
|
|
67
|
-
const bobsPostSubject = {
|
|
68
|
-
$type: 'com.atproto.repo.strongRef',
|
|
69
|
-
uri: sc.posts[sc.dids.bob][1].ref.uriStr,
|
|
70
|
-
cid: sc.posts[sc.dids.bob][1].ref.cidStr,
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
await sc.createReport({
|
|
74
|
-
reportedBy: sc.dids.carol,
|
|
75
|
-
reasonType: REASONMISLEADING,
|
|
76
|
-
reason: 'misleading',
|
|
77
|
-
subject: bobsPostSubject,
|
|
78
|
-
})
|
|
79
|
-
|
|
80
|
-
await emitRecordEvent(bobsPostSubject, 'update')
|
|
81
|
-
const statusAfterUpdate = await getSubjectStatus(bobsPostSubject.uri)
|
|
82
|
-
assert(isRecordHosting(statusAfterUpdate?.hosting))
|
|
83
|
-
expect(statusAfterUpdate.hosting?.updatedAt).toBeTruthy()
|
|
84
|
-
|
|
85
|
-
await emitRecordEvent(bobsPostSubject, 'delete')
|
|
86
|
-
const statusAfterDelete = await getSubjectStatus(bobsPostSubject.uri)
|
|
87
|
-
assert(isRecordHosting(statusAfterDelete?.hosting))
|
|
88
|
-
expect(statusAfterDelete.hosting?.deletedAt).toBeTruthy()
|
|
89
|
-
expect(statusAfterDelete.hosting?.status).toEqual('deleted')
|
|
90
|
-
// Ensure that due to delete or update event, review state does not change
|
|
91
|
-
expect(statusAfterDelete.reviewState).toEqual(REVIEWOPEN)
|
|
92
|
-
})
|
|
93
|
-
})
|
|
94
|
-
describe('account/identity events', () => {
|
|
95
|
-
const emitAccountEvent = async (
|
|
96
|
-
subject: InputSchema['subject'],
|
|
97
|
-
active: boolean,
|
|
98
|
-
status?: 'takendown' | 'deleted' | 'deactivated' | 'suspended',
|
|
99
|
-
) => {
|
|
100
|
-
return await modClient.emitEvent(
|
|
101
|
-
{
|
|
102
|
-
event: {
|
|
103
|
-
status,
|
|
104
|
-
active,
|
|
105
|
-
timestamp: new Date().toISOString(),
|
|
106
|
-
$type: 'tools.ozone.moderation.defs#accountEvent',
|
|
107
|
-
},
|
|
108
|
-
subject,
|
|
109
|
-
createdBy: 'did:example:admin',
|
|
110
|
-
},
|
|
111
|
-
'admin',
|
|
112
|
-
)
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
it('saves updated and deleted timestamps and account status', async () => {
|
|
116
|
-
const carolsAccountSubject = {
|
|
117
|
-
$type: 'com.atproto.admin.defs#repoRef',
|
|
118
|
-
did: sc.dids.carol,
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
await sc.createReport({
|
|
122
|
-
reportedBy: sc.dids.carol,
|
|
123
|
-
reasonType: REASONMISLEADING,
|
|
124
|
-
reason: 'misleading',
|
|
125
|
-
subject: carolsAccountSubject,
|
|
126
|
-
})
|
|
127
|
-
|
|
128
|
-
await emitAccountEvent(carolsAccountSubject, false, 'deactivated')
|
|
129
|
-
const statusAfterDeactivation = await getSubjectStatus(
|
|
130
|
-
carolsAccountSubject.did,
|
|
131
|
-
)
|
|
132
|
-
assert(isAccountHosting(statusAfterDeactivation?.hosting))
|
|
133
|
-
expect(statusAfterDeactivation.hosting.deactivatedAt).toBeTruthy()
|
|
134
|
-
expect(statusAfterDeactivation.hosting.status).toEqual('deactivated')
|
|
135
|
-
expect(statusAfterDeactivation.reviewState).toEqual(REVIEWOPEN)
|
|
136
|
-
|
|
137
|
-
await emitAccountEvent(carolsAccountSubject, true)
|
|
138
|
-
const statusAfterReactivation = await getSubjectStatus(
|
|
139
|
-
carolsAccountSubject.did,
|
|
140
|
-
)
|
|
141
|
-
assert(isAccountHosting(statusAfterReactivation?.hosting))
|
|
142
|
-
expect(statusAfterReactivation.hosting.updatedAt).toBeTruthy()
|
|
143
|
-
expect(statusAfterReactivation.hosting.status).toEqual('active')
|
|
144
|
-
expect(statusAfterReactivation.hosting.deletedAt).toBeFalsy()
|
|
145
|
-
})
|
|
146
|
-
|
|
147
|
-
it('gets statuses by hosting properties', async () => {
|
|
148
|
-
await Promise.all([
|
|
149
|
-
emitAccountEvent(
|
|
150
|
-
{
|
|
151
|
-
$type: 'com.atproto.admin.defs#repoRef',
|
|
152
|
-
did: sc.dids.carol,
|
|
153
|
-
},
|
|
154
|
-
false,
|
|
155
|
-
'deactivated',
|
|
156
|
-
),
|
|
157
|
-
emitAccountEvent(
|
|
158
|
-
{
|
|
159
|
-
$type: 'com.atproto.admin.defs#repoRef',
|
|
160
|
-
did: sc.dids.bob,
|
|
161
|
-
},
|
|
162
|
-
false,
|
|
163
|
-
'deleted',
|
|
164
|
-
),
|
|
165
|
-
])
|
|
166
|
-
const [
|
|
167
|
-
{ subjectStatuses: deactivatedOrDeletedStatuses },
|
|
168
|
-
{ subjectStatuses: deletedStatusesInPastDay },
|
|
169
|
-
{ subjectStatuses: deletedStatusesBeforeYesterday },
|
|
170
|
-
] = await Promise.all([
|
|
171
|
-
modClient.queryStatuses({
|
|
172
|
-
hostingStatuses: ['deactivated', 'deleted'],
|
|
173
|
-
}),
|
|
174
|
-
modClient.queryStatuses({
|
|
175
|
-
hostingDeletedAfter: new Date(
|
|
176
|
-
Date.now() - 1000 * 60 * 60 * 24,
|
|
177
|
-
).toISOString(),
|
|
178
|
-
}),
|
|
179
|
-
modClient.queryStatuses({
|
|
180
|
-
hostingDeletedBefore: new Date(
|
|
181
|
-
Date.now() - 1000 * 60 * 60 * 24,
|
|
182
|
-
).toISOString(),
|
|
183
|
-
}),
|
|
184
|
-
])
|
|
185
|
-
|
|
186
|
-
expect(deactivatedOrDeletedStatuses.length).toEqual(3)
|
|
187
|
-
expect(deletedStatusesInPastDay.length).toEqual(2)
|
|
188
|
-
assert(isStrongRef(deletedStatusesInPastDay[0]?.subject))
|
|
189
|
-
expect(deletedStatusesInPastDay[0]?.subject.uri).toEqual(
|
|
190
|
-
sc.posts[sc.dids.bob][1].ref.uriStr,
|
|
191
|
-
)
|
|
192
|
-
assert(isRepoRef(deletedStatusesInPastDay[1]?.subject))
|
|
193
|
-
expect(deletedStatusesInPastDay[1]?.subject.did).toEqual(sc.dids.bob)
|
|
194
|
-
expect(deletedStatusesBeforeYesterday.length).toEqual(0)
|
|
195
|
-
})
|
|
196
|
-
})
|
|
197
|
-
})
|
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
import { AtpAgent } from '@atproto/api'
|
|
2
|
-
import {
|
|
3
|
-
ModeratorClient,
|
|
4
|
-
SeedClient,
|
|
5
|
-
TestNetwork,
|
|
6
|
-
usersBulkSeed,
|
|
7
|
-
} from '@atproto/dev-env'
|
|
8
|
-
import { ids } from '../src/lexicon/lexicons.js'
|
|
9
|
-
import { OutputSchema as SearchReposOutputSchema } from '../src/lexicon/types/tools/ozone/moderation/searchRepos.js'
|
|
10
|
-
import { paginateAll } from './_util.js'
|
|
11
|
-
|
|
12
|
-
describe('admin repo search view', () => {
|
|
13
|
-
let network: TestNetwork
|
|
14
|
-
let agent: AtpAgent
|
|
15
|
-
let sc: SeedClient
|
|
16
|
-
let modClient: ModeratorClient
|
|
17
|
-
let headers: { [s: string]: string }
|
|
18
|
-
|
|
19
|
-
beforeAll(async () => {
|
|
20
|
-
network = await TestNetwork.create({
|
|
21
|
-
dbPostgresSchema: 'ozone_admin_repo_search',
|
|
22
|
-
})
|
|
23
|
-
agent = network.ozone.getAgent()
|
|
24
|
-
sc = network.getSeedClient()
|
|
25
|
-
modClient = network.ozone.getModClient()
|
|
26
|
-
await usersBulkSeed(sc)
|
|
27
|
-
headers = await network.ozone.modHeaders(
|
|
28
|
-
ids.ToolsOzoneModerationSearchRepos,
|
|
29
|
-
)
|
|
30
|
-
await network.processAll()
|
|
31
|
-
}, 40_000) // @NOTE seeding can take a while
|
|
32
|
-
|
|
33
|
-
afterAll(async () => {
|
|
34
|
-
await network?.close()
|
|
35
|
-
})
|
|
36
|
-
|
|
37
|
-
beforeAll(async () => {
|
|
38
|
-
await modClient.emitEvent({
|
|
39
|
-
event: { $type: 'tools.ozone.moderation.defs#modEventTakedown' },
|
|
40
|
-
subject: {
|
|
41
|
-
$type: 'com.atproto.admin.defs#repoRef',
|
|
42
|
-
did: sc.dids['cara-wiegand69.test'],
|
|
43
|
-
},
|
|
44
|
-
})
|
|
45
|
-
await network.ozone.processAll()
|
|
46
|
-
})
|
|
47
|
-
|
|
48
|
-
it('gives relevant results', async () => {
|
|
49
|
-
const result = await agent.api.tools.ozone.moderation.searchRepos(
|
|
50
|
-
{ term: 'car' },
|
|
51
|
-
{ headers },
|
|
52
|
-
)
|
|
53
|
-
|
|
54
|
-
const handles = result.data.repos.map((u) => u.handle)
|
|
55
|
-
|
|
56
|
-
const shouldContain = [
|
|
57
|
-
'cara-wiegand69.test', // Present despite repo takedown
|
|
58
|
-
'carlos6.test',
|
|
59
|
-
'carolina-mcderm77.test',
|
|
60
|
-
]
|
|
61
|
-
|
|
62
|
-
shouldContain.forEach((handle) => expect(handles).toContain(handle))
|
|
63
|
-
|
|
64
|
-
const shouldNotContain = [
|
|
65
|
-
'sven70.test',
|
|
66
|
-
'hilario84.test',
|
|
67
|
-
'santa-hermann78.test',
|
|
68
|
-
'dylan61.test',
|
|
69
|
-
'preston-harris.test',
|
|
70
|
-
'loyce95.test',
|
|
71
|
-
'melyna-zboncak.test',
|
|
72
|
-
]
|
|
73
|
-
|
|
74
|
-
shouldNotContain.forEach((handle) => expect(handles).not.toContain(handle))
|
|
75
|
-
})
|
|
76
|
-
|
|
77
|
-
it('finds repo by did', async () => {
|
|
78
|
-
const term = sc.dids['cara-wiegand69.test']
|
|
79
|
-
const res = await agent.api.tools.ozone.moderation.searchRepos(
|
|
80
|
-
{ term },
|
|
81
|
-
{ headers },
|
|
82
|
-
)
|
|
83
|
-
|
|
84
|
-
expect(res.data.repos.length).toEqual(1)
|
|
85
|
-
expect(res.data.repos[0].did).toEqual(term)
|
|
86
|
-
})
|
|
87
|
-
|
|
88
|
-
it('paginates with term', async () => {
|
|
89
|
-
const results = (results: SearchReposOutputSchema[]) =>
|
|
90
|
-
results.flatMap((res) => res.repos)
|
|
91
|
-
const paginator = async (cursor?: string) => {
|
|
92
|
-
const res = await agent.api.tools.ozone.moderation.searchRepos(
|
|
93
|
-
{ term: 'p', cursor, limit: 3 },
|
|
94
|
-
{ headers },
|
|
95
|
-
)
|
|
96
|
-
return res.data
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
const paginatedAll = await paginateAll(paginator)
|
|
100
|
-
paginatedAll.forEach((res) =>
|
|
101
|
-
expect(res.repos.length).toBeLessThanOrEqual(3),
|
|
102
|
-
)
|
|
103
|
-
|
|
104
|
-
const full = await agent.api.tools.ozone.moderation.searchRepos(
|
|
105
|
-
{ term: 'p' },
|
|
106
|
-
{ headers },
|
|
107
|
-
)
|
|
108
|
-
|
|
109
|
-
expect(full.data.repos.length).toBeGreaterThan(3)
|
|
110
|
-
expect(results(paginatedAll)).toEqual(results([full.data]))
|
|
111
|
-
})
|
|
112
|
-
|
|
113
|
-
it('paginates without term', async () => {
|
|
114
|
-
const results = (results: SearchReposOutputSchema[]) =>
|
|
115
|
-
results.flatMap((res) => res.repos)
|
|
116
|
-
const paginator = async (cursor?: string) => {
|
|
117
|
-
const res = await agent.api.tools.ozone.moderation.searchRepos(
|
|
118
|
-
{ cursor, limit: 3 },
|
|
119
|
-
{ headers },
|
|
120
|
-
)
|
|
121
|
-
return res.data
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
const paginatedAll = await paginateAll(paginator, 5)
|
|
125
|
-
paginatedAll.forEach((res) =>
|
|
126
|
-
expect(res.repos.length).toBeLessThanOrEqual(3),
|
|
127
|
-
)
|
|
128
|
-
|
|
129
|
-
const full = await agent.api.tools.ozone.moderation.searchRepos(
|
|
130
|
-
{ limit: 15 },
|
|
131
|
-
{ headers },
|
|
132
|
-
)
|
|
133
|
-
|
|
134
|
-
expect(results(paginatedAll)).toEqual(results([full.data]))
|
|
135
|
-
})
|
|
136
|
-
})
|
|
@@ -1,308 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ModeratorClient,
|
|
3
|
-
SeedClient,
|
|
4
|
-
TestNetwork,
|
|
5
|
-
basicSeed,
|
|
6
|
-
} from '@atproto/dev-env'
|
|
7
|
-
import {
|
|
8
|
-
REASONMISLEADING,
|
|
9
|
-
REASONSPAM,
|
|
10
|
-
} from '../src/lexicon/types/com/atproto/moderation/defs.js'
|
|
11
|
-
|
|
12
|
-
describe('report-action', () => {
|
|
13
|
-
let network: TestNetwork
|
|
14
|
-
let sc: SeedClient
|
|
15
|
-
let modClient: ModeratorClient
|
|
16
|
-
|
|
17
|
-
beforeAll(async () => {
|
|
18
|
-
network = await TestNetwork.create({
|
|
19
|
-
dbPostgresSchema: 'ozone_report_action',
|
|
20
|
-
})
|
|
21
|
-
sc = network.getSeedClient()
|
|
22
|
-
modClient = network.ozone.getModClient()
|
|
23
|
-
await basicSeed(sc)
|
|
24
|
-
await network.processAll()
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
beforeEach(async () => {
|
|
28
|
-
await network.processAll()
|
|
29
|
-
})
|
|
30
|
-
|
|
31
|
-
afterAll(async () => {
|
|
32
|
-
await network?.close()
|
|
33
|
-
})
|
|
34
|
-
|
|
35
|
-
describe('emitEvent with reportAction', () => {
|
|
36
|
-
it('actions specific report IDs and updates status to closed', async () => {
|
|
37
|
-
// Create 3 reports on bob's account
|
|
38
|
-
const bobsAccount = {
|
|
39
|
-
$type: 'com.atproto.admin.defs#repoRef',
|
|
40
|
-
did: sc.dids.bob,
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
for (let i = 0; i < 3; i++) {
|
|
44
|
-
await sc.createReport({
|
|
45
|
-
reasonType: REASONSPAM,
|
|
46
|
-
reason: `Spam report ${i}`,
|
|
47
|
-
subject: bobsAccount,
|
|
48
|
-
reportedBy: sc.dids.alice,
|
|
49
|
-
})
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
await network.processAll()
|
|
53
|
-
|
|
54
|
-
// Query to get the actual report table IDs
|
|
55
|
-
const allBobReports = await modClient.queryReports({
|
|
56
|
-
status: 'open',
|
|
57
|
-
subject: sc.dids.bob,
|
|
58
|
-
})
|
|
59
|
-
const reportIds = allBobReports.reports.map((r) => r.id)
|
|
60
|
-
|
|
61
|
-
// Action the first 2 reports with an acknowledge event
|
|
62
|
-
await modClient.emitEvent({
|
|
63
|
-
event: { $type: 'tools.ozone.moderation.defs#modEventAcknowledge' },
|
|
64
|
-
subject: bobsAccount,
|
|
65
|
-
reportAction: {
|
|
66
|
-
ids: [reportIds[0], reportIds[1]],
|
|
67
|
-
note: 'Reviewed and found no violation',
|
|
68
|
-
},
|
|
69
|
-
})
|
|
70
|
-
|
|
71
|
-
// Query reports and verify status — split by expected status since
|
|
72
|
-
// queryReports requires a status filter
|
|
73
|
-
const closedBobReports = await modClient.queryReports({
|
|
74
|
-
status: 'closed',
|
|
75
|
-
subject: sc.dids.bob,
|
|
76
|
-
})
|
|
77
|
-
const openBobReports = await modClient.queryReports({
|
|
78
|
-
status: 'open',
|
|
79
|
-
subject: sc.dids.bob,
|
|
80
|
-
})
|
|
81
|
-
|
|
82
|
-
// First 2 should be closed, third should still be open
|
|
83
|
-
const report1 = closedBobReports.reports.find(
|
|
84
|
-
(r) => r.id === reportIds[0],
|
|
85
|
-
)
|
|
86
|
-
const report2 = closedBobReports.reports.find(
|
|
87
|
-
(r) => r.id === reportIds[1],
|
|
88
|
-
)
|
|
89
|
-
const report3 = openBobReports.reports.find((r) => r.id === reportIds[2])
|
|
90
|
-
|
|
91
|
-
expect(report1?.status).toBe('closed')
|
|
92
|
-
expect(report1?.actionNote).toBe('Reviewed and found no violation')
|
|
93
|
-
expect(report1?.actionEventIds?.length).toBe(1)
|
|
94
|
-
|
|
95
|
-
expect(report2?.status).toBe('closed')
|
|
96
|
-
expect(report2?.actionNote).toBe('Reviewed and found no violation')
|
|
97
|
-
expect(report2?.actionEventIds?.length).toBe(1)
|
|
98
|
-
|
|
99
|
-
expect(report3?.status).toBe('open')
|
|
100
|
-
expect(report3?.actionNote).toBeFalsy()
|
|
101
|
-
expect(report3?.actionEventIds).toBeFalsy()
|
|
102
|
-
})
|
|
103
|
-
|
|
104
|
-
it('actions reports by type and associates multiple events', async () => {
|
|
105
|
-
// Create mixed reports on alice's account
|
|
106
|
-
const alicesAccount = {
|
|
107
|
-
$type: 'com.atproto.admin.defs#repoRef',
|
|
108
|
-
did: sc.dids.alice,
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// Create 2 spam and 2 misleading reports
|
|
112
|
-
for (let i = 0; i < 2; i++) {
|
|
113
|
-
await sc.createReport({
|
|
114
|
-
reasonType: REASONSPAM,
|
|
115
|
-
reason: `Spam ${i}`,
|
|
116
|
-
subject: alicesAccount,
|
|
117
|
-
reportedBy: sc.dids.bob,
|
|
118
|
-
})
|
|
119
|
-
await sc.createReport({
|
|
120
|
-
reasonType: REASONMISLEADING,
|
|
121
|
-
reason: `Misleading ${i}`,
|
|
122
|
-
subject: alicesAccount,
|
|
123
|
-
reportedBy: sc.dids.bob,
|
|
124
|
-
})
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
await network.processAll()
|
|
128
|
-
|
|
129
|
-
// Action only spam reports with takedown
|
|
130
|
-
const takedownEvent = await modClient.emitEvent({
|
|
131
|
-
event: {
|
|
132
|
-
$type: 'tools.ozone.moderation.defs#modEventTakedown',
|
|
133
|
-
comment: 'Spam account',
|
|
134
|
-
},
|
|
135
|
-
subject: alicesAccount,
|
|
136
|
-
reportAction: {
|
|
137
|
-
types: ['com.atproto.moderation.defs#reasonSpam'],
|
|
138
|
-
note: 'Account taken down for spam',
|
|
139
|
-
},
|
|
140
|
-
})
|
|
141
|
-
|
|
142
|
-
// Later, escalate the misleading reports
|
|
143
|
-
const escalateEvent = await modClient.emitEvent({
|
|
144
|
-
event: {
|
|
145
|
-
$type: 'tools.ozone.moderation.defs#modEventEscalate',
|
|
146
|
-
comment: 'Needs review',
|
|
147
|
-
},
|
|
148
|
-
subject: alicesAccount,
|
|
149
|
-
reportAction: {
|
|
150
|
-
types: ['com.atproto.moderation.defs#reasonMisleading'],
|
|
151
|
-
},
|
|
152
|
-
})
|
|
153
|
-
|
|
154
|
-
// Query and verify
|
|
155
|
-
const spamReports = await modClient.queryReports({
|
|
156
|
-
status: 'closed',
|
|
157
|
-
subject: sc.dids.alice,
|
|
158
|
-
reportTypes: [REASONSPAM],
|
|
159
|
-
})
|
|
160
|
-
const misleadingReports = await modClient.queryReports({
|
|
161
|
-
status: 'escalated',
|
|
162
|
-
subject: sc.dids.alice,
|
|
163
|
-
reportTypes: [REASONMISLEADING],
|
|
164
|
-
})
|
|
165
|
-
|
|
166
|
-
// Spam reports should be closed with takedown event ID
|
|
167
|
-
expect(spamReports.reports.length).toBe(2)
|
|
168
|
-
spamReports.reports.forEach((report) => {
|
|
169
|
-
expect(report.status).toBe('closed')
|
|
170
|
-
expect(report.actionNote).toBe('Account taken down for spam')
|
|
171
|
-
expect(report.actionEventIds).toContain(takedownEvent.id)
|
|
172
|
-
})
|
|
173
|
-
|
|
174
|
-
// Misleading reports should be escalated with escalate event ID
|
|
175
|
-
expect(misleadingReports.reports.length).toBe(2)
|
|
176
|
-
misleadingReports.reports.forEach((report) => {
|
|
177
|
-
expect(report.status).toBe('escalated')
|
|
178
|
-
expect(report.actionEventIds).toContain(escalateEvent.id)
|
|
179
|
-
})
|
|
180
|
-
})
|
|
181
|
-
|
|
182
|
-
it('actions all reports on a subject and dismisses with comment event', async () => {
|
|
183
|
-
// Create a post with multiple reports (use Carol's post to avoid conflicts)
|
|
184
|
-
const carolsPost = {
|
|
185
|
-
$type: 'com.atproto.repo.strongRef',
|
|
186
|
-
uri: sc.posts[sc.dids.carol][0].ref.uriStr,
|
|
187
|
-
cid: sc.posts[sc.dids.carol][0].ref.cidStr,
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
// Create 3 reports of different types
|
|
191
|
-
await sc.createReport({
|
|
192
|
-
reasonType: REASONSPAM,
|
|
193
|
-
reason: 'Spam post',
|
|
194
|
-
subject: carolsPost,
|
|
195
|
-
reportedBy: sc.dids.bob,
|
|
196
|
-
})
|
|
197
|
-
await sc.createReport({
|
|
198
|
-
reasonType: REASONMISLEADING,
|
|
199
|
-
reason: 'Misleading content',
|
|
200
|
-
subject: carolsPost,
|
|
201
|
-
reportedBy: sc.dids.bob,
|
|
202
|
-
})
|
|
203
|
-
await sc.createReport({
|
|
204
|
-
reasonType: REASONSPAM,
|
|
205
|
-
reason: 'Another spam report',
|
|
206
|
-
subject: carolsPost,
|
|
207
|
-
reportedBy: sc.dids.dan,
|
|
208
|
-
})
|
|
209
|
-
|
|
210
|
-
await network.processAll()
|
|
211
|
-
|
|
212
|
-
// Dismiss all reports with a comment (no subject action)
|
|
213
|
-
await modClient.emitEvent({
|
|
214
|
-
event: {
|
|
215
|
-
$type: 'tools.ozone.moderation.defs#modEventComment',
|
|
216
|
-
comment: 'False positive',
|
|
217
|
-
},
|
|
218
|
-
subject: carolsPost,
|
|
219
|
-
reportAction: {
|
|
220
|
-
all: true,
|
|
221
|
-
note: 'Thank you for reporting. No violation found.',
|
|
222
|
-
},
|
|
223
|
-
})
|
|
224
|
-
|
|
225
|
-
// Query reports on this post
|
|
226
|
-
const postReports = await modClient.queryReports({
|
|
227
|
-
status: 'closed',
|
|
228
|
-
subject: carolsPost.uri,
|
|
229
|
-
})
|
|
230
|
-
|
|
231
|
-
// All 3 reports should be closed
|
|
232
|
-
expect(postReports.reports.length).toBe(3)
|
|
233
|
-
postReports.reports.forEach((report) => {
|
|
234
|
-
expect(report.status).toBe('closed')
|
|
235
|
-
expect(report.actionNote).toBe(
|
|
236
|
-
'Thank you for reporting. No violation found.',
|
|
237
|
-
)
|
|
238
|
-
expect(report.actionEventIds?.length).toBeGreaterThan(0)
|
|
239
|
-
})
|
|
240
|
-
})
|
|
241
|
-
|
|
242
|
-
it('validates report IDs belong to the subject and throws error for mismatches', async () => {
|
|
243
|
-
// Create reports on two different subjects (use carol and dan to avoid conflicts)
|
|
244
|
-
const carolsAccount = {
|
|
245
|
-
$type: 'com.atproto.admin.defs#repoRef',
|
|
246
|
-
did: sc.dids.carol,
|
|
247
|
-
}
|
|
248
|
-
const dansAccount = {
|
|
249
|
-
$type: 'com.atproto.admin.defs#repoRef',
|
|
250
|
-
did: sc.dids.dan,
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
await sc.createReport({
|
|
254
|
-
reasonType: REASONSPAM,
|
|
255
|
-
reason: 'Spam',
|
|
256
|
-
subject: carolsAccount,
|
|
257
|
-
reportedBy: sc.dids.bob,
|
|
258
|
-
})
|
|
259
|
-
|
|
260
|
-
await sc.createReport({
|
|
261
|
-
reasonType: REASONSPAM,
|
|
262
|
-
reason: 'Spam',
|
|
263
|
-
subject: dansAccount,
|
|
264
|
-
reportedBy: sc.dids.bob,
|
|
265
|
-
})
|
|
266
|
-
|
|
267
|
-
await network.processAll()
|
|
268
|
-
|
|
269
|
-
// Query to get actual report table IDs
|
|
270
|
-
const carolReports = await modClient.queryReports({
|
|
271
|
-
status: 'open',
|
|
272
|
-
subject: sc.dids.carol,
|
|
273
|
-
})
|
|
274
|
-
const danReports = await modClient.queryReports({
|
|
275
|
-
status: 'open',
|
|
276
|
-
subject: sc.dids.dan,
|
|
277
|
-
})
|
|
278
|
-
|
|
279
|
-
const carolReportId = carolReports.reports[0].id
|
|
280
|
-
const danReportId = danReports.reports[0].id
|
|
281
|
-
|
|
282
|
-
// Try to action dan's report while targeting carol's account - should fail
|
|
283
|
-
const promise = modClient.emitEvent({
|
|
284
|
-
event: { $type: 'tools.ozone.moderation.defs#modEventAcknowledge' },
|
|
285
|
-
subject: carolsAccount,
|
|
286
|
-
reportAction: {
|
|
287
|
-
ids: [danReportId],
|
|
288
|
-
note: 'This should fail',
|
|
289
|
-
},
|
|
290
|
-
})
|
|
291
|
-
|
|
292
|
-
await expect(promise).rejects.toThrow(
|
|
293
|
-
/No matching reports found|do not exist or do not belong/,
|
|
294
|
-
)
|
|
295
|
-
|
|
296
|
-
// Verify carol's report was not affected
|
|
297
|
-
const carolReportsAfter = await modClient.queryReports({
|
|
298
|
-
status: 'open',
|
|
299
|
-
subject: sc.dids.carol,
|
|
300
|
-
})
|
|
301
|
-
const report = carolReportsAfter.reports.find(
|
|
302
|
-
(r) => r.id === carolReportId,
|
|
303
|
-
)
|
|
304
|
-
expect(report?.status).toBe('open')
|
|
305
|
-
expect(report?.actionEventIds).toBeFalsy()
|
|
306
|
-
})
|
|
307
|
-
})
|
|
308
|
-
})
|