@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,81 +0,0 @@
|
|
|
1
|
-
import { AtpAgent } from '@atproto/api'
|
|
2
|
-
import {
|
|
3
|
-
ModeratorClient,
|
|
4
|
-
SeedClient,
|
|
5
|
-
TestNetwork,
|
|
6
|
-
TestOzone,
|
|
7
|
-
basicSeed,
|
|
8
|
-
} from '@atproto/dev-env'
|
|
9
|
-
import { ids } from '../src/lexicon/lexicons.js'
|
|
10
|
-
import {
|
|
11
|
-
REASONOTHER,
|
|
12
|
-
REASONSPAM,
|
|
13
|
-
} from '../src/lexicon/types/com/atproto/moderation/defs.js'
|
|
14
|
-
import { forSnapshot } from './_util.js'
|
|
15
|
-
|
|
16
|
-
describe('admin get multiple subjects with all relevant details', () => {
|
|
17
|
-
let network: TestNetwork
|
|
18
|
-
let ozone: TestOzone
|
|
19
|
-
let agent: AtpAgent
|
|
20
|
-
let sc: SeedClient
|
|
21
|
-
let modClient: ModeratorClient
|
|
22
|
-
|
|
23
|
-
beforeAll(async () => {
|
|
24
|
-
network = await TestNetwork.create({
|
|
25
|
-
dbPostgresSchema: 'ozone_admin_get_subjects',
|
|
26
|
-
})
|
|
27
|
-
ozone = network.ozone
|
|
28
|
-
agent = ozone.getAgent()
|
|
29
|
-
sc = network.getSeedClient()
|
|
30
|
-
modClient = ozone.getModClient()
|
|
31
|
-
await basicSeed(sc)
|
|
32
|
-
await network.processAll()
|
|
33
|
-
})
|
|
34
|
-
|
|
35
|
-
beforeEach(async () => {
|
|
36
|
-
await network.processAll()
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
afterAll(async () => {
|
|
40
|
-
await network?.close()
|
|
41
|
-
})
|
|
42
|
-
|
|
43
|
-
beforeAll(async () => {
|
|
44
|
-
await sc.createReport({
|
|
45
|
-
reportedBy: sc.dids.bob,
|
|
46
|
-
reasonType: REASONSPAM,
|
|
47
|
-
subject: {
|
|
48
|
-
$type: 'com.atproto.repo.strongRef',
|
|
49
|
-
uri: sc.posts[sc.dids.alice][0].ref.uriStr,
|
|
50
|
-
cid: sc.posts[sc.dids.alice][0].ref.cidStr,
|
|
51
|
-
},
|
|
52
|
-
})
|
|
53
|
-
await sc.createReport({
|
|
54
|
-
reportedBy: sc.dids.carol,
|
|
55
|
-
reasonType: REASONOTHER,
|
|
56
|
-
reason: 'defamation',
|
|
57
|
-
subject: {
|
|
58
|
-
$type: 'com.atproto.admin.defs#repoRef',
|
|
59
|
-
did: sc.dids.alice,
|
|
60
|
-
},
|
|
61
|
-
})
|
|
62
|
-
await modClient.emitEvent({
|
|
63
|
-
event: { $type: 'tools.ozone.moderation.defs#modEventTakedown' },
|
|
64
|
-
subject: {
|
|
65
|
-
$type: 'com.atproto.admin.defs#repoRef',
|
|
66
|
-
did: sc.dids.alice,
|
|
67
|
-
},
|
|
68
|
-
})
|
|
69
|
-
})
|
|
70
|
-
|
|
71
|
-
it('gets multiple subjects with records', async () => {
|
|
72
|
-
const {
|
|
73
|
-
data: { subjects },
|
|
74
|
-
} = await agent.tools.ozone.moderation.getSubjects(
|
|
75
|
-
{ subjects: [sc.dids.alice, sc.posts[sc.dids.alice][0].ref.uriStr] },
|
|
76
|
-
{ headers: await ozone.modHeaders(ids.ToolsOzoneModerationGetSubjects) },
|
|
77
|
-
)
|
|
78
|
-
|
|
79
|
-
expect(forSnapshot(subjects)).toMatchSnapshot()
|
|
80
|
-
})
|
|
81
|
-
})
|
package/tests/mod-tool.test.ts
DELETED
|
@@ -1,268 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ModeratorClient,
|
|
3
|
-
SeedClient,
|
|
4
|
-
TestNetwork,
|
|
5
|
-
basicSeed,
|
|
6
|
-
} from '@atproto/dev-env'
|
|
7
|
-
|
|
8
|
-
describe('mod-tool tracking', () => {
|
|
9
|
-
let network: TestNetwork
|
|
10
|
-
let sc: SeedClient
|
|
11
|
-
let modClient: ModeratorClient
|
|
12
|
-
|
|
13
|
-
beforeAll(async () => {
|
|
14
|
-
network = await TestNetwork.create({
|
|
15
|
-
dbPostgresSchema: 'ozone_mod_tool_test',
|
|
16
|
-
})
|
|
17
|
-
sc = network.getSeedClient()
|
|
18
|
-
modClient = network.ozone.getModClient()
|
|
19
|
-
await basicSeed(sc)
|
|
20
|
-
await network.processAll()
|
|
21
|
-
})
|
|
22
|
-
|
|
23
|
-
afterAll(async () => {
|
|
24
|
-
await network?.close()
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
it('stores and returns modTool with name and meta metadata', async () => {
|
|
28
|
-
const subject = {
|
|
29
|
-
$type: 'com.atproto.repo.strongRef' as const,
|
|
30
|
-
uri: sc.posts[sc.dids.bob][0].ref.uriStr,
|
|
31
|
-
cid: sc.posts[sc.dids.bob][0].ref.cidStr,
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
const modTool = {
|
|
35
|
-
name: 'automod/1.1.3',
|
|
36
|
-
meta: {
|
|
37
|
-
confidence: 85,
|
|
38
|
-
rules: ['high_risk_country', 'spam_detection'],
|
|
39
|
-
version: '1.1.3',
|
|
40
|
-
environment: 'production',
|
|
41
|
-
},
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
const emittedEvent = await modClient.emitEvent({
|
|
45
|
-
event: {
|
|
46
|
-
$type: 'tools.ozone.moderation.defs#modEventLabel',
|
|
47
|
-
createLabelVals: ['spam'],
|
|
48
|
-
negateLabelVals: [],
|
|
49
|
-
},
|
|
50
|
-
subject,
|
|
51
|
-
modTool,
|
|
52
|
-
})
|
|
53
|
-
|
|
54
|
-
expect(emittedEvent.modTool).toEqual(modTool)
|
|
55
|
-
expect(emittedEvent.modTool?.name).toBe('automod/1.1.3')
|
|
56
|
-
expect(emittedEvent.modTool?.meta).toEqual({
|
|
57
|
-
confidence: 85,
|
|
58
|
-
rules: ['high_risk_country', 'spam_detection'],
|
|
59
|
-
version: '1.1.3',
|
|
60
|
-
environment: 'production',
|
|
61
|
-
})
|
|
62
|
-
|
|
63
|
-
const queryResult = await modClient.queryEvents({
|
|
64
|
-
subject: subject.uri,
|
|
65
|
-
})
|
|
66
|
-
|
|
67
|
-
const foundEvent = queryResult.events.find((e) => e.id === emittedEvent.id)
|
|
68
|
-
expect(foundEvent?.modTool).toEqual(modTool)
|
|
69
|
-
})
|
|
70
|
-
|
|
71
|
-
it('filters events by modTool name', async () => {
|
|
72
|
-
const subject = {
|
|
73
|
-
$type: 'com.atproto.repo.strongRef' as const,
|
|
74
|
-
uri: sc.posts[sc.dids.alice][0].ref.uriStr,
|
|
75
|
-
cid: sc.posts[sc.dids.alice][0].ref.cidStr,
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
const event1 = await modClient.emitEvent({
|
|
79
|
-
event: {
|
|
80
|
-
$type: 'tools.ozone.moderation.defs#modEventLabel',
|
|
81
|
-
createLabelVals: ['test1'],
|
|
82
|
-
negateLabelVals: [],
|
|
83
|
-
},
|
|
84
|
-
subject,
|
|
85
|
-
modTool: { name: 'automod/1.1.3' },
|
|
86
|
-
})
|
|
87
|
-
|
|
88
|
-
const event2 = await modClient.emitEvent({
|
|
89
|
-
event: {
|
|
90
|
-
$type: 'tools.ozone.moderation.defs#modEventLabel',
|
|
91
|
-
createLabelVals: ['test2'],
|
|
92
|
-
negateLabelVals: [],
|
|
93
|
-
},
|
|
94
|
-
subject,
|
|
95
|
-
modTool: { name: 'ozone-web/1.0.0' },
|
|
96
|
-
})
|
|
97
|
-
|
|
98
|
-
const event3 = await modClient.emitEvent({
|
|
99
|
-
event: {
|
|
100
|
-
$type: 'tools.ozone.moderation.defs#modEventLabel',
|
|
101
|
-
createLabelVals: ['test3'],
|
|
102
|
-
negateLabelVals: [],
|
|
103
|
-
},
|
|
104
|
-
subject,
|
|
105
|
-
modTool: { name: 'mobile-app/2.1.0' },
|
|
106
|
-
})
|
|
107
|
-
|
|
108
|
-
const automodResults = await modClient.queryEvents({
|
|
109
|
-
subject: subject.uri,
|
|
110
|
-
modTool: ['automod/1.1.3'],
|
|
111
|
-
})
|
|
112
|
-
|
|
113
|
-
expect(automodResults.events).toHaveLength(1)
|
|
114
|
-
expect(automodResults.events[0].id).toBe(event1.id)
|
|
115
|
-
expect(automodResults.events[0].modTool?.name).toBe('automod/1.1.3')
|
|
116
|
-
|
|
117
|
-
const multipleResults = await modClient.queryEvents({
|
|
118
|
-
subject: subject.uri,
|
|
119
|
-
modTool: ['automod/1.1.3', 'ozone-web/1.0.0'],
|
|
120
|
-
})
|
|
121
|
-
|
|
122
|
-
expect(multipleResults.events).toHaveLength(2)
|
|
123
|
-
const eventIds = multipleResults.events.map((e) => e.id)
|
|
124
|
-
expect(eventIds).toContain(event1.id)
|
|
125
|
-
expect(eventIds).toContain(event2.id)
|
|
126
|
-
expect(eventIds).not.toContain(event3.id)
|
|
127
|
-
})
|
|
128
|
-
|
|
129
|
-
it('filters events by batchId and supports pagination', async () => {
|
|
130
|
-
const subject = {
|
|
131
|
-
$type: 'com.atproto.repo.strongRef',
|
|
132
|
-
uri: sc.posts[sc.dids.carol][0].ref.uriStr,
|
|
133
|
-
cid: sc.posts[sc.dids.carol][0].ref.cidStr,
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
const batchId1 = 'batch-123'
|
|
137
|
-
const batchId2 = 'batch-456'
|
|
138
|
-
|
|
139
|
-
// Create events with first batchId
|
|
140
|
-
const event1 = await modClient.emitEvent({
|
|
141
|
-
event: {
|
|
142
|
-
$type: 'tools.ozone.moderation.defs#modEventLabel',
|
|
143
|
-
createLabelVals: ['batch1-event1'],
|
|
144
|
-
negateLabelVals: [],
|
|
145
|
-
},
|
|
146
|
-
subject,
|
|
147
|
-
modTool: {
|
|
148
|
-
name: 'automod/1.1.3',
|
|
149
|
-
meta: { batchId: batchId1 },
|
|
150
|
-
},
|
|
151
|
-
})
|
|
152
|
-
|
|
153
|
-
const event2 = await modClient.emitEvent({
|
|
154
|
-
event: {
|
|
155
|
-
$type: 'tools.ozone.moderation.defs#modEventLabel',
|
|
156
|
-
createLabelVals: ['batch1-event2'],
|
|
157
|
-
negateLabelVals: [],
|
|
158
|
-
},
|
|
159
|
-
subject,
|
|
160
|
-
modTool: {
|
|
161
|
-
name: 'automod/1.1.3',
|
|
162
|
-
meta: { batchId: batchId1 },
|
|
163
|
-
},
|
|
164
|
-
})
|
|
165
|
-
|
|
166
|
-
const event3 = await modClient.emitEvent({
|
|
167
|
-
event: {
|
|
168
|
-
$type: 'tools.ozone.moderation.defs#modEventLabel',
|
|
169
|
-
createLabelVals: ['batch1-event3'],
|
|
170
|
-
negateLabelVals: [],
|
|
171
|
-
},
|
|
172
|
-
subject,
|
|
173
|
-
modTool: {
|
|
174
|
-
name: 'ozone-ui/workspace',
|
|
175
|
-
meta: { batchId: batchId1 },
|
|
176
|
-
},
|
|
177
|
-
})
|
|
178
|
-
|
|
179
|
-
// Create events with second batchId
|
|
180
|
-
const event4 = await modClient.emitEvent({
|
|
181
|
-
event: {
|
|
182
|
-
$type: 'tools.ozone.moderation.defs#modEventLabel',
|
|
183
|
-
createLabelVals: ['batch2-event1'],
|
|
184
|
-
negateLabelVals: [],
|
|
185
|
-
},
|
|
186
|
-
subject,
|
|
187
|
-
modTool: {
|
|
188
|
-
name: 'ozone-ui/workspace',
|
|
189
|
-
meta: { batchId: batchId2 },
|
|
190
|
-
},
|
|
191
|
-
})
|
|
192
|
-
|
|
193
|
-
// Create event without batchId
|
|
194
|
-
const event5 = await modClient.emitEvent({
|
|
195
|
-
event: {
|
|
196
|
-
$type: 'tools.ozone.moderation.defs#modEventLabel',
|
|
197
|
-
createLabelVals: ['no-batch'],
|
|
198
|
-
negateLabelVals: [],
|
|
199
|
-
},
|
|
200
|
-
subject,
|
|
201
|
-
})
|
|
202
|
-
|
|
203
|
-
// Test filtering by first batchId
|
|
204
|
-
const batch1Results = await modClient.queryEvents({
|
|
205
|
-
subject: subject.uri,
|
|
206
|
-
batchId: batchId1,
|
|
207
|
-
})
|
|
208
|
-
|
|
209
|
-
expect(batch1Results.events).toHaveLength(3)
|
|
210
|
-
const batch1EventIds = batch1Results.events.map((e) => e.id)
|
|
211
|
-
expect(batch1EventIds).toContain(event1.id)
|
|
212
|
-
expect(batch1EventIds).toContain(event2.id)
|
|
213
|
-
expect(batch1EventIds).toContain(event3.id)
|
|
214
|
-
expect(batch1EventIds).not.toContain(event4.id)
|
|
215
|
-
expect(batch1EventIds).not.toContain(event5.id)
|
|
216
|
-
|
|
217
|
-
// Verify all events have the correct batchId
|
|
218
|
-
batch1Results.events.forEach((event) => {
|
|
219
|
-
expect(event.modTool?.meta?.batchId).toBe(batchId1)
|
|
220
|
-
})
|
|
221
|
-
|
|
222
|
-
// Test filtering by second batchId
|
|
223
|
-
const batch2Results = await modClient.queryEvents({
|
|
224
|
-
subject: subject.uri,
|
|
225
|
-
batchId: batchId2,
|
|
226
|
-
})
|
|
227
|
-
|
|
228
|
-
expect(batch2Results.events).toHaveLength(1)
|
|
229
|
-
expect(batch2Results.events[0].id).toBe(event4.id)
|
|
230
|
-
expect(batch2Results.events[0].modTool?.meta?.batchId).toBe(batchId2)
|
|
231
|
-
|
|
232
|
-
// Test pagination with batchId filter
|
|
233
|
-
const paginatedResults = await modClient.queryEvents({
|
|
234
|
-
subject: subject.uri,
|
|
235
|
-
batchId: batchId1,
|
|
236
|
-
limit: 2,
|
|
237
|
-
})
|
|
238
|
-
|
|
239
|
-
expect(paginatedResults.events).toHaveLength(2)
|
|
240
|
-
expect(paginatedResults.cursor).toBeTruthy()
|
|
241
|
-
|
|
242
|
-
// Get next page
|
|
243
|
-
const nextPageResults = await modClient.queryEvents({
|
|
244
|
-
subject: subject.uri,
|
|
245
|
-
batchId: batchId1,
|
|
246
|
-
limit: 2,
|
|
247
|
-
cursor: paginatedResults.cursor,
|
|
248
|
-
})
|
|
249
|
-
|
|
250
|
-
expect(nextPageResults.events).toHaveLength(1)
|
|
251
|
-
|
|
252
|
-
// Verify all paginated results have correct batchId
|
|
253
|
-
const allPaginatedEvents = paginatedResults.events.concat(
|
|
254
|
-
nextPageResults.events,
|
|
255
|
-
)
|
|
256
|
-
allPaginatedEvents.forEach((event) => {
|
|
257
|
-
expect(event.modTool?.meta?.batchId).toBe(batchId1)
|
|
258
|
-
})
|
|
259
|
-
|
|
260
|
-
// Verify we got all 3 events across pages
|
|
261
|
-
const allPaginatedIds = paginatedResults.events
|
|
262
|
-
.map((e) => e.id)
|
|
263
|
-
.concat(nextPageResults.events.map((e) => e.id))
|
|
264
|
-
expect(allPaginatedIds).toContain(event1.id)
|
|
265
|
-
expect(allPaginatedIds).toContain(event2.id)
|
|
266
|
-
expect(allPaginatedIds).toContain(event3.id)
|
|
267
|
-
})
|
|
268
|
-
})
|
|
@@ -1,260 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ComAtprotoModerationDefs,
|
|
3
|
-
ToolsOzoneModerationDefs,
|
|
4
|
-
} from '@atproto/api'
|
|
5
|
-
import {
|
|
6
|
-
ModeratorClient,
|
|
7
|
-
SeedClient,
|
|
8
|
-
TestNetwork,
|
|
9
|
-
basicSeed,
|
|
10
|
-
} from '@atproto/dev-env'
|
|
11
|
-
import {
|
|
12
|
-
REASONMISLEADING,
|
|
13
|
-
REASONSPAM,
|
|
14
|
-
} from '../src/lexicon/types/com/atproto/moderation/defs.js'
|
|
15
|
-
import { REVIEWESCALATED } from '../src/lexicon/types/tools/ozone/moderation/defs.js'
|
|
16
|
-
|
|
17
|
-
describe('moderation-appeals', () => {
|
|
18
|
-
let network: TestNetwork
|
|
19
|
-
let sc: SeedClient
|
|
20
|
-
let modClient: ModeratorClient
|
|
21
|
-
|
|
22
|
-
beforeAll(async () => {
|
|
23
|
-
network = await TestNetwork.create({
|
|
24
|
-
dbPostgresSchema: 'ozone_moderation_appeals',
|
|
25
|
-
})
|
|
26
|
-
sc = network.getSeedClient()
|
|
27
|
-
modClient = network.ozone.getModClient()
|
|
28
|
-
await basicSeed(sc)
|
|
29
|
-
await network.processAll()
|
|
30
|
-
})
|
|
31
|
-
|
|
32
|
-
afterAll(async () => {
|
|
33
|
-
await network?.close()
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
const assertSubjectStatus = async (
|
|
37
|
-
subject: string,
|
|
38
|
-
status: string,
|
|
39
|
-
appealed: boolean | undefined,
|
|
40
|
-
): Promise<ToolsOzoneModerationDefs.SubjectStatusView | undefined> => {
|
|
41
|
-
const res = await modClient.queryStatuses({
|
|
42
|
-
subject,
|
|
43
|
-
})
|
|
44
|
-
expect(res.subjectStatuses[0]?.reviewState).toEqual(status)
|
|
45
|
-
expect(res.subjectStatuses[0]?.appealed).toEqual(appealed)
|
|
46
|
-
return res.subjectStatuses[0]
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
describe('appeals from users', () => {
|
|
50
|
-
const getBobsPostSubject = () => ({
|
|
51
|
-
$type: 'com.atproto.repo.strongRef',
|
|
52
|
-
uri: sc.posts[sc.dids.bob][1].ref.uriStr,
|
|
53
|
-
cid: sc.posts[sc.dids.bob][1].ref.cidStr,
|
|
54
|
-
})
|
|
55
|
-
const getCarolPostSubject = () => ({
|
|
56
|
-
$type: 'com.atproto.repo.strongRef',
|
|
57
|
-
uri: sc.posts[sc.dids.carol][0].ref.uriStr,
|
|
58
|
-
cid: sc.posts[sc.dids.carol][0].ref.cidStr,
|
|
59
|
-
})
|
|
60
|
-
const assertBobsPostStatus = async (
|
|
61
|
-
status: string,
|
|
62
|
-
appealed: boolean | undefined,
|
|
63
|
-
) => assertSubjectStatus(getBobsPostSubject().uri, status, appealed)
|
|
64
|
-
|
|
65
|
-
it('only changes subject status if original author of the content or a moderator is appealing', async () => {
|
|
66
|
-
// Create a report by alice
|
|
67
|
-
await modClient.emitEvent({
|
|
68
|
-
event: {
|
|
69
|
-
$type: 'tools.ozone.moderation.defs#modEventReport',
|
|
70
|
-
reportType: REASONMISLEADING,
|
|
71
|
-
},
|
|
72
|
-
subject: getBobsPostSubject(),
|
|
73
|
-
})
|
|
74
|
-
|
|
75
|
-
await assertBobsPostStatus(ToolsOzoneModerationDefs.REVIEWOPEN, undefined)
|
|
76
|
-
|
|
77
|
-
// Create a report as normal user with appeal type
|
|
78
|
-
expect(
|
|
79
|
-
sc.createReport({
|
|
80
|
-
reportedBy: sc.dids.carol,
|
|
81
|
-
reasonType: ComAtprotoModerationDefs.REASONAPPEAL,
|
|
82
|
-
reason: 'appealing',
|
|
83
|
-
subject: getBobsPostSubject(),
|
|
84
|
-
}),
|
|
85
|
-
).rejects.toThrow('You cannot appeal this report')
|
|
86
|
-
|
|
87
|
-
// Verify that the appeal status did not change
|
|
88
|
-
await assertBobsPostStatus(ToolsOzoneModerationDefs.REVIEWOPEN, undefined)
|
|
89
|
-
|
|
90
|
-
// Emit report event as moderator
|
|
91
|
-
await modClient.emitEvent({
|
|
92
|
-
event: {
|
|
93
|
-
$type: 'tools.ozone.moderation.defs#modEventReport',
|
|
94
|
-
reportType: ComAtprotoModerationDefs.REASONAPPEAL,
|
|
95
|
-
},
|
|
96
|
-
subject: getBobsPostSubject(),
|
|
97
|
-
})
|
|
98
|
-
|
|
99
|
-
// Verify that appeal status changed when appeal report was emitted by moderator
|
|
100
|
-
const status = await assertBobsPostStatus(REVIEWESCALATED, true)
|
|
101
|
-
// @ts-expect-error unspecced ?
|
|
102
|
-
expect(status?.appealedAt).not.toBeNull()
|
|
103
|
-
|
|
104
|
-
// Create a report as normal user for carol's post
|
|
105
|
-
await sc.createReport({
|
|
106
|
-
reportedBy: sc.dids.alice,
|
|
107
|
-
reasonType: REASONMISLEADING,
|
|
108
|
-
reason: 'lies!',
|
|
109
|
-
subject: getCarolPostSubject(),
|
|
110
|
-
})
|
|
111
|
-
|
|
112
|
-
// Verify that the appeal status on carol's post is undefined
|
|
113
|
-
await assertSubjectStatus(
|
|
114
|
-
getCarolPostSubject().uri,
|
|
115
|
-
ToolsOzoneModerationDefs.REVIEWOPEN,
|
|
116
|
-
undefined,
|
|
117
|
-
)
|
|
118
|
-
|
|
119
|
-
await sc.createReport({
|
|
120
|
-
reportedBy: sc.dids.carol,
|
|
121
|
-
reasonType: ComAtprotoModerationDefs.REASONAPPEAL,
|
|
122
|
-
reason: 'appealing',
|
|
123
|
-
subject: getCarolPostSubject(),
|
|
124
|
-
})
|
|
125
|
-
// Verify that the appeal status on carol's post is true
|
|
126
|
-
await assertSubjectStatus(
|
|
127
|
-
getCarolPostSubject().uri,
|
|
128
|
-
REVIEWESCALATED,
|
|
129
|
-
true,
|
|
130
|
-
)
|
|
131
|
-
})
|
|
132
|
-
it('allows multiple appeals and updates last appealed timestamp', async () => {
|
|
133
|
-
// Resolve appeal with acknowledge
|
|
134
|
-
await modClient.emitEvent({
|
|
135
|
-
event: {
|
|
136
|
-
$type: 'tools.ozone.moderation.defs#modEventResolveAppeal',
|
|
137
|
-
},
|
|
138
|
-
subject: getBobsPostSubject(),
|
|
139
|
-
})
|
|
140
|
-
|
|
141
|
-
const previousStatus = await assertBobsPostStatus(REVIEWESCALATED, false)
|
|
142
|
-
|
|
143
|
-
await modClient.emitEvent({
|
|
144
|
-
event: {
|
|
145
|
-
$type: 'tools.ozone.moderation.defs#modEventReport',
|
|
146
|
-
reportType: ComAtprotoModerationDefs.REASONAPPEAL,
|
|
147
|
-
},
|
|
148
|
-
subject: getBobsPostSubject(),
|
|
149
|
-
})
|
|
150
|
-
|
|
151
|
-
// Verify that even after the appeal event by bob for his post, the appeal status is true again with new timestamp
|
|
152
|
-
const newStatus = await assertBobsPostStatus(REVIEWESCALATED, true)
|
|
153
|
-
expect(
|
|
154
|
-
new Date(`${previousStatus?.lastAppealedAt}`).getTime(),
|
|
155
|
-
).toBeLessThan(new Date(`${newStatus?.lastAppealedAt}`).getTime())
|
|
156
|
-
})
|
|
157
|
-
})
|
|
158
|
-
|
|
159
|
-
describe('appeal resolution', () => {
|
|
160
|
-
const getAlicesPostSubject = () => ({
|
|
161
|
-
$type: 'com.atproto.repo.strongRef',
|
|
162
|
-
uri: sc.posts[sc.dids.alice][1].ref.uriStr,
|
|
163
|
-
cid: sc.posts[sc.dids.alice][1].ref.cidStr,
|
|
164
|
-
})
|
|
165
|
-
it('appeal status is maintained while review state changes based on incoming events', async () => {
|
|
166
|
-
// Bob reports alice's post
|
|
167
|
-
await modClient.emitEvent({
|
|
168
|
-
event: {
|
|
169
|
-
$type: 'tools.ozone.moderation.defs#modEventReport',
|
|
170
|
-
reportType: REASONMISLEADING,
|
|
171
|
-
},
|
|
172
|
-
subject: getAlicesPostSubject(),
|
|
173
|
-
})
|
|
174
|
-
|
|
175
|
-
// Moderator acknowledges the report, assume a label was applied too
|
|
176
|
-
await modClient.emitEvent({
|
|
177
|
-
event: {
|
|
178
|
-
$type: 'tools.ozone.moderation.defs#modEventAcknowledge',
|
|
179
|
-
},
|
|
180
|
-
subject: getAlicesPostSubject(),
|
|
181
|
-
})
|
|
182
|
-
|
|
183
|
-
// Alice appeals the report
|
|
184
|
-
await modClient.emitEvent({
|
|
185
|
-
event: {
|
|
186
|
-
$type: 'tools.ozone.moderation.defs#modEventReport',
|
|
187
|
-
reportType: ComAtprotoModerationDefs.REASONAPPEAL,
|
|
188
|
-
},
|
|
189
|
-
subject: getAlicesPostSubject(),
|
|
190
|
-
})
|
|
191
|
-
|
|
192
|
-
await assertSubjectStatus(
|
|
193
|
-
getAlicesPostSubject().uri,
|
|
194
|
-
REVIEWESCALATED,
|
|
195
|
-
true,
|
|
196
|
-
)
|
|
197
|
-
|
|
198
|
-
// Bob reports it again
|
|
199
|
-
await modClient.emitEvent({
|
|
200
|
-
event: {
|
|
201
|
-
$type: 'tools.ozone.moderation.defs#modEventReport',
|
|
202
|
-
reportType: REASONSPAM,
|
|
203
|
-
},
|
|
204
|
-
subject: getAlicesPostSubject(),
|
|
205
|
-
})
|
|
206
|
-
|
|
207
|
-
// Assert that the status is still REVIEWESCALATED, as report events are meant to do
|
|
208
|
-
await assertSubjectStatus(
|
|
209
|
-
getAlicesPostSubject().uri,
|
|
210
|
-
REVIEWESCALATED,
|
|
211
|
-
true,
|
|
212
|
-
)
|
|
213
|
-
|
|
214
|
-
// Emit an escalation event
|
|
215
|
-
await modClient.emitEvent({
|
|
216
|
-
event: {
|
|
217
|
-
$type: 'tools.ozone.moderation.defs#modEventEscalate',
|
|
218
|
-
},
|
|
219
|
-
subject: getAlicesPostSubject(),
|
|
220
|
-
})
|
|
221
|
-
|
|
222
|
-
await assertSubjectStatus(
|
|
223
|
-
getAlicesPostSubject().uri,
|
|
224
|
-
REVIEWESCALATED,
|
|
225
|
-
true,
|
|
226
|
-
)
|
|
227
|
-
|
|
228
|
-
// Emit an acknowledge event
|
|
229
|
-
await modClient.emitEvent({
|
|
230
|
-
event: {
|
|
231
|
-
$type: 'tools.ozone.moderation.defs#modEventAcknowledge',
|
|
232
|
-
},
|
|
233
|
-
subject: getAlicesPostSubject(),
|
|
234
|
-
})
|
|
235
|
-
|
|
236
|
-
// Assert that status moved on to reviewClosed while appealed status is still true
|
|
237
|
-
await assertSubjectStatus(
|
|
238
|
-
getAlicesPostSubject().uri,
|
|
239
|
-
ToolsOzoneModerationDefs.REVIEWCLOSED,
|
|
240
|
-
true,
|
|
241
|
-
)
|
|
242
|
-
|
|
243
|
-
// Emit a resolveAppeal event
|
|
244
|
-
await modClient.emitEvent({
|
|
245
|
-
event: {
|
|
246
|
-
$type: 'tools.ozone.moderation.defs#modEventResolveAppeal',
|
|
247
|
-
comment: 'lgtm',
|
|
248
|
-
},
|
|
249
|
-
subject: getAlicesPostSubject(),
|
|
250
|
-
})
|
|
251
|
-
|
|
252
|
-
// Assert that status stayed the same while appealed status is still true
|
|
253
|
-
await assertSubjectStatus(
|
|
254
|
-
getAlicesPostSubject().uri,
|
|
255
|
-
ToolsOzoneModerationDefs.REVIEWCLOSED,
|
|
256
|
-
false,
|
|
257
|
-
)
|
|
258
|
-
})
|
|
259
|
-
})
|
|
260
|
-
})
|