@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,52 +0,0 @@
|
|
|
1
|
-
import { Generated } from 'kysely'
|
|
2
|
-
import {
|
|
3
|
-
REVIEWCLOSED,
|
|
4
|
-
REVIEWESCALATED,
|
|
5
|
-
REVIEWNONE,
|
|
6
|
-
REVIEWOPEN,
|
|
7
|
-
} from '../../lexicon/types/tools/ozone/moderation/defs.js'
|
|
8
|
-
|
|
9
|
-
export const subjectStatusTableName = 'moderation_subject_status'
|
|
10
|
-
|
|
11
|
-
export interface ModerationSubjectStatus {
|
|
12
|
-
id: Generated<number>
|
|
13
|
-
|
|
14
|
-
// unique columns
|
|
15
|
-
did: string
|
|
16
|
-
recordPath: string
|
|
17
|
-
convoId: string
|
|
18
|
-
|
|
19
|
-
recordCid: string | null
|
|
20
|
-
blobCids: string[] | null
|
|
21
|
-
reviewState:
|
|
22
|
-
| typeof REVIEWCLOSED
|
|
23
|
-
| typeof REVIEWOPEN
|
|
24
|
-
| typeof REVIEWESCALATED
|
|
25
|
-
| typeof REVIEWNONE
|
|
26
|
-
createdAt: string
|
|
27
|
-
updatedAt: string
|
|
28
|
-
lastReviewedBy: string | null
|
|
29
|
-
lastReviewedAt: string | null
|
|
30
|
-
lastReportedAt: string | null
|
|
31
|
-
lastAppealedAt: string | null
|
|
32
|
-
hostingUpdatedAt: string | null
|
|
33
|
-
hostingDeletedAt: string | null
|
|
34
|
-
hostingCreatedAt: string | null
|
|
35
|
-
hostingDeactivatedAt: string | null
|
|
36
|
-
hostingReactivatedAt: string | null
|
|
37
|
-
hostingStatus: string | null
|
|
38
|
-
muteUntil: string | null
|
|
39
|
-
muteReportingUntil: string | null
|
|
40
|
-
suspendUntil: string | null
|
|
41
|
-
takendown: boolean
|
|
42
|
-
appealed: boolean | null
|
|
43
|
-
comment: string | null
|
|
44
|
-
tags: string[] | null
|
|
45
|
-
priorityScore?: number
|
|
46
|
-
ageAssuranceState: string
|
|
47
|
-
ageAssuranceUpdatedBy?: string | null
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export type PartialDB = {
|
|
51
|
-
[subjectStatusTableName]: ModerationSubjectStatus
|
|
52
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { Generated } from 'kysely'
|
|
2
|
-
|
|
3
|
-
export const moderatorAssignmentTableName = 'moderator_assignment'
|
|
4
|
-
|
|
5
|
-
export interface ModeratorAssignment {
|
|
6
|
-
id: Generated<number>
|
|
7
|
-
did: string
|
|
8
|
-
reportId: number | null
|
|
9
|
-
queueId: number | null
|
|
10
|
-
startAt: string
|
|
11
|
-
endAt: string | null
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export type PartialDB = {
|
|
15
|
-
[moderatorAssignmentTableName]: ModeratorAssignment
|
|
16
|
-
}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { Generated, GeneratedAlways } from 'kysely'
|
|
2
|
-
|
|
3
|
-
export const ozoneSetTableName = 'set_detail'
|
|
4
|
-
export const ozoneSetValueTableName = 'set_value'
|
|
5
|
-
|
|
6
|
-
export interface SetDetail {
|
|
7
|
-
id: GeneratedAlways<number>
|
|
8
|
-
name: string
|
|
9
|
-
description: string | null
|
|
10
|
-
createdAt: Generated<Date>
|
|
11
|
-
updatedAt: Generated<Date>
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export interface SetValue {
|
|
15
|
-
id: GeneratedAlways<number>
|
|
16
|
-
setId: number
|
|
17
|
-
value: string
|
|
18
|
-
createdAt: Generated<Date>
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export type PartialDB = {
|
|
22
|
-
[ozoneSetTableName]: SetDetail
|
|
23
|
-
[ozoneSetValueTableName]: SetValue
|
|
24
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { GeneratedAlways, Selectable } from 'kysely'
|
|
2
|
-
|
|
3
|
-
export const tableName = 'record_events_stats'
|
|
4
|
-
|
|
5
|
-
export type RecordEventsStats = {
|
|
6
|
-
subjectDid: GeneratedAlways<string>
|
|
7
|
-
subjectUri: GeneratedAlways<string>
|
|
8
|
-
escalateCount: GeneratedAlways<number>
|
|
9
|
-
reportCount: GeneratedAlways<number>
|
|
10
|
-
appealCount: GeneratedAlways<number>
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export type RecordEventsStatsRow = Selectable<RecordEventsStats>
|
|
14
|
-
|
|
15
|
-
export type PartialDB = { [tableName]: RecordEventsStats }
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { Generated } from 'kysely'
|
|
2
|
-
|
|
3
|
-
export const eventTableName = 'record_push_event'
|
|
4
|
-
|
|
5
|
-
export type RecordPushEventType = 'pds_takedown' | 'appview_takedown'
|
|
6
|
-
|
|
7
|
-
export interface RecordPushEvent {
|
|
8
|
-
id: Generated<number>
|
|
9
|
-
eventType: RecordPushEventType
|
|
10
|
-
subjectDid: string
|
|
11
|
-
subjectUri: string
|
|
12
|
-
subjectCid: string
|
|
13
|
-
takedownRef: string | null
|
|
14
|
-
confirmedAt: Date | null
|
|
15
|
-
lastAttempted: Date | null
|
|
16
|
-
attempts: Generated<number>
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export type PartialDB = {
|
|
20
|
-
[eventTableName]: RecordPushEvent
|
|
21
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { Generated } from 'kysely'
|
|
2
|
-
|
|
3
|
-
export const eventTableName = 'repo_push_event'
|
|
4
|
-
|
|
5
|
-
export type RepoPushEventType = 'pds_takedown' | 'appview_takedown'
|
|
6
|
-
|
|
7
|
-
export interface RepoPushEvent {
|
|
8
|
-
id: Generated<number>
|
|
9
|
-
eventType: RepoPushEventType
|
|
10
|
-
subjectDid: string
|
|
11
|
-
takedownRef: string | null
|
|
12
|
-
confirmedAt: Date | null
|
|
13
|
-
lastAttempted: Date | null
|
|
14
|
-
attempts: Generated<number>
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export type PartialDB = {
|
|
18
|
-
[eventTableName]: RepoPushEvent
|
|
19
|
-
}
|
package/src/db/schema/report.ts
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { Generated } from 'kysely'
|
|
2
|
-
|
|
3
|
-
export const reportTableName = 'report'
|
|
4
|
-
|
|
5
|
-
export interface Report {
|
|
6
|
-
id: Generated<number>
|
|
7
|
-
eventId: number // References moderation_event.id
|
|
8
|
-
queueId: number | null // NULL = not yet assigned, -1 = no matching queue
|
|
9
|
-
queuedAt: string | null
|
|
10
|
-
actionEventIds: number[] | null // Array of event IDs, sorted DESC [newest, ..., oldest]
|
|
11
|
-
actionNote: string | null
|
|
12
|
-
isMuted: boolean
|
|
13
|
-
status: string // 'open', 'closed', 'escalated', 'queued', 'assigned'
|
|
14
|
-
reportType: string // Denormalized from moderation_event.meta.reportType
|
|
15
|
-
did: string // Denormalized from moderation_event.subjectDid
|
|
16
|
-
recordPath: string // '' = account/message/conversation, 'collection/rkey' = record
|
|
17
|
-
subjectMessageId: string | null // Denormalized from moderation_event.subjectMessageId
|
|
18
|
-
subjectConvoId: string | null // Denormalized from moderation_event.subjectConvoId
|
|
19
|
-
createdAt: string
|
|
20
|
-
updatedAt: string
|
|
21
|
-
assignedTo: string | null // DID of permanently assigned moderator, null if unassigned
|
|
22
|
-
assignedAt: string | null // When the permanent assignment was created
|
|
23
|
-
closedAt: string | null
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export type PartialDB = {
|
|
27
|
-
[reportTableName]: Report
|
|
28
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { Generated } from 'kysely'
|
|
2
|
-
|
|
3
|
-
export const reportActivityTableName = 'report_activity'
|
|
4
|
-
|
|
5
|
-
export interface ReportActivity {
|
|
6
|
-
id: Generated<number>
|
|
7
|
-
reportId: number
|
|
8
|
-
// One of: queueActivity | assignmentActivity | escalationActivity
|
|
9
|
-
// | closeActivity | internalNoteActivity | publicNoteActivity
|
|
10
|
-
activityType: string
|
|
11
|
-
previousStatus: string | null // report status before this activity; null for note-only types
|
|
12
|
-
internalNote: string | null // moderator-only note
|
|
13
|
-
publicNote: string | null // potentially reporter-visible note
|
|
14
|
-
meta: unknown | null // loose activity-specific metadata (e.g. { assignmentId: 42 })
|
|
15
|
-
isAutomated: boolean
|
|
16
|
-
createdBy: string // DID of actor (or service DID for automated activities)
|
|
17
|
-
createdAt: string // ISO string
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export type PartialDB = {
|
|
21
|
-
[reportActivityTableName]: ReportActivity
|
|
22
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { Generated } from 'kysely'
|
|
2
|
-
|
|
3
|
-
export const reportQueueTableName = 'report_queue'
|
|
4
|
-
|
|
5
|
-
export interface ReportQueue {
|
|
6
|
-
id: Generated<number>
|
|
7
|
-
name: string
|
|
8
|
-
subjectTypes: string[] // ['account'] or ['record'] or ['account', 'record']
|
|
9
|
-
collection: string | null // Collection name (e.g., 'app.bsky.feed.post'), NULL for accounts
|
|
10
|
-
reportTypes: string[] // Array of report reason types (fully qualified NSIDs)
|
|
11
|
-
description: string | null // Optional description of the queue
|
|
12
|
-
createdBy: string // DID of moderator who created this queue
|
|
13
|
-
createdAt: string
|
|
14
|
-
updatedAt: string
|
|
15
|
-
enabled: boolean
|
|
16
|
-
deletedAt: string | null // NULL = active, timestamp = soft-deleted
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export type PartialDB = {
|
|
20
|
-
[reportQueueTableName]: ReportQueue
|
|
21
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { Generated } from 'kysely'
|
|
2
|
-
|
|
3
|
-
export const reportStatTableName = 'report_stat'
|
|
4
|
-
|
|
5
|
-
export interface ReportStat {
|
|
6
|
-
// metadata
|
|
7
|
-
id: Generated<number>
|
|
8
|
-
computedAt: string // When this snapshot was last computed
|
|
9
|
-
|
|
10
|
-
// group
|
|
11
|
-
date: string // ISO date e.g. '2026-04-15' — the calendar day this snapshot covers
|
|
12
|
-
queueId: number | null // NULL = aggregate across all queues
|
|
13
|
-
reportTypes: string[] | null // NULL = aggregate across all report types
|
|
14
|
-
moderatorDid: string | null // NULL = aggregate, non-null = per-moderator
|
|
15
|
-
|
|
16
|
-
// stats
|
|
17
|
-
inboundCount: number | null // Reports received during this calendar day
|
|
18
|
-
pendingCount: number | null // Reports with status != 'closed' at time of computation
|
|
19
|
-
actionedCount: number | null // Reports closed during this calendar day
|
|
20
|
-
escalatedCount: number | null // Reports escalated during this calendar day
|
|
21
|
-
actionRate: number | null // actionedCount / inboundCount * 100
|
|
22
|
-
avgHandlingTimeSec: number | null // Average time from creation/assignment to close, in seconds
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export type PartialDB = {
|
|
26
|
-
[reportStatTableName]: ReportStat
|
|
27
|
-
}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { GeneratedAlways } from 'kysely'
|
|
2
|
-
import {
|
|
3
|
-
SafelinkActionType,
|
|
4
|
-
SafelinkEventType,
|
|
5
|
-
SafelinkPatternType,
|
|
6
|
-
SafelinkReasonType,
|
|
7
|
-
} from '../../api/util.js'
|
|
8
|
-
|
|
9
|
-
export const safelinkRuleTableName = 'safelink_rule'
|
|
10
|
-
export const safelinkEventTableName = 'safelink_event'
|
|
11
|
-
|
|
12
|
-
export interface SafelinkRule {
|
|
13
|
-
id: GeneratedAlways<number>
|
|
14
|
-
url: string
|
|
15
|
-
pattern: SafelinkPatternType
|
|
16
|
-
action: SafelinkActionType
|
|
17
|
-
reason: SafelinkReasonType
|
|
18
|
-
createdBy: string
|
|
19
|
-
createdAt: string
|
|
20
|
-
updatedAt: string
|
|
21
|
-
comment: string | null
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export interface SafelinkEvent {
|
|
25
|
-
id: GeneratedAlways<number>
|
|
26
|
-
eventType: SafelinkEventType
|
|
27
|
-
url: string
|
|
28
|
-
pattern: SafelinkPatternType
|
|
29
|
-
action: SafelinkActionType
|
|
30
|
-
reason: SafelinkReasonType
|
|
31
|
-
createdBy: string
|
|
32
|
-
createdAt: string
|
|
33
|
-
comment: string | null
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export type PartialDB = {
|
|
37
|
-
[safelinkRuleTableName]: SafelinkRule
|
|
38
|
-
[safelinkEventTableName]: SafelinkEvent
|
|
39
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { GeneratedAlways } from 'kysely'
|
|
2
|
-
|
|
3
|
-
export const scheduledActionTableName = 'scheduled_action'
|
|
4
|
-
|
|
5
|
-
export interface ScheduledAction {
|
|
6
|
-
id: GeneratedAlways<number>
|
|
7
|
-
action: string
|
|
8
|
-
eventData: unknown | null
|
|
9
|
-
did: string
|
|
10
|
-
executeAt: string | null
|
|
11
|
-
executeAfter: string | null
|
|
12
|
-
executeUntil: string | null
|
|
13
|
-
randomizeExecution: boolean
|
|
14
|
-
createdBy: string
|
|
15
|
-
createdAt: string
|
|
16
|
-
updatedAt: string
|
|
17
|
-
status: string
|
|
18
|
-
lastExecutedAt: string | null
|
|
19
|
-
lastFailureReason: string | null
|
|
20
|
-
executionEventId: number | null
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export type PartialDB = {
|
|
24
|
-
[scheduledActionTableName]: ScheduledAction
|
|
25
|
-
}
|
package/src/db/schema/setting.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { Generated, GeneratedAlways } from 'kysely'
|
|
2
|
-
import { Member } from './member.js'
|
|
3
|
-
|
|
4
|
-
export const settingTableName = 'setting'
|
|
5
|
-
|
|
6
|
-
export type SettingScope = 'personal' | 'instance'
|
|
7
|
-
|
|
8
|
-
export interface Setting {
|
|
9
|
-
id: GeneratedAlways<number>
|
|
10
|
-
key: string
|
|
11
|
-
value: Record<string, unknown>
|
|
12
|
-
managerRole: Member['role'] | null
|
|
13
|
-
description: string | null
|
|
14
|
-
did: string
|
|
15
|
-
scope: SettingScope
|
|
16
|
-
lastUpdatedBy: string
|
|
17
|
-
createdBy: string
|
|
18
|
-
createdAt: Generated<Date>
|
|
19
|
-
updatedAt: Generated<Date>
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export type PartialDB = {
|
|
23
|
-
[settingTableName]: Setting
|
|
24
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { Generated } from 'kysely'
|
|
2
|
-
|
|
3
|
-
export const verificationTableName = 'verification'
|
|
4
|
-
|
|
5
|
-
export interface Verification {
|
|
6
|
-
uri: string
|
|
7
|
-
cid: string
|
|
8
|
-
issuer: string
|
|
9
|
-
subject: string
|
|
10
|
-
handle: string
|
|
11
|
-
displayName: string
|
|
12
|
-
revokeReason: string | null
|
|
13
|
-
revokedBy: string | null
|
|
14
|
-
revokedAt: string | null
|
|
15
|
-
createdAt: string
|
|
16
|
-
updatedAt: Generated<string>
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export type PartialDB = {
|
|
20
|
-
[verificationTableName]: Verification
|
|
21
|
-
}
|
package/src/db/types.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { DynamicModule, RawBuilder, SelectQueryBuilder, sql } from 'kysely'
|
|
2
|
-
// eslint-disable-next-line import/default
|
|
3
|
-
import pg from 'pg'
|
|
4
|
-
type PgPool = pg.Pool
|
|
5
|
-
|
|
6
|
-
export type DbRef =
|
|
7
|
-
| RawBuilder<unknown>
|
|
8
|
-
| ReturnType<DynamicModule<unknown>['ref']>
|
|
9
|
-
|
|
10
|
-
export type AnyQb = SelectQueryBuilder<any, any, any>
|
|
11
|
-
|
|
12
|
-
export type PgOptions = {
|
|
13
|
-
url: string
|
|
14
|
-
pool?: PgPool
|
|
15
|
-
schema?: string
|
|
16
|
-
poolSize?: number
|
|
17
|
-
poolMaxUses?: number
|
|
18
|
-
poolIdleTimeoutMs?: number
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export const jsonb = <T>(val: T) => {
|
|
22
|
-
if (val === null) return sql<T>`null`
|
|
23
|
-
return sql<T>`${JSON.stringify(val)}::jsonb`
|
|
24
|
-
}
|
package/src/error.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { ErrorRequestHandler } from 'express'
|
|
2
|
-
import { XRPCError } from '@atproto/xrpc-server'
|
|
3
|
-
import { httpLogger as log } from './logger.js'
|
|
4
|
-
|
|
5
|
-
export const handler: ErrorRequestHandler = (err, _req, res, next) => {
|
|
6
|
-
log.error({ err }, 'unexpected internal server error')
|
|
7
|
-
if (res.headersSent) {
|
|
8
|
-
return next(err)
|
|
9
|
-
}
|
|
10
|
-
const serverError = XRPCError.fromError(err)
|
|
11
|
-
res.status(serverError.type).json(serverError.payload)
|
|
12
|
-
}
|
package/src/image-invalidator.ts
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
// Invalidation is a general interface for propagating an image blob
|
|
2
|
-
// takedown through any caches where a representation of it may be stored.
|
|
3
|
-
// @NOTE this does not remove the blob from storage: just invalidates it from caches.
|
|
4
|
-
// @NOTE keep in sync with same interface in aws/src/cloudfront.ts
|
|
5
|
-
export interface ImageInvalidator {
|
|
6
|
-
invalidate(subject: string, paths: string[]): Promise<void>
|
|
7
|
-
}
|
package/src/index.ts
DELETED
|
@@ -1,154 +0,0 @@
|
|
|
1
|
-
import events from 'node:events'
|
|
2
|
-
import http from 'node:http'
|
|
3
|
-
import { AddressInfo } from 'node:net'
|
|
4
|
-
import compression from 'compression'
|
|
5
|
-
import cors from 'cors'
|
|
6
|
-
import express from 'express'
|
|
7
|
-
// eslint-disable-next-line import/default
|
|
8
|
-
import httpTerminator from 'http-terminator'
|
|
9
|
-
import { DAY, SECOND } from '@atproto/common'
|
|
10
|
-
import API, { health, wellKnown } from './api/index.js'
|
|
11
|
-
import { OzoneConfig, OzoneSecrets } from './config/index.js'
|
|
12
|
-
import { AppContext, AppContextOptions } from './context.js'
|
|
13
|
-
import { Member } from './db/schema/member.js'
|
|
14
|
-
import * as error from './error.js'
|
|
15
|
-
import { createServer } from './lexicon/index.js'
|
|
16
|
-
import { dbLogger, loggerMiddleware } from './logger.js'
|
|
17
|
-
|
|
18
|
-
export * from './config/index.js'
|
|
19
|
-
export { type ImageInvalidator } from './image-invalidator.js'
|
|
20
|
-
export { Database } from './db/index.js'
|
|
21
|
-
export { EventPusher, EventReverser, OzoneDaemon } from './daemon/index.js'
|
|
22
|
-
export { AppContext } from './context.js'
|
|
23
|
-
export { httpLogger } from './logger.js'
|
|
24
|
-
|
|
25
|
-
export class OzoneService {
|
|
26
|
-
public ctx: AppContext
|
|
27
|
-
public app: express.Application
|
|
28
|
-
public server?: http.Server
|
|
29
|
-
private terminator?: httpTerminator.HttpTerminator
|
|
30
|
-
private dbStatsInterval?: NodeJS.Timeout
|
|
31
|
-
|
|
32
|
-
constructor(opts: { ctx: AppContext; app: express.Application }) {
|
|
33
|
-
this.ctx = opts.ctx
|
|
34
|
-
this.app = opts.app
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
static async create(
|
|
38
|
-
cfg: OzoneConfig,
|
|
39
|
-
secrets: OzoneSecrets,
|
|
40
|
-
overrides?: Partial<AppContextOptions>,
|
|
41
|
-
): Promise<OzoneService> {
|
|
42
|
-
const app = express()
|
|
43
|
-
app.set('trust proxy', true)
|
|
44
|
-
app.use(cors({ maxAge: DAY / SECOND }))
|
|
45
|
-
app.use(loggerMiddleware)
|
|
46
|
-
app.use(compression())
|
|
47
|
-
|
|
48
|
-
const ctx = await AppContext.fromConfig(cfg, secrets, overrides)
|
|
49
|
-
|
|
50
|
-
let server = createServer({
|
|
51
|
-
validateResponse: false,
|
|
52
|
-
payload: {
|
|
53
|
-
jsonLimit: 100 * 1024, // 100kb
|
|
54
|
-
textLimit: 100 * 1024, // 100kb
|
|
55
|
-
blobLimit: 5 * 1024 * 1024, // 5mb
|
|
56
|
-
},
|
|
57
|
-
})
|
|
58
|
-
|
|
59
|
-
server = API(server, ctx)
|
|
60
|
-
|
|
61
|
-
app.use(health.createRouter(ctx))
|
|
62
|
-
app.use(wellKnown.createRouter(ctx))
|
|
63
|
-
app.use(server.xrpc.router)
|
|
64
|
-
app.use(error.handler)
|
|
65
|
-
|
|
66
|
-
return new OzoneService({ ctx, app })
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
async seedInitialMembers() {
|
|
70
|
-
const members: Array<{ role: Member['role']; did: string }> = []
|
|
71
|
-
this.ctx.cfg.access.admins.forEach((did) =>
|
|
72
|
-
members.push({
|
|
73
|
-
role: 'tools.ozone.team.defs#roleAdmin',
|
|
74
|
-
did,
|
|
75
|
-
}),
|
|
76
|
-
)
|
|
77
|
-
this.ctx.cfg.access.triage.forEach((did) =>
|
|
78
|
-
members.push({
|
|
79
|
-
role: 'tools.ozone.team.defs#roleTriage',
|
|
80
|
-
did,
|
|
81
|
-
}),
|
|
82
|
-
)
|
|
83
|
-
this.ctx.cfg.access.moderators.forEach((did) =>
|
|
84
|
-
members.push({
|
|
85
|
-
role: 'tools.ozone.team.defs#roleModerator',
|
|
86
|
-
did,
|
|
87
|
-
}),
|
|
88
|
-
)
|
|
89
|
-
|
|
90
|
-
for (const member of members) {
|
|
91
|
-
const service = this.ctx.teamService(this.ctx.db)
|
|
92
|
-
await service.upsert({
|
|
93
|
-
...member,
|
|
94
|
-
lastUpdatedBy: this.ctx.cfg.service.did,
|
|
95
|
-
})
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
async start(): Promise<http.Server> {
|
|
100
|
-
if (this.dbStatsInterval) {
|
|
101
|
-
throw new Error(`${this.constructor.name} already started`)
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// Any moderator that are configured via env var may not exist in the database
|
|
105
|
-
// so we need to sync them from env var to the database
|
|
106
|
-
await this.seedInitialMembers()
|
|
107
|
-
|
|
108
|
-
this.dbStatsInterval = setInterval(() => {
|
|
109
|
-
dbLogger.info(
|
|
110
|
-
{
|
|
111
|
-
idleCount: this.ctx.db.pool.idleCount,
|
|
112
|
-
totalCount: this.ctx.db.pool.totalCount,
|
|
113
|
-
waitingCount: this.ctx.db.pool.waitingCount,
|
|
114
|
-
},
|
|
115
|
-
'db pool stats',
|
|
116
|
-
)
|
|
117
|
-
dbLogger.info(
|
|
118
|
-
this.ctx.backgroundQueue.getStats(),
|
|
119
|
-
'background queue stats',
|
|
120
|
-
)
|
|
121
|
-
}, 10000)
|
|
122
|
-
await this.ctx.sequencer.start()
|
|
123
|
-
const server = this.app.listen(this.ctx.cfg.service.port)
|
|
124
|
-
this.server = server
|
|
125
|
-
server.keepAliveTimeout = 90000
|
|
126
|
-
this.terminator = httpTerminator.createHttpTerminator({ server })
|
|
127
|
-
await events.once(server, 'listening')
|
|
128
|
-
const { port } = server.address() as AddressInfo
|
|
129
|
-
this.ctx.assignPort(port)
|
|
130
|
-
return server
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
async destroy(): Promise<void> {
|
|
134
|
-
clearInterval(this.dbStatsInterval)
|
|
135
|
-
this.dbStatsInterval = undefined
|
|
136
|
-
|
|
137
|
-
// @TODO Use a disposable stack when Node24 becomes the min supported version
|
|
138
|
-
try {
|
|
139
|
-
await this.terminator?.terminate()
|
|
140
|
-
} finally {
|
|
141
|
-
try {
|
|
142
|
-
await this.ctx.backgroundQueue.destroy()
|
|
143
|
-
} finally {
|
|
144
|
-
try {
|
|
145
|
-
await this.ctx.sequencer.destroy()
|
|
146
|
-
} finally {
|
|
147
|
-
await this.ctx.db.close()
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
export default OzoneService
|