@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.
- package/CHANGELOG.md +15 -0
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +12 -0
- package/dist/api/index.js.map +1 -1
- package/dist/api/set/addValues.d.ts +4 -0
- package/dist/api/set/addValues.d.ts.map +1 -0
- package/dist/api/set/addValues.js +24 -0
- package/dist/api/set/addValues.js.map +1 -0
- package/dist/api/set/deleteSet.d.ts +4 -0
- package/dist/api/set/deleteSet.d.ts.map +1 -0
- package/dist/api/set/deleteSet.js +28 -0
- package/dist/api/set/deleteSet.js.map +1 -0
- package/dist/api/set/deleteValues.d.ts +4 -0
- package/dist/api/set/deleteValues.d.ts.map +1 -0
- package/dist/api/set/deleteValues.js +24 -0
- package/dist/api/set/deleteValues.js.map +1 -0
- package/dist/api/set/getValues.d.ts +4 -0
- package/dist/api/set/getValues.d.ts.map +1 -0
- package/dist/api/set/getValues.js +35 -0
- package/dist/api/set/getValues.js.map +1 -0
- package/dist/api/set/querySets.d.ts +4 -0
- package/dist/api/set/querySets.d.ts.map +1 -0
- package/dist/api/set/querySets.js +33 -0
- package/dist/api/set/querySets.js.map +1 -0
- package/dist/api/set/upsertSet.d.ts +4 -0
- package/dist/api/set/upsertSet.d.ts.map +1 -0
- package/dist/api/set/upsertSet.js +32 -0
- package/dist/api/set/upsertSet.js.map +1 -0
- package/dist/context.d.ts +3 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +6 -0
- package/dist/context.js.map +1 -1
- package/dist/daemon/blob-diverter.d.ts +1 -1
- package/dist/daemon/blob-diverter.d.ts.map +1 -1
- package/dist/db/migrations/20241008T205730722Z-sets.d.ts +4 -0
- package/dist/db/migrations/20241008T205730722Z-sets.d.ts.map +1 -0
- package/dist/db/migrations/20241008T205730722Z-sets.js +46 -0
- package/dist/db/migrations/20241008T205730722Z-sets.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 +2 -1
- package/dist/db/migrations/index.js.map +1 -1
- package/dist/db/pagination.d.ts +1 -1
- package/dist/db/pagination.d.ts.map +1 -1
- package/dist/db/schema/index.d.ts +2 -1
- package/dist/db/schema/index.d.ts.map +1 -1
- package/dist/db/schema/ozone_set.d.ts +21 -0
- package/dist/db/schema/ozone_set.d.ts.map +1 -0
- package/dist/db/schema/ozone_set.js +6 -0
- package/dist/db/schema/ozone_set.js.map +1 -0
- package/dist/lexicon/index.d.ts +17 -0
- package/dist/lexicon/index.d.ts.map +1 -1
- package/dist/lexicon/index.js +44 -1
- package/dist/lexicon/index.js.map +1 -1
- package/dist/lexicon/lexicons.d.ts +292 -0
- package/dist/lexicon/lexicons.d.ts.map +1 -1
- package/dist/lexicon/lexicons.js +298 -0
- package/dist/lexicon/lexicons.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/set/addValues.d.ts +32 -0
- package/dist/lexicon/types/tools/ozone/set/addValues.d.ts.map +1 -0
- package/dist/lexicon/types/tools/ozone/set/addValues.js +3 -0
- package/dist/lexicon/types/tools/ozone/set/addValues.js.map +1 -0
- package/dist/lexicon/types/tools/ozone/set/defs.d.ts +22 -0
- package/dist/lexicon/types/tools/ozone/set/defs.d.ts.map +1 -0
- package/dist/lexicon/types/tools/ozone/set/defs.js +24 -0
- package/dist/lexicon/types/tools/ozone/set/defs.js.map +1 -0
- package/dist/lexicon/types/tools/ozone/set/deleteSet.d.ts +41 -0
- package/dist/lexicon/types/tools/ozone/set/deleteSet.d.ts.map +1 -0
- package/dist/lexicon/types/tools/ozone/set/deleteSet.js +3 -0
- package/dist/lexicon/types/tools/ozone/set/deleteSet.js.map +1 -0
- package/dist/lexicon/types/tools/ozone/set/deleteValues.d.ts +33 -0
- package/dist/lexicon/types/tools/ozone/set/deleteValues.d.ts.map +1 -0
- package/dist/lexicon/types/tools/ozone/set/deleteValues.js +3 -0
- package/dist/lexicon/types/tools/ozone/set/deleteValues.js.map +1 -0
- package/dist/lexicon/types/tools/ozone/set/getValues.d.ts +41 -0
- package/dist/lexicon/types/tools/ozone/set/getValues.d.ts.map +1 -0
- package/dist/lexicon/types/tools/ozone/set/getValues.js +3 -0
- package/dist/lexicon/types/tools/ozone/set/getValues.js.map +1 -0
- package/dist/lexicon/types/tools/ozone/set/querySets.d.ts +42 -0
- package/dist/lexicon/types/tools/ozone/set/querySets.d.ts.map +1 -0
- package/dist/lexicon/types/tools/ozone/set/querySets.js +3 -0
- package/dist/lexicon/types/tools/ozone/set/querySets.js.map +1 -0
- package/dist/lexicon/types/tools/ozone/set/upsertSet.d.ts +35 -0
- package/dist/lexicon/types/tools/ozone/set/upsertSet.d.ts.map +1 -0
- package/dist/lexicon/types/tools/ozone/set/upsertSet.js +3 -0
- package/dist/lexicon/types/tools/ozone/set/upsertSet.js.map +1 -0
- package/dist/mod-service/subject.d.ts +9 -9
- package/dist/mod-service/subject.d.ts.map +1 -1
- package/dist/set/service.d.ts +46 -0
- package/dist/set/service.d.ts.map +1 -0
- package/dist/set/service.js +166 -0
- package/dist/set/service.js.map +1 -0
- package/package.json +3 -3
- package/src/api/index.ts +12 -0
- package/src/api/set/addValues.ts +28 -0
- package/src/api/set/deleteSet.ts +34 -0
- package/src/api/set/deleteValues.ts +31 -0
- package/src/api/set/getValues.ts +42 -0
- package/src/api/set/querySets.ts +36 -0
- package/src/api/set/upsertSet.ts +38 -0
- package/src/context.ts +8 -0
- package/src/daemon/blob-diverter.ts +1 -1
- package/src/db/migrations/20241008T205730722Z-sets.ts +53 -0
- package/src/db/migrations/index.ts +1 -0
- package/src/db/pagination.ts +1 -1
- package/src/db/schema/index.ts +2 -0
- package/src/db/schema/ozone_set.ts +24 -0
- package/src/lexicon/index.ts +82 -0
- package/src/lexicon/lexicons.ts +301 -0
- package/src/lexicon/types/tools/ozone/set/addValues.ts +41 -0
- package/src/lexicon/types/tools/ozone/set/defs.ts +44 -0
- package/src/lexicon/types/tools/ozone/set/deleteSet.ts +50 -0
- package/src/lexicon/types/tools/ozone/set/deleteValues.ts +42 -0
- package/src/lexicon/types/tools/ozone/set/getValues.ts +51 -0
- package/src/lexicon/types/tools/ozone/set/querySets.ts +52 -0
- package/src/lexicon/types/tools/ozone/set/upsertSet.ts +43 -0
- package/src/mod-service/subject.ts +9 -9
- package/src/set/service.ts +227 -0
- package/tests/__snapshots__/sets.test.ts.snap +46 -0
- package/tests/sets.test.ts +246 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/set/service.ts"],"names":[],"mappings":";;;AAIA,iDAAyD;AAIzD,MAAa,UAAU;IACrB,YAAmB,EAAY;QAAnB;;;;mBAAO,EAAE;WAAU;IAAG,CAAC;IAEnC,MAAM,CAAC,OAAO;QACZ,OAAO,CAAC,EAAY,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAA;IAC7C,CAAC;IAED,wBAAwB;QACtB,OAAO,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC;YACrD,MAAM;YACN,QAAQ;YACR,eAAe;YACf,aAAa;YACb,aAAa;YACb,CAAC,EAAE,EAAE,EAAE,CACL,EAAE;iBACC,UAAU,CAAC,WAAW,CAAC;iBACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAS,OAAO,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;iBACtD,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC;iBAC9B,EAAE,CAAC,SAAS,CAAC;SACnB,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,EACV,KAAK,EACL,MAAM,EACN,UAAU,EACV,MAAM,EACN,aAAa,GAOd;QAIC,IAAI,EAAE,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QAErD,IAAI,UAAU,EAAE,CAAC;YACf,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,UAAU,GAAG,CAAC,CAAA;QACnD,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;gBACtB,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;YACtE,CAAC;iBAAM,CAAC;gBACN,EAAE,GAAG,EAAE,CAAC,KAAK,CACX,KAAK,MAAM,EAAE,EACb,aAAa,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EACnC,IAAI,IAAI,CAAC,MAAM,CAAC,CACjB,CAAA;YACH,CAAC;QACH,CAAC;QAED,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,MAAM,EAAE,EAAE,aAAa,CAAC,CAAA;QAE7C,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,OAAO,EAAE,CAAA;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;QAE5B,OAAO;YACL,IAAI;YACJ,MAAM,EAAE,QAAQ;gBACd,CAAC,CAAC,MAAM,KAAK,MAAM;oBACjB,CAAC,CAAC,QAAQ,EAAE,IAAI;oBAChB,CAAC,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE;gBACpC,CAAC,CAAC,SAAS;SACd,CAAA;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAY;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE;aACrB,UAAU,CAAC,YAAY,CAAC;aACxB,SAAS,EAAE;aACX,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;QAE3B,OAAO,MAAM,KAAK,CAAC,gBAAgB,EAAE,CAAA;IACvC,CAAC;IAED,KAAK,CAAC,iBAAiB,CACrB,IAAY;QAEZ,OAAO,MAAM,IAAI,CAAC,wBAAwB,EAAE;aACzC,KAAK,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC;aAC1B,gBAAgB,EAAE,CAAA;IACvB,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,EACrB,IAAI,EACJ,KAAK,EACL,MAAM,GAKP;QAQC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAA;QAC9C,IAAI,CAAC,GAAG;YAAE,OAAO,SAAS,CAAA;QAE1B,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAA;QAClC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE;aAClB,UAAU,CAAC,WAAW,CAAC;aACvB,SAAS,EAAE;aACX,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAA;QAE9B,MAAM,MAAM,GAAG,IAAI,yBAAY,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAA;QAC5D,MAAM,gBAAgB,GAAG,IAAA,qBAAQ,EAAC,EAAE,EAAE;YACpC,KAAK;YACL,MAAM;YACN,MAAM;YACN,SAAS,EAAE,KAAK;SACjB,CAAC,CAAA;QAEF,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,OAAO,EAAE,CAAA;QAE/C,OAAO;YACL,GAAG;YACH,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;YAClC,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC;SACtC,CAAA;IACH,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,EACX,IAAI,EACJ,WAAW,GAC6B;QACxC,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aACb,UAAU,CAAC,YAAY,CAAC;aACxB,MAAM,CAAC;YACN,IAAI;YACJ,WAAW;YACX,SAAS,EAAE,IAAI,IAAI,EAAE;SACtB,CAAC;aACD,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE;YACjB,uEAAuE;YACvE,iDAAiD;YACjD,OAAO,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,CAClC,OAAO,WAAW,KAAK,QAAQ;gBAC7B,CAAC,CAAC;oBACE,WAAW;oBACX,SAAS,EAAE,IAAI,IAAI,EAAE;iBACtB;gBACH,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAC9B,CAAA;QACH,CAAC,CAAC;aACD,OAAO,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAa,EAAE,MAAgB;QAC7C,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YACtC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;YACtB,MAAM,KAAK,GAAG,GAAG,CAAC,EAAE;iBACjB,UAAU,CAAC,WAAW,CAAC;iBACvB,MAAM,CACL,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACrB,KAAK;gBACL,KAAK;gBACL,SAAS,EAAE,GAAG;aACf,CAAC,CAAC,CACJ;iBACA,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAA;YAEjE,MAAM,KAAK,CAAC,OAAO,EAAE,CAAA;YAErB,uCAAuC;YACvC,MAAM,GAAG,CAAC,EAAE;iBACT,WAAW,CAAC,YAAY,CAAC;iBACzB,GAAG,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;iBACvB,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC;iBACvB,OAAO,EAAE,CAAA;QACd,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAa,EAAE,MAAgB;QAChD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,OAAM;QACR,CAAC;QACD,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YACtC,MAAM,KAAK,GAAG,GAAG,CAAC,EAAE;iBACjB,UAAU,CAAC,WAAW,CAAC;iBACvB,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC;iBAC1B,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;YAE/B,MAAM,KAAK,CAAC,OAAO,EAAE,CAAA;YAErB,uCAAuC;YACvC,MAAM,GAAG,CAAC,EAAE;iBACT,WAAW,CAAC,YAAY,CAAC;iBACzB,GAAG,CAAC,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;iBAC9B,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC;iBACvB,OAAO,EAAE,CAAA;QACd,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAa;QAC3B,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YACtC,MAAM,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,CAAA;YACzE,MAAM,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,CAAA;QACzE,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,IAAI,CAAC,GAAgD;QACnD,OAAO;YACL,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,SAAS;YACzC,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE;YACtC,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,WAAW,EAAE;SACvC,CAAA;IACH,CAAC;CACF;AA1ND,gCA0NC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atproto/ozone",
|
|
3
|
-
"version": "0.1.
|
|
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.
|
|
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.
|
|
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'
|
package/src/db/pagination.ts
CHANGED
package/src/db/schema/index.ts
CHANGED
|
@@ -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
|
+
}
|
package/src/lexicon/index.ts
CHANGED
|
@@ -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
|
|