@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
package/tests/sets.test.ts
DELETED
|
@@ -1,246 +0,0 @@
|
|
|
1
|
-
import AtpAgent, {
|
|
2
|
-
ToolsOzoneSetDefs,
|
|
3
|
-
ToolsOzoneSetQuerySets,
|
|
4
|
-
} from '@atproto/api'
|
|
5
|
-
import { SeedClient, TestNetwork, basicSeed } from '@atproto/dev-env'
|
|
6
|
-
import { ids } from '../src/lexicon/lexicons.js'
|
|
7
|
-
import { forSnapshot } from './_util.js'
|
|
8
|
-
|
|
9
|
-
describe('ozone-sets', () => {
|
|
10
|
-
let network: TestNetwork
|
|
11
|
-
let agent: AtpAgent
|
|
12
|
-
let sc: SeedClient
|
|
13
|
-
|
|
14
|
-
const sampleSet1 = {
|
|
15
|
-
name: 'test-set-1',
|
|
16
|
-
description: 'Test set 1',
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
const sampleSet2 = {
|
|
20
|
-
name: 'test-set-2',
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
const sampleSet3 = {
|
|
24
|
-
name: 'another-set',
|
|
25
|
-
description: 'Another test set',
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const upsertSet = async (set: ToolsOzoneSetDefs.Set) => {
|
|
29
|
-
const { data } = await agent.tools.ozone.set.upsertSet(set, {
|
|
30
|
-
encoding: 'application/json',
|
|
31
|
-
headers: await network.ozone.modHeaders(
|
|
32
|
-
ids.ToolsOzoneSetUpsertSet,
|
|
33
|
-
'admin',
|
|
34
|
-
),
|
|
35
|
-
})
|
|
36
|
-
|
|
37
|
-
return data
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const removeSet = async (name: string) => {
|
|
41
|
-
await agent.tools.ozone.set.deleteSet(
|
|
42
|
-
{ name },
|
|
43
|
-
{
|
|
44
|
-
encoding: 'application/json',
|
|
45
|
-
headers: await network.ozone.modHeaders(
|
|
46
|
-
ids.ToolsOzoneSetDeleteSet,
|
|
47
|
-
'admin',
|
|
48
|
-
),
|
|
49
|
-
},
|
|
50
|
-
)
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
const addValues = async (name: string, values: string[]) => {
|
|
54
|
-
await agent.tools.ozone.set.addValues(
|
|
55
|
-
{ name, values },
|
|
56
|
-
{
|
|
57
|
-
encoding: 'application/json',
|
|
58
|
-
headers: await network.ozone.modHeaders(
|
|
59
|
-
ids.ToolsOzoneSetAddValues,
|
|
60
|
-
'admin',
|
|
61
|
-
),
|
|
62
|
-
},
|
|
63
|
-
)
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const getValues = async (name: string, limit?: number, cursor?: string) => {
|
|
67
|
-
const { data } = await agent.tools.ozone.set.getValues(
|
|
68
|
-
{ name, limit, cursor },
|
|
69
|
-
{
|
|
70
|
-
headers: await network.ozone.modHeaders(
|
|
71
|
-
ids.ToolsOzoneSetGetValues,
|
|
72
|
-
'moderator',
|
|
73
|
-
),
|
|
74
|
-
},
|
|
75
|
-
)
|
|
76
|
-
return data
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
const querySets = async (params: ToolsOzoneSetQuerySets.QueryParams) => {
|
|
80
|
-
const { data } = await agent.tools.ozone.set.querySets(params, {
|
|
81
|
-
headers: await network.ozone.modHeaders(
|
|
82
|
-
ids.ToolsOzoneSetQuerySets,
|
|
83
|
-
'moderator',
|
|
84
|
-
),
|
|
85
|
-
})
|
|
86
|
-
return data
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
beforeAll(async () => {
|
|
90
|
-
network = await TestNetwork.create({
|
|
91
|
-
dbPostgresSchema: 'ozone_sets',
|
|
92
|
-
})
|
|
93
|
-
agent = network.ozone.getAgent()
|
|
94
|
-
sc = network.getSeedClient()
|
|
95
|
-
await basicSeed(sc)
|
|
96
|
-
await network.processAll()
|
|
97
|
-
})
|
|
98
|
-
|
|
99
|
-
afterAll(async () => {
|
|
100
|
-
await network?.close()
|
|
101
|
-
})
|
|
102
|
-
|
|
103
|
-
describe('querySets', () => {
|
|
104
|
-
beforeAll(async () => {
|
|
105
|
-
await Promise.all([
|
|
106
|
-
upsertSet(sampleSet1),
|
|
107
|
-
upsertSet(sampleSet2),
|
|
108
|
-
upsertSet(sampleSet3),
|
|
109
|
-
])
|
|
110
|
-
})
|
|
111
|
-
afterAll(async () => {
|
|
112
|
-
await Promise.all([
|
|
113
|
-
removeSet(sampleSet1.name),
|
|
114
|
-
removeSet(sampleSet2.name),
|
|
115
|
-
removeSet(sampleSet3.name),
|
|
116
|
-
])
|
|
117
|
-
})
|
|
118
|
-
it('returns all sets when no parameters are provided', async () => {
|
|
119
|
-
const result = await querySets({})
|
|
120
|
-
expect(result.sets.length).toBe(3)
|
|
121
|
-
expect(forSnapshot(result.sets)).toMatchSnapshot()
|
|
122
|
-
})
|
|
123
|
-
|
|
124
|
-
it('limits the number of returned sets', async () => {
|
|
125
|
-
const result = await querySets({ limit: 2 })
|
|
126
|
-
expect(result.sets.length).toBe(2)
|
|
127
|
-
expect(result.cursor).toBeDefined()
|
|
128
|
-
})
|
|
129
|
-
|
|
130
|
-
it('returns sets after the cursor', async () => {
|
|
131
|
-
const firstPage = await querySets({ limit: 2 })
|
|
132
|
-
const secondPage = await querySets({ cursor: firstPage.cursor })
|
|
133
|
-
expect(secondPage.sets.length).toBe(1)
|
|
134
|
-
expect(secondPage.sets[0].name).toBe('test-set-2')
|
|
135
|
-
})
|
|
136
|
-
|
|
137
|
-
it('filters sets by name prefix', async () => {
|
|
138
|
-
const result = await querySets({ namePrefix: 'test-' })
|
|
139
|
-
expect(result.sets.length).toBe(2)
|
|
140
|
-
expect(result.sets.map((s) => s.name)).toEqual([
|
|
141
|
-
'test-set-1',
|
|
142
|
-
'test-set-2',
|
|
143
|
-
])
|
|
144
|
-
})
|
|
145
|
-
|
|
146
|
-
it('sorts sets by given column and direction', async () => {
|
|
147
|
-
const sortedByName = await querySets({ sortBy: 'name' })
|
|
148
|
-
expect(sortedByName.sets.map((s) => s.name)).toEqual([
|
|
149
|
-
'another-set',
|
|
150
|
-
'test-set-1',
|
|
151
|
-
'test-set-2',
|
|
152
|
-
])
|
|
153
|
-
const reverseSortedByName = await querySets({
|
|
154
|
-
sortBy: 'name',
|
|
155
|
-
sortDirection: 'desc',
|
|
156
|
-
})
|
|
157
|
-
expect(reverseSortedByName.sets.map((s) => s.name)).toEqual([
|
|
158
|
-
'test-set-2',
|
|
159
|
-
'test-set-1',
|
|
160
|
-
'another-set',
|
|
161
|
-
])
|
|
162
|
-
})
|
|
163
|
-
})
|
|
164
|
-
|
|
165
|
-
describe('upsertSet', () => {
|
|
166
|
-
afterAll(async () => {
|
|
167
|
-
await removeSet('new-test-set')
|
|
168
|
-
})
|
|
169
|
-
it('creates a new set', async () => {
|
|
170
|
-
const result = await upsertSet({
|
|
171
|
-
name: 'new-test-set',
|
|
172
|
-
description: 'A new test set',
|
|
173
|
-
})
|
|
174
|
-
expect(forSnapshot(result)).toMatchSnapshot()
|
|
175
|
-
})
|
|
176
|
-
|
|
177
|
-
it('updates an existing set', async () => {
|
|
178
|
-
const result = await upsertSet({
|
|
179
|
-
name: 'new-test-set',
|
|
180
|
-
description: 'Updated description',
|
|
181
|
-
})
|
|
182
|
-
expect(forSnapshot(result)).toMatchSnapshot()
|
|
183
|
-
})
|
|
184
|
-
|
|
185
|
-
it('allows setting empty description', async () => {
|
|
186
|
-
const result = await upsertSet({
|
|
187
|
-
name: 'new-test-set',
|
|
188
|
-
description: '',
|
|
189
|
-
})
|
|
190
|
-
expect(result.description).toBeUndefined()
|
|
191
|
-
})
|
|
192
|
-
})
|
|
193
|
-
|
|
194
|
-
describe('addValues', () => {
|
|
195
|
-
beforeAll(async () => {
|
|
196
|
-
await upsertSet(sampleSet1)
|
|
197
|
-
await upsertSet(sampleSet2)
|
|
198
|
-
})
|
|
199
|
-
afterAll(async () => {
|
|
200
|
-
await removeSet(sampleSet1.name)
|
|
201
|
-
await removeSet(sampleSet2.name)
|
|
202
|
-
})
|
|
203
|
-
it('adds new values to an existing set', async () => {
|
|
204
|
-
const newValues = ['value1', 'value2', 'value3']
|
|
205
|
-
await addValues(sampleSet1.name, newValues)
|
|
206
|
-
|
|
207
|
-
const result = await getValues(sampleSet1.name)
|
|
208
|
-
expect(result.values).toEqual(expect.arrayContaining(newValues))
|
|
209
|
-
})
|
|
210
|
-
|
|
211
|
-
it('does not duplicate existing values', async () => {
|
|
212
|
-
const initialValues = ['initial1', 'initial2']
|
|
213
|
-
await addValues(sampleSet2.name, initialValues)
|
|
214
|
-
|
|
215
|
-
const newValues = ['initial2', 'new1', 'new2']
|
|
216
|
-
await addValues(sampleSet2.name, newValues)
|
|
217
|
-
|
|
218
|
-
const result = await getValues(sampleSet2.name)
|
|
219
|
-
expect(result.values).toEqual(
|
|
220
|
-
expect.arrayContaining([...initialValues, 'new1', 'new2']),
|
|
221
|
-
)
|
|
222
|
-
expect(result.values.filter((v) => v === 'initial2').length).toBe(1)
|
|
223
|
-
})
|
|
224
|
-
})
|
|
225
|
-
|
|
226
|
-
describe('getValues', () => {
|
|
227
|
-
beforeAll(async () => {
|
|
228
|
-
await upsertSet(sampleSet1)
|
|
229
|
-
})
|
|
230
|
-
afterAll(async () => {
|
|
231
|
-
await removeSet(sampleSet1.name)
|
|
232
|
-
})
|
|
233
|
-
it('paginates values from a set', async () => {
|
|
234
|
-
const allValues = Array.from({ length: 9 }, (_, i) => `value${i}`)
|
|
235
|
-
await addValues(sampleSet1.name, allValues)
|
|
236
|
-
|
|
237
|
-
const firstPage = await getValues(sampleSet1.name, 3)
|
|
238
|
-
const secondPage = await getValues(sampleSet1.name, 3, firstPage.cursor)
|
|
239
|
-
const lastPage = await getValues(sampleSet1.name, 3, secondPage.cursor)
|
|
240
|
-
|
|
241
|
-
expect(firstPage.values).toEqual(allValues.slice(0, 3))
|
|
242
|
-
expect(secondPage.values).toEqual(allValues.slice(3, 6))
|
|
243
|
-
expect(lastPage.values).toEqual(allValues.slice(6, 9))
|
|
244
|
-
})
|
|
245
|
-
})
|
|
246
|
-
})
|
package/tests/settings.test.ts
DELETED
|
@@ -1,308 +0,0 @@
|
|
|
1
|
-
import AtpAgent, {
|
|
2
|
-
ToolsOzoneSettingListOptions,
|
|
3
|
-
ToolsOzoneSettingUpsertOption,
|
|
4
|
-
} from '@atproto/api'
|
|
5
|
-
import { SeedClient, TestNetwork, basicSeed } from '@atproto/dev-env'
|
|
6
|
-
import { SettingScope } from '../dist/db/schema/setting.js'
|
|
7
|
-
import { ids } from '../src/lexicon/lexicons.js'
|
|
8
|
-
import { forSnapshot } from './_util.js'
|
|
9
|
-
|
|
10
|
-
describe('ozone-settings', () => {
|
|
11
|
-
let network: TestNetwork
|
|
12
|
-
let agent: AtpAgent
|
|
13
|
-
let sc: SeedClient
|
|
14
|
-
|
|
15
|
-
const upsertOption = async (
|
|
16
|
-
setting: ToolsOzoneSettingUpsertOption.InputSchema,
|
|
17
|
-
callerRole: 'admin' | 'moderator' | 'triage' = 'admin',
|
|
18
|
-
) => {
|
|
19
|
-
const { data } = await agent.tools.ozone.setting.upsertOption(setting, {
|
|
20
|
-
encoding: 'application/json',
|
|
21
|
-
headers: await network.ozone.modHeaders(
|
|
22
|
-
ids.ToolsOzoneSettingUpsertOption,
|
|
23
|
-
callerRole,
|
|
24
|
-
),
|
|
25
|
-
})
|
|
26
|
-
|
|
27
|
-
return data
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
const removeOptions = async (
|
|
31
|
-
keys: string[],
|
|
32
|
-
scope: SettingScope,
|
|
33
|
-
callerRole: 'admin' | 'moderator' | 'triage' = 'admin',
|
|
34
|
-
) => {
|
|
35
|
-
await agent.tools.ozone.setting.removeOptions(
|
|
36
|
-
{ keys, scope },
|
|
37
|
-
{
|
|
38
|
-
encoding: 'application/json',
|
|
39
|
-
headers: await network.ozone.modHeaders(
|
|
40
|
-
ids.ToolsOzoneSettingRemoveOptions,
|
|
41
|
-
callerRole,
|
|
42
|
-
),
|
|
43
|
-
},
|
|
44
|
-
)
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
const listOptions = async (
|
|
48
|
-
params: ToolsOzoneSettingListOptions.QueryParams,
|
|
49
|
-
callerRole: 'admin' | 'moderator' | 'triage' = 'moderator',
|
|
50
|
-
) => {
|
|
51
|
-
const { data } = await agent.tools.ozone.setting.listOptions(params, {
|
|
52
|
-
headers: await network.ozone.modHeaders(
|
|
53
|
-
ids.ToolsOzoneSettingListOptions,
|
|
54
|
-
callerRole,
|
|
55
|
-
),
|
|
56
|
-
})
|
|
57
|
-
return data
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
beforeAll(async () => {
|
|
61
|
-
network = await TestNetwork.create({
|
|
62
|
-
dbPostgresSchema: 'ozone_settings',
|
|
63
|
-
})
|
|
64
|
-
agent = network.ozone.getAgent()
|
|
65
|
-
sc = network.getSeedClient()
|
|
66
|
-
await basicSeed(sc)
|
|
67
|
-
await network.processAll()
|
|
68
|
-
})
|
|
69
|
-
|
|
70
|
-
afterAll(async () => {
|
|
71
|
-
await network?.close()
|
|
72
|
-
})
|
|
73
|
-
|
|
74
|
-
describe('upsertOption', () => {
|
|
75
|
-
afterAll(async () => {
|
|
76
|
-
await removeOptions(
|
|
77
|
-
['tools.ozone.setting.upsertTest.labelers'],
|
|
78
|
-
'personal',
|
|
79
|
-
)
|
|
80
|
-
})
|
|
81
|
-
it('only allows managerRole to update instance settings', async () => {
|
|
82
|
-
await upsertOption({
|
|
83
|
-
scope: 'instance',
|
|
84
|
-
key: 'tools.ozone.setting.upsertTest.labelers',
|
|
85
|
-
value: { dids: ['did:plc:xyz'] },
|
|
86
|
-
description: 'triage users can not update this',
|
|
87
|
-
managerRole: 'tools.ozone.team.defs#roleModerator',
|
|
88
|
-
})
|
|
89
|
-
|
|
90
|
-
await expect(
|
|
91
|
-
upsertOption(
|
|
92
|
-
{
|
|
93
|
-
scope: 'instance',
|
|
94
|
-
key: 'tools.ozone.setting.upsertTest.labelers',
|
|
95
|
-
value: { noDids: 'test' },
|
|
96
|
-
description: 'triage users can not update this',
|
|
97
|
-
managerRole: 'tools.ozone.team.defs#roleModerator',
|
|
98
|
-
},
|
|
99
|
-
'triage',
|
|
100
|
-
),
|
|
101
|
-
).rejects.toThrow(/Not permitted/gi)
|
|
102
|
-
|
|
103
|
-
await upsertOption(
|
|
104
|
-
{
|
|
105
|
-
scope: 'instance',
|
|
106
|
-
key: 'tools.ozone.setting.upsertTest.labelers',
|
|
107
|
-
value: { noDids: 'test' },
|
|
108
|
-
description:
|
|
109
|
-
'My personal labelers that i want to use when browsing ozone',
|
|
110
|
-
managerRole: 'tools.ozone.team.defs#roleModerator',
|
|
111
|
-
},
|
|
112
|
-
'moderator',
|
|
113
|
-
)
|
|
114
|
-
|
|
115
|
-
const afterUpdatedByModerator = await listOptions(
|
|
116
|
-
{
|
|
117
|
-
scope: 'instance',
|
|
118
|
-
prefix: 'tools.ozone.setting.upsertTest.labelers',
|
|
119
|
-
},
|
|
120
|
-
'moderator',
|
|
121
|
-
)
|
|
122
|
-
expect(afterUpdatedByModerator.options[0].value?.['dids']).toBeFalsy()
|
|
123
|
-
expect(afterUpdatedByModerator.options[0].value?.['noDids']).toEqual(
|
|
124
|
-
'test',
|
|
125
|
-
)
|
|
126
|
-
await upsertOption(
|
|
127
|
-
{
|
|
128
|
-
scope: 'instance',
|
|
129
|
-
key: 'tools.ozone.setting.upsertTest.labelers',
|
|
130
|
-
value: { dids: 'test' },
|
|
131
|
-
description:
|
|
132
|
-
'My personal labelers that i want to use when browsing ozone',
|
|
133
|
-
managerRole: 'tools.ozone.team.defs#roleModerator',
|
|
134
|
-
},
|
|
135
|
-
'moderator',
|
|
136
|
-
)
|
|
137
|
-
|
|
138
|
-
const afterUpdatedByAdmin = await listOptions(
|
|
139
|
-
{
|
|
140
|
-
scope: 'instance',
|
|
141
|
-
prefix: 'tools.ozone.setting.upsertTest.labelers',
|
|
142
|
-
},
|
|
143
|
-
'admin',
|
|
144
|
-
)
|
|
145
|
-
expect(afterUpdatedByAdmin.options[0].value?.['noDids']).toBeFalsy()
|
|
146
|
-
expect(afterUpdatedByAdmin.options[0].value?.['dids']).toEqual('test')
|
|
147
|
-
})
|
|
148
|
-
})
|
|
149
|
-
|
|
150
|
-
describe('listOptions', () => {
|
|
151
|
-
beforeAll(async () => {
|
|
152
|
-
await upsertOption({
|
|
153
|
-
scope: 'instance',
|
|
154
|
-
key: 'tools.ozone.setting.client.queues',
|
|
155
|
-
value: { stratosphere: { name: 'Stratosphere' } },
|
|
156
|
-
description:
|
|
157
|
-
'This determines how many queues the client interface will show',
|
|
158
|
-
managerRole: 'tools.ozone.team.defs#roleAdmin',
|
|
159
|
-
})
|
|
160
|
-
await upsertOption({
|
|
161
|
-
scope: 'instance',
|
|
162
|
-
key: 'tools.ozone.setting.client.queueHash',
|
|
163
|
-
value: { val: 10.5 },
|
|
164
|
-
description:
|
|
165
|
-
'This determines how each queue is balanced when sorted by oldest first',
|
|
166
|
-
managerRole: 'tools.ozone.team.defs#roleAdmin',
|
|
167
|
-
})
|
|
168
|
-
await upsertOption({
|
|
169
|
-
scope: 'instance',
|
|
170
|
-
key: 'tools.ozone.setting.client.externalLabelers',
|
|
171
|
-
value: { dids: ['did:plc:xyz'] },
|
|
172
|
-
description:
|
|
173
|
-
'List of external labelers that will be plugged into the client views',
|
|
174
|
-
managerRole: 'tools.ozone.team.defs#roleAdmin',
|
|
175
|
-
})
|
|
176
|
-
})
|
|
177
|
-
|
|
178
|
-
afterAll(async () => {
|
|
179
|
-
await removeOptions(
|
|
180
|
-
[
|
|
181
|
-
'tools.ozone.setting.client.queues',
|
|
182
|
-
'tools.ozone.setting.client.queueHash',
|
|
183
|
-
'tools.ozone.setting.client.externalLabelers',
|
|
184
|
-
],
|
|
185
|
-
'instance',
|
|
186
|
-
)
|
|
187
|
-
})
|
|
188
|
-
|
|
189
|
-
it('returns all personal settings', async () => {
|
|
190
|
-
const result = await listOptions({ prefix: 'tools.ozone.setting.client' })
|
|
191
|
-
expect(result.options.length).toBe(3)
|
|
192
|
-
|
|
193
|
-
expect(forSnapshot(result.options)).toMatchSnapshot()
|
|
194
|
-
})
|
|
195
|
-
|
|
196
|
-
it('allows paginating options', async () => {
|
|
197
|
-
const params = { prefix: 'tools.ozone.setting.client', limit: 1 }
|
|
198
|
-
const pageOne = await listOptions(params)
|
|
199
|
-
const pageTwo = await listOptions({
|
|
200
|
-
...params,
|
|
201
|
-
cursor: pageOne.cursor,
|
|
202
|
-
})
|
|
203
|
-
const pageThree = await listOptions({
|
|
204
|
-
...params,
|
|
205
|
-
cursor: pageTwo.cursor,
|
|
206
|
-
})
|
|
207
|
-
const pageFour = await listOptions({
|
|
208
|
-
...params,
|
|
209
|
-
cursor: pageThree.cursor,
|
|
210
|
-
})
|
|
211
|
-
|
|
212
|
-
expect(pageFour.options.length).toBe(0)
|
|
213
|
-
expect(pageFour.cursor).toBeUndefined()
|
|
214
|
-
})
|
|
215
|
-
})
|
|
216
|
-
|
|
217
|
-
describe('removeOptions', () => {
|
|
218
|
-
afterAll(async () => {
|
|
219
|
-
await Promise.all([
|
|
220
|
-
removeOptions(['tools.ozone.setting.personal.labelers'], 'personal'),
|
|
221
|
-
removeOptions(
|
|
222
|
-
['tools.ozone.setting.only.mod', 'tools.ozone.setting.only.admin'],
|
|
223
|
-
'instance',
|
|
224
|
-
),
|
|
225
|
-
])
|
|
226
|
-
})
|
|
227
|
-
|
|
228
|
-
it('only allows the owner to delete personal setting', async () => {
|
|
229
|
-
await upsertOption({
|
|
230
|
-
scope: 'personal',
|
|
231
|
-
key: 'tools.ozone.setting.personal.labelers',
|
|
232
|
-
value: { dids: ['did:plc:xyz'] },
|
|
233
|
-
description:
|
|
234
|
-
'My personal labelers that i want to use when browsing ozone',
|
|
235
|
-
managerRole: 'tools.ozone.team.defs#roleOwner',
|
|
236
|
-
})
|
|
237
|
-
|
|
238
|
-
// one user can't remove personal setting of another
|
|
239
|
-
await removeOptions(
|
|
240
|
-
['tools.ozone.setting.personal.labelers'],
|
|
241
|
-
'personal',
|
|
242
|
-
'triage',
|
|
243
|
-
)
|
|
244
|
-
const list = await listOptions({ scope: 'personal' }, 'admin')
|
|
245
|
-
expect(list.options.length).toBe(1)
|
|
246
|
-
|
|
247
|
-
// the owner of the personal setting can remove their own setting
|
|
248
|
-
await removeOptions(['tools.ozone.setting.personal.labelers'], 'personal')
|
|
249
|
-
const listAfterRemoval = await listOptions({ scope: 'personal' }, 'admin')
|
|
250
|
-
expect(listAfterRemoval.options.length).toBe(0)
|
|
251
|
-
})
|
|
252
|
-
|
|
253
|
-
it('only allows managerRole to delete instance setting', async () => {
|
|
254
|
-
await Promise.all([
|
|
255
|
-
upsertOption({
|
|
256
|
-
scope: 'instance',
|
|
257
|
-
key: 'tools.ozone.setting.only.mod',
|
|
258
|
-
value: { dids: ['did:plc:xyz'] },
|
|
259
|
-
description: 'Triage mods can not manage these',
|
|
260
|
-
managerRole: 'tools.ozone.team.defs#roleModerator',
|
|
261
|
-
}),
|
|
262
|
-
upsertOption({
|
|
263
|
-
scope: 'instance',
|
|
264
|
-
key: 'tools.ozone.setting.only.admin',
|
|
265
|
-
value: { dids: ['did:plc:xyz'] },
|
|
266
|
-
description: 'Moderators or triage mods can not manage these',
|
|
267
|
-
managerRole: 'tools.ozone.team.defs#roleAdmin',
|
|
268
|
-
}),
|
|
269
|
-
])
|
|
270
|
-
|
|
271
|
-
await Promise.all([
|
|
272
|
-
removeOptions(['tools.ozone.setting.only.mod'], 'instance', 'triage'),
|
|
273
|
-
removeOptions(
|
|
274
|
-
['tools.ozone.setting.only.admin'],
|
|
275
|
-
'instance',
|
|
276
|
-
'moderator',
|
|
277
|
-
),
|
|
278
|
-
removeOptions(['tools.ozone.setting.only.admin'], 'instance', 'triage'),
|
|
279
|
-
])
|
|
280
|
-
|
|
281
|
-
const afterFailedAttempt = await listOptions(
|
|
282
|
-
{ scope: 'instance', prefix: 'tools.ozone.setting.only' },
|
|
283
|
-
'admin',
|
|
284
|
-
)
|
|
285
|
-
const keysAfterFailedAttempt = afterFailedAttempt.options.map(
|
|
286
|
-
(o) => o.key,
|
|
287
|
-
)
|
|
288
|
-
|
|
289
|
-
const keys = [
|
|
290
|
-
'tools.ozone.setting.only.mod',
|
|
291
|
-
'tools.ozone.setting.only.admin',
|
|
292
|
-
]
|
|
293
|
-
|
|
294
|
-
keys.forEach((key) => expect(keysAfterFailedAttempt).toContain(key))
|
|
295
|
-
|
|
296
|
-
await Promise.all([
|
|
297
|
-
removeOptions(['tools.ozone.setting.only.mod'], 'instance', 'admin'),
|
|
298
|
-
removeOptions(['tools.ozone.setting.only.admin'], 'instance', 'admin'),
|
|
299
|
-
])
|
|
300
|
-
|
|
301
|
-
const afterRemoval = await listOptions(
|
|
302
|
-
{ scope: 'instance', prefix: 'tools.ozone.setting.only' },
|
|
303
|
-
'admin',
|
|
304
|
-
)
|
|
305
|
-
expect(afterRemoval.options.length).toBe(0)
|
|
306
|
-
})
|
|
307
|
-
})
|
|
308
|
-
})
|