@atproto/ozone 0.1.49 → 0.1.51

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.
Files changed (120) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/api/index.d.ts.map +1 -1
  3. package/dist/api/index.js +12 -0
  4. package/dist/api/index.js.map +1 -1
  5. package/dist/api/set/addValues.d.ts +4 -0
  6. package/dist/api/set/addValues.d.ts.map +1 -0
  7. package/dist/api/set/addValues.js +24 -0
  8. package/dist/api/set/addValues.js.map +1 -0
  9. package/dist/api/set/deleteSet.d.ts +4 -0
  10. package/dist/api/set/deleteSet.d.ts.map +1 -0
  11. package/dist/api/set/deleteSet.js +28 -0
  12. package/dist/api/set/deleteSet.js.map +1 -0
  13. package/dist/api/set/deleteValues.d.ts +4 -0
  14. package/dist/api/set/deleteValues.d.ts.map +1 -0
  15. package/dist/api/set/deleteValues.js +24 -0
  16. package/dist/api/set/deleteValues.js.map +1 -0
  17. package/dist/api/set/getValues.d.ts +4 -0
  18. package/dist/api/set/getValues.d.ts.map +1 -0
  19. package/dist/api/set/getValues.js +35 -0
  20. package/dist/api/set/getValues.js.map +1 -0
  21. package/dist/api/set/querySets.d.ts +4 -0
  22. package/dist/api/set/querySets.d.ts.map +1 -0
  23. package/dist/api/set/querySets.js +33 -0
  24. package/dist/api/set/querySets.js.map +1 -0
  25. package/dist/api/set/upsertSet.d.ts +4 -0
  26. package/dist/api/set/upsertSet.d.ts.map +1 -0
  27. package/dist/api/set/upsertSet.js +32 -0
  28. package/dist/api/set/upsertSet.js.map +1 -0
  29. package/dist/context.d.ts +3 -0
  30. package/dist/context.d.ts.map +1 -1
  31. package/dist/context.js +6 -0
  32. package/dist/context.js.map +1 -1
  33. package/dist/daemon/blob-diverter.d.ts +1 -1
  34. package/dist/daemon/blob-diverter.d.ts.map +1 -1
  35. package/dist/db/migrations/20241008T205730722Z-sets.d.ts +4 -0
  36. package/dist/db/migrations/20241008T205730722Z-sets.d.ts.map +1 -0
  37. package/dist/db/migrations/20241008T205730722Z-sets.js +46 -0
  38. package/dist/db/migrations/20241008T205730722Z-sets.js.map +1 -0
  39. package/dist/db/migrations/index.d.ts +1 -0
  40. package/dist/db/migrations/index.d.ts.map +1 -1
  41. package/dist/db/migrations/index.js +2 -1
  42. package/dist/db/migrations/index.js.map +1 -1
  43. package/dist/db/pagination.d.ts +1 -1
  44. package/dist/db/pagination.d.ts.map +1 -1
  45. package/dist/db/schema/index.d.ts +2 -1
  46. package/dist/db/schema/index.d.ts.map +1 -1
  47. package/dist/db/schema/ozone_set.d.ts +21 -0
  48. package/dist/db/schema/ozone_set.d.ts.map +1 -0
  49. package/dist/db/schema/ozone_set.js +6 -0
  50. package/dist/db/schema/ozone_set.js.map +1 -0
  51. package/dist/lexicon/index.d.ts +17 -0
  52. package/dist/lexicon/index.d.ts.map +1 -1
  53. package/dist/lexicon/index.js +44 -1
  54. package/dist/lexicon/index.js.map +1 -1
  55. package/dist/lexicon/lexicons.d.ts +292 -0
  56. package/dist/lexicon/lexicons.d.ts.map +1 -1
  57. package/dist/lexicon/lexicons.js +298 -0
  58. package/dist/lexicon/lexicons.js.map +1 -1
  59. package/dist/lexicon/types/tools/ozone/set/addValues.d.ts +32 -0
  60. package/dist/lexicon/types/tools/ozone/set/addValues.d.ts.map +1 -0
  61. package/dist/lexicon/types/tools/ozone/set/addValues.js +3 -0
  62. package/dist/lexicon/types/tools/ozone/set/addValues.js.map +1 -0
  63. package/dist/lexicon/types/tools/ozone/set/defs.d.ts +22 -0
  64. package/dist/lexicon/types/tools/ozone/set/defs.d.ts.map +1 -0
  65. package/dist/lexicon/types/tools/ozone/set/defs.js +24 -0
  66. package/dist/lexicon/types/tools/ozone/set/defs.js.map +1 -0
  67. package/dist/lexicon/types/tools/ozone/set/deleteSet.d.ts +41 -0
  68. package/dist/lexicon/types/tools/ozone/set/deleteSet.d.ts.map +1 -0
  69. package/dist/lexicon/types/tools/ozone/set/deleteSet.js +3 -0
  70. package/dist/lexicon/types/tools/ozone/set/deleteSet.js.map +1 -0
  71. package/dist/lexicon/types/tools/ozone/set/deleteValues.d.ts +33 -0
  72. package/dist/lexicon/types/tools/ozone/set/deleteValues.d.ts.map +1 -0
  73. package/dist/lexicon/types/tools/ozone/set/deleteValues.js +3 -0
  74. package/dist/lexicon/types/tools/ozone/set/deleteValues.js.map +1 -0
  75. package/dist/lexicon/types/tools/ozone/set/getValues.d.ts +41 -0
  76. package/dist/lexicon/types/tools/ozone/set/getValues.d.ts.map +1 -0
  77. package/dist/lexicon/types/tools/ozone/set/getValues.js +3 -0
  78. package/dist/lexicon/types/tools/ozone/set/getValues.js.map +1 -0
  79. package/dist/lexicon/types/tools/ozone/set/querySets.d.ts +42 -0
  80. package/dist/lexicon/types/tools/ozone/set/querySets.d.ts.map +1 -0
  81. package/dist/lexicon/types/tools/ozone/set/querySets.js +3 -0
  82. package/dist/lexicon/types/tools/ozone/set/querySets.js.map +1 -0
  83. package/dist/lexicon/types/tools/ozone/set/upsertSet.d.ts +35 -0
  84. package/dist/lexicon/types/tools/ozone/set/upsertSet.d.ts.map +1 -0
  85. package/dist/lexicon/types/tools/ozone/set/upsertSet.js +3 -0
  86. package/dist/lexicon/types/tools/ozone/set/upsertSet.js.map +1 -0
  87. package/dist/mod-service/subject.d.ts +9 -9
  88. package/dist/mod-service/subject.d.ts.map +1 -1
  89. package/dist/set/service.d.ts +46 -0
  90. package/dist/set/service.d.ts.map +1 -0
  91. package/dist/set/service.js +166 -0
  92. package/dist/set/service.js.map +1 -0
  93. package/package.json +3 -3
  94. package/src/api/index.ts +12 -0
  95. package/src/api/set/addValues.ts +28 -0
  96. package/src/api/set/deleteSet.ts +34 -0
  97. package/src/api/set/deleteValues.ts +31 -0
  98. package/src/api/set/getValues.ts +42 -0
  99. package/src/api/set/querySets.ts +36 -0
  100. package/src/api/set/upsertSet.ts +38 -0
  101. package/src/context.ts +8 -0
  102. package/src/daemon/blob-diverter.ts +1 -1
  103. package/src/db/migrations/20241008T205730722Z-sets.ts +53 -0
  104. package/src/db/migrations/index.ts +1 -0
  105. package/src/db/pagination.ts +1 -1
  106. package/src/db/schema/index.ts +2 -0
  107. package/src/db/schema/ozone_set.ts +24 -0
  108. package/src/lexicon/index.ts +82 -0
  109. package/src/lexicon/lexicons.ts +301 -0
  110. package/src/lexicon/types/tools/ozone/set/addValues.ts +41 -0
  111. package/src/lexicon/types/tools/ozone/set/defs.ts +44 -0
  112. package/src/lexicon/types/tools/ozone/set/deleteSet.ts +50 -0
  113. package/src/lexicon/types/tools/ozone/set/deleteValues.ts +42 -0
  114. package/src/lexicon/types/tools/ozone/set/getValues.ts +51 -0
  115. package/src/lexicon/types/tools/ozone/set/querySets.ts +52 -0
  116. package/src/lexicon/types/tools/ozone/set/upsertSet.ts +43 -0
  117. package/src/mod-service/subject.ts +9 -9
  118. package/src/set/service.ts +227 -0
  119. package/tests/__snapshots__/sets.test.ts.snap +46 -0
  120. package/tests/sets.test.ts +246 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/set/service.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atproto/ozone",
3
- "version": "0.1.49",
3
+ "version": "0.1.51",
4
4
  "license": "MIT",
5
5
  "description": "Backend service for moderating the Bluesky network.",
6
6
  "keywords": [
@@ -32,7 +32,7 @@
32
32
  "structured-headers": "^1.0.1",
33
33
  "typed-emitter": "^2.1.0",
34
34
  "uint8arrays": "3.0.0",
35
- "@atproto/api": "^0.13.11",
35
+ "@atproto/api": "^0.13.12",
36
36
  "@atproto/common": "^0.4.4",
37
37
  "@atproto/crypto": "^0.4.1",
38
38
  "@atproto/identity": "^0.4.2",
@@ -52,7 +52,7 @@
52
52
  "jest": "^28.1.2",
53
53
  "ts-node": "^10.8.2",
54
54
  "@atproto/lex-cli": "^0.5.1",
55
- "@atproto/pds": "^0.4.63"
55
+ "@atproto/pds": "^0.4.65"
56
56
  },
57
57
  "scripts": {
58
58
  "codegen": "lex gen-server --yes ./src/lexicon ../../lexicons/com/atproto/*/* ../../lexicons/app/bsky/*/* ../../lexicons/chat/bsky/*/* ../../lexicons/tools/ozone/*/*",
package/src/api/index.ts CHANGED
@@ -23,6 +23,12 @@ import listMembers from './team/listMembers'
23
23
  import getConfig from './server/getConfig'
24
24
  import chat from './chat'
25
25
  import proxied from './proxied'
26
+ import setAddValues from './set/addValues'
27
+ import setGetValues from './set/getValues'
28
+ import querySets from './set/querySets'
29
+ import upsertSet from './set/upsertSet'
30
+ import setDeleteValues from './set/deleteValues'
31
+ import deleteSet from './set/deleteSet'
26
32
  import getRepos from './moderation/getRepos'
27
33
 
28
34
  export * as health from './health'
@@ -54,5 +60,11 @@ export default function (server: Server, ctx: AppContext) {
54
60
  chat(server, ctx)
55
61
  proxied(server, ctx)
56
62
  getConfig(server, ctx)
63
+ setAddValues(server, ctx)
64
+ setGetValues(server, ctx)
65
+ querySets(server, ctx)
66
+ upsertSet(server, ctx)
67
+ setDeleteValues(server, ctx)
68
+ deleteSet(server, ctx)
57
69
  return server
58
70
  }
@@ -0,0 +1,28 @@
1
+ import { AuthRequiredError, InvalidRequestError } from '@atproto/xrpc-server'
2
+ import { Server } from '../../lexicon'
3
+ import AppContext from '../../context'
4
+
5
+ export default function (server: Server, ctx: AppContext) {
6
+ server.tools.ozone.set.addValues({
7
+ auth: ctx.authVerifier.modOrAdminToken,
8
+ handler: async ({ input, auth }) => {
9
+ const access = auth.credentials
10
+ const db = ctx.db
11
+ const { name, values } = input.body
12
+
13
+ if (!access.isModerator) {
14
+ throw new AuthRequiredError(
15
+ 'Must be a moderator to add values to a set',
16
+ )
17
+ }
18
+
19
+ const setService = ctx.setService(db)
20
+ const set = await setService.getByName(name)
21
+ if (!set) {
22
+ throw new InvalidRequestError(`Set with name "${name}" does not exist`)
23
+ }
24
+
25
+ await setService.addValues(set.id, values)
26
+ },
27
+ })
28
+ }
@@ -0,0 +1,34 @@
1
+ import { AuthRequiredError, InvalidRequestError } from '@atproto/xrpc-server'
2
+ import { Server } from '../../lexicon'
3
+ import AppContext from '../../context'
4
+
5
+ export default function (server: Server, ctx: AppContext) {
6
+ server.tools.ozone.set.deleteSet({
7
+ auth: ctx.authVerifier.modOrAdminToken,
8
+ handler: async ({ input, auth }) => {
9
+ const access = auth.credentials
10
+ const db = ctx.db
11
+ const { name } = input.body
12
+
13
+ if (!access.isModerator) {
14
+ throw new AuthRequiredError('Must be a moderator to delete a set')
15
+ }
16
+
17
+ const setService = ctx.setService(db)
18
+ const set = await setService.getByName(name)
19
+ if (!set) {
20
+ throw new InvalidRequestError(
21
+ `Set with name "${name}" does not exist`,
22
+ 'SetNotFound',
23
+ )
24
+ }
25
+
26
+ await setService.removeSet(set.id)
27
+
28
+ return {
29
+ encoding: 'application/json',
30
+ body: {},
31
+ }
32
+ },
33
+ })
34
+ }
@@ -0,0 +1,31 @@
1
+ import { AuthRequiredError, InvalidRequestError } from '@atproto/xrpc-server'
2
+ import { Server } from '../../lexicon'
3
+ import AppContext from '../../context'
4
+
5
+ export default function (server: Server, ctx: AppContext) {
6
+ server.tools.ozone.set.deleteValues({
7
+ auth: ctx.authVerifier.modOrAdminToken,
8
+ handler: async ({ input, auth }) => {
9
+ const access = auth.credentials
10
+ const db = ctx.db
11
+ const { name, values } = input.body
12
+
13
+ if (!access.isModerator) {
14
+ throw new AuthRequiredError(
15
+ 'Must be a moderator to remove values from a set',
16
+ )
17
+ }
18
+
19
+ const setService = ctx.setService(db)
20
+ const set = await setService.getByName(name)
21
+ if (!set) {
22
+ throw new InvalidRequestError(
23
+ `Set with name "${name}" does not exist`,
24
+ 'SetNotFound',
25
+ )
26
+ }
27
+
28
+ await setService.removeValues(set.id, values)
29
+ },
30
+ })
31
+ }
@@ -0,0 +1,42 @@
1
+ import { AuthRequiredError, InvalidRequestError } from '@atproto/xrpc-server'
2
+ import { Server } from '../../lexicon'
3
+ import AppContext from '../../context'
4
+
5
+ export default function (server: Server, ctx: AppContext) {
6
+ server.tools.ozone.set.getValues({
7
+ auth: ctx.authVerifier.modOrAdminToken,
8
+ handler: async ({ params, auth }) => {
9
+ const access = auth.credentials
10
+ const db = ctx.db
11
+ const { name, limit, cursor } = params
12
+
13
+ if (!access.isModerator) {
14
+ throw new AuthRequiredError('Must be a moderator to get set details')
15
+ }
16
+
17
+ const setService = ctx.setService(db)
18
+
19
+ const result = await setService.getSetWithValues({
20
+ name,
21
+ limit,
22
+ cursor,
23
+ })
24
+
25
+ if (!result) {
26
+ throw new InvalidRequestError(
27
+ `Set with name "${name}" not found`,
28
+ 'SetNotFound',
29
+ )
30
+ }
31
+
32
+ return {
33
+ encoding: 'application/json',
34
+ body: {
35
+ set: setService.view(result.set),
36
+ values: result.values,
37
+ cursor: result.cursor,
38
+ },
39
+ }
40
+ },
41
+ })
42
+ }
@@ -0,0 +1,36 @@
1
+ import { AuthRequiredError } from '@atproto/xrpc-server'
2
+ import { Server } from '../../lexicon'
3
+ import AppContext from '../../context'
4
+
5
+ export default function (server: Server, ctx: AppContext) {
6
+ server.tools.ozone.set.querySets({
7
+ auth: ctx.authVerifier.modOrAdminToken,
8
+ handler: async ({ params, auth }) => {
9
+ const access = auth.credentials
10
+ const db = ctx.db
11
+ const { limit, cursor, namePrefix, sortBy, sortDirection } = params
12
+
13
+ if (!access.isModerator) {
14
+ throw new AuthRequiredError('Must be a moderator to query sets')
15
+ }
16
+
17
+ const setService = ctx.setService(db)
18
+
19
+ const queryResult = await setService.query({
20
+ limit,
21
+ cursor,
22
+ namePrefix,
23
+ sortBy,
24
+ sortDirection,
25
+ })
26
+
27
+ return {
28
+ encoding: 'application/json',
29
+ body: {
30
+ sets: queryResult.sets.map((set) => setService.view(set)),
31
+ cursor: queryResult.cursor,
32
+ },
33
+ }
34
+ },
35
+ })
36
+ }
@@ -0,0 +1,38 @@
1
+ import { AuthRequiredError, InvalidRequestError } from '@atproto/xrpc-server'
2
+ import { Server } from '../../lexicon'
3
+ import AppContext from '../../context'
4
+
5
+ export default function (server: Server, ctx: AppContext) {
6
+ server.tools.ozone.set.upsertSet({
7
+ auth: ctx.authVerifier.modOrAdminToken,
8
+ handler: async ({ input, auth }) => {
9
+ const access = auth.credentials
10
+ const db = ctx.db
11
+ const { name, description } = input.body
12
+
13
+ if (!access.isModerator) {
14
+ throw new AuthRequiredError(
15
+ 'Must be a moderator to create or update a set',
16
+ )
17
+ }
18
+
19
+ const setService = ctx.setService(db)
20
+
21
+ await setService.upsert({
22
+ name,
23
+ description: description ?? null,
24
+ })
25
+ const setWithSize = await setService.getByNameWithSize(name)
26
+
27
+ // Unlikely to happen since we just upserted the set
28
+ if (!setWithSize) {
29
+ throw new InvalidRequestError(`Set not found`)
30
+ }
31
+
32
+ return {
33
+ encoding: 'application/json',
34
+ body: setService.view(setWithSize),
35
+ }
36
+ },
37
+ })
38
+ }
package/src/context.ts CHANGED
@@ -26,12 +26,14 @@ import {
26
26
  ParsedLabelers,
27
27
  parseLabelerHeader,
28
28
  } from './util'
29
+ import { SetService, SetServiceCreator } from './set/service'
29
30
 
30
31
  export type AppContextOptions = {
31
32
  db: Database
32
33
  cfg: OzoneConfig
33
34
  modService: ModerationServiceCreator
34
35
  communicationTemplateService: CommunicationTemplateServiceCreator
36
+ setService: SetServiceCreator
35
37
  teamService: TeamServiceCreator
36
38
  appviewAgent: AtpAgent
37
39
  pdsAgent: AtpAgent | undefined
@@ -117,6 +119,7 @@ export class AppContext {
117
119
 
118
120
  const communicationTemplateService = CommunicationTemplateService.creator()
119
121
  const teamService = TeamService.creator()
122
+ const setService = SetService.creator()
120
123
 
121
124
  const sequencer = new Sequencer(modService(db))
122
125
 
@@ -133,6 +136,7 @@ export class AppContext {
133
136
  modService,
134
137
  communicationTemplateService,
135
138
  teamService,
139
+ setService,
136
140
  appviewAgent,
137
141
  pdsAgent,
138
142
  chatAgent,
@@ -182,6 +186,10 @@ export class AppContext {
182
186
  return this.opts.teamService
183
187
  }
184
188
 
189
+ get setService(): SetServiceCreator {
190
+ return this.opts.setService
191
+ }
192
+
185
193
  get appviewAgent(): AtpAgent {
186
194
  return this.opts.appviewAgent
187
195
  }
@@ -107,7 +107,7 @@ export class BlobDiverter {
107
107
  subjectBlobCids,
108
108
  }: {
109
109
  subjectDid: string
110
- subjectUri: string
110
+ subjectUri: string | null
111
111
  subjectBlobCids: string[]
112
112
  }): Promise<boolean> {
113
113
  const didDoc = await this.idResolver.did.resolve(subjectDid)
@@ -0,0 +1,53 @@
1
+ import { Kysely, sql } from 'kysely'
2
+
3
+ export async function up(db: Kysely<unknown>): Promise<void> {
4
+ // Create the sets table
5
+ await db.schema
6
+ .createTable('set_detail')
7
+ .addColumn('id', 'serial', (col) => col.primaryKey())
8
+ .addColumn('name', 'varchar', (col) => col.notNull().unique())
9
+ .addColumn('description', 'varchar')
10
+ .addColumn('createdAt', 'timestamptz', (col) =>
11
+ col.defaultTo(sql`now()`).notNull(),
12
+ )
13
+ .addColumn('updatedAt', 'timestamptz', (col) =>
14
+ col.defaultTo(sql`now()`).notNull(),
15
+ )
16
+ .execute()
17
+
18
+ // Create the set values table
19
+ await db.schema
20
+ .createTable('set_value')
21
+ .addColumn('id', 'bigserial', (col) => col.primaryKey())
22
+ .addColumn('setId', 'integer', (col) =>
23
+ col.notNull().references('set_detail.id'),
24
+ )
25
+ .addColumn('value', 'varchar', (col) => col.notNull())
26
+ .addColumn('createdAt', 'timestamptz', (col) =>
27
+ col.defaultTo(sql`now()`).notNull(),
28
+ )
29
+ .execute()
30
+
31
+ // Add indexes for better performance
32
+ await db.schema
33
+ .createIndex('set_detail_name_idx')
34
+ .on('set_detail')
35
+ .column('name')
36
+ .execute()
37
+
38
+ // Create a unique constraint on setId and value
39
+ await db.schema
40
+ .alterTable('set_value')
41
+ .addUniqueConstraint('set_value_setid_value_unique', ['setId', 'value'])
42
+ .execute()
43
+ await db.schema
44
+ .createIndex('set_value_setid_created_at_idx')
45
+ .on('set_value')
46
+ .columns(['setId', 'createdAt'])
47
+ .execute()
48
+ }
49
+
50
+ export async function down(db: Kysely<unknown>): Promise<void> {
51
+ await db.schema.dropTable('set_value').execute()
52
+ await db.schema.dropTable('set_detail').execute()
53
+ }
@@ -14,3 +14,4 @@ export * as _20240814T003647759Z from './20240814T003647759Z-event-created-at-in
14
14
  export * as _20240903T205730722Z from './20240903T205730722Z-add-template-lang'
15
15
  export * as _20240904T205730722Z from './20240904T205730722Z-add-subject-did-index'
16
16
  export * as _20241001T205730722Z from './20241001T205730722Z-subject-status-review-state-index'
17
+ export * as _20241008T205730722Z from './20241008T205730722Z-sets'
@@ -146,7 +146,7 @@ export class StatusKeyset extends GenericKeyset<StatusKeysetParam, Cursor> {
146
146
 
147
147
  type TimeIdKeysetParam = {
148
148
  id: number
149
- createdAt: string
149
+ createdAt: string | Date
150
150
  }
151
151
  type TimeIdResult = TimeIdKeysetParam
152
152
 
@@ -7,6 +7,7 @@ import * as blobPushEvent from './blob_push_event'
7
7
  import * as label from './label'
8
8
  import * as signingKey from './signing_key'
9
9
  import * as communicationTemplate from './communication_template'
10
+ import * as set from './ozone_set'
10
11
  import * as member from './member'
11
12
 
12
13
  export type DatabaseSchemaType = modEvent.PartialDB &
@@ -17,6 +18,7 @@ export type DatabaseSchemaType = modEvent.PartialDB &
17
18
  recordPushEvent.PartialDB &
18
19
  blobPushEvent.PartialDB &
19
20
  communicationTemplate.PartialDB &
21
+ set.PartialDB &
20
22
  member.PartialDB
21
23
 
22
24
  export type DatabaseSchema = Kysely<DatabaseSchemaType>
@@ -0,0 +1,24 @@
1
+ import { Generated, GeneratedAlways } from 'kysely'
2
+
3
+ export const ozoneSetTableName = 'set_detail'
4
+ export const ozoneSetValueTableName = 'set_value'
5
+
6
+ export interface SetDetail {
7
+ id: GeneratedAlways<number>
8
+ name: string
9
+ description: string | null
10
+ createdAt: Generated<Date>
11
+ updatedAt: Generated<Date>
12
+ }
13
+
14
+ export interface SetValue {
15
+ id: GeneratedAlways<number>
16
+ setId: number
17
+ value: string
18
+ createdAt: Generated<Date>
19
+ }
20
+
21
+ export type PartialDB = {
22
+ [ozoneSetTableName]: SetDetail
23
+ [ozoneSetValueTableName]: SetValue
24
+ }
@@ -173,6 +173,12 @@ import * as ToolsOzoneModerationQueryEvents from './types/tools/ozone/moderation
173
173
  import * as ToolsOzoneModerationQueryStatuses from './types/tools/ozone/moderation/queryStatuses'
174
174
  import * as ToolsOzoneModerationSearchRepos from './types/tools/ozone/moderation/searchRepos'
175
175
  import * as ToolsOzoneServerGetConfig from './types/tools/ozone/server/getConfig'
176
+ import * as ToolsOzoneSetAddValues from './types/tools/ozone/set/addValues'
177
+ import * as ToolsOzoneSetDeleteSet from './types/tools/ozone/set/deleteSet'
178
+ import * as ToolsOzoneSetDeleteValues from './types/tools/ozone/set/deleteValues'
179
+ import * as ToolsOzoneSetGetValues from './types/tools/ozone/set/getValues'
180
+ import * as ToolsOzoneSetQuerySets from './types/tools/ozone/set/querySets'
181
+ import * as ToolsOzoneSetUpsertSet from './types/tools/ozone/set/upsertSet'
176
182
  import * as ToolsOzoneSignatureFindCorrelation from './types/tools/ozone/signature/findCorrelation'
177
183
  import * as ToolsOzoneSignatureFindRelatedAccounts from './types/tools/ozone/signature/findRelatedAccounts'
178
184
  import * as ToolsOzoneSignatureSearchAccounts from './types/tools/ozone/signature/searchAccounts'
@@ -2164,6 +2170,7 @@ export class ToolsOzoneNS {
2164
2170
  communication: ToolsOzoneCommunicationNS
2165
2171
  moderation: ToolsOzoneModerationNS
2166
2172
  server: ToolsOzoneServerNS
2173
+ set: ToolsOzoneSetNS
2167
2174
  signature: ToolsOzoneSignatureNS
2168
2175
  team: ToolsOzoneTeamNS
2169
2176
 
@@ -2172,6 +2179,7 @@ export class ToolsOzoneNS {
2172
2179
  this.communication = new ToolsOzoneCommunicationNS(server)
2173
2180
  this.moderation = new ToolsOzoneModerationNS(server)
2174
2181
  this.server = new ToolsOzoneServerNS(server)
2182
+ this.set = new ToolsOzoneSetNS(server)
2175
2183
  this.signature = new ToolsOzoneSignatureNS(server)
2176
2184
  this.team = new ToolsOzoneTeamNS(server)
2177
2185
  }
@@ -2355,6 +2363,80 @@ export class ToolsOzoneServerNS {
2355
2363
  }
2356
2364
  }
2357
2365
 
2366
+ export class ToolsOzoneSetNS {
2367
+ _server: Server
2368
+
2369
+ constructor(server: Server) {
2370
+ this._server = server
2371
+ }
2372
+
2373
+ addValues<AV extends AuthVerifier>(
2374
+ cfg: ConfigOf<
2375
+ AV,
2376
+ ToolsOzoneSetAddValues.Handler<ExtractAuth<AV>>,
2377
+ ToolsOzoneSetAddValues.HandlerReqCtx<ExtractAuth<AV>>
2378
+ >,
2379
+ ) {
2380
+ const nsid = 'tools.ozone.set.addValues' // @ts-ignore
2381
+ return this._server.xrpc.method(nsid, cfg)
2382
+ }
2383
+
2384
+ deleteSet<AV extends AuthVerifier>(
2385
+ cfg: ConfigOf<
2386
+ AV,
2387
+ ToolsOzoneSetDeleteSet.Handler<ExtractAuth<AV>>,
2388
+ ToolsOzoneSetDeleteSet.HandlerReqCtx<ExtractAuth<AV>>
2389
+ >,
2390
+ ) {
2391
+ const nsid = 'tools.ozone.set.deleteSet' // @ts-ignore
2392
+ return this._server.xrpc.method(nsid, cfg)
2393
+ }
2394
+
2395
+ deleteValues<AV extends AuthVerifier>(
2396
+ cfg: ConfigOf<
2397
+ AV,
2398
+ ToolsOzoneSetDeleteValues.Handler<ExtractAuth<AV>>,
2399
+ ToolsOzoneSetDeleteValues.HandlerReqCtx<ExtractAuth<AV>>
2400
+ >,
2401
+ ) {
2402
+ const nsid = 'tools.ozone.set.deleteValues' // @ts-ignore
2403
+ return this._server.xrpc.method(nsid, cfg)
2404
+ }
2405
+
2406
+ getValues<AV extends AuthVerifier>(
2407
+ cfg: ConfigOf<
2408
+ AV,
2409
+ ToolsOzoneSetGetValues.Handler<ExtractAuth<AV>>,
2410
+ ToolsOzoneSetGetValues.HandlerReqCtx<ExtractAuth<AV>>
2411
+ >,
2412
+ ) {
2413
+ const nsid = 'tools.ozone.set.getValues' // @ts-ignore
2414
+ return this._server.xrpc.method(nsid, cfg)
2415
+ }
2416
+
2417
+ querySets<AV extends AuthVerifier>(
2418
+ cfg: ConfigOf<
2419
+ AV,
2420
+ ToolsOzoneSetQuerySets.Handler<ExtractAuth<AV>>,
2421
+ ToolsOzoneSetQuerySets.HandlerReqCtx<ExtractAuth<AV>>
2422
+ >,
2423
+ ) {
2424
+ const nsid = 'tools.ozone.set.querySets' // @ts-ignore
2425
+ return this._server.xrpc.method(nsid, cfg)
2426
+ }
2427
+
2428
+ upsertSet<AV extends AuthVerifier>(
2429
+ cfg: ConfigOf<
2430
+ AV,
2431
+ ToolsOzoneSetUpsertSet.Handler<ExtractAuth<AV>>,
2432
+ ToolsOzoneSetUpsertSet.HandlerReqCtx<ExtractAuth<AV>>
2433
+ >,
2434
+ ) {
2435
+ const nsid = 'tools.ozone.set.upsertSet' // @ts-ignore
2436
+ return this._server.xrpc.method(nsid, cfg)
2437
+ }
2438
+ }
2439
+
2358
2440
  export class ToolsOzoneSignatureNS {
2359
2441
  _server: Server
2360
2442