@atproto/ozone 0.1.175 → 0.2.0
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 +23 -0
- package/dist/api/chat/getConvo.d.ts +4 -0
- package/dist/api/chat/getConvo.d.ts.map +1 -0
- package/dist/api/chat/getConvo.js +18 -0
- package/dist/api/chat/getConvo.js.map +1 -0
- package/dist/api/chat/getConvoMembers.d.ts +4 -0
- package/dist/api/chat/getConvoMembers.d.ts.map +1 -0
- package/dist/api/chat/getConvoMembers.js +18 -0
- package/dist/api/chat/getConvoMembers.js.map +1 -0
- package/dist/api/chat/index.d.ts.map +1 -1
- package/dist/api/chat/index.js +4 -0
- package/dist/api/chat/index.js.map +1 -1
- package/dist/daemon/event-reverser.d.ts.map +1 -1
- package/dist/daemon/event-reverser.js +1 -0
- package/dist/daemon/event-reverser.js.map +1 -1
- package/dist/db/migrations/20260513T202941104Z-add-subject-convo-id.d.ts +4 -0
- package/dist/db/migrations/20260513T202941104Z-add-subject-convo-id.d.ts.map +1 -0
- package/dist/db/migrations/20260513T202941104Z-add-subject-convo-id.js +107 -0
- package/dist/db/migrations/20260513T202941104Z-add-subject-convo-id.js.map +1 -0
- package/dist/db/migrations/index.d.ts +1 -0
- package/dist/db/migrations/index.d.ts.map +1 -1
- package/dist/db/migrations/index.js +1 -0
- package/dist/db/migrations/index.js.map +1 -1
- package/dist/db/schema/expiring_tag.d.ts +1 -0
- package/dist/db/schema/expiring_tag.d.ts.map +1 -1
- package/dist/db/schema/expiring_tag.js.map +1 -1
- package/dist/db/schema/moderation_event.d.ts +2 -1
- package/dist/db/schema/moderation_event.d.ts.map +1 -1
- package/dist/db/schema/moderation_event.js.map +1 -1
- package/dist/db/schema/moderation_subject_status.d.ts +1 -0
- package/dist/db/schema/moderation_subject_status.d.ts.map +1 -1
- package/dist/db/schema/moderation_subject_status.js.map +1 -1
- package/dist/db/schema/report.d.ts +1 -0
- package/dist/db/schema/report.d.ts.map +1 -1
- package/dist/db/schema/report.js.map +1 -1
- package/dist/lexicon/index.d.ts +21 -2
- package/dist/lexicon/index.d.ts.map +1 -1
- package/dist/lexicon/index.js +36 -2
- package/dist/lexicon/index.js.map +1 -1
- package/dist/lexicon/lexicons.d.ts +1420 -92
- package/dist/lexicon/lexicons.d.ts.map +1 -1
- package/dist/lexicon/lexicons.js +771 -44
- package/dist/lexicon/lexicons.js.map +1 -1
- package/dist/lexicon/types/app/bsky/actor/defs.d.ts +4 -0
- package/dist/lexicon/types/app/bsky/actor/defs.d.ts.map +1 -1
- package/dist/lexicon/types/app/bsky/actor/defs.js.map +1 -1
- package/dist/lexicon/types/app/bsky/embed/external.d.ts +48 -2
- package/dist/lexicon/types/app/bsky/embed/external.d.ts.map +1 -1
- package/dist/lexicon/types/app/bsky/embed/external.js +21 -0
- package/dist/lexicon/types/app/bsky/embed/external.js.map +1 -1
- package/dist/lexicon/types/app/bsky/embed/getEmbedExternalView.d.ts +31 -0
- package/dist/lexicon/types/app/bsky/embed/getEmbedExternalView.d.ts.map +1 -0
- package/dist/lexicon/types/app/bsky/embed/getEmbedExternalView.js +5 -0
- package/dist/lexicon/types/app/bsky/embed/getEmbedExternalView.js.map +1 -0
- package/dist/lexicon/types/chat/bsky/actor/getStatus.d.ts +24 -0
- package/dist/lexicon/types/chat/bsky/actor/getStatus.d.ts.map +1 -0
- package/dist/lexicon/types/chat/bsky/{group/getJoinLinkPreview.js → actor/getStatus.js} +2 -2
- package/dist/lexicon/types/chat/bsky/actor/getStatus.js.map +1 -0
- package/dist/lexicon/types/chat/bsky/convo/defs.d.ts +39 -7
- package/dist/lexicon/types/chat/bsky/convo/defs.d.ts.map +1 -1
- package/dist/lexicon/types/chat/bsky/convo/defs.js +21 -0
- package/dist/lexicon/types/chat/bsky/convo/defs.js.map +1 -1
- package/dist/lexicon/types/chat/bsky/convo/getConvoForMembers.d.ts +1 -1
- package/dist/lexicon/types/chat/bsky/convo/getConvoForMembers.d.ts.map +1 -1
- package/dist/lexicon/types/chat/bsky/convo/getConvoForMembers.js.map +1 -1
- package/dist/lexicon/types/chat/bsky/convo/getLog.d.ts +1 -1
- package/dist/lexicon/types/chat/bsky/convo/getLog.d.ts.map +1 -1
- package/dist/lexicon/types/chat/bsky/convo/getLog.js.map +1 -1
- package/dist/lexicon/types/chat/bsky/convo/listConvoRequests.d.ts +1 -1
- package/dist/lexicon/types/chat/bsky/convo/listConvoRequests.d.ts.map +1 -1
- package/dist/lexicon/types/chat/bsky/convo/listConvoRequests.js.map +1 -1
- package/dist/lexicon/types/chat/bsky/embed/joinLink.d.ts +19 -0
- package/dist/lexicon/types/chat/bsky/embed/joinLink.d.ts.map +1 -0
- package/dist/lexicon/types/chat/bsky/embed/joinLink.js +19 -0
- package/dist/lexicon/types/chat/bsky/embed/joinLink.js.map +1 -0
- package/dist/lexicon/types/chat/bsky/group/addMembers.d.ts +1 -1
- package/dist/lexicon/types/chat/bsky/group/addMembers.d.ts.map +1 -1
- package/dist/lexicon/types/chat/bsky/group/addMembers.js.map +1 -1
- package/dist/lexicon/types/chat/bsky/group/createGroup.d.ts +1 -1
- package/dist/lexicon/types/chat/bsky/group/createGroup.d.ts.map +1 -1
- package/dist/lexicon/types/chat/bsky/group/createGroup.js.map +1 -1
- package/dist/lexicon/types/chat/bsky/group/defs.d.ts +23 -0
- package/dist/lexicon/types/chat/bsky/group/defs.d.ts.map +1 -1
- package/dist/lexicon/types/chat/bsky/group/defs.js +14 -0
- package/dist/lexicon/types/chat/bsky/group/defs.js.map +1 -1
- package/dist/lexicon/types/chat/bsky/group/{getJoinLinkPreview.d.ts → getJoinLinkPreviews.d.ts} +3 -4
- package/dist/lexicon/types/chat/bsky/group/getJoinLinkPreviews.d.ts.map +1 -0
- package/dist/lexicon/types/chat/bsky/group/getJoinLinkPreviews.js +5 -0
- package/dist/lexicon/types/chat/bsky/group/getJoinLinkPreviews.js.map +1 -0
- package/dist/lexicon/types/chat/bsky/group/listMutualGroups.d.ts +25 -0
- package/dist/lexicon/types/chat/bsky/group/listMutualGroups.d.ts.map +1 -0
- package/dist/lexicon/types/chat/bsky/group/listMutualGroups.js +5 -0
- package/dist/lexicon/types/chat/bsky/group/listMutualGroups.js.map +1 -0
- package/dist/lexicon/types/chat/bsky/group/updateJoinRequestsRead.d.ts +24 -0
- package/dist/lexicon/types/chat/bsky/group/updateJoinRequestsRead.d.ts.map +1 -0
- package/dist/lexicon/types/chat/bsky/group/updateJoinRequestsRead.js +5 -0
- package/dist/lexicon/types/chat/bsky/group/updateJoinRequestsRead.js.map +1 -0
- package/dist/lexicon/types/chat/bsky/group/withdrawJoinRequest.d.ts +24 -0
- package/dist/lexicon/types/chat/bsky/group/withdrawJoinRequest.d.ts.map +1 -0
- package/dist/lexicon/types/chat/bsky/group/withdrawJoinRequest.js +5 -0
- package/dist/lexicon/types/chat/bsky/group/withdrawJoinRequest.js.map +1 -0
- package/dist/lexicon/types/chat/bsky/moderation/defs.d.ts +42 -0
- package/dist/lexicon/types/chat/bsky/moderation/defs.d.ts.map +1 -0
- package/dist/lexicon/types/chat/bsky/moderation/defs.js +26 -0
- package/dist/lexicon/types/chat/bsky/moderation/defs.js.map +1 -0
- package/dist/lexicon/types/chat/bsky/moderation/getConvo.d.ts +23 -0
- package/dist/lexicon/types/chat/bsky/moderation/getConvo.d.ts.map +1 -0
- package/dist/lexicon/types/chat/bsky/moderation/getConvo.js +5 -0
- package/dist/lexicon/types/chat/bsky/moderation/getConvo.js.map +1 -0
- package/dist/lexicon/types/chat/bsky/moderation/getConvoMembers.d.ts +26 -0
- package/dist/lexicon/types/chat/bsky/moderation/getConvoMembers.d.ts.map +1 -0
- package/dist/lexicon/types/chat/bsky/moderation/getConvoMembers.js +5 -0
- package/dist/lexicon/types/chat/bsky/moderation/getConvoMembers.js.map +1 -0
- package/dist/lexicon/types/chat/bsky/moderation/subscribeModEvents.d.ts +14 -2
- package/dist/lexicon/types/chat/bsky/moderation/subscribeModEvents.d.ts.map +1 -1
- package/dist/lexicon/types/chat/bsky/moderation/subscribeModEvents.js +7 -0
- package/dist/lexicon/types/chat/bsky/moderation/subscribeModEvents.js.map +1 -1
- package/dist/lexicon/types/com/atproto/server/getServiceAuth.d.ts +1 -1
- package/dist/lexicon/types/com/atproto/server/getServiceAuth.d.ts.map +1 -1
- package/dist/lexicon/types/com/atproto/server/getServiceAuth.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/moderation/defs.d.ts +10 -3
- package/dist/lexicon/types/tools/ozone/moderation/defs.d.ts.map +1 -1
- package/dist/lexicon/types/tools/ozone/moderation/defs.js +7 -0
- package/dist/lexicon/types/tools/ozone/moderation/defs.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/moderation/queryEvents.d.ts +2 -2
- package/dist/lexicon/types/tools/ozone/moderation/queryEvents.d.ts.map +1 -1
- package/dist/lexicon/types/tools/ozone/moderation/queryEvents.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/moderation/queryStatuses.d.ts +2 -2
- package/dist/lexicon/types/tools/ozone/moderation/queryStatuses.d.ts.map +1 -1
- package/dist/lexicon/types/tools/ozone/moderation/queryStatuses.js.map +1 -1
- package/dist/mod-service/expiring-tags.d.ts +3 -0
- package/dist/mod-service/expiring-tags.d.ts.map +1 -1
- package/dist/mod-service/expiring-tags.js +5 -2
- package/dist/mod-service/expiring-tags.js.map +1 -1
- package/dist/mod-service/index.d.ts +3 -1
- package/dist/mod-service/index.d.ts.map +1 -1
- package/dist/mod-service/index.js +48 -10
- package/dist/mod-service/index.js.map +1 -1
- package/dist/mod-service/status.d.ts +7 -1
- package/dist/mod-service/status.d.ts.map +1 -1
- package/dist/mod-service/status.js +18 -3
- package/dist/mod-service/status.js.map +1 -1
- package/dist/mod-service/subject.d.ts +38 -2
- package/dist/mod-service/subject.d.ts.map +1 -1
- package/dist/mod-service/subject.js +67 -0
- package/dist/mod-service/subject.js.map +1 -1
- package/dist/mod-service/views.d.ts +2 -1
- package/dist/mod-service/views.d.ts.map +1 -1
- package/dist/mod-service/views.js +24 -22
- package/dist/mod-service/views.js.map +1 -1
- package/dist/queue/service.d.ts.map +1 -1
- package/dist/queue/service.js +7 -3
- package/dist/queue/service.js.map +1 -1
- package/dist/safelink/service.d.ts +1 -1
- package/package.json +9 -8
- package/src/api/chat/getConvo.ts +23 -0
- package/src/api/chat/getConvoMembers.ts +23 -0
- package/src/api/chat/index.ts +4 -0
- package/src/daemon/event-reverser.ts +1 -0
- package/src/db/migrations/20260513T202941104Z-add-subject-convo-id.ts +114 -0
- package/src/db/migrations/index.ts +1 -0
- package/src/db/schema/expiring_tag.ts +1 -0
- package/src/db/schema/moderation_event.ts +2 -0
- package/src/db/schema/moderation_subject_status.ts +4 -0
- package/src/db/schema/report.ts +2 -1
- package/src/mod-service/expiring-tags.ts +8 -2
- package/src/mod-service/index.ts +52 -16
- package/src/mod-service/status.ts +24 -2
- package/src/mod-service/subject.ts +79 -1
- package/src/mod-service/views.ts +28 -23
- package/src/queue/service.ts +8 -4
- package/tests/__snapshots__/verification.test.ts.snap +2 -0
- package/tests/expiring-tags.test.ts +1 -0
- package/tests/moderation-events.test.ts +108 -1
- package/tests/moderation-status-tags.test.ts +23 -0
- package/tests/moderation-statuses.test.ts +82 -0
- package/tests/moderation.test.ts +73 -0
- package/tests/repo-search.test.ts +1 -1
- package/tsconfig.build.tsbuildinfo +1 -1
- package/dist/lexicon/types/chat/bsky/group/getJoinLinkPreview.d.ts.map +0 -1
- package/dist/lexicon/types/chat/bsky/group/getJoinLinkPreview.js.map +0 -1
- package/src/lexicon/index.ts +0 -4502
- package/src/lexicon/lexicons.ts +0 -25711
- package/src/lexicon/types/app/bsky/actor/defs.ts +0 -716
- package/src/lexicon/types/app/bsky/actor/getPreferences.ts +0 -38
- package/src/lexicon/types/app/bsky/actor/getProfile.ts +0 -37
- package/src/lexicon/types/app/bsky/actor/getProfiles.ts +0 -40
- package/src/lexicon/types/app/bsky/actor/getSuggestions.ts +0 -46
- package/src/lexicon/types/app/bsky/actor/profile.ts +0 -52
- package/src/lexicon/types/app/bsky/actor/putPreferences.ts +0 -34
- package/src/lexicon/types/app/bsky/actor/searchActors.ts +0 -46
- package/src/lexicon/types/app/bsky/actor/searchActorsTypeahead.ts +0 -44
- package/src/lexicon/types/app/bsky/actor/status.ts +0 -46
- package/src/lexicon/types/app/bsky/ageassurance/begin.ts +0 -54
- package/src/lexicon/types/app/bsky/ageassurance/defs.ts +0 -303
- package/src/lexicon/types/app/bsky/ageassurance/getConfig.ts +0 -34
- package/src/lexicon/types/app/bsky/ageassurance/getState.ts +0 -42
- package/src/lexicon/types/app/bsky/bookmark/createBookmark.ts +0 -35
- package/src/lexicon/types/app/bsky/bookmark/defs.ts +0 -54
- package/src/lexicon/types/app/bsky/bookmark/deleteBookmark.ts +0 -34
- package/src/lexicon/types/app/bsky/bookmark/getBookmarks.ts +0 -42
- package/src/lexicon/types/app/bsky/contact/defs.ts +0 -71
- package/src/lexicon/types/app/bsky/contact/dismissMatch.ts +0 -43
- package/src/lexicon/types/app/bsky/contact/getMatches.ts +0 -43
- package/src/lexicon/types/app/bsky/contact/getSyncStatus.ts +0 -39
- package/src/lexicon/types/app/bsky/contact/importContacts.ts +0 -54
- package/src/lexicon/types/app/bsky/contact/removeData.ts +0 -40
- package/src/lexicon/types/app/bsky/contact/sendNotification.ts +0 -44
- package/src/lexicon/types/app/bsky/contact/startPhoneVerification.ts +0 -43
- package/src/lexicon/types/app/bsky/contact/verifyPhone.ts +0 -53
- package/src/lexicon/types/app/bsky/draft/createDraft.ts +0 -46
- package/src/lexicon/types/app/bsky/draft/defs.ts +0 -212
- package/src/lexicon/types/app/bsky/draft/deleteDraft.ts +0 -33
- package/src/lexicon/types/app/bsky/draft/getDrafts.ts +0 -42
- package/src/lexicon/types/app/bsky/draft/updateDraft.ts +0 -34
- package/src/lexicon/types/app/bsky/embed/defs.ts +0 -32
- package/src/lexicon/types/app/bsky/embed/external.ts +0 -85
- package/src/lexicon/types/app/bsky/embed/images.ts +0 -86
- package/src/lexicon/types/app/bsky/embed/record.ts +0 -146
- package/src/lexicon/types/app/bsky/embed/recordWithMedia.ts +0 -59
- package/src/lexicon/types/app/bsky/embed/video.ts +0 -75
- package/src/lexicon/types/app/bsky/feed/defs.ts +0 -428
- package/src/lexicon/types/app/bsky/feed/describeFeedGenerator.ts +0 -70
- package/src/lexicon/types/app/bsky/feed/generator.ts +0 -51
- package/src/lexicon/types/app/bsky/feed/getActorFeeds.ts +0 -43
- package/src/lexicon/types/app/bsky/feed/getActorLikes.ts +0 -44
- package/src/lexicon/types/app/bsky/feed/getAuthorFeed.ts +0 -53
- package/src/lexicon/types/app/bsky/feed/getFeed.ts +0 -44
- package/src/lexicon/types/app/bsky/feed/getFeedGenerator.ts +0 -45
- package/src/lexicon/types/app/bsky/feed/getFeedGenerators.ts +0 -40
- package/src/lexicon/types/app/bsky/feed/getFeedSkeleton.ts +0 -47
- package/src/lexicon/types/app/bsky/feed/getLikes.ts +0 -65
- package/src/lexicon/types/app/bsky/feed/getListFeed.ts +0 -45
- package/src/lexicon/types/app/bsky/feed/getPostThread.ts +0 -51
- package/src/lexicon/types/app/bsky/feed/getPosts.ts +0 -41
- package/src/lexicon/types/app/bsky/feed/getQuotes.ts +0 -48
- package/src/lexicon/types/app/bsky/feed/getRepostedBy.ts +0 -48
- package/src/lexicon/types/app/bsky/feed/getSuggestedFeeds.ts +0 -42
- package/src/lexicon/types/app/bsky/feed/getTimeline.ts +0 -44
- package/src/lexicon/types/app/bsky/feed/like.ts +0 -40
- package/src/lexicon/types/app/bsky/feed/post.ts +0 -117
- package/src/lexicon/types/app/bsky/feed/postgate.ts +0 -58
- package/src/lexicon/types/app/bsky/feed/repost.ts +0 -40
- package/src/lexicon/types/app/bsky/feed/searchPosts.ts +0 -66
- package/src/lexicon/types/app/bsky/feed/sendInteractions.ts +0 -43
- package/src/lexicon/types/app/bsky/feed/threadgate.ts +0 -110
- package/src/lexicon/types/app/bsky/graph/block.ts +0 -39
- package/src/lexicon/types/app/bsky/graph/defs.ts +0 -206
- package/src/lexicon/types/app/bsky/graph/follow.ts +0 -40
- package/src/lexicon/types/app/bsky/graph/getActorStarterPacks.ts +0 -43
- package/src/lexicon/types/app/bsky/graph/getBlocks.ts +0 -42
- package/src/lexicon/types/app/bsky/graph/getFollowers.ts +0 -44
- package/src/lexicon/types/app/bsky/graph/getFollows.ts +0 -44
- package/src/lexicon/types/app/bsky/graph/getKnownFollowers.ts +0 -44
- package/src/lexicon/types/app/bsky/graph/getList.ts +0 -45
- package/src/lexicon/types/app/bsky/graph/getListBlocks.ts +0 -42
- package/src/lexicon/types/app/bsky/graph/getListMutes.ts +0 -42
- package/src/lexicon/types/app/bsky/graph/getLists.ts +0 -46
- package/src/lexicon/types/app/bsky/graph/getListsWithMembership.ts +0 -63
- package/src/lexicon/types/app/bsky/graph/getMutes.ts +0 -42
- package/src/lexicon/types/app/bsky/graph/getRelationships.ts +0 -49
- package/src/lexicon/types/app/bsky/graph/getStarterPack.ts +0 -41
- package/src/lexicon/types/app/bsky/graph/getStarterPacks.ts +0 -40
- package/src/lexicon/types/app/bsky/graph/getStarterPacksWithMembership.ts +0 -65
- package/src/lexicon/types/app/bsky/graph/getSuggestedFollowsByActor.ts +0 -46
- package/src/lexicon/types/app/bsky/graph/list.ts +0 -47
- package/src/lexicon/types/app/bsky/graph/listblock.ts +0 -39
- package/src/lexicon/types/app/bsky/graph/listitem.ts +0 -41
- package/src/lexicon/types/app/bsky/graph/muteActor.ts +0 -33
- package/src/lexicon/types/app/bsky/graph/muteActorList.ts +0 -33
- package/src/lexicon/types/app/bsky/graph/muteThread.ts +0 -33
- package/src/lexicon/types/app/bsky/graph/searchStarterPacks.ts +0 -44
- package/src/lexicon/types/app/bsky/graph/starterpack.ts +0 -60
- package/src/lexicon/types/app/bsky/graph/unmuteActor.ts +0 -33
- package/src/lexicon/types/app/bsky/graph/unmuteActorList.ts +0 -33
- package/src/lexicon/types/app/bsky/graph/unmuteThread.ts +0 -33
- package/src/lexicon/types/app/bsky/graph/verification.ts +0 -44
- package/src/lexicon/types/app/bsky/labeler/defs.ts +0 -100
- package/src/lexicon/types/app/bsky/labeler/getServices.ts +0 -45
- package/src/lexicon/types/app/bsky/labeler/service.ts +0 -48
- package/src/lexicon/types/app/bsky/notification/declaration.ts +0 -38
- package/src/lexicon/types/app/bsky/notification/defs.ts +0 -142
- package/src/lexicon/types/app/bsky/notification/getPreferences.ts +0 -38
- package/src/lexicon/types/app/bsky/notification/getUnreadCount.ts +0 -40
- package/src/lexicon/types/app/bsky/notification/listActivitySubscriptions.ts +0 -42
- package/src/lexicon/types/app/bsky/notification/listNotifications.ts +0 -87
- package/src/lexicon/types/app/bsky/notification/putActivitySubscription.ts +0 -46
- package/src/lexicon/types/app/bsky/notification/putPreferences.ts +0 -33
- package/src/lexicon/types/app/bsky/notification/putPreferencesV2.ts +0 -56
- package/src/lexicon/types/app/bsky/notification/registerPush.ts +0 -38
- package/src/lexicon/types/app/bsky/notification/unregisterPush.ts +0 -36
- package/src/lexicon/types/app/bsky/notification/updateSeen.ts +0 -33
- package/src/lexicon/types/app/bsky/richtext/facet.ts +0 -97
- package/src/lexicon/types/app/bsky/unspecced/defs.ts +0 -250
- package/src/lexicon/types/app/bsky/unspecced/getAgeAssuranceState.ts +0 -34
- package/src/lexicon/types/app/bsky/unspecced/getConfig.ts +0 -54
- package/src/lexicon/types/app/bsky/unspecced/getOnboardingSuggestedStarterPacks.ts +0 -40
- package/src/lexicon/types/app/bsky/unspecced/getOnboardingSuggestedStarterPacksSkeleton.ts +0 -41
- package/src/lexicon/types/app/bsky/unspecced/getOnboardingSuggestedUsersSkeleton.ts +0 -47
- package/src/lexicon/types/app/bsky/unspecced/getPopularFeedGenerators.ts +0 -43
- package/src/lexicon/types/app/bsky/unspecced/getPostThreadOtherV2.ts +0 -60
- package/src/lexicon/types/app/bsky/unspecced/getPostThreadV2.ts +0 -77
- package/src/lexicon/types/app/bsky/unspecced/getSuggestedFeeds.ts +0 -40
- package/src/lexicon/types/app/bsky/unspecced/getSuggestedFeedsSkeleton.ts +0 -41
- package/src/lexicon/types/app/bsky/unspecced/getSuggestedOnboardingUsers.ts +0 -46
- package/src/lexicon/types/app/bsky/unspecced/getSuggestedStarterPacks.ts +0 -40
- package/src/lexicon/types/app/bsky/unspecced/getSuggestedStarterPacksSkeleton.ts +0 -41
- package/src/lexicon/types/app/bsky/unspecced/getSuggestedUsers.ts +0 -46
- package/src/lexicon/types/app/bsky/unspecced/getSuggestedUsersForDiscover.ts +0 -42
- package/src/lexicon/types/app/bsky/unspecced/getSuggestedUsersForDiscoverSkeleton.ts +0 -43
- package/src/lexicon/types/app/bsky/unspecced/getSuggestedUsersForExplore.ts +0 -44
- package/src/lexicon/types/app/bsky/unspecced/getSuggestedUsersForExploreSkeleton.ts +0 -45
- package/src/lexicon/types/app/bsky/unspecced/getSuggestedUsersForSeeMore.ts +0 -44
- package/src/lexicon/types/app/bsky/unspecced/getSuggestedUsersForSeeMoreSkeleton.ts +0 -45
- package/src/lexicon/types/app/bsky/unspecced/getSuggestedUsersSkeleton.ts +0 -47
- package/src/lexicon/types/app/bsky/unspecced/getSuggestionsSkeleton.ts +0 -52
- package/src/lexicon/types/app/bsky/unspecced/getTaggedSuggestions.ts +0 -54
- package/src/lexicon/types/app/bsky/unspecced/getTrendingTopics.ts +0 -43
- package/src/lexicon/types/app/bsky/unspecced/getTrends.ts +0 -40
- package/src/lexicon/types/app/bsky/unspecced/getTrendsSkeleton.ts +0 -42
- package/src/lexicon/types/app/bsky/unspecced/initAgeAssurance.ts +0 -48
- package/src/lexicon/types/app/bsky/unspecced/searchActorsSkeleton.ts +0 -52
- package/src/lexicon/types/app/bsky/unspecced/searchPostsSkeleton.ts +0 -68
- package/src/lexicon/types/app/bsky/unspecced/searchStarterPacksSkeleton.ts +0 -50
- package/src/lexicon/types/app/bsky/video/defs.ts +0 -38
- package/src/lexicon/types/app/bsky/video/getJobStatus.ts +0 -40
- package/src/lexicon/types/app/bsky/video/getUploadLimits.ts +0 -41
- package/src/lexicon/types/app/bsky/video/uploadVideo.ts +0 -42
- package/src/lexicon/types/chat/bsky/actor/declaration.ts +0 -39
- package/src/lexicon/types/chat/bsky/actor/defs.ts +0 -96
- package/src/lexicon/types/chat/bsky/actor/deleteAccount.ts +0 -35
- package/src/lexicon/types/chat/bsky/actor/exportAccountData.ts +0 -33
- package/src/lexicon/types/chat/bsky/convo/acceptConvo.ts +0 -45
- package/src/lexicon/types/chat/bsky/convo/addReaction.ts +0 -52
- package/src/lexicon/types/chat/bsky/convo/defs.ts +0 -1058
- package/src/lexicon/types/chat/bsky/convo/deleteMessageForSelf.ts +0 -44
- package/src/lexicon/types/chat/bsky/convo/getConvo.ts +0 -41
- package/src/lexicon/types/chat/bsky/convo/getConvoAvailability.ts +0 -41
- package/src/lexicon/types/chat/bsky/convo/getConvoForMembers.ts +0 -46
- package/src/lexicon/types/chat/bsky/convo/getConvoMembers.ts +0 -44
- package/src/lexicon/types/chat/bsky/convo/getLog.ts +0 -70
- package/src/lexicon/types/chat/bsky/convo/getMessages.ts +0 -52
- package/src/lexicon/types/chat/bsky/convo/leaveConvo.ts +0 -45
- package/src/lexicon/types/chat/bsky/convo/listConvoRequests.ts +0 -47
- package/src/lexicon/types/chat/bsky/convo/listConvos.ts +0 -49
- package/src/lexicon/types/chat/bsky/convo/lockConvo.ts +0 -45
- package/src/lexicon/types/chat/bsky/convo/muteConvo.ts +0 -45
- package/src/lexicon/types/chat/bsky/convo/removeReaction.ts +0 -51
- package/src/lexicon/types/chat/bsky/convo/sendMessage.ts +0 -44
- package/src/lexicon/types/chat/bsky/convo/sendMessageBatch.ts +0 -61
- package/src/lexicon/types/chat/bsky/convo/unlockConvo.ts +0 -45
- package/src/lexicon/types/chat/bsky/convo/unmuteConvo.ts +0 -45
- package/src/lexicon/types/chat/bsky/convo/updateAllRead.ts +0 -44
- package/src/lexicon/types/chat/bsky/convo/updateRead.ts +0 -46
- package/src/lexicon/types/chat/bsky/group/addMembers.ts +0 -57
- package/src/lexicon/types/chat/bsky/group/approveJoinRequest.ts +0 -46
- package/src/lexicon/types/chat/bsky/group/createGroup.ts +0 -51
- package/src/lexicon/types/chat/bsky/group/createJoinLink.ts +0 -47
- package/src/lexicon/types/chat/bsky/group/defs.ts +0 -75
- package/src/lexicon/types/chat/bsky/group/disableJoinLink.ts +0 -45
- package/src/lexicon/types/chat/bsky/group/editGroup.ts +0 -46
- package/src/lexicon/types/chat/bsky/group/editJoinLink.ts +0 -47
- package/src/lexicon/types/chat/bsky/group/enableJoinLink.ts +0 -49
- package/src/lexicon/types/chat/bsky/group/getJoinLinkPreview.ts +0 -41
- package/src/lexicon/types/chat/bsky/group/listJoinRequests.ts +0 -44
- package/src/lexicon/types/chat/bsky/group/rejectJoinRequest.ts +0 -43
- package/src/lexicon/types/chat/bsky/group/removeMembers.ts +0 -46
- package/src/lexicon/types/chat/bsky/group/requestJoin.ts +0 -52
- package/src/lexicon/types/chat/bsky/moderation/getActorMetadata.ts +0 -59
- package/src/lexicon/types/chat/bsky/moderation/getMessageContext.ts +0 -52
- package/src/lexicon/types/chat/bsky/moderation/subscribeModEvents.ts +0 -386
- package/src/lexicon/types/chat/bsky/moderation/updateActorAccess.ts +0 -35
- package/src/lexicon/types/com/atproto/admin/defs.ts +0 -106
- package/src/lexicon/types/com/atproto/admin/deleteAccount.ts +0 -33
- package/src/lexicon/types/com/atproto/admin/disableAccountInvites.ts +0 -35
- package/src/lexicon/types/com/atproto/admin/disableInviteCodes.ts +0 -34
- package/src/lexicon/types/com/atproto/admin/enableAccountInvites.ts +0 -35
- package/src/lexicon/types/com/atproto/admin/getAccountInfo.ts +0 -36
- package/src/lexicon/types/com/atproto/admin/getAccountInfos.ts +0 -40
- package/src/lexicon/types/com/atproto/admin/getInviteCodes.ts +0 -43
- package/src/lexicon/types/com/atproto/admin/getSubjectStatus.ts +0 -49
- package/src/lexicon/types/com/atproto/admin/searchAccounts.ts +0 -43
- package/src/lexicon/types/com/atproto/admin/sendEmail.ts +0 -48
- package/src/lexicon/types/com/atproto/admin/updateAccountEmail.ts +0 -35
- package/src/lexicon/types/com/atproto/admin/updateAccountHandle.ts +0 -34
- package/src/lexicon/types/com/atproto/admin/updateAccountPassword.ts +0 -34
- package/src/lexicon/types/com/atproto/admin/updateAccountSigningKey.ts +0 -35
- package/src/lexicon/types/com/atproto/admin/updateSubjectStatus.ts +0 -56
- package/src/lexicon/types/com/atproto/identity/defs.ts +0 -34
- package/src/lexicon/types/com/atproto/identity/getRecommendedDidCredentials.ts +0 -41
- package/src/lexicon/types/com/atproto/identity/refreshIdentity.ts +0 -43
- package/src/lexicon/types/com/atproto/identity/requestPlcOperationSignature.ts +0 -26
- package/src/lexicon/types/com/atproto/identity/resolveDid.ts +0 -42
- package/src/lexicon/types/com/atproto/identity/resolveHandle.ts +0 -41
- package/src/lexicon/types/com/atproto/identity/resolveIdentity.ts +0 -38
- package/src/lexicon/types/com/atproto/identity/signPlcOperation.ts +0 -49
- package/src/lexicon/types/com/atproto/identity/submitPlcOperation.ts +0 -33
- package/src/lexicon/types/com/atproto/identity/updateHandle.ts +0 -34
- package/src/lexicon/types/com/atproto/label/defs.ts +0 -143
- package/src/lexicon/types/com/atproto/label/queryLabels.ts +0 -46
- package/src/lexicon/types/com/atproto/label/subscribeLabels.ts +0 -58
- package/src/lexicon/types/com/atproto/lexicon/resolveLexicon.ts +0 -46
- package/src/lexicon/types/com/atproto/lexicon/schema.ts +0 -38
- package/src/lexicon/types/com/atproto/moderation/createReport.ts +0 -80
- package/src/lexicon/types/com/atproto/moderation/defs.ts +0 -83
- package/src/lexicon/types/com/atproto/repo/applyWrites.ts +0 -158
- package/src/lexicon/types/com/atproto/repo/createRecord.ts +0 -59
- package/src/lexicon/types/com/atproto/repo/defs.ts +0 -31
- package/src/lexicon/types/com/atproto/repo/deleteRecord.ts +0 -54
- package/src/lexicon/types/com/atproto/repo/describeRepo.ts +0 -47
- package/src/lexicon/types/com/atproto/repo/getRecord.ts +0 -49
- package/src/lexicon/types/com/atproto/repo/importRepo.ts +0 -31
- package/src/lexicon/types/com/atproto/repo/listMissingBlobs.ts +0 -57
- package/src/lexicon/types/com/atproto/repo/listRecords.ts +0 -65
- package/src/lexicon/types/com/atproto/repo/putRecord.ts +0 -61
- package/src/lexicon/types/com/atproto/repo/strongRef.ts +0 -31
- package/src/lexicon/types/com/atproto/repo/uploadBlob.ts +0 -41
- package/src/lexicon/types/com/atproto/server/activateAccount.ts +0 -26
- package/src/lexicon/types/com/atproto/server/checkAccountStatus.ts +0 -45
- package/src/lexicon/types/com/atproto/server/confirmEmail.ts +0 -35
- package/src/lexicon/types/com/atproto/server/createAccount.ts +0 -71
- package/src/lexicon/types/com/atproto/server/createAppPassword.ts +0 -63
- package/src/lexicon/types/com/atproto/server/createInviteCode.ts +0 -44
- package/src/lexicon/types/com/atproto/server/createInviteCodes.ts +0 -61
- package/src/lexicon/types/com/atproto/server/createSession.ts +0 -59
- package/src/lexicon/types/com/atproto/server/deactivateAccount.ts +0 -34
- package/src/lexicon/types/com/atproto/server/defs.ts +0 -52
- package/src/lexicon/types/com/atproto/server/deleteAccount.ts +0 -36
- package/src/lexicon/types/com/atproto/server/deleteSession.ts +0 -27
- package/src/lexicon/types/com/atproto/server/describeServer.ts +0 -76
- package/src/lexicon/types/com/atproto/server/getAccountInviteCodes.ts +0 -43
- package/src/lexicon/types/com/atproto/server/getServiceAuth.ts +0 -45
- package/src/lexicon/types/com/atproto/server/getSession.ts +0 -45
- package/src/lexicon/types/com/atproto/server/listAppPasswords.ts +0 -55
- package/src/lexicon/types/com/atproto/server/refreshSession.ts +0 -48
- package/src/lexicon/types/com/atproto/server/requestAccountDelete.ts +0 -26
- package/src/lexicon/types/com/atproto/server/requestEmailConfirmation.ts +0 -26
- package/src/lexicon/types/com/atproto/server/requestEmailUpdate.ts +0 -37
- package/src/lexicon/types/com/atproto/server/requestPasswordReset.ts +0 -33
- package/src/lexicon/types/com/atproto/server/reserveSigningKey.ts +0 -45
- package/src/lexicon/types/com/atproto/server/resetPassword.ts +0 -35
- package/src/lexicon/types/com/atproto/server/revokeAppPassword.ts +0 -33
- package/src/lexicon/types/com/atproto/server/updateEmail.ts +0 -37
- package/src/lexicon/types/com/atproto/sync/defs.ts +0 -23
- package/src/lexicon/types/com/atproto/sync/getBlob.ts +0 -44
- package/src/lexicon/types/com/atproto/sync/getBlocks.ts +0 -43
- package/src/lexicon/types/com/atproto/sync/getCheckout.ts +0 -36
- package/src/lexicon/types/com/atproto/sync/getHead.ts +0 -41
- package/src/lexicon/types/com/atproto/sync/getHostStatus.ts +0 -47
- package/src/lexicon/types/com/atproto/sync/getLatestCommit.ts +0 -42
- package/src/lexicon/types/com/atproto/sync/getRecord.ts +0 -45
- package/src/lexicon/types/com/atproto/sync/getRepo.ts +0 -39
- package/src/lexicon/types/com/atproto/sync/getRepoStatus.ts +0 -53
- package/src/lexicon/types/com/atproto/sync/listBlobs.ts +0 -46
- package/src/lexicon/types/com/atproto/sync/listHosts.ts +0 -63
- package/src/lexicon/types/com/atproto/sync/listRepos.ts +0 -69
- package/src/lexicon/types/com/atproto/sync/listReposByCollection.ts +0 -58
- package/src/lexicon/types/com/atproto/sync/notifyOfUpdate.ts +0 -34
- package/src/lexicon/types/com/atproto/sync/requestCrawl.ts +0 -35
- package/src/lexicon/types/com/atproto/sync/subscribeRepos.ts +0 -179
- package/src/lexicon/types/com/atproto/temp/addReservedHandle.ts +0 -41
- package/src/lexicon/types/com/atproto/temp/checkHandleAvailability.ts +0 -99
- package/src/lexicon/types/com/atproto/temp/checkSignupQueue.ts +0 -39
- package/src/lexicon/types/com/atproto/temp/dereferenceScope.ts +0 -42
- package/src/lexicon/types/com/atproto/temp/fetchLabels.ts +0 -41
- package/src/lexicon/types/com/atproto/temp/requestPhoneVerification.ts +0 -33
- package/src/lexicon/types/com/atproto/temp/revokeAccountCredentials.ts +0 -33
- package/src/lexicon/types/tools/ozone/communication/createTemplate.ts +0 -52
- package/src/lexicon/types/tools/ozone/communication/defs.ts +0 -43
- package/src/lexicon/types/tools/ozone/communication/deleteTemplate.ts +0 -33
- package/src/lexicon/types/tools/ozone/communication/listTemplates.ts +0 -38
- package/src/lexicon/types/tools/ozone/communication/updateTemplate.ts +0 -55
- package/src/lexicon/types/tools/ozone/hosting/getAccountHistory.ts +0 -147
- package/src/lexicon/types/tools/ozone/moderation/cancelScheduledActions.ts +0 -79
- package/src/lexicon/types/tools/ozone/moderation/defs.ts +0 -1176
- package/src/lexicon/types/tools/ozone/moderation/emitEvent.ts +0 -104
- package/src/lexicon/types/tools/ozone/moderation/getAccountTimeline.ts +0 -105
- package/src/lexicon/types/tools/ozone/moderation/getEvent.ts +0 -36
- package/src/lexicon/types/tools/ozone/moderation/getRecord.ts +0 -38
- package/src/lexicon/types/tools/ozone/moderation/getRecords.ts +0 -44
- package/src/lexicon/types/tools/ozone/moderation/getRepo.ts +0 -37
- package/src/lexicon/types/tools/ozone/moderation/getReporterStats.ts +0 -40
- package/src/lexicon/types/tools/ozone/moderation/getRepos.ts +0 -44
- package/src/lexicon/types/tools/ozone/moderation/getSubjects.ts +0 -40
- package/src/lexicon/types/tools/ozone/moderation/listScheduledActions.ts +0 -57
- package/src/lexicon/types/tools/ozone/moderation/queryEvents.ts +0 -86
- package/src/lexicon/types/tools/ozone/moderation/queryStatuses.ts +0 -121
- package/src/lexicon/types/tools/ozone/moderation/scheduleAction.ts +0 -133
- package/src/lexicon/types/tools/ozone/moderation/searchRepos.ts +0 -45
- package/src/lexicon/types/tools/ozone/queue/assignModerator.ts +0 -46
- package/src/lexicon/types/tools/ozone/queue/createQueue.ts +0 -54
- package/src/lexicon/types/tools/ozone/queue/defs.ts +0 -99
- package/src/lexicon/types/tools/ozone/queue/deleteQueue.ts +0 -48
- package/src/lexicon/types/tools/ozone/queue/getAssignments.ts +0 -48
- package/src/lexicon/types/tools/ozone/queue/listQueues.ts +0 -50
- package/src/lexicon/types/tools/ozone/queue/routeReports.ts +0 -50
- package/src/lexicon/types/tools/ozone/queue/unassignModerator.ts +0 -37
- package/src/lexicon/types/tools/ozone/queue/updateQueue.ts +0 -51
- package/src/lexicon/types/tools/ozone/report/assignModerator.ts +0 -50
- package/src/lexicon/types/tools/ozone/report/createActivity.ts +0 -60
- package/src/lexicon/types/tools/ozone/report/defs.ts +0 -466
- package/src/lexicon/types/tools/ozone/report/getAssignments.ts +0 -48
- package/src/lexicon/types/tools/ozone/report/getHistoricalStats.ts +0 -54
- package/src/lexicon/types/tools/ozone/report/getLatestReport.ts +0 -39
- package/src/lexicon/types/tools/ozone/report/getLiveStats.ts +0 -45
- package/src/lexicon/types/tools/ozone/report/getReport.ts +0 -38
- package/src/lexicon/types/tools/ozone/report/listActivities.ts +0 -44
- package/src/lexicon/types/tools/ozone/report/queryReports.ts +0 -72
- package/src/lexicon/types/tools/ozone/report/reassignQueue.ts +0 -55
- package/src/lexicon/types/tools/ozone/report/refreshStats.ts +0 -46
- package/src/lexicon/types/tools/ozone/report/unassignModerator.ts +0 -44
- package/src/lexicon/types/tools/ozone/safelink/addRule.ts +0 -51
- package/src/lexicon/types/tools/ozone/safelink/defs.ts +0 -76
- package/src/lexicon/types/tools/ozone/safelink/queryEvents.ts +0 -55
- package/src/lexicon/types/tools/ozone/safelink/queryRules.ts +0 -61
- package/src/lexicon/types/tools/ozone/safelink/removeRule.ts +0 -49
- package/src/lexicon/types/tools/ozone/safelink/updateRule.ts +0 -51
- package/src/lexicon/types/tools/ozone/server/getConfig.ts +0 -78
- package/src/lexicon/types/tools/ozone/set/addValues.ts +0 -36
- package/src/lexicon/types/tools/ozone/set/defs.ts +0 -50
- package/src/lexicon/types/tools/ozone/set/deleteSet.ts +0 -43
- package/src/lexicon/types/tools/ozone/set/deleteValues.ts +0 -37
- package/src/lexicon/types/tools/ozone/set/getValues.ts +0 -45
- package/src/lexicon/types/tools/ozone/set/querySets.ts +0 -46
- package/src/lexicon/types/tools/ozone/set/upsertSet.ts +0 -38
- package/src/lexicon/types/tools/ozone/setting/defs.ts +0 -44
- package/src/lexicon/types/tools/ozone/setting/listOptions.ts +0 -47
- package/src/lexicon/types/tools/ozone/setting/removeOptions.ts +0 -42
- package/src/lexicon/types/tools/ozone/setting/upsertOption.ts +0 -53
- package/src/lexicon/types/tools/ozone/signature/defs.ts +0 -31
- package/src/lexicon/types/tools/ozone/signature/findCorrelation.ts +0 -40
- package/src/lexicon/types/tools/ozone/signature/findRelatedAccounts.ts +0 -60
- package/src/lexicon/types/tools/ozone/signature/searchAccounts.ts +0 -43
- package/src/lexicon/types/tools/ozone/team/addMember.ts +0 -49
- package/src/lexicon/types/tools/ozone/team/defs.ts +0 -51
- package/src/lexicon/types/tools/ozone/team/deleteMember.ts +0 -34
- package/src/lexicon/types/tools/ozone/team/listMembers.ts +0 -45
- package/src/lexicon/types/tools/ozone/team/updateMember.ts +0 -50
- package/src/lexicon/types/tools/ozone/verification/defs.ts +0 -59
- package/src/lexicon/types/tools/ozone/verification/grantVerifications.ts +0 -87
- package/src/lexicon/types/tools/ozone/verification/listVerifications.ts +0 -56
- package/src/lexicon/types/tools/ozone/verification/revokeVerifications.ts +0 -68
- package/src/lexicon/util.ts +0 -82
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/mod-service/status.ts"],"names":[],"mappings":"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","sourcesContent":["// This may require better organization but for now, just dumping functions here containing DB queries for moderation status\n\nimport { HOUR } from '@atproto/common'\nimport { AtUri } from '@atproto/syntax'\nimport { isAppealReport } from '../api/util.js'\nimport { Database } from '../db/index.js'\nimport { DatabaseSchema } from '../db/schema/index.js'\nimport { jsonb } from '../db/types.js'\nimport {\n REVIEWCLOSED,\n REVIEWESCALATED,\n REVIEWNONE,\n REVIEWOPEN,\n} from '../lexicon/types/tools/ozone/moderation/defs.js'\nimport { ModerationEventRow, ModerationSubjectStatusRow } from './types.js'\n\nconst getSubjectStatusForModerationEvent = ({\n currentStatus,\n action,\n createdBy,\n createdAt,\n durationInHours,\n}: {\n currentStatus?: ModerationSubjectStatusRow\n action: string\n createdBy: string\n createdAt: string\n durationInHours: number | null\n}): Partial<ModerationSubjectStatusRow> => {\n const defaultReviewState = currentStatus\n ? currentStatus.reviewState\n : REVIEWNONE\n\n switch (action) {\n case 'tools.ozone.moderation.defs#modEventAcknowledge':\n return {\n lastReviewedBy: createdBy,\n reviewState: REVIEWCLOSED,\n lastReviewedAt: createdAt,\n }\n case 'tools.ozone.moderation.defs#modEventReport':\n return {\n reviewState: REVIEWOPEN,\n lastReportedAt: createdAt,\n }\n case 'tools.ozone.moderation.defs#modEventEscalate':\n return {\n lastReviewedBy: createdBy,\n reviewState: REVIEWESCALATED,\n lastReviewedAt: createdAt,\n }\n case 'tools.ozone.moderation.defs#modEventReverseTakedown':\n return {\n lastReviewedBy: createdBy,\n reviewState: REVIEWCLOSED,\n takendown: false,\n suspendUntil: null,\n lastReviewedAt: createdAt,\n }\n case 'tools.ozone.moderation.defs#modEventUnmuteReporter':\n return {\n lastReviewedBy: createdBy,\n muteReportingUntil: null,\n // It's not likely to receive an unmute event that does not already have a status row\n // but if it does happen, default to unnecessary\n reviewState: defaultReviewState,\n lastReviewedAt: createdAt,\n }\n case 'tools.ozone.moderation.defs#modEventUnmute':\n return {\n lastReviewedBy: createdBy,\n muteUntil: null,\n // It's not likely to receive an unmute event that does not already have a status row\n // but if it does happen, default to unnecessary\n reviewState: defaultReviewState,\n lastReviewedAt: createdAt,\n }\n case 'tools.ozone.moderation.defs#modEventTakedown':\n return {\n // If we are doing a takedown, safe to move the item out of appealed state\n ...(currentStatus?.appealed ? { appealed: false } : {}),\n takendown: true,\n lastReviewedBy: createdBy,\n reviewState: REVIEWCLOSED,\n lastReviewedAt: createdAt,\n suspendUntil: durationInHours\n ? new Date(Date.now() + durationInHours * HOUR).toISOString()\n : null,\n }\n case 'tools.ozone.moderation.defs#modEventMuteReporter':\n return {\n lastReviewedBy: createdBy,\n lastReviewedAt: createdAt,\n // By default, mute for 24hrs\n muteReportingUntil: new Date(\n Date.now() + (durationInHours || 24) * HOUR,\n ).toISOString(),\n // It's not likely to receive a mute event on a subject that does not already have a status row\n // but if it does happen, default to unnecessary\n reviewState: defaultReviewState,\n }\n case 'tools.ozone.moderation.defs#modEventMute':\n return {\n lastReviewedBy: createdBy,\n lastReviewedAt: createdAt,\n // By default, mute for 24hrs\n muteUntil: new Date(\n Date.now() + (durationInHours || 24) * HOUR,\n ).toISOString(),\n // It's not likely to receive a mute event on a subject that does not already have a status row\n // but if it does happen, default to unnecessary\n reviewState: defaultReviewState,\n }\n case 'tools.ozone.moderation.defs#modEventComment':\n return {\n lastReviewedBy: createdBy,\n lastReviewedAt: createdAt,\n reviewState: defaultReviewState,\n }\n case 'tools.ozone.moderation.defs#modEventTag':\n return { tags: [], reviewState: defaultReviewState }\n case 'tools.ozone.moderation.defs#modEventResolveAppeal':\n return {\n appealed: false,\n }\n case 'tools.ozone.moderation.defs#ageAssuranceEvent':\n case 'tools.ozone.moderation.defs#ageAssuranceOverrideEvent':\n case 'tools.ozone.moderation.defs#ageAssurancePurgeEvent':\n return {\n reviewState: defaultReviewState,\n }\n default:\n return {}\n }\n}\n\nconst hostingEvents = [\n 'tools.ozone.moderation.defs#accountEvent',\n 'tools.ozone.moderation.defs#identityEvent',\n 'tools.ozone.moderation.defs#recordEvent',\n]\n\nconst getSubjectStatusForRecordEvent = ({\n event,\n currentStatus,\n}: {\n event: ModerationEventRow\n currentStatus?: ModerationSubjectStatusRow\n}): Partial<ModerationSubjectStatusRow> => {\n const timestamp =\n typeof event.meta?.timestamp === 'string'\n ? event.meta?.timestamp\n : event.createdAt\n\n if (event.action === 'tools.ozone.moderation.defs#recordEvent') {\n if (event.meta?.op === 'delete') {\n return {\n hostingStatus: 'deleted',\n hostingDeletedAt: timestamp,\n }\n } else if (event.meta?.op === 'update') {\n return {\n hostingStatus: 'active',\n hostingUpdatedAt: timestamp,\n }\n }\n return {}\n }\n\n if (event.action === 'tools.ozone.moderation.defs#accountEvent') {\n const status: Partial<ModerationSubjectStatusRow> = {\n hostingUpdatedAt: timestamp,\n }\n\n if (event.meta?.status) {\n status.hostingStatus = `${event.meta?.status}`\n }\n\n if (event.meta?.status === 'deleted') {\n status.hostingDeletedAt = timestamp\n } else if (event.meta?.status === 'deactivated') {\n status.hostingDeactivatedAt = timestamp\n } else {\n // When deactivated accounts are re-activated, we receive the event with just the active flag set to true\n // so we want to make sure that the hostingStatus is not set to an outdated value\n if (\n currentStatus?.hostingStatus === 'deactivated' &&\n event.meta?.active\n ) {\n status.hostingStatus = 'active'\n status.hostingReactivatedAt = timestamp\n }\n }\n\n return status\n }\n\n if (event.action === 'tools.ozone.moderation.defs#identityEvent') {\n const status: Partial<ModerationSubjectStatusRow> = {\n hostingUpdatedAt: timestamp,\n }\n\n if (event.meta?.tombstone) {\n status.hostingStatus = 'tombstoned'\n status.hostingDeletedAt = timestamp\n }\n\n return status\n }\n\n return {}\n}\n\nexport const moderationSubjectStatusQueryBuilder = (db: DatabaseSchema) => {\n // @NOTE: Using select() instead of selectAll() below because the materialized\n // views might be incomplete, and we don't want the null `did` columns to\n // interfere with the (never null) `did` column from the\n // `moderation_subject_status` table in the results\n return db\n .selectFrom('moderation_subject_status')\n .selectAll('moderation_subject_status')\n .leftJoin('account_events_stats', (join) =>\n join.onRef(\n 'moderation_subject_status.did',\n '=',\n 'account_events_stats.subjectDid',\n ),\n )\n .select([\n 'account_events_stats.takedownCount',\n 'account_events_stats.suspendCount',\n 'account_events_stats.escalateCount',\n 'account_events_stats.reportCount',\n 'account_events_stats.appealCount',\n ])\n .leftJoin('account_record_events_stats', (join) =>\n join.onRef(\n 'moderation_subject_status.did',\n '=',\n 'account_record_events_stats.subjectDid',\n ),\n )\n .select([\n 'account_record_events_stats.totalReports',\n 'account_record_events_stats.reportedCount',\n 'account_record_events_stats.escalatedCount',\n 'account_record_events_stats.appealedCount',\n ])\n .leftJoin('account_record_status_stats', (join) =>\n join.onRef(\n 'moderation_subject_status.did',\n '=',\n 'account_record_status_stats.did',\n ),\n )\n .select([\n 'account_record_status_stats.subjectCount',\n 'account_record_status_stats.pendingCount',\n 'account_record_status_stats.processedCount',\n 'account_record_status_stats.takendownCount',\n ])\n .leftJoin('account_strike', (join) =>\n join.onRef('moderation_subject_status.did', '=', 'account_strike.did'),\n )\n .select([\n 'account_strike.activeStrikeCount as strikeCount',\n 'account_strike.totalStrikeCount',\n 'account_strike.firstStrikeAt',\n 'account_strike.lastStrikeAt',\n ])\n}\n\n// Based on a given moderation action event, this function will update the moderation status of the subject\n// If there's no existing status, it will create one\n// If the action event does not affect the status, it will do nothing\nexport const adjustModerationSubjectStatus = async (\n db: Database,\n moderationEvent: ModerationEventRow,\n blobCids?: string[],\n): Promise<ModerationSubjectStatusRow | null> => {\n const {\n action,\n subjectDid,\n subjectUri,\n subjectCid,\n createdBy,\n meta,\n addedTags,\n removedTags,\n comment,\n createdAt,\n } = moderationEvent\n\n // If subjectUri exists, it's not a repoRef so pass along the uri to get identifier back\n const identifier = getStatusIdentifierFromSubject(subjectUri || subjectDid)\n\n db.assertTransaction()\n\n const now = new Date().toISOString()\n const currentStatus = await db.db\n .selectFrom('moderation_subject_status')\n .where('did', '=', identifier.did)\n .where('recordPath', '=', identifier.recordPath)\n // Make sure we respect other updates that may be happening at the same time\n .forUpdate()\n .selectAll()\n .executeTakeFirst()\n\n if (hostingEvents.includes(action)) {\n const newStatus = getSubjectStatusForRecordEvent({\n event: moderationEvent,\n currentStatus,\n })\n if (!Object.keys(newStatus).length) {\n return currentStatus || null\n }\n\n const status = await db.db\n .insertInto('moderation_subject_status')\n .values({\n ...identifier,\n ...newStatus,\n // newStatus doesn't contain a reviewState or takendown so in case this is a new entry\n // we need to set a default values so that the insert doesn't fail\n reviewState: currentStatus ? currentStatus.reviewState : REVIEWNONE,\n // @TODO: should we try to update this based on status property of account event?\n // For now we're the only one emitting takedowns so i don't think it makes too much of a difference\n takendown: currentStatus ? currentStatus.takendown : false,\n ageAssuranceState: currentStatus\n ? currentStatus.ageAssuranceState\n : 'unknown',\n createdAt: now,\n updatedAt: now,\n })\n .onConflict((oc) =>\n oc.constraint('moderation_status_unique_idx').doUpdateSet({\n ...newStatus,\n updatedAt: now,\n }),\n )\n .returningAll()\n .executeTakeFirst()\n\n return status || null\n }\n\n // If reporting is muted for this reporter, we don't want to update the subject status\n if (meta?.isReporterMuted) {\n return currentStatus || null\n }\n\n const isAppealEvent =\n action === 'tools.ozone.moderation.defs#modEventReport' &&\n meta?.reportType &&\n isAppealReport(`${meta.reportType}`)\n\n const subjectStatus = getSubjectStatusForModerationEvent({\n currentStatus,\n action,\n createdBy,\n createdAt,\n durationInHours: moderationEvent.durationInHours,\n })\n\n if (\n currentStatus?.reviewState === REVIEWESCALATED &&\n subjectStatus.reviewState !== REVIEWCLOSED\n ) {\n // If the current status is escalated only allow incoming events to move the state to\n // reviewClosed because escalated subjects should never move to any other state\n subjectStatus.reviewState = REVIEWESCALATED\n }\n\n if (currentStatus && subjectStatus.reviewState === REVIEWNONE) {\n // reviewNone is ONLY allowed when there is no current status\n // If there is a current status, it should not be allowed to move back to reviewNone\n subjectStatus.reviewState = currentStatus.reviewState\n }\n\n // Set these because we don't want to override them if they're already set\n const defaultData = {\n comment: null,\n // Defaulting reviewState to open for any event may not be the desired behavior.\n // For instance, if a subject never had any event and we just want to leave a comment to keep an eye on it\n // that shouldn't mean we want to review the subject\n reviewState: REVIEWNONE,\n recordCid: subjectCid || null,\n ageAssuranceState: currentStatus?.ageAssuranceState || 'unknown',\n }\n const newStatus = {\n ...defaultData,\n ...subjectStatus,\n }\n\n if (\n action === 'tools.ozone.moderation.defs#modEventPriorityScore' &&\n typeof meta?.priorityScore === 'number'\n ) {\n newStatus.priorityScore = meta?.priorityScore\n subjectStatus.priorityScore = meta?.priorityScore\n }\n\n if (\n action === 'tools.ozone.moderation.defs#modEventReverseTakedown' &&\n !subjectStatus.takendown\n ) {\n newStatus.takendown = false\n subjectStatus.takendown = false\n }\n\n if (isAppealEvent) {\n newStatus.appealed = true\n subjectStatus.appealed = true\n newStatus.lastAppealedAt = createdAt\n subjectStatus.lastAppealedAt = createdAt\n // Set reviewState to escalated when appeal events are emitted\n subjectStatus.reviewState = REVIEWESCALATED\n newStatus.reviewState = REVIEWESCALATED\n }\n\n if (\n action === 'tools.ozone.moderation.defs#modEventResolveAppeal' &&\n subjectStatus.appealed\n ) {\n newStatus.appealed = false\n subjectStatus.appealed = false\n }\n\n if (\n action === 'tools.ozone.moderation.defs#modEventComment' &&\n meta?.sticky\n ) {\n newStatus.comment = comment\n subjectStatus.comment = comment\n }\n\n if (action === 'tools.ozone.moderation.defs#modEventTag') {\n let tags = currentStatus?.tags || []\n if (addedTags?.length) {\n tags = tags.concat(addedTags)\n }\n if (removedTags?.length) {\n tags = tags.filter((tag) => !removedTags.includes(tag))\n }\n newStatus.tags = jsonb([...new Set(tags)]) as unknown as string[]\n subjectStatus.tags = newStatus.tags\n }\n\n if (action === 'tools.ozone.moderation.defs#ageAssuranceEvent') {\n // Only when the last update was made by an admin AND state was set to reset user event can override final state\n if (\n currentStatus?.ageAssuranceUpdatedBy !== 'admin' ||\n currentStatus?.ageAssuranceState === 'reset'\n ) {\n if (typeof meta?.status === 'string') {\n newStatus.ageAssuranceState = meta.status\n subjectStatus.ageAssuranceState = meta.status\n newStatus.ageAssuranceUpdatedBy = 'user'\n subjectStatus.ageAssuranceUpdatedBy = 'user'\n }\n }\n }\n\n if (action === 'tools.ozone.moderation.defs#ageAssuranceOverrideEvent') {\n if (typeof meta?.status === 'string') {\n newStatus.ageAssuranceState = meta.status\n subjectStatus.ageAssuranceState = meta.status\n newStatus.ageAssuranceUpdatedBy = 'admin'\n subjectStatus.ageAssuranceUpdatedBy = 'admin'\n }\n }\n\n if (action === 'tools.ozone.moderation.defs#ageAssurancePurgeEvent') {\n newStatus.ageAssuranceState = 'unknown'\n subjectStatus.ageAssuranceState = 'unknown'\n newStatus.ageAssuranceUpdatedBy = null\n subjectStatus.ageAssuranceUpdatedBy = null\n }\n\n if (blobCids?.length) {\n const newBlobCids = jsonb(\n blobCids,\n ) as unknown as ModerationSubjectStatusRow['blobCids']\n newStatus.blobCids = newBlobCids\n subjectStatus.blobCids = newBlobCids\n }\n\n const insertQuery = db.db\n .insertInto('moderation_subject_status')\n .values({\n ...identifier,\n ...newStatus,\n createdAt: now,\n updatedAt: now,\n } as ModerationSubjectStatusRow)\n .onConflict((oc) =>\n oc.constraint('moderation_status_unique_idx').doUpdateSet({\n ...subjectStatus,\n updatedAt: now,\n }),\n )\n\n const status = await insertQuery.returningAll().executeTakeFirst()\n return status || null\n}\n\nexport const getStatusIdentifierFromSubject = (\n subject: string | AtUri,\n): { did: string; recordPath: string } => {\n const isSubjectString = typeof subject === 'string'\n if (isSubjectString && subject.startsWith('did:')) {\n return {\n did: subject,\n recordPath: '',\n }\n }\n\n if (isSubjectString && !subject.startsWith('at://')) {\n throw new Error('Subject is neither a did nor an at-uri')\n }\n\n const uri = isSubjectString ? new AtUri(subject) : subject\n return {\n did: uri.host,\n recordPath: `${uri.collection}/${uri.rkey}`,\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/mod-service/status.ts"],"names":[],"mappings":"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","sourcesContent":["// This may require better organization but for now, just dumping functions here containing DB queries for moderation status\n\nimport { HOUR } from '@atproto/common'\nimport { AtUri } from '@atproto/syntax'\nimport { isAppealReport } from '../api/util.js'\nimport { Database } from '../db/index.js'\nimport { DatabaseSchema } from '../db/schema/index.js'\nimport { jsonb } from '../db/types.js'\nimport {\n REVIEWCLOSED,\n REVIEWESCALATED,\n REVIEWNONE,\n REVIEWOPEN,\n} from '../lexicon/types/tools/ozone/moderation/defs.js'\nimport { ModerationEventRow, ModerationSubjectStatusRow } from './types.js'\n\nconst getSubjectStatusForModerationEvent = ({\n currentStatus,\n action,\n createdBy,\n createdAt,\n durationInHours,\n}: {\n currentStatus?: ModerationSubjectStatusRow\n action: string\n createdBy: string\n createdAt: string\n durationInHours: number | null\n}): Partial<ModerationSubjectStatusRow> => {\n const defaultReviewState = currentStatus\n ? currentStatus.reviewState\n : REVIEWNONE\n\n switch (action) {\n case 'tools.ozone.moderation.defs#modEventAcknowledge':\n return {\n lastReviewedBy: createdBy,\n reviewState: REVIEWCLOSED,\n lastReviewedAt: createdAt,\n }\n case 'tools.ozone.moderation.defs#modEventReport':\n return {\n reviewState: REVIEWOPEN,\n lastReportedAt: createdAt,\n }\n case 'tools.ozone.moderation.defs#modEventEscalate':\n return {\n lastReviewedBy: createdBy,\n reviewState: REVIEWESCALATED,\n lastReviewedAt: createdAt,\n }\n case 'tools.ozone.moderation.defs#modEventReverseTakedown':\n return {\n lastReviewedBy: createdBy,\n reviewState: REVIEWCLOSED,\n takendown: false,\n suspendUntil: null,\n lastReviewedAt: createdAt,\n }\n case 'tools.ozone.moderation.defs#modEventUnmuteReporter':\n return {\n lastReviewedBy: createdBy,\n muteReportingUntil: null,\n // It's not likely to receive an unmute event that does not already have a status row\n // but if it does happen, default to unnecessary\n reviewState: defaultReviewState,\n lastReviewedAt: createdAt,\n }\n case 'tools.ozone.moderation.defs#modEventUnmute':\n return {\n lastReviewedBy: createdBy,\n muteUntil: null,\n // It's not likely to receive an unmute event that does not already have a status row\n // but if it does happen, default to unnecessary\n reviewState: defaultReviewState,\n lastReviewedAt: createdAt,\n }\n case 'tools.ozone.moderation.defs#modEventTakedown':\n return {\n // If we are doing a takedown, safe to move the item out of appealed state\n ...(currentStatus?.appealed ? { appealed: false } : {}),\n takendown: true,\n lastReviewedBy: createdBy,\n reviewState: REVIEWCLOSED,\n lastReviewedAt: createdAt,\n suspendUntil: durationInHours\n ? new Date(Date.now() + durationInHours * HOUR).toISOString()\n : null,\n }\n case 'tools.ozone.moderation.defs#modEventMuteReporter':\n return {\n lastReviewedBy: createdBy,\n lastReviewedAt: createdAt,\n // By default, mute for 24hrs\n muteReportingUntil: new Date(\n Date.now() + (durationInHours || 24) * HOUR,\n ).toISOString(),\n // It's not likely to receive a mute event on a subject that does not already have a status row\n // but if it does happen, default to unnecessary\n reviewState: defaultReviewState,\n }\n case 'tools.ozone.moderation.defs#modEventMute':\n return {\n lastReviewedBy: createdBy,\n lastReviewedAt: createdAt,\n // By default, mute for 24hrs\n muteUntil: new Date(\n Date.now() + (durationInHours || 24) * HOUR,\n ).toISOString(),\n // It's not likely to receive a mute event on a subject that does not already have a status row\n // but if it does happen, default to unnecessary\n reviewState: defaultReviewState,\n }\n case 'tools.ozone.moderation.defs#modEventComment':\n return {\n lastReviewedBy: createdBy,\n lastReviewedAt: createdAt,\n reviewState: defaultReviewState,\n }\n case 'tools.ozone.moderation.defs#modEventTag':\n return { tags: [], reviewState: defaultReviewState }\n case 'tools.ozone.moderation.defs#modEventResolveAppeal':\n return {\n appealed: false,\n }\n case 'tools.ozone.moderation.defs#ageAssuranceEvent':\n case 'tools.ozone.moderation.defs#ageAssuranceOverrideEvent':\n case 'tools.ozone.moderation.defs#ageAssurancePurgeEvent':\n return {\n reviewState: defaultReviewState,\n }\n default:\n return {}\n }\n}\n\nconst hostingEvents = [\n 'tools.ozone.moderation.defs#accountEvent',\n 'tools.ozone.moderation.defs#identityEvent',\n 'tools.ozone.moderation.defs#recordEvent',\n]\n\nconst getSubjectStatusForRecordEvent = ({\n event,\n currentStatus,\n}: {\n event: ModerationEventRow\n currentStatus?: ModerationSubjectStatusRow\n}): Partial<ModerationSubjectStatusRow> => {\n const timestamp =\n typeof event.meta?.timestamp === 'string'\n ? event.meta?.timestamp\n : event.createdAt\n\n if (event.action === 'tools.ozone.moderation.defs#recordEvent') {\n if (event.meta?.op === 'delete') {\n return {\n hostingStatus: 'deleted',\n hostingDeletedAt: timestamp,\n }\n } else if (event.meta?.op === 'update') {\n return {\n hostingStatus: 'active',\n hostingUpdatedAt: timestamp,\n }\n }\n return {}\n }\n\n if (event.action === 'tools.ozone.moderation.defs#accountEvent') {\n const status: Partial<ModerationSubjectStatusRow> = {\n hostingUpdatedAt: timestamp,\n }\n\n if (event.meta?.status) {\n status.hostingStatus = `${event.meta?.status}`\n }\n\n if (event.meta?.status === 'deleted') {\n status.hostingDeletedAt = timestamp\n } else if (event.meta?.status === 'deactivated') {\n status.hostingDeactivatedAt = timestamp\n } else {\n // When deactivated accounts are re-activated, we receive the event with just the active flag set to true\n // so we want to make sure that the hostingStatus is not set to an outdated value\n if (\n currentStatus?.hostingStatus === 'deactivated' &&\n event.meta?.active\n ) {\n status.hostingStatus = 'active'\n status.hostingReactivatedAt = timestamp\n }\n }\n\n return status\n }\n\n if (event.action === 'tools.ozone.moderation.defs#identityEvent') {\n const status: Partial<ModerationSubjectStatusRow> = {\n hostingUpdatedAt: timestamp,\n }\n\n if (event.meta?.tombstone) {\n status.hostingStatus = 'tombstoned'\n status.hostingDeletedAt = timestamp\n }\n\n return status\n }\n\n return {}\n}\n\nexport const moderationSubjectStatusQueryBuilder = (db: DatabaseSchema) => {\n // @NOTE: Using select() instead of selectAll() below because the materialized\n // views might be incomplete, and we don't want the null `did` columns to\n // interfere with the (never null) `did` column from the\n // `moderation_subject_status` table in the results\n return db\n .selectFrom('moderation_subject_status')\n .selectAll('moderation_subject_status')\n .leftJoin('account_events_stats', (join) =>\n join.onRef(\n 'moderation_subject_status.did',\n '=',\n 'account_events_stats.subjectDid',\n ),\n )\n .select([\n 'account_events_stats.takedownCount',\n 'account_events_stats.suspendCount',\n 'account_events_stats.escalateCount',\n 'account_events_stats.reportCount',\n 'account_events_stats.appealCount',\n ])\n .leftJoin('account_record_events_stats', (join) =>\n join.onRef(\n 'moderation_subject_status.did',\n '=',\n 'account_record_events_stats.subjectDid',\n ),\n )\n .select([\n 'account_record_events_stats.totalReports',\n 'account_record_events_stats.reportedCount',\n 'account_record_events_stats.escalatedCount',\n 'account_record_events_stats.appealedCount',\n ])\n .leftJoin('account_record_status_stats', (join) =>\n join.onRef(\n 'moderation_subject_status.did',\n '=',\n 'account_record_status_stats.did',\n ),\n )\n .select([\n 'account_record_status_stats.subjectCount',\n 'account_record_status_stats.pendingCount',\n 'account_record_status_stats.processedCount',\n 'account_record_status_stats.takendownCount',\n ])\n .leftJoin('account_strike', (join) =>\n join.onRef('moderation_subject_status.did', '=', 'account_strike.did'),\n )\n .select([\n 'account_strike.activeStrikeCount as strikeCount',\n 'account_strike.totalStrikeCount',\n 'account_strike.firstStrikeAt',\n 'account_strike.lastStrikeAt',\n ])\n}\n\n// Based on a given moderation action event, this function will update the moderation status of the subject\n// If there's no existing status, it will create one\n// If the action event does not affect the status, it will do nothing\nexport const adjustModerationSubjectStatus = async (\n db: Database,\n moderationEvent: ModerationEventRow,\n blobCids?: string[],\n): Promise<ModerationSubjectStatusRow | null> => {\n const {\n action,\n subjectDid,\n subjectUri,\n subjectCid,\n subjectConvoId,\n createdBy,\n meta,\n addedTags,\n removedTags,\n comment,\n createdAt,\n } = moderationEvent\n\n // If subjectUri exists, it's not a repoRef so pass along the uri to get identifier back\n const identifier = getStatusIdentifierFromSubject(\n subjectUri || subjectDid,\n subjectConvoId,\n )\n\n db.assertTransaction()\n\n const now = new Date().toISOString()\n const currentStatus = await db.db\n .selectFrom('moderation_subject_status')\n .where('did', '=', identifier.did)\n .where('recordPath', '=', identifier.recordPath)\n .where('convoId', '=', identifier.convoId)\n // Make sure we respect other updates that may be happening at the same time\n .forUpdate()\n .selectAll()\n .executeTakeFirst()\n\n if (hostingEvents.includes(action)) {\n const newStatus = getSubjectStatusForRecordEvent({\n event: moderationEvent,\n currentStatus,\n })\n if (!Object.keys(newStatus).length) {\n return currentStatus || null\n }\n\n const status = await db.db\n .insertInto('moderation_subject_status')\n .values({\n ...identifier,\n ...newStatus,\n // newStatus doesn't contain a reviewState or takendown so in case this is a new entry\n // we need to set a default values so that the insert doesn't fail\n reviewState: currentStatus ? currentStatus.reviewState : REVIEWNONE,\n // @TODO: should we try to update this based on status property of account event?\n // For now we're the only one emitting takedowns so i don't think it makes too much of a difference\n takendown: currentStatus ? currentStatus.takendown : false,\n ageAssuranceState: currentStatus\n ? currentStatus.ageAssuranceState\n : 'unknown',\n createdAt: now,\n updatedAt: now,\n })\n .onConflict((oc) =>\n oc.constraint('moderation_status_unique_idx').doUpdateSet({\n ...newStatus,\n updatedAt: now,\n }),\n )\n .returningAll()\n .executeTakeFirst()\n\n return status || null\n }\n\n // If reporting is muted for this reporter, we don't want to update the subject status\n if (meta?.isReporterMuted) {\n return currentStatus || null\n }\n\n const isAppealEvent =\n action === 'tools.ozone.moderation.defs#modEventReport' &&\n meta?.reportType &&\n isAppealReport(`${meta.reportType}`)\n\n const subjectStatus = getSubjectStatusForModerationEvent({\n currentStatus,\n action,\n createdBy,\n createdAt,\n durationInHours: moderationEvent.durationInHours,\n })\n\n if (\n currentStatus?.reviewState === REVIEWESCALATED &&\n subjectStatus.reviewState !== REVIEWCLOSED\n ) {\n // If the current status is escalated only allow incoming events to move the state to\n // reviewClosed because escalated subjects should never move to any other state\n subjectStatus.reviewState = REVIEWESCALATED\n }\n\n if (currentStatus && subjectStatus.reviewState === REVIEWNONE) {\n // reviewNone is ONLY allowed when there is no current status\n // If there is a current status, it should not be allowed to move back to reviewNone\n subjectStatus.reviewState = currentStatus.reviewState\n }\n\n // Set these because we don't want to override them if they're already set\n const defaultData = {\n comment: null,\n // Defaulting reviewState to open for any event may not be the desired behavior.\n // For instance, if a subject never had any event and we just want to leave a comment to keep an eye on it\n // that shouldn't mean we want to review the subject\n reviewState: REVIEWNONE,\n recordCid: subjectCid || null,\n ageAssuranceState: currentStatus?.ageAssuranceState || 'unknown',\n }\n const newStatus = {\n ...defaultData,\n ...subjectStatus,\n }\n\n if (\n action === 'tools.ozone.moderation.defs#modEventPriorityScore' &&\n typeof meta?.priorityScore === 'number'\n ) {\n newStatus.priorityScore = meta?.priorityScore\n subjectStatus.priorityScore = meta?.priorityScore\n }\n\n if (\n action === 'tools.ozone.moderation.defs#modEventReverseTakedown' &&\n !subjectStatus.takendown\n ) {\n newStatus.takendown = false\n subjectStatus.takendown = false\n }\n\n if (isAppealEvent) {\n newStatus.appealed = true\n subjectStatus.appealed = true\n newStatus.lastAppealedAt = createdAt\n subjectStatus.lastAppealedAt = createdAt\n // Set reviewState to escalated when appeal events are emitted\n subjectStatus.reviewState = REVIEWESCALATED\n newStatus.reviewState = REVIEWESCALATED\n }\n\n if (\n action === 'tools.ozone.moderation.defs#modEventResolveAppeal' &&\n subjectStatus.appealed\n ) {\n newStatus.appealed = false\n subjectStatus.appealed = false\n }\n\n if (\n action === 'tools.ozone.moderation.defs#modEventComment' &&\n meta?.sticky\n ) {\n newStatus.comment = comment\n subjectStatus.comment = comment\n }\n\n if (action === 'tools.ozone.moderation.defs#modEventTag') {\n let tags = currentStatus?.tags || []\n if (addedTags?.length) {\n tags = tags.concat(addedTags)\n }\n if (removedTags?.length) {\n tags = tags.filter((tag) => !removedTags.includes(tag))\n }\n newStatus.tags = jsonb([...new Set(tags)]) as unknown as string[]\n subjectStatus.tags = newStatus.tags\n }\n\n if (action === 'tools.ozone.moderation.defs#ageAssuranceEvent') {\n // Only when the last update was made by an admin AND state was set to reset user event can override final state\n if (\n currentStatus?.ageAssuranceUpdatedBy !== 'admin' ||\n currentStatus?.ageAssuranceState === 'reset'\n ) {\n if (typeof meta?.status === 'string') {\n newStatus.ageAssuranceState = meta.status\n subjectStatus.ageAssuranceState = meta.status\n newStatus.ageAssuranceUpdatedBy = 'user'\n subjectStatus.ageAssuranceUpdatedBy = 'user'\n }\n }\n }\n\n if (action === 'tools.ozone.moderation.defs#ageAssuranceOverrideEvent') {\n if (typeof meta?.status === 'string') {\n newStatus.ageAssuranceState = meta.status\n subjectStatus.ageAssuranceState = meta.status\n newStatus.ageAssuranceUpdatedBy = 'admin'\n subjectStatus.ageAssuranceUpdatedBy = 'admin'\n }\n }\n\n if (action === 'tools.ozone.moderation.defs#ageAssurancePurgeEvent') {\n newStatus.ageAssuranceState = 'unknown'\n subjectStatus.ageAssuranceState = 'unknown'\n newStatus.ageAssuranceUpdatedBy = null\n subjectStatus.ageAssuranceUpdatedBy = null\n }\n\n if (blobCids?.length) {\n const newBlobCids = jsonb(\n blobCids,\n ) as unknown as ModerationSubjectStatusRow['blobCids']\n newStatus.blobCids = newBlobCids\n subjectStatus.blobCids = newBlobCids\n }\n\n const insertQuery = db.db\n .insertInto('moderation_subject_status')\n .values({\n ...identifier,\n ...newStatus,\n createdAt: now,\n updatedAt: now,\n } as ModerationSubjectStatusRow)\n .onConflict((oc) =>\n oc.constraint('moderation_status_unique_idx').doUpdateSet({\n ...subjectStatus,\n updatedAt: now,\n }),\n )\n\n const status = await insertQuery.returningAll().executeTakeFirst()\n return status || null\n}\n\n/**\n * Get moderation_subject_status identifier (did, recordPath, convoId).\n * @note Supports addressing conversations explicitly (via convoId) and implicitly (via properly formed at-uri)\n */\nexport const getStatusIdentifierFromSubject = (\n subject: string | AtUri,\n convoId?: string | null,\n): { did: string; recordPath: string; convoId: string } => {\n const isSubjectString = typeof subject === 'string'\n if (isSubjectString && subject.startsWith('did:')) {\n return {\n did: subject,\n recordPath: '',\n convoId: convoId || '',\n }\n }\n\n if (isSubjectString && !subject.startsWith('at://')) {\n throw new Error('Subject is neither a did nor an at-uri')\n }\n\n const uri = isSubjectString ? new AtUri(subject) : subject\n\n // Handle conversation URIs\n if (uri.collection === 'chat.bsky.convo') {\n return {\n did: uri.host,\n recordPath: '',\n convoId: uri.rkey,\n }\n }\n\n return {\n did: uri.host,\n recordPath: `${uri.collection}/${uri.rkey}`,\n convoId: '',\n }\n}\n"]}
|
|
@@ -9,36 +9,42 @@ import { ModerationEventRow, ModerationSubjectStatusRow } from './types.js';
|
|
|
9
9
|
type SubjectInput = ReportInput['subject'] | ActionInput['subject'];
|
|
10
10
|
type StrongRef = ComAtprotoRepoStrongRef.Main;
|
|
11
11
|
type MessageRef = ChatBskyConvoDefs.MessageRef;
|
|
12
|
+
type ConvoRef = ChatBskyConvoDefs.ConvoRef;
|
|
12
13
|
export declare const subjectFromInput: (subject: SubjectInput, blobs?: string[]) => ModSubject;
|
|
13
14
|
export declare const subjectFromEventRow: (row: ModerationEventRow) => ModSubject;
|
|
14
15
|
export declare const subjectFromStatusRow: (row: ModerationSubjectStatusRow) => ModSubject;
|
|
15
16
|
type SubjectInfo = {
|
|
16
|
-
subjectType: 'com.atproto.admin.defs#repoRef' | 'com.atproto.repo.strongRef' | 'chat.bsky.convo.defs#messageRef';
|
|
17
|
+
subjectType: 'com.atproto.admin.defs#repoRef' | 'com.atproto.repo.strongRef' | 'chat.bsky.convo.defs#messageRef' | 'chat.bsky.convo.defs#convoRef';
|
|
17
18
|
subjectDid: string;
|
|
18
19
|
subjectUri: string | null;
|
|
19
20
|
subjectCid: string | null;
|
|
20
21
|
subjectBlobCids: string[] | null;
|
|
21
22
|
subjectMessageId: string | null;
|
|
23
|
+
subjectConvoId: string | null;
|
|
22
24
|
meta: Record<string, string | undefined> | null;
|
|
23
25
|
};
|
|
24
26
|
export interface ModSubject {
|
|
25
27
|
did: string;
|
|
26
28
|
recordPath: string | undefined;
|
|
29
|
+
convoId: string | undefined;
|
|
27
30
|
blobCids?: string[];
|
|
28
31
|
isRepo(): this is RepoSubject;
|
|
29
32
|
isRecord(): this is RecordSubject;
|
|
30
33
|
isMessage(): this is MessageSubject;
|
|
34
|
+
isConvo(): this is ConvoSubject;
|
|
31
35
|
info(): SubjectInfo;
|
|
32
|
-
lex(): $Typed<RepoRef> | $Typed<StrongRef> | $Typed<MessageRef>;
|
|
36
|
+
lex(): $Typed<RepoRef> | $Typed<StrongRef> | $Typed<MessageRef> | $Typed<ConvoRef>;
|
|
33
37
|
}
|
|
34
38
|
export declare class RepoSubject implements ModSubject {
|
|
35
39
|
did: string;
|
|
36
40
|
blobCids: undefined;
|
|
37
41
|
recordPath: undefined;
|
|
42
|
+
convoId: undefined;
|
|
38
43
|
constructor(did: string);
|
|
39
44
|
isRepo(): this is RepoSubject;
|
|
40
45
|
isRecord(): this is RecordSubject;
|
|
41
46
|
isMessage(): this is MessageSubject;
|
|
47
|
+
isConvo(): this is ConvoSubject;
|
|
42
48
|
info(): {
|
|
43
49
|
subjectType: "com.atproto.admin.defs#repoRef";
|
|
44
50
|
subjectDid: string;
|
|
@@ -46,6 +52,7 @@ export declare class RepoSubject implements ModSubject {
|
|
|
46
52
|
subjectCid: null;
|
|
47
53
|
subjectBlobCids: null;
|
|
48
54
|
subjectMessageId: null;
|
|
55
|
+
subjectConvoId: null;
|
|
49
56
|
meta: null;
|
|
50
57
|
};
|
|
51
58
|
lex(): $Typed<RepoRef>;
|
|
@@ -57,10 +64,12 @@ export declare class RecordSubject implements ModSubject {
|
|
|
57
64
|
parsedUri: AtUri;
|
|
58
65
|
did: string;
|
|
59
66
|
recordPath: string;
|
|
67
|
+
convoId: undefined;
|
|
60
68
|
constructor(uri: string, cid: string, blobCids?: string[] | undefined);
|
|
61
69
|
isRepo(): this is RepoSubject;
|
|
62
70
|
isRecord(): this is RecordSubject;
|
|
63
71
|
isMessage(): this is MessageSubject;
|
|
72
|
+
isConvo(): this is ConvoSubject;
|
|
64
73
|
info(): {
|
|
65
74
|
subjectType: "com.atproto.repo.strongRef";
|
|
66
75
|
subjectDid: string;
|
|
@@ -68,6 +77,7 @@ export declare class RecordSubject implements ModSubject {
|
|
|
68
77
|
subjectCid: string;
|
|
69
78
|
subjectBlobCids: string[];
|
|
70
79
|
subjectMessageId: null;
|
|
80
|
+
subjectConvoId: null;
|
|
71
81
|
meta: null;
|
|
72
82
|
};
|
|
73
83
|
lex(): $Typed<StrongRef>;
|
|
@@ -82,6 +92,7 @@ export declare class MessageSubject implements ModSubject {
|
|
|
82
92
|
isRepo(): this is RepoSubject;
|
|
83
93
|
isRecord(): this is RecordSubject;
|
|
84
94
|
isMessage(): this is MessageSubject;
|
|
95
|
+
isConvo(): this is ConvoSubject;
|
|
85
96
|
info(): {
|
|
86
97
|
subjectType: "chat.bsky.convo.defs#messageRef";
|
|
87
98
|
subjectDid: string;
|
|
@@ -89,11 +100,36 @@ export declare class MessageSubject implements ModSubject {
|
|
|
89
100
|
subjectCid: null;
|
|
90
101
|
subjectBlobCids: null;
|
|
91
102
|
subjectMessageId: string;
|
|
103
|
+
subjectConvoId: string;
|
|
92
104
|
meta: {
|
|
93
105
|
convoId: string | undefined;
|
|
94
106
|
};
|
|
95
107
|
};
|
|
96
108
|
lex(): $Typed<MessageRef>;
|
|
97
109
|
}
|
|
110
|
+
export declare class ConvoSubject implements ModSubject {
|
|
111
|
+
did: string;
|
|
112
|
+
convoId: string;
|
|
113
|
+
blobCids: undefined;
|
|
114
|
+
recordPath: undefined;
|
|
115
|
+
constructor(did: string, convoId: string);
|
|
116
|
+
isRepo(): this is RepoSubject;
|
|
117
|
+
isRecord(): this is RecordSubject;
|
|
118
|
+
isMessage(): this is MessageSubject;
|
|
119
|
+
isConvo(): this is ConvoSubject;
|
|
120
|
+
info(): {
|
|
121
|
+
subjectType: "chat.bsky.convo.defs#convoRef";
|
|
122
|
+
subjectDid: string;
|
|
123
|
+
subjectUri: null;
|
|
124
|
+
subjectCid: null;
|
|
125
|
+
subjectBlobCids: null;
|
|
126
|
+
subjectMessageId: null;
|
|
127
|
+
subjectConvoId: string;
|
|
128
|
+
meta: {
|
|
129
|
+
convoId: string | undefined;
|
|
130
|
+
};
|
|
131
|
+
};
|
|
132
|
+
lex(): $Typed<ConvoRef>;
|
|
133
|
+
}
|
|
98
134
|
export {};
|
|
99
135
|
//# sourceMappingURL=subject.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subject.d.ts","sourceRoot":"","sources":["../../src/mod-service/subject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAA;AAEvC,OAAO,KAAK,iBAAiB,MAAM,0CAA0C,CAAA;AAC7E,OAAO,EAAE,OAAO,EAAa,MAAM,4CAA4C,CAAA;AAC/E,OAAO,EAAE,WAAW,IAAI,WAAW,EAAE,MAAM,yDAAyD,CAAA;AACpG,OAAO,KAAK,uBAAuB,MAAM,gDAAgD,CAAA;AACzF,OAAO,EAAE,WAAW,IAAI,WAAW,EAAE,MAAM,sDAAsD,CAAA;AACjG,OAAO,EAAE,MAAM,EAAe,MAAM,oBAAoB,CAAA;AACxD,OAAO,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAA;AAE3E,KAAK,YAAY,GAAG,WAAW,CAAC,SAAS,CAAC,GAAG,WAAW,CAAC,SAAS,CAAC,CAAA;AAEnE,KAAK,SAAS,GAAG,uBAAuB,CAAC,IAAI,CAAA;AAG7C,KAAK,UAAU,GAAG,iBAAiB,CAAC,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"subject.d.ts","sourceRoot":"","sources":["../../src/mod-service/subject.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ import * as ComAtprotoRepoStrongRef from '../lexicon/types/com/atproto/repo/stro
|
|
|
6
6
|
import { asPredicate } from '../lexicon/util.js';
|
|
7
7
|
const isStrongRef = asPredicate(ComAtprotoRepoStrongRef.validateMain);
|
|
8
8
|
const isValidMessageRef = asPredicate(ChatBskyConvoDefs.validateMessageRef);
|
|
9
|
+
const isValidConvoRef = asPredicate(ChatBskyConvoDefs.validateConvoRef);
|
|
9
10
|
const isMessageRefWithoutConvoId = (subject) => subject != null &&
|
|
10
11
|
typeof subject === 'object' &&
|
|
11
12
|
isValidMessageRef({ convoId: '', ...subject });
|
|
@@ -24,6 +25,11 @@ export const subjectFromInput = (subject, blobs) => {
|
|
|
24
25
|
if (isValidMessageRef(subject)) {
|
|
25
26
|
return new MessageSubject(subject.did, subject.convoId, subject.messageId);
|
|
26
27
|
}
|
|
28
|
+
// @NOTE #convoRef is a new type for reporting entire conversations.
|
|
29
|
+
// Similar to messageRef, we take advantage of the open union to support this.
|
|
30
|
+
if (isValidConvoRef(subject)) {
|
|
31
|
+
return new ConvoSubject(subject.did, subject.convoId);
|
|
32
|
+
}
|
|
27
33
|
// @TODO we should start to require subject.convoId is a string in order to properly validate
|
|
28
34
|
// the #messageRef. temporarily allowing it to be optional as a stopgap for rollout.
|
|
29
35
|
// The next "if" can be removed once convoId is consistently provided.
|
|
@@ -43,6 +49,10 @@ export const subjectFromEventRow = (row) => {
|
|
|
43
49
|
const convoId = typeof row.meta?.['convoId'] === 'string' ? row.meta['convoId'] : '';
|
|
44
50
|
return new MessageSubject(row.subjectDid, convoId, row.subjectMessageId);
|
|
45
51
|
}
|
|
52
|
+
else if (row.subjectType === 'chat.bsky.convo.defs#convoRef' &&
|
|
53
|
+
row.subjectConvoId) {
|
|
54
|
+
return new ConvoSubject(row.subjectDid, row.subjectConvoId);
|
|
55
|
+
}
|
|
46
56
|
else {
|
|
47
57
|
return new RepoSubject(row.subjectDid);
|
|
48
58
|
}
|
|
@@ -54,6 +64,10 @@ export const subjectFromStatusRow = (row) => {
|
|
|
54
64
|
const uri = AtUri.make(row.did, ...row.recordPath.split('/')).toString();
|
|
55
65
|
return new RecordSubject(uri.toString(), row.recordCid, row.blobCids ?? []);
|
|
56
66
|
}
|
|
67
|
+
else if (row.convoId) {
|
|
68
|
+
// Conversation subject - restore from subject status row
|
|
69
|
+
return new ConvoSubject(row.did, row.convoId);
|
|
70
|
+
}
|
|
57
71
|
else {
|
|
58
72
|
return new RepoSubject(row.did);
|
|
59
73
|
}
|
|
@@ -63,6 +77,7 @@ export class RepoSubject {
|
|
|
63
77
|
this.did = did;
|
|
64
78
|
this.blobCids = undefined;
|
|
65
79
|
this.recordPath = undefined;
|
|
80
|
+
this.convoId = undefined;
|
|
66
81
|
}
|
|
67
82
|
isRepo() {
|
|
68
83
|
return true;
|
|
@@ -73,6 +88,9 @@ export class RepoSubject {
|
|
|
73
88
|
isMessage() {
|
|
74
89
|
return false;
|
|
75
90
|
}
|
|
91
|
+
isConvo() {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
76
94
|
info() {
|
|
77
95
|
return {
|
|
78
96
|
subjectType: 'com.atproto.admin.defs#repoRef',
|
|
@@ -81,6 +99,7 @@ export class RepoSubject {
|
|
|
81
99
|
subjectCid: null,
|
|
82
100
|
subjectBlobCids: null,
|
|
83
101
|
subjectMessageId: null,
|
|
102
|
+
subjectConvoId: null,
|
|
84
103
|
meta: null,
|
|
85
104
|
};
|
|
86
105
|
}
|
|
@@ -96,6 +115,7 @@ export class RecordSubject {
|
|
|
96
115
|
this.uri = uri;
|
|
97
116
|
this.cid = cid;
|
|
98
117
|
this.blobCids = blobCids;
|
|
118
|
+
this.convoId = undefined;
|
|
99
119
|
this.parsedUri = new AtUri(uri);
|
|
100
120
|
this.did = this.parsedUri.hostname;
|
|
101
121
|
this.recordPath = `${this.parsedUri.collection}/${this.parsedUri.rkey}`;
|
|
@@ -109,6 +129,9 @@ export class RecordSubject {
|
|
|
109
129
|
isMessage() {
|
|
110
130
|
return false;
|
|
111
131
|
}
|
|
132
|
+
isConvo() {
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
112
135
|
info() {
|
|
113
136
|
return {
|
|
114
137
|
subjectType: 'com.atproto.repo.strongRef',
|
|
@@ -117,6 +140,7 @@ export class RecordSubject {
|
|
|
117
140
|
subjectCid: this.cid,
|
|
118
141
|
subjectBlobCids: this.blobCids ?? [],
|
|
119
142
|
subjectMessageId: null,
|
|
143
|
+
subjectConvoId: null,
|
|
120
144
|
meta: null,
|
|
121
145
|
};
|
|
122
146
|
}
|
|
@@ -145,6 +169,9 @@ export class MessageSubject {
|
|
|
145
169
|
isMessage() {
|
|
146
170
|
return true;
|
|
147
171
|
}
|
|
172
|
+
isConvo() {
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
148
175
|
info() {
|
|
149
176
|
return {
|
|
150
177
|
subjectType: 'chat.bsky.convo.defs#messageRef',
|
|
@@ -153,6 +180,7 @@ export class MessageSubject {
|
|
|
153
180
|
subjectCid: null,
|
|
154
181
|
subjectBlobCids: null,
|
|
155
182
|
subjectMessageId: this.messageId,
|
|
183
|
+
subjectConvoId: this.convoId,
|
|
156
184
|
meta: { convoId: this.convoId || undefined },
|
|
157
185
|
};
|
|
158
186
|
}
|
|
@@ -165,4 +193,43 @@ export class MessageSubject {
|
|
|
165
193
|
};
|
|
166
194
|
}
|
|
167
195
|
}
|
|
196
|
+
export class ConvoSubject {
|
|
197
|
+
constructor(did, convoId) {
|
|
198
|
+
this.did = did;
|
|
199
|
+
this.convoId = convoId;
|
|
200
|
+
this.blobCids = undefined;
|
|
201
|
+
this.recordPath = undefined;
|
|
202
|
+
}
|
|
203
|
+
isRepo() {
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
isRecord() {
|
|
207
|
+
return false;
|
|
208
|
+
}
|
|
209
|
+
isMessage() {
|
|
210
|
+
return false;
|
|
211
|
+
}
|
|
212
|
+
isConvo() {
|
|
213
|
+
return true;
|
|
214
|
+
}
|
|
215
|
+
info() {
|
|
216
|
+
return {
|
|
217
|
+
subjectType: 'chat.bsky.convo.defs#convoRef',
|
|
218
|
+
subjectDid: this.did,
|
|
219
|
+
subjectUri: null,
|
|
220
|
+
subjectCid: null,
|
|
221
|
+
subjectBlobCids: null,
|
|
222
|
+
subjectMessageId: null,
|
|
223
|
+
subjectConvoId: this.convoId,
|
|
224
|
+
meta: { convoId: this.convoId || undefined },
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
lex() {
|
|
228
|
+
return {
|
|
229
|
+
$type: 'chat.bsky.convo.defs#convoRef',
|
|
230
|
+
did: this.did,
|
|
231
|
+
convoId: this.convoId,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
}
|
|
168
235
|
//# sourceMappingURL=subject.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subject.js","sourceRoot":"","sources":["../../src/mod-service/subject.ts"],"names":[],"mappings":"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","sourcesContent":["import { AtUri } from '@atproto/syntax'\nimport { InvalidRequestError } from '@atproto/xrpc-server'\nimport * as ChatBskyConvoDefs from '../lexicon/types/chat/bsky/convo/defs.js'\nimport { RepoRef, isRepoRef } from '../lexicon/types/com/atproto/admin/defs.js'\nimport { InputSchema as ReportInput } from '../lexicon/types/com/atproto/moderation/createReport.js'\nimport * as ComAtprotoRepoStrongRef from '../lexicon/types/com/atproto/repo/strongRef.js'\nimport { InputSchema as ActionInput } from '../lexicon/types/tools/ozone/moderation/emitEvent.js'\nimport { $Typed, asPredicate } from '../lexicon/util.js'\nimport { ModerationEventRow, ModerationSubjectStatusRow } from './types.js'\n\ntype SubjectInput = ReportInput['subject'] | ActionInput['subject']\n\ntype StrongRef = ComAtprotoRepoStrongRef.Main\nconst isStrongRef = asPredicate(ComAtprotoRepoStrongRef.validateMain)\n\ntype MessageRef = ChatBskyConvoDefs.MessageRef\nconst isValidMessageRef = asPredicate(ChatBskyConvoDefs.validateMessageRef)\n\nconst isMessageRefWithoutConvoId = (\n subject: unknown,\n): subject is $Typed<Omit<MessageRef, 'convoId'> & { convoId?: string }> =>\n subject != null &&\n typeof subject === 'object' &&\n isValidMessageRef({ convoId: '', ...subject })\n\nexport const subjectFromInput = (\n subject: SubjectInput,\n blobs?: string[],\n): ModSubject => {\n if (isRepoRef(subject)) {\n if (blobs && blobs.length > 0) {\n throw new InvalidRequestError('Blobs do not apply to repo subjects')\n }\n return new RepoSubject(subject.did)\n }\n if (isStrongRef(subject)) {\n return new RecordSubject(subject.uri, subject.cid, blobs)\n }\n // @NOTE #messageRef is not a report input for com.atproto.moderation.createReport.\n // we are taking advantage of the open union in order for bsky.chat to interoperate here.\n if (isValidMessageRef(subject)) {\n return new MessageSubject(subject.did, subject.convoId, subject.messageId)\n }\n // @TODO we should start to require subject.convoId is a string in order to properly validate\n // the #messageRef. temporarily allowing it to be optional as a stopgap for rollout.\n // The next \"if\" can be removed once convoId is consistently provided.\n if (isMessageRefWithoutConvoId(subject)) {\n return new MessageSubject(\n subject.did,\n subject.convoId ?? '',\n subject.messageId,\n )\n }\n\n throw new InvalidRequestError('Invalid subject')\n}\n\nexport const subjectFromEventRow = (row: ModerationEventRow): ModSubject => {\n if (\n row.subjectType === 'com.atproto.repo.strongRef' &&\n row.subjectUri &&\n row.subjectCid\n ) {\n return new RecordSubject(\n row.subjectUri,\n row.subjectCid,\n row.subjectBlobCids ?? [],\n )\n } else if (\n row.subjectType === 'chat.bsky.convo.defs#messageRef' &&\n row.subjectMessageId\n ) {\n const convoId =\n typeof row.meta?.['convoId'] === 'string' ? row.meta['convoId'] : ''\n return new MessageSubject(row.subjectDid, convoId, row.subjectMessageId)\n } else {\n return new RepoSubject(row.subjectDid)\n }\n}\n\nexport const subjectFromStatusRow = (\n row: ModerationSubjectStatusRow,\n): ModSubject => {\n if (row.recordPath && row.recordCid) {\n // Not too intuitive but the recordpath is basically <collection>/<rkey>\n // which is what the last 2 params of .make() arguments are\n const uri = AtUri.make(row.did, ...row.recordPath.split('/')).toString()\n return new RecordSubject(uri.toString(), row.recordCid, row.blobCids ?? [])\n } else {\n return new RepoSubject(row.did)\n }\n}\n\ntype SubjectInfo = {\n subjectType:\n | 'com.atproto.admin.defs#repoRef'\n | 'com.atproto.repo.strongRef'\n | 'chat.bsky.convo.defs#messageRef'\n subjectDid: string\n subjectUri: string | null\n subjectCid: string | null\n subjectBlobCids: string[] | null\n subjectMessageId: string | null\n meta: Record<string, string | undefined> | null\n}\n\nexport interface ModSubject {\n did: string\n recordPath: string | undefined\n blobCids?: string[]\n isRepo(): this is RepoSubject\n isRecord(): this is RecordSubject\n isMessage(): this is MessageSubject\n info(): SubjectInfo\n lex(): $Typed<RepoRef> | $Typed<StrongRef> | $Typed<MessageRef>\n}\n\nexport class RepoSubject implements ModSubject {\n blobCids = undefined\n recordPath = undefined\n constructor(public did: string) {}\n isRepo(): this is RepoSubject {\n return true\n }\n isRecord(): this is RecordSubject {\n return false\n }\n isMessage(): this is MessageSubject {\n return false\n }\n info() {\n return {\n subjectType: 'com.atproto.admin.defs#repoRef' as const,\n subjectDid: this.did,\n subjectUri: null,\n subjectCid: null,\n subjectBlobCids: null,\n subjectMessageId: null,\n meta: null,\n }\n }\n lex(): $Typed<RepoRef> {\n return {\n $type: 'com.atproto.admin.defs#repoRef',\n did: this.did,\n }\n }\n}\n\nexport class RecordSubject implements ModSubject {\n parsedUri: AtUri\n did: string\n recordPath: string\n constructor(\n public uri: string,\n public cid: string,\n public blobCids?: string[],\n ) {\n this.parsedUri = new AtUri(uri)\n this.did = this.parsedUri.hostname\n this.recordPath = `${this.parsedUri.collection}/${this.parsedUri.rkey}`\n }\n isRepo(): this is RepoSubject {\n return false\n }\n isRecord(): this is RecordSubject {\n return true\n }\n isMessage(): this is MessageSubject {\n return false\n }\n info() {\n return {\n subjectType: 'com.atproto.repo.strongRef' as const,\n subjectDid: this.did,\n subjectUri: this.uri,\n subjectCid: this.cid,\n subjectBlobCids: this.blobCids ?? [],\n subjectMessageId: null,\n meta: null,\n }\n }\n lex(): $Typed<StrongRef> {\n return {\n $type: 'com.atproto.repo.strongRef',\n uri: this.uri,\n cid: this.cid,\n }\n }\n}\n\nexport class MessageSubject implements ModSubject {\n blobCids = undefined\n recordPath = undefined\n constructor(\n public did: string,\n public convoId: string,\n public messageId: string,\n ) {}\n isRepo(): this is RepoSubject {\n return false\n }\n isRecord(): this is RecordSubject {\n return false\n }\n isMessage(): this is MessageSubject {\n return true\n }\n info() {\n return {\n subjectType: 'chat.bsky.convo.defs#messageRef' as const,\n subjectDid: this.did,\n subjectUri: null,\n subjectCid: null,\n subjectBlobCids: null,\n subjectMessageId: this.messageId,\n meta: { convoId: this.convoId || undefined },\n }\n }\n lex(): $Typed<MessageRef> {\n return {\n $type: 'chat.bsky.convo.defs#messageRef',\n did: this.did,\n convoId: this.convoId,\n messageId: this.messageId,\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"subject.js","sourceRoot":"","sources":["../../src/mod-service/subject.ts"],"names":[],"mappings":"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","sourcesContent":["import { AtUri } from '@atproto/syntax'\nimport { InvalidRequestError } from '@atproto/xrpc-server'\nimport * as ChatBskyConvoDefs from '../lexicon/types/chat/bsky/convo/defs.js'\nimport { RepoRef, isRepoRef } from '../lexicon/types/com/atproto/admin/defs.js'\nimport { InputSchema as ReportInput } from '../lexicon/types/com/atproto/moderation/createReport.js'\nimport * as ComAtprotoRepoStrongRef from '../lexicon/types/com/atproto/repo/strongRef.js'\nimport { InputSchema as ActionInput } from '../lexicon/types/tools/ozone/moderation/emitEvent.js'\nimport { $Typed, asPredicate } from '../lexicon/util.js'\nimport { ModerationEventRow, ModerationSubjectStatusRow } from './types.js'\n\ntype SubjectInput = ReportInput['subject'] | ActionInput['subject']\n\ntype StrongRef = ComAtprotoRepoStrongRef.Main\nconst isStrongRef = asPredicate(ComAtprotoRepoStrongRef.validateMain)\n\ntype MessageRef = ChatBskyConvoDefs.MessageRef\nconst isValidMessageRef = asPredicate(ChatBskyConvoDefs.validateMessageRef)\n\ntype ConvoRef = ChatBskyConvoDefs.ConvoRef\nconst isValidConvoRef = asPredicate(ChatBskyConvoDefs.validateConvoRef)\n\nconst isMessageRefWithoutConvoId = (\n subject: unknown,\n): subject is $Typed<Omit<MessageRef, 'convoId'> & { convoId?: string }> =>\n subject != null &&\n typeof subject === 'object' &&\n isValidMessageRef({ convoId: '', ...subject })\n\nexport const subjectFromInput = (\n subject: SubjectInput,\n blobs?: string[],\n): ModSubject => {\n if (isRepoRef(subject)) {\n if (blobs && blobs.length > 0) {\n throw new InvalidRequestError('Blobs do not apply to repo subjects')\n }\n return new RepoSubject(subject.did)\n }\n if (isStrongRef(subject)) {\n return new RecordSubject(subject.uri, subject.cid, blobs)\n }\n // @NOTE #messageRef is not a report input for com.atproto.moderation.createReport.\n // we are taking advantage of the open union in order for bsky.chat to interoperate here.\n if (isValidMessageRef(subject)) {\n return new MessageSubject(subject.did, subject.convoId, subject.messageId)\n }\n // @NOTE #convoRef is a new type for reporting entire conversations.\n // Similar to messageRef, we take advantage of the open union to support this.\n if (isValidConvoRef(subject)) {\n return new ConvoSubject(subject.did, subject.convoId)\n }\n // @TODO we should start to require subject.convoId is a string in order to properly validate\n // the #messageRef. temporarily allowing it to be optional as a stopgap for rollout.\n // The next \"if\" can be removed once convoId is consistently provided.\n if (isMessageRefWithoutConvoId(subject)) {\n return new MessageSubject(\n subject.did,\n subject.convoId ?? '',\n subject.messageId,\n )\n }\n\n throw new InvalidRequestError('Invalid subject')\n}\n\nexport const subjectFromEventRow = (row: ModerationEventRow): ModSubject => {\n if (\n row.subjectType === 'com.atproto.repo.strongRef' &&\n row.subjectUri &&\n row.subjectCid\n ) {\n return new RecordSubject(\n row.subjectUri,\n row.subjectCid,\n row.subjectBlobCids ?? [],\n )\n } else if (\n row.subjectType === 'chat.bsky.convo.defs#messageRef' &&\n row.subjectMessageId\n ) {\n const convoId =\n typeof row.meta?.['convoId'] === 'string' ? row.meta['convoId'] : ''\n return new MessageSubject(row.subjectDid, convoId, row.subjectMessageId)\n } else if (\n row.subjectType === 'chat.bsky.convo.defs#convoRef' &&\n row.subjectConvoId\n ) {\n return new ConvoSubject(row.subjectDid, row.subjectConvoId)\n } else {\n return new RepoSubject(row.subjectDid)\n }\n}\n\nexport const subjectFromStatusRow = (\n row: ModerationSubjectStatusRow,\n): ModSubject => {\n if (row.recordPath && row.recordCid) {\n // Not too intuitive but the recordpath is basically <collection>/<rkey>\n // which is what the last 2 params of .make() arguments are\n const uri = AtUri.make(row.did, ...row.recordPath.split('/')).toString()\n return new RecordSubject(uri.toString(), row.recordCid, row.blobCids ?? [])\n } else if (row.convoId) {\n // Conversation subject - restore from subject status row\n return new ConvoSubject(row.did, row.convoId)\n } else {\n return new RepoSubject(row.did)\n }\n}\n\ntype SubjectInfo = {\n subjectType:\n | 'com.atproto.admin.defs#repoRef'\n | 'com.atproto.repo.strongRef'\n | 'chat.bsky.convo.defs#messageRef'\n | 'chat.bsky.convo.defs#convoRef'\n subjectDid: string\n subjectUri: string | null\n subjectCid: string | null\n subjectBlobCids: string[] | null\n subjectMessageId: string | null\n subjectConvoId: string | null\n meta: Record<string, string | undefined> | null\n}\n\nexport interface ModSubject {\n did: string\n recordPath: string | undefined\n convoId: string | undefined\n blobCids?: string[]\n isRepo(): this is RepoSubject\n isRecord(): this is RecordSubject\n isMessage(): this is MessageSubject\n isConvo(): this is ConvoSubject\n info(): SubjectInfo\n lex():\n | $Typed<RepoRef>\n | $Typed<StrongRef>\n | $Typed<MessageRef>\n | $Typed<ConvoRef>\n}\n\nexport class RepoSubject implements ModSubject {\n blobCids = undefined\n recordPath = undefined\n convoId = undefined\n constructor(public did: string) {}\n isRepo(): this is RepoSubject {\n return true\n }\n isRecord(): this is RecordSubject {\n return false\n }\n isMessage(): this is MessageSubject {\n return false\n }\n isConvo(): this is ConvoSubject {\n return false\n }\n info() {\n return {\n subjectType: 'com.atproto.admin.defs#repoRef' as const,\n subjectDid: this.did,\n subjectUri: null,\n subjectCid: null,\n subjectBlobCids: null,\n subjectMessageId: null,\n subjectConvoId: null,\n meta: null,\n }\n }\n lex(): $Typed<RepoRef> {\n return {\n $type: 'com.atproto.admin.defs#repoRef',\n did: this.did,\n }\n }\n}\n\nexport class RecordSubject implements ModSubject {\n parsedUri: AtUri\n did: string\n recordPath: string\n convoId = undefined\n constructor(\n public uri: string,\n public cid: string,\n public blobCids?: string[],\n ) {\n this.parsedUri = new AtUri(uri)\n this.did = this.parsedUri.hostname\n this.recordPath = `${this.parsedUri.collection}/${this.parsedUri.rkey}`\n }\n isRepo(): this is RepoSubject {\n return false\n }\n isRecord(): this is RecordSubject {\n return true\n }\n isMessage(): this is MessageSubject {\n return false\n }\n isConvo(): this is ConvoSubject {\n return false\n }\n info() {\n return {\n subjectType: 'com.atproto.repo.strongRef' as const,\n subjectDid: this.did,\n subjectUri: this.uri,\n subjectCid: this.cid,\n subjectBlobCids: this.blobCids ?? [],\n subjectMessageId: null,\n subjectConvoId: null,\n meta: null,\n }\n }\n lex(): $Typed<StrongRef> {\n return {\n $type: 'com.atproto.repo.strongRef',\n uri: this.uri,\n cid: this.cid,\n }\n }\n}\n\nexport class MessageSubject implements ModSubject {\n blobCids = undefined\n recordPath = undefined\n constructor(\n public did: string,\n public convoId: string,\n public messageId: string,\n ) {}\n isRepo(): this is RepoSubject {\n return false\n }\n isRecord(): this is RecordSubject {\n return false\n }\n isMessage(): this is MessageSubject {\n return true\n }\n isConvo(): this is ConvoSubject {\n return false\n }\n info() {\n return {\n subjectType: 'chat.bsky.convo.defs#messageRef' as const,\n subjectDid: this.did,\n subjectUri: null,\n subjectCid: null,\n subjectBlobCids: null,\n subjectMessageId: this.messageId,\n subjectConvoId: this.convoId,\n meta: { convoId: this.convoId || undefined },\n }\n }\n lex(): $Typed<MessageRef> {\n return {\n $type: 'chat.bsky.convo.defs#messageRef',\n did: this.did,\n convoId: this.convoId,\n messageId: this.messageId,\n }\n }\n}\n\nexport class ConvoSubject implements ModSubject {\n blobCids = undefined\n recordPath = undefined\n constructor(\n public did: string,\n public convoId: string,\n ) {}\n isRepo(): this is RepoSubject {\n return false\n }\n isRecord(): this is RecordSubject {\n return false\n }\n isMessage(): this is MessageSubject {\n return false\n }\n isConvo(): this is ConvoSubject {\n return true\n }\n info() {\n return {\n subjectType: 'chat.bsky.convo.defs#convoRef' as const,\n subjectDid: this.did,\n subjectUri: null,\n subjectCid: null,\n subjectBlobCids: null,\n subjectMessageId: null,\n subjectConvoId: this.convoId,\n meta: { convoId: this.convoId || undefined },\n }\n }\n lex(): $Typed<ConvoRef> {\n return {\n $type: 'chat.bsky.convo.defs#convoRef',\n did: this.did,\n convoId: this.convoId,\n }\n }\n}\n"]}
|
|
@@ -11,6 +11,7 @@ import { OutputSchema as ReportOutput } from '../lexicon/types/com/atproto/moder
|
|
|
11
11
|
import { BlobView, ModEventView, ModEventViewDetail, RecordView, RecordViewDetail, RepoView, SubjectStatusView } from '../lexicon/types/tools/ozone/moderation/defs.js';
|
|
12
12
|
import { Un$Typed } from '../lexicon/util.js';
|
|
13
13
|
import { ParsedLabelers } from '../util.js';
|
|
14
|
+
import { ModSubject } from './subject.js';
|
|
14
15
|
import { ModerationEventRowWithHandle, ModerationSubjectStatusRowWithHandle } from './types.js';
|
|
15
16
|
export type AuthHeaders = {
|
|
16
17
|
headers: {
|
|
@@ -44,7 +45,7 @@ export declare class ModerationViews {
|
|
|
44
45
|
recordDetails(subjects: RecordSubject[], labelers?: ParsedLabelers): Promise<Map<string, RecordViewDetail>>;
|
|
45
46
|
getExternalLabels(subjects: string[], labelers?: ParsedLabelers): Promise<Map<string, Label[]>>;
|
|
46
47
|
formatReport(report: ModerationEventRowWithHandle): ReportOutput;
|
|
47
|
-
subject(subject:
|
|
48
|
+
subject(subject: ModSubject): Promise<SubjectView>;
|
|
48
49
|
blob(blobs: BlobRef[]): Promise<BlobView[]>;
|
|
49
50
|
labels(subjects: string[], includeNeg?: boolean): Promise<Map<string, Label[]>>;
|
|
50
51
|
formatLabelAndEnsureSig(row: LabelRow): Promise<Label>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../../src/mod-service/views.ts"],"names":[],"mappings":"AACA,OAAO,EACL,gBAAgB,EAChB,QAAQ,EACR,uBAAuB,EACxB,MAAM,cAAc,CAAA;AAErB,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAE1C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAA;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,4CAA4C,CAAA;AACxE,OAAO,EACL,KAAK,EAEN,MAAM,4CAA4C,CAAA;AACnD,OAAO,EAAE,YAAY,IAAI,YAAY,EAAE,MAAM,yDAAyD,CAAA;AAEtG,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,kBAAkB,EAClB,UAAU,EACV,gBAAgB,EAChB,QAAQ,EACR,iBAAiB,EAmBlB,MAAM,iDAAiD,CAAA;AACxD,OAAO,EAAE,QAAQ,EAAe,MAAM,oBAAoB,CAAA;AAE1D,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"views.d.ts","sourceRoot":"","sources":["../../src/mod-service/views.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@ import { isAccountEvent, isAgeAssuranceEvent, isAgeAssuranceOverrideEvent, isIde
|
|
|
10
10
|
import { asPredicate } from '../lexicon/util.js';
|
|
11
11
|
import { dbLogger, httpLogger } from '../logger.js';
|
|
12
12
|
import { moderationSubjectStatusQueryBuilder } from './status.js';
|
|
13
|
-
import { subjectFromEventRow, subjectFromStatusRow } from './subject.js';
|
|
13
|
+
import { subjectFromEventRow, subjectFromStatusRow, } from './subject.js';
|
|
14
14
|
import { formatLabel, getPdsAgentForRepo, signLabel } from './util.js';
|
|
15
15
|
const isValidSelfLabels = asPredicate(validateSelfLabels);
|
|
16
16
|
const ifString = (val) => typeof val === 'string' ? val : undefined;
|
|
@@ -198,13 +198,8 @@ export class ModerationViews {
|
|
|
198
198
|
return eventView;
|
|
199
199
|
}
|
|
200
200
|
async eventDetail(result) {
|
|
201
|
-
const
|
|
202
|
-
|
|
203
|
-
: result.subjectUri;
|
|
204
|
-
if (!subjectId) {
|
|
205
|
-
throw new Error(`Bad subject: ${result.id}`);
|
|
206
|
-
}
|
|
207
|
-
const subject = await this.subject(subjectId);
|
|
201
|
+
const modSubject = subjectFromEventRow(result);
|
|
202
|
+
const subject = await this.subject(modSubject);
|
|
208
203
|
const eventView = this.formatEvent(result);
|
|
209
204
|
const allBlobs = 'value' in subject ? findBlobRefs(subject.value) : [];
|
|
210
205
|
const subjectBlobs = await this.blob(allBlobs.filter((blob) => eventView.subjectBlobCids.includes(blob.ref.toString())));
|
|
@@ -395,9 +390,16 @@ export class ModerationViews {
|
|
|
395
390
|
}
|
|
396
391
|
// Partial view for subjects
|
|
397
392
|
async subject(subject) {
|
|
398
|
-
if (subject.
|
|
399
|
-
|
|
400
|
-
|
|
393
|
+
if (subject.isConvo()) {
|
|
394
|
+
return {
|
|
395
|
+
$type: 'tools.ozone.moderation.defs#convoView',
|
|
396
|
+
did: subject.did,
|
|
397
|
+
convoId: subject.convoId,
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
else if (subject.isRepo()) {
|
|
401
|
+
const repos = await this.repos([subject.did]);
|
|
402
|
+
const repo = repos.get(subject.did);
|
|
401
403
|
if (repo) {
|
|
402
404
|
return {
|
|
403
405
|
...repo,
|
|
@@ -407,26 +409,25 @@ export class ModerationViews {
|
|
|
407
409
|
else {
|
|
408
410
|
return {
|
|
409
411
|
$type: 'tools.ozone.moderation.defs#repoViewNotFound',
|
|
410
|
-
did: subject,
|
|
412
|
+
did: subject.did,
|
|
411
413
|
};
|
|
412
414
|
}
|
|
413
415
|
}
|
|
414
|
-
else {
|
|
415
|
-
const
|
|
416
|
-
const
|
|
416
|
+
else if (subject.isRecord()) {
|
|
417
|
+
const uri = subject.uri;
|
|
418
|
+
const records = await this.records([{ uri }]);
|
|
419
|
+
const record = records.get(uri);
|
|
417
420
|
if (record) {
|
|
418
421
|
return {
|
|
419
422
|
...record,
|
|
420
423
|
$type: 'tools.ozone.moderation.defs#recordView',
|
|
421
424
|
};
|
|
422
425
|
}
|
|
423
|
-
else {
|
|
424
|
-
return {
|
|
425
|
-
$type: 'tools.ozone.moderation.defs#recordViewNotFound',
|
|
426
|
-
uri: subject,
|
|
427
|
-
};
|
|
428
|
-
}
|
|
429
426
|
}
|
|
427
|
+
return {
|
|
428
|
+
$type: 'tools.ozone.moderation.defs#repoViewNotFound',
|
|
429
|
+
did: subject.did,
|
|
430
|
+
};
|
|
430
431
|
}
|
|
431
432
|
// Partial view for blobs
|
|
432
433
|
async blob(blobs) {
|
|
@@ -504,7 +505,8 @@ export class ModerationViews {
|
|
|
504
505
|
for (const sub of parsedSubjects) {
|
|
505
506
|
qb = qb.orWhere((qb) => qb
|
|
506
507
|
.where('moderation_subject_status.did', '=', sub.did)
|
|
507
|
-
.where('moderation_subject_status.recordPath', '=', sub.recordPath ?? '')
|
|
508
|
+
.where('moderation_subject_status.recordPath', '=', sub.recordPath ?? '')
|
|
509
|
+
.where('moderation_subject_status.convoId', '=', ''));
|
|
508
510
|
}
|
|
509
511
|
return qb;
|
|
510
512
|
});
|