@atproto/ozone 0.1.24 → 0.1.26

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 (121) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/api/index.d.ts.map +1 -1
  3. package/dist/api/index.js +8 -0
  4. package/dist/api/index.js.map +1 -1
  5. package/dist/api/proxied.d.ts.map +1 -1
  6. package/dist/api/proxied.js +13 -0
  7. package/dist/api/proxied.js.map +1 -1
  8. package/dist/api/server/getConfig.d.ts.map +1 -1
  9. package/dist/api/server/getConfig.js +4 -3
  10. package/dist/api/server/getConfig.js.map +1 -1
  11. package/dist/api/team/addMember.d.ts +4 -0
  12. package/dist/api/team/addMember.d.ts.map +1 -0
  13. package/dist/api/team/addMember.js +38 -0
  14. package/dist/api/team/addMember.js.map +1 -0
  15. package/dist/api/team/deleteMember.d.ts +4 -0
  16. package/dist/api/team/deleteMember.d.ts.map +1 -0
  17. package/dist/api/team/deleteMember.js +26 -0
  18. package/dist/api/team/deleteMember.js.map +1 -0
  19. package/dist/api/team/listMembers.d.ts +4 -0
  20. package/dist/api/team/listMembers.d.ts.map +1 -0
  21. package/dist/api/team/listMembers.js +20 -0
  22. package/dist/api/team/listMembers.js.map +1 -0
  23. package/dist/api/team/updateMember.d.ts +4 -0
  24. package/dist/api/team/updateMember.d.ts.map +1 -0
  25. package/dist/api/team/updateMember.js +40 -0
  26. package/dist/api/team/updateMember.js.map +1 -0
  27. package/dist/api/util.d.ts +1 -0
  28. package/dist/api/util.d.ts.map +1 -1
  29. package/dist/api/util.js +10 -1
  30. package/dist/api/util.js.map +1 -1
  31. package/dist/auth-verifier.d.ts +3 -6
  32. package/dist/auth-verifier.d.ts.map +1 -1
  33. package/dist/auth-verifier.js +7 -19
  34. package/dist/auth-verifier.js.map +1 -1
  35. package/dist/config/config.d.ts.map +1 -1
  36. package/dist/config/config.js +10 -7
  37. package/dist/config/config.js.map +1 -1
  38. package/dist/context.d.ts +3 -0
  39. package/dist/context.d.ts.map +1 -1
  40. package/dist/context.js +7 -3
  41. package/dist/context.js.map +1 -1
  42. package/dist/db/migrations/20240521T211332580Z-member.d.ts +4 -0
  43. package/dist/db/migrations/20240521T211332580Z-member.d.ts.map +1 -0
  44. package/dist/db/migrations/20240521T211332580Z-member.js +20 -0
  45. package/dist/db/migrations/20240521T211332580Z-member.js.map +1 -0
  46. package/dist/db/migrations/index.d.ts +1 -0
  47. package/dist/db/migrations/index.d.ts.map +1 -1
  48. package/dist/db/migrations/index.js +2 -1
  49. package/dist/db/migrations/index.js.map +1 -1
  50. package/dist/db/schema/index.d.ts +2 -1
  51. package/dist/db/schema/index.d.ts.map +1 -1
  52. package/dist/db/schema/member.d.ts +14 -0
  53. package/dist/db/schema/member.d.ts.map +1 -0
  54. package/dist/db/schema/member.js +5 -0
  55. package/dist/db/schema/member.js.map +1 -0
  56. package/dist/index.d.ts +1 -0
  57. package/dist/index.d.ts.map +1 -1
  58. package/dist/index.js +25 -0
  59. package/dist/index.js.map +1 -1
  60. package/dist/lexicon/index.d.ts +18 -0
  61. package/dist/lexicon/index.d.ts.map +1 -1
  62. package/dist/lexicon/index.js +41 -1
  63. package/dist/lexicon/index.js.map +1 -1
  64. package/dist/lexicon/lexicons.d.ts +204 -0
  65. package/dist/lexicon/lexicons.d.ts.map +1 -1
  66. package/dist/lexicon/lexicons.js +222 -0
  67. package/dist/lexicon/lexicons.js.map +1 -1
  68. package/dist/lexicon/types/tools/ozone/team/addMember.d.ts +40 -0
  69. package/dist/lexicon/types/tools/ozone/team/addMember.d.ts.map +1 -0
  70. package/dist/lexicon/types/tools/ozone/team/addMember.js +3 -0
  71. package/dist/lexicon/types/tools/ozone/team/addMember.js.map +1 -0
  72. package/dist/lexicon/types/tools/ozone/team/defs.d.ts +24 -0
  73. package/dist/lexicon/types/tools/ozone/team/defs.d.ts.map +1 -0
  74. package/dist/lexicon/types/tools/ozone/team/defs.js +22 -0
  75. package/dist/lexicon/types/tools/ozone/team/defs.js.map +1 -0
  76. package/dist/lexicon/types/tools/ozone/team/deleteMember.d.ts +30 -0
  77. package/dist/lexicon/types/tools/ozone/team/deleteMember.d.ts.map +1 -0
  78. package/dist/lexicon/types/tools/ozone/team/deleteMember.js +3 -0
  79. package/dist/lexicon/types/tools/ozone/team/deleteMember.js.map +1 -0
  80. package/dist/lexicon/types/tools/ozone/team/listMembers.d.ts +38 -0
  81. package/dist/lexicon/types/tools/ozone/team/listMembers.d.ts.map +1 -0
  82. package/dist/lexicon/types/tools/ozone/team/listMembers.js +3 -0
  83. package/dist/lexicon/types/tools/ozone/team/listMembers.js.map +1 -0
  84. package/dist/lexicon/types/tools/ozone/team/updateMember.d.ts +41 -0
  85. package/dist/lexicon/types/tools/ozone/team/updateMember.d.ts.map +1 -0
  86. package/dist/lexicon/types/tools/ozone/team/updateMember.js +3 -0
  87. package/dist/lexicon/types/tools/ozone/team/updateMember.js.map +1 -0
  88. package/dist/logger.d.ts +2 -1
  89. package/dist/logger.d.ts.map +1 -1
  90. package/dist/team/index.d.ts +37 -0
  91. package/dist/team/index.d.ts.map +1 -0
  92. package/dist/team/index.js +144 -0
  93. package/dist/team/index.js.map +1 -0
  94. package/package.json +3 -3
  95. package/src/api/index.ts +8 -0
  96. package/src/api/proxied.ts +17 -0
  97. package/src/api/server/getConfig.ts +4 -4
  98. package/src/api/team/addMember.ts +46 -0
  99. package/src/api/team/deleteMember.ts +29 -0
  100. package/src/api/team/listMembers.ts +20 -0
  101. package/src/api/team/updateMember.ts +47 -0
  102. package/src/api/util.ts +15 -0
  103. package/src/auth-verifier.ts +14 -12
  104. package/src/config/config.ts +10 -7
  105. package/src/context.ts +9 -3
  106. package/src/db/migrations/20240521T211332580Z-member.ts +17 -0
  107. package/src/db/migrations/index.ts +1 -0
  108. package/src/db/schema/index.ts +3 -1
  109. package/src/db/schema/member.ts +19 -0
  110. package/src/index.ts +36 -0
  111. package/src/lexicon/index.ts +63 -0
  112. package/src/lexicon/lexicons.ts +225 -0
  113. package/src/lexicon/types/tools/ozone/team/addMember.ts +53 -0
  114. package/src/lexicon/types/tools/ozone/team/defs.ts +42 -0
  115. package/src/lexicon/types/tools/ozone/team/deleteMember.ts +39 -0
  116. package/src/lexicon/types/tools/ozone/team/listMembers.ts +48 -0
  117. package/src/lexicon/types/tools/ozone/team/updateMember.ts +54 -0
  118. package/src/team/index.ts +213 -0
  119. package/tests/__snapshots__/team.test.ts.snap +664 -0
  120. package/tests/get-config.test.ts +3 -4
  121. package/tests/team.test.ts +163 -0
@@ -0,0 +1,40 @@
1
+ /**
2
+ * GENERATED CODE - DO NOT MODIFY
3
+ */
4
+ import express from 'express';
5
+ import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server';
6
+ import * as ToolsOzoneTeamDefs from './defs';
7
+ export interface QueryParams {
8
+ }
9
+ export interface InputSchema {
10
+ did: string;
11
+ role: 'tools.ozone.team.defs#roleAdmin' | 'tools.ozone.team.defs#roleModerator' | 'tools.ozone.team.defs#roleTriage' | (string & {});
12
+ [k: string]: unknown;
13
+ }
14
+ export type OutputSchema = ToolsOzoneTeamDefs.Member;
15
+ export interface HandlerInput {
16
+ encoding: 'application/json';
17
+ body: InputSchema;
18
+ }
19
+ export interface HandlerSuccess {
20
+ encoding: 'application/json';
21
+ body: OutputSchema;
22
+ headers?: {
23
+ [key: string]: string;
24
+ };
25
+ }
26
+ export interface HandlerError {
27
+ status: number;
28
+ message?: string;
29
+ error?: 'MemberAlreadyExists';
30
+ }
31
+ export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough;
32
+ export type HandlerReqCtx<HA extends HandlerAuth = never> = {
33
+ auth: HA;
34
+ params: QueryParams;
35
+ input: HandlerInput;
36
+ req: express.Request;
37
+ res: express.Response;
38
+ };
39
+ export type Handler<HA extends HandlerAuth = never> = (ctx: HandlerReqCtx<HA>) => Promise<HandlerOutput> | HandlerOutput;
40
+ //# sourceMappingURL=addMember.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addMember.d.ts","sourceRoot":"","sources":["../../../../../../src/lexicon/types/tools/ozone/team/addMember.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,OAAO,MAAM,SAAS,CAAA;AAK7B,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACtE,OAAO,KAAK,kBAAkB,MAAM,QAAQ,CAAA;AAE5C,MAAM,WAAW,WAAW;CAAG;AAE/B,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EACA,iCAAiC,GACjC,qCAAqC,GACrC,kCAAkC,GAClC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;IACjB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CACrB;AAED,MAAM,MAAM,YAAY,GAAG,kBAAkB,CAAC,MAAM,CAAA;AAEpD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,IAAI,EAAE,WAAW,CAAA;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,IAAI,EAAE,YAAY,CAAA;IAClB,OAAO,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAA;CACpC;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,qBAAqB,CAAA;CAC9B;AAED,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,cAAc,GAAG,kBAAkB,CAAA;AAC9E,MAAM,MAAM,aAAa,CAAC,EAAE,SAAS,WAAW,GAAG,KAAK,IAAI;IAC1D,IAAI,EAAE,EAAE,CAAA;IACR,MAAM,EAAE,WAAW,CAAA;IACnB,KAAK,EAAE,YAAY,CAAA;IACnB,GAAG,EAAE,OAAO,CAAC,OAAO,CAAA;IACpB,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAA;CACtB,CAAA;AACD,MAAM,MAAM,OAAO,CAAC,EAAE,SAAS,WAAW,GAAG,KAAK,IAAI,CACpD,GAAG,EAAE,aAAa,CAAC,EAAE,CAAC,KACnB,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa,CAAA"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=addMember.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addMember.js","sourceRoot":"","sources":["../../../../../../src/lexicon/types/tools/ozone/team/addMember.ts"],"names":[],"mappings":""}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * GENERATED CODE - DO NOT MODIFY
3
+ */
4
+ import { ValidationResult } from '@atproto/lexicon';
5
+ import * as AppBskyActorDefs from '../../../app/bsky/actor/defs';
6
+ export interface Member {
7
+ did: string;
8
+ disabled?: boolean;
9
+ profile?: AppBskyActorDefs.ProfileViewDetailed;
10
+ createdAt?: string;
11
+ updatedAt?: string;
12
+ lastUpdatedBy?: string;
13
+ role: 'lex:tools.ozone.team.defs#roleAdmin' | 'lex:tools.ozone.team.defs#roleModerator' | 'lex:tools.ozone.team.defs#roleTriage' | (string & {});
14
+ [k: string]: unknown;
15
+ }
16
+ export declare function isMember(v: unknown): v is Member;
17
+ export declare function validateMember(v: unknown): ValidationResult;
18
+ /** Admin role. Highest level of access, can perform all actions. */
19
+ export declare const ROLEADMIN = "tools.ozone.team.defs#roleAdmin";
20
+ /** Moderator role. Can perform most actions. */
21
+ export declare const ROLEMODERATOR = "tools.ozone.team.defs#roleModerator";
22
+ /** Triage role. Mostly intended for monitoring and escalating issues. */
23
+ export declare const ROLETRIAGE = "tools.ozone.team.defs#roleTriage";
24
+ //# sourceMappingURL=defs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defs.d.ts","sourceRoot":"","sources":["../../../../../../src/lexicon/types/tools/ozone/team/defs.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,gBAAgB,EAAW,MAAM,kBAAkB,CAAA;AAI5D,OAAO,KAAK,gBAAgB,MAAM,8BAA8B,CAAA;AAEhE,MAAM,WAAW,MAAM;IACrB,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,OAAO,CAAC,EAAE,gBAAgB,CAAC,mBAAmB,CAAA;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,IAAI,EACA,qCAAqC,GACrC,yCAAyC,GACzC,sCAAsC,GACtC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;IACjB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CACrB;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,MAAM,CAMhD;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,GAAG,gBAAgB,CAE3D;AAED,oEAAoE;AACpE,eAAO,MAAM,SAAS,oCAAoC,CAAA;AAC1D,gDAAgD;AAChD,eAAO,MAAM,aAAa,wCAAwC,CAAA;AAClE,yEAAyE;AACzE,eAAO,MAAM,UAAU,qCAAqC,CAAA"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ROLETRIAGE = exports.ROLEMODERATOR = exports.ROLEADMIN = exports.validateMember = exports.isMember = void 0;
4
+ const lexicons_1 = require("../../../../lexicons");
5
+ const util_1 = require("../../../../util");
6
+ function isMember(v) {
7
+ return ((0, util_1.isObj)(v) &&
8
+ (0, util_1.hasProp)(v, '$type') &&
9
+ v.$type === 'tools.ozone.team.defs#member');
10
+ }
11
+ exports.isMember = isMember;
12
+ function validateMember(v) {
13
+ return lexicons_1.lexicons.validate('tools.ozone.team.defs#member', v);
14
+ }
15
+ exports.validateMember = validateMember;
16
+ /** Admin role. Highest level of access, can perform all actions. */
17
+ exports.ROLEADMIN = 'tools.ozone.team.defs#roleAdmin';
18
+ /** Moderator role. Can perform most actions. */
19
+ exports.ROLEMODERATOR = 'tools.ozone.team.defs#roleModerator';
20
+ /** Triage role. Mostly intended for monitoring and escalating issues. */
21
+ exports.ROLETRIAGE = 'tools.ozone.team.defs#roleTriage';
22
+ //# sourceMappingURL=defs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defs.js","sourceRoot":"","sources":["../../../../../../src/lexicon/types/tools/ozone/team/defs.ts"],"names":[],"mappings":";;;AAIA,mDAA+C;AAC/C,2CAAiD;AAmBjD,SAAgB,QAAQ,CAAC,CAAU;IACjC,OAAO,CACL,IAAA,YAAK,EAAC,CAAC,CAAC;QACR,IAAA,cAAO,EAAC,CAAC,EAAE,OAAO,CAAC;QACnB,CAAC,CAAC,KAAK,KAAK,8BAA8B,CAC3C,CAAA;AACH,CAAC;AAND,4BAMC;AAED,SAAgB,cAAc,CAAC,CAAU;IACvC,OAAO,mBAAQ,CAAC,QAAQ,CAAC,8BAA8B,EAAE,CAAC,CAAC,CAAA;AAC7D,CAAC;AAFD,wCAEC;AAED,oEAAoE;AACvD,QAAA,SAAS,GAAG,iCAAiC,CAAA;AAC1D,gDAAgD;AACnC,QAAA,aAAa,GAAG,qCAAqC,CAAA;AAClE,yEAAyE;AAC5D,QAAA,UAAU,GAAG,kCAAkC,CAAA"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * GENERATED CODE - DO NOT MODIFY
3
+ */
4
+ import express from 'express';
5
+ import { HandlerAuth } from '@atproto/xrpc-server';
6
+ export interface QueryParams {
7
+ }
8
+ export interface InputSchema {
9
+ did: string;
10
+ [k: string]: unknown;
11
+ }
12
+ export interface HandlerInput {
13
+ encoding: 'application/json';
14
+ body: InputSchema;
15
+ }
16
+ export interface HandlerError {
17
+ status: number;
18
+ message?: string;
19
+ error?: 'MemberNotFound';
20
+ }
21
+ export type HandlerOutput = HandlerError | void;
22
+ export type HandlerReqCtx<HA extends HandlerAuth = never> = {
23
+ auth: HA;
24
+ params: QueryParams;
25
+ input: HandlerInput;
26
+ req: express.Request;
27
+ res: express.Response;
28
+ };
29
+ export type Handler<HA extends HandlerAuth = never> = (ctx: HandlerReqCtx<HA>) => Promise<HandlerOutput> | HandlerOutput;
30
+ //# sourceMappingURL=deleteMember.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deleteMember.d.ts","sourceRoot":"","sources":["../../../../../../src/lexicon/types/tools/ozone/team/deleteMember.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,OAAO,MAAM,SAAS,CAAA;AAK7B,OAAO,EAAE,WAAW,EAAsB,MAAM,sBAAsB,CAAA;AAEtE,MAAM,WAAW,WAAW;CAAG;AAE/B,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,IAAI,EAAE,WAAW,CAAA;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,gBAAgB,CAAA;CACzB;AAED,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,IAAI,CAAA;AAC/C,MAAM,MAAM,aAAa,CAAC,EAAE,SAAS,WAAW,GAAG,KAAK,IAAI;IAC1D,IAAI,EAAE,EAAE,CAAA;IACR,MAAM,EAAE,WAAW,CAAA;IACnB,KAAK,EAAE,YAAY,CAAA;IACnB,GAAG,EAAE,OAAO,CAAC,OAAO,CAAA;IACpB,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAA;CACtB,CAAA;AACD,MAAM,MAAM,OAAO,CAAC,EAAE,SAAS,WAAW,GAAG,KAAK,IAAI,CACpD,GAAG,EAAE,aAAa,CAAC,EAAE,CAAC,KACnB,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa,CAAA"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=deleteMember.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deleteMember.js","sourceRoot":"","sources":["../../../../../../src/lexicon/types/tools/ozone/team/deleteMember.ts"],"names":[],"mappings":""}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * GENERATED CODE - DO NOT MODIFY
3
+ */
4
+ import express from 'express';
5
+ import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server';
6
+ import * as ToolsOzoneTeamDefs from './defs';
7
+ export interface QueryParams {
8
+ limit: number;
9
+ cursor?: string;
10
+ }
11
+ export type InputSchema = undefined;
12
+ export interface OutputSchema {
13
+ cursor?: string;
14
+ members: ToolsOzoneTeamDefs.Member[];
15
+ [k: string]: unknown;
16
+ }
17
+ export type HandlerInput = undefined;
18
+ export interface HandlerSuccess {
19
+ encoding: 'application/json';
20
+ body: OutputSchema;
21
+ headers?: {
22
+ [key: string]: string;
23
+ };
24
+ }
25
+ export interface HandlerError {
26
+ status: number;
27
+ message?: string;
28
+ }
29
+ export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough;
30
+ export type HandlerReqCtx<HA extends HandlerAuth = never> = {
31
+ auth: HA;
32
+ params: QueryParams;
33
+ input: HandlerInput;
34
+ req: express.Request;
35
+ res: express.Response;
36
+ };
37
+ export type Handler<HA extends HandlerAuth = never> = (ctx: HandlerReqCtx<HA>) => Promise<HandlerOutput> | HandlerOutput;
38
+ //# sourceMappingURL=listMembers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listMembers.d.ts","sourceRoot":"","sources":["../../../../../../src/lexicon/types/tools/ozone/team/listMembers.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,OAAO,MAAM,SAAS,CAAA;AAK7B,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACtE,OAAO,KAAK,kBAAkB,MAAM,QAAQ,CAAA;AAE5C,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,MAAM,WAAW,GAAG,SAAS,CAAA;AAEnC,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,kBAAkB,CAAC,MAAM,EAAE,CAAA;IACpC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CACrB;AAED,MAAM,MAAM,YAAY,GAAG,SAAS,CAAA;AAEpC,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,IAAI,EAAE,YAAY,CAAA;IAClB,OAAO,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAA;CACpC;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,cAAc,GAAG,kBAAkB,CAAA;AAC9E,MAAM,MAAM,aAAa,CAAC,EAAE,SAAS,WAAW,GAAG,KAAK,IAAI;IAC1D,IAAI,EAAE,EAAE,CAAA;IACR,MAAM,EAAE,WAAW,CAAA;IACnB,KAAK,EAAE,YAAY,CAAA;IACnB,GAAG,EAAE,OAAO,CAAC,OAAO,CAAA;IACpB,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAA;CACtB,CAAA;AACD,MAAM,MAAM,OAAO,CAAC,EAAE,SAAS,WAAW,GAAG,KAAK,IAAI,CACpD,GAAG,EAAE,aAAa,CAAC,EAAE,CAAC,KACnB,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa,CAAA"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=listMembers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listMembers.js","sourceRoot":"","sources":["../../../../../../src/lexicon/types/tools/ozone/team/listMembers.ts"],"names":[],"mappings":""}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * GENERATED CODE - DO NOT MODIFY
3
+ */
4
+ import express from 'express';
5
+ import { HandlerAuth, HandlerPipeThrough } from '@atproto/xrpc-server';
6
+ import * as ToolsOzoneTeamDefs from './defs';
7
+ export interface QueryParams {
8
+ }
9
+ export interface InputSchema {
10
+ did: string;
11
+ disabled?: boolean;
12
+ role?: 'tools.ozone.team.defs#roleAdmin' | 'tools.ozone.team.defs#roleModerator' | 'tools.ozone.team.defs#roleTriage' | (string & {});
13
+ [k: string]: unknown;
14
+ }
15
+ export type OutputSchema = ToolsOzoneTeamDefs.Member;
16
+ export interface HandlerInput {
17
+ encoding: 'application/json';
18
+ body: InputSchema;
19
+ }
20
+ export interface HandlerSuccess {
21
+ encoding: 'application/json';
22
+ body: OutputSchema;
23
+ headers?: {
24
+ [key: string]: string;
25
+ };
26
+ }
27
+ export interface HandlerError {
28
+ status: number;
29
+ message?: string;
30
+ error?: 'MemberNotFound';
31
+ }
32
+ export type HandlerOutput = HandlerError | HandlerSuccess | HandlerPipeThrough;
33
+ export type HandlerReqCtx<HA extends HandlerAuth = never> = {
34
+ auth: HA;
35
+ params: QueryParams;
36
+ input: HandlerInput;
37
+ req: express.Request;
38
+ res: express.Response;
39
+ };
40
+ export type Handler<HA extends HandlerAuth = never> = (ctx: HandlerReqCtx<HA>) => Promise<HandlerOutput> | HandlerOutput;
41
+ //# sourceMappingURL=updateMember.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateMember.d.ts","sourceRoot":"","sources":["../../../../../../src/lexicon/types/tools/ozone/team/updateMember.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,OAAO,MAAM,SAAS,CAAA;AAK7B,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACtE,OAAO,KAAK,kBAAkB,MAAM,QAAQ,CAAA;AAE5C,MAAM,WAAW,WAAW;CAAG;AAE/B,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,IAAI,CAAC,EACD,iCAAiC,GACjC,qCAAqC,GACrC,kCAAkC,GAClC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;IACjB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;CACrB;AAED,MAAM,MAAM,YAAY,GAAG,kBAAkB,CAAC,MAAM,CAAA;AAEpD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,IAAI,EAAE,WAAW,CAAA;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,IAAI,EAAE,YAAY,CAAA;IAClB,OAAO,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,CAAA;CACpC;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,gBAAgB,CAAA;CACzB;AAED,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,cAAc,GAAG,kBAAkB,CAAA;AAC9E,MAAM,MAAM,aAAa,CAAC,EAAE,SAAS,WAAW,GAAG,KAAK,IAAI;IAC1D,IAAI,EAAE,EAAE,CAAA;IACR,MAAM,EAAE,WAAW,CAAA;IACnB,KAAK,EAAE,YAAY,CAAA;IACnB,GAAG,EAAE,OAAO,CAAC,OAAO,CAAA;IACpB,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAA;CACtB,CAAA;AACD,MAAM,MAAM,OAAO,CAAC,EAAE,SAAS,WAAW,GAAG,KAAK,IAAI,CACpD,GAAG,EAAE,aAAa,CAAC,EAAE,CAAC,KACnB,OAAO,CAAC,aAAa,CAAC,GAAG,aAAa,CAAA"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=updateMember.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"updateMember.js","sourceRoot":"","sources":["../../../../../../src/lexicon/types/tools/ozone/team/updateMember.ts"],"names":[],"mappings":""}
package/dist/logger.d.ts CHANGED
@@ -1,7 +1,8 @@
1
+ /// <reference types="node/http" />
1
2
  import { subsystemLogger } from '@atproto/common';
2
3
  export declare const dbLogger: ReturnType<typeof subsystemLogger>;
3
4
  export declare const seqLogger: ReturnType<typeof subsystemLogger>;
4
5
  export declare const httpLogger: ReturnType<typeof subsystemLogger>;
5
6
  export declare const langLogger: ReturnType<typeof subsystemLogger>;
6
- export declare const loggerMiddleware: import("pino-http").HttpLogger;
7
+ export declare const loggerMiddleware: import("pino-http").HttpLogger<import("http").IncomingMessage, import("http").ServerResponse<import("http").IncomingMessage>, never>;
7
8
  //# sourceMappingURL=logger.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEjD,eAAO,MAAM,QAAQ,EAAE,UAAU,CAAC,OAAO,eAAe,CAC3B,CAAA;AAC7B,eAAO,MAAM,SAAS,EAAE,UAAU,CAAC,OAAO,eAAe,CACrB,CAAA;AACpC,eAAO,MAAM,UAAU,EAAE,UAAU,CAAC,OAAO,eAAe,CAChC,CAAA;AAC1B,eAAO,MAAM,UAAU,EAAE,UAAU,CAAC,OAAO,eAAe,CAC3B,CAAA;AAE/B,eAAO,MAAM,gBAAgB,gCAU3B,CAAA"}
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEjD,eAAO,MAAM,QAAQ,EAAE,UAAU,CAAC,OAAO,eAAe,CAC3B,CAAA;AAC7B,eAAO,MAAM,SAAS,EAAE,UAAU,CAAC,OAAO,eAAe,CACrB,CAAA;AACpC,eAAO,MAAM,UAAU,EAAE,UAAU,CAAC,OAAO,eAAe,CAChC,CAAA;AAC1B,eAAO,MAAM,UAAU,EAAE,UAAU,CAAC,OAAO,eAAe,CAC3B,CAAA;AAE/B,eAAO,MAAM,gBAAgB,sIAU3B,CAAA"}
@@ -0,0 +1,37 @@
1
+ import Database from '../db';
2
+ import { Selectable } from 'kysely';
3
+ import { Member } from '../db/schema/member';
4
+ import { Member as TeamMember } from '../lexicon/types/tools/ozone/team/defs';
5
+ import { ProfileViewDetailed } from '../lexicon/types/app/bsky/actor/defs';
6
+ import AppContext from '../context';
7
+ export type TeamServiceCreator = (db: Database) => TeamService;
8
+ export declare class TeamService {
9
+ db: Database;
10
+ constructor(db: Database);
11
+ static creator(): (db: Database) => TeamService;
12
+ list({ cursor, limit, }: {
13
+ cursor?: string;
14
+ limit?: number;
15
+ }): Promise<{
16
+ members: Selectable<Member>[];
17
+ cursor?: string;
18
+ }>;
19
+ create({ role, did, disabled, updatedAt, createdAt, lastUpdatedBy, }: Omit<Selectable<Member>, 'createdAt' | 'updatedAt'> & {
20
+ createdAt?: Date;
21
+ updatedAt?: Date;
22
+ }): Promise<Selectable<Member>>;
23
+ upsert({ role, did, lastUpdatedBy, }: Pick<Selectable<Member>, 'role' | 'did' | 'lastUpdatedBy'>): Promise<void>;
24
+ update(did: string, updates: Partial<Pick<Selectable<Member>, 'role' | 'disabled' | 'lastUpdatedBy' | 'updatedAt'>>): Promise<Selectable<Member>>;
25
+ delete(did: string): Promise<void>;
26
+ assertCanDelete(did: string): Promise<void>;
27
+ doesMemberExist(did: string): Promise<boolean>;
28
+ getMember(did: string): Promise<Selectable<Member> | undefined>;
29
+ getMemberRole(member?: Selectable<Member>): {
30
+ isModerator: boolean;
31
+ isAdmin: boolean;
32
+ isTriage: boolean;
33
+ };
34
+ getProfiles(dids: string[], ctx: AppContext): Promise<Map<string, ProfileViewDetailed>>;
35
+ view(members: Selectable<Member>[], ctx: AppContext): Promise<TeamMember[]>;
36
+ }
37
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/team/index.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,OAAO,CAAA;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAE,MAAM,IAAI,UAAU,EAAE,MAAM,wCAAwC,CAAA;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAA;AAG1E,OAAO,UAAU,MAAM,YAAY,CAAA;AAGnC,MAAM,MAAM,kBAAkB,GAAG,CAAC,EAAE,EAAE,QAAQ,KAAK,WAAW,CAAA;AAE9D,qBAAa,WAAW;IACH,EAAE,EAAE,QAAQ;gBAAZ,EAAE,EAAE,QAAQ;IAE/B,MAAM,CAAC,OAAO,SACA,QAAQ;IAGhB,IAAI,CAAC,EACT,MAAM,EACN,KAAU,GACX,EAAE;QACD,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,KAAK,CAAC,EAAE,MAAM,CAAA;KACf,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAazD,MAAM,CAAC,EACX,IAAI,EACJ,GAAG,EACH,QAAQ,EACR,SAAS,EACT,SAAS,EACT,aAAa,GACd,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,WAAW,CAAC,GAAG;QACvD,SAAS,CAAC,EAAE,IAAI,CAAA;QAChB,SAAS,CAAC,EAAE,IAAI,CAAA;KACjB,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAkBzB,MAAM,CAAC,EACX,IAAI,EACJ,GAAG,EACH,aAAa,GACd,EAAE,IAAI,CACL,UAAU,CAAC,MAAM,CAAC,EAClB,MAAM,GAAG,KAAK,GAAG,eAAe,CACjC,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBX,MAAM,CACV,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,OAAO,CACd,IAAI,CACF,UAAU,CAAC,MAAM,CAAC,EAClB,MAAM,GAAG,UAAU,GAAG,eAAe,GAAG,WAAW,CACpD,CACF,GACA,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IAiBxB,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlC,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ3C,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU9C,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;IAUrE,aAAa,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC;;;;;IAenC,WAAW,CACf,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,UAAU,GACd,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IA0BtC,IAAI,CACR,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,EAC7B,GAAG,EAAE,UAAU,GACd,OAAO,CAAC,UAAU,EAAE,CAAC;CAiBzB"}
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TeamService = void 0;
4
+ const xrpc_server_1 = require("@atproto/xrpc-server");
5
+ const common_1 = require("@atproto/common");
6
+ const logger_1 = require("../logger");
7
+ class TeamService {
8
+ constructor(db) {
9
+ Object.defineProperty(this, "db", {
10
+ enumerable: true,
11
+ configurable: true,
12
+ writable: true,
13
+ value: db
14
+ });
15
+ }
16
+ static creator() {
17
+ return (db) => new TeamService(db);
18
+ }
19
+ async list({ cursor, limit = 25, }) {
20
+ let builder = this.db.db.selectFrom('member').selectAll();
21
+ if (cursor) {
22
+ builder = builder.where('createdAt', '>', new Date(cursor));
23
+ }
24
+ const members = await builder
25
+ .limit(limit)
26
+ .orderBy('createdAt', 'asc')
27
+ .execute();
28
+ return { members, cursor: members.at(-1)?.createdAt.toISOString() };
29
+ }
30
+ async create({ role, did, disabled, updatedAt, createdAt, lastUpdatedBy, }) {
31
+ const now = new Date();
32
+ const newMember = await this.db.db
33
+ .insertInto('member')
34
+ .values({
35
+ role,
36
+ did,
37
+ disabled,
38
+ lastUpdatedBy,
39
+ updatedAt: updatedAt || now,
40
+ createdAt: createdAt || now,
41
+ })
42
+ .returningAll()
43
+ .executeTakeFirstOrThrow();
44
+ return newMember;
45
+ }
46
+ async upsert({ role, did, lastUpdatedBy, }) {
47
+ const now = new Date();
48
+ await this.db.db
49
+ .insertInto('member')
50
+ .values({
51
+ role,
52
+ did,
53
+ lastUpdatedBy,
54
+ disabled: false,
55
+ updatedAt: now,
56
+ createdAt: now,
57
+ })
58
+ .onConflict((oc) => oc.column('did').doUpdateSet({ role, updatedAt: now, lastUpdatedBy }))
59
+ .execute();
60
+ }
61
+ async update(did, updates) {
62
+ const { role, disabled, lastUpdatedBy, updatedAt = new Date() } = updates;
63
+ const updatedMember = await this.db.db
64
+ .updateTable('member')
65
+ .where('did', '=', did)
66
+ .set({
67
+ role,
68
+ disabled,
69
+ lastUpdatedBy,
70
+ updatedAt,
71
+ })
72
+ .returningAll()
73
+ .executeTakeFirstOrThrow();
74
+ return updatedMember;
75
+ }
76
+ async delete(did) {
77
+ await this.db.db.deleteFrom('member').where('did', '=', did).execute();
78
+ }
79
+ async assertCanDelete(did) {
80
+ const memberExists = await this.doesMemberExist(did);
81
+ if (!memberExists) {
82
+ throw new xrpc_server_1.InvalidRequestError('member not found', 'MemberNotFound');
83
+ }
84
+ }
85
+ async doesMemberExist(did) {
86
+ const member = await this.db.db
87
+ .selectFrom('member')
88
+ .select('did')
89
+ .where('did', '=', did)
90
+ .executeTakeFirst();
91
+ return !!member;
92
+ }
93
+ async getMember(did) {
94
+ const member = await this.db.db
95
+ .selectFrom('member')
96
+ .selectAll()
97
+ .where('did', '=', did)
98
+ .executeTakeFirst();
99
+ return member;
100
+ }
101
+ getMemberRole(member) {
102
+ const isAdmin = member?.role === 'tools.ozone.team.defs#roleAdmin';
103
+ const isModerator = isAdmin || member?.role === 'tools.ozone.team.defs#roleModerator';
104
+ const isTriage = isModerator || member?.role === 'tools.ozone.team.defs#roleTriage';
105
+ return {
106
+ isModerator,
107
+ isAdmin,
108
+ isTriage,
109
+ };
110
+ }
111
+ // getProfiles() only allows 25 DIDs at a time so we need to query in chunks
112
+ async getProfiles(dids, ctx) {
113
+ const profiles = new Map();
114
+ try {
115
+ const headers = await ctx.appviewAuth();
116
+ for (const actors of (0, common_1.chunkArray)(dids, 25)) {
117
+ const { data } = await ctx.appviewAgent.api.app.bsky.actor.getProfiles({ actors }, headers);
118
+ data.profiles.forEach((profile) => {
119
+ profiles.set(profile.did, profile);
120
+ });
121
+ }
122
+ }
123
+ catch (error) {
124
+ logger_1.httpLogger.error({ error, dids }, 'Failed to get profiles for team members');
125
+ }
126
+ return profiles;
127
+ }
128
+ async view(members, ctx) {
129
+ const profiles = await this.getProfiles(members.map(({ did }) => did), ctx);
130
+ return members.map((member) => {
131
+ return {
132
+ did: member.did,
133
+ role: member.role,
134
+ disabled: member.disabled,
135
+ profile: profiles.get(member.did),
136
+ createdAt: member.createdAt.toISOString(),
137
+ updatedAt: member.updatedAt.toISOString(),
138
+ lastUpdatedBy: member.lastUpdatedBy,
139
+ };
140
+ });
141
+ }
142
+ }
143
+ exports.TeamService = TeamService;
144
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/team/index.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.24",
3
+ "version": "0.1.26",
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.12.19",
35
+ "@atproto/api": "^0.12.21",
36
36
  "@atproto/common": "^0.4.0",
37
37
  "@atproto/crypto": "^0.4.0",
38
38
  "@atproto/identity": "^0.4.0",
@@ -52,7 +52,7 @@
52
52
  "jest": "^28.1.2",
53
53
  "ts-node": "^10.8.2",
54
54
  "@atproto/lex-cli": "^0.4.0",
55
- "@atproto/pds": "^0.4.34"
55
+ "@atproto/pds": "^0.4.37"
56
56
  },
57
57
  "scripts": {
58
58
  "codegen": "lex gen-server ./src/lexicon ../../lexicons/com/atproto/*/* ../../lexicons/app/bsky/*/* ../../lexicons/chat/bsky/*/* ../../lexicons/tools/ozone/*/*",
package/src/api/index.ts CHANGED
@@ -15,6 +15,10 @@ import createTemplate from './communication/createTemplate'
15
15
  import updateTemplate from './communication/updateTemplate'
16
16
  import deleteTemplate from './communication/deleteTemplate'
17
17
  import listTemplates from './communication/listTemplates'
18
+ import addMember from './team/addMember'
19
+ import updateMember from './team/updateMember'
20
+ import deleteMember from './team/deleteMember'
21
+ import listMembers from './team/listMembers'
18
22
  import getConfig from './server/getConfig'
19
23
  import chat from './chat'
20
24
  import proxied from './proxied'
@@ -39,6 +43,10 @@ export default function (server: Server, ctx: AppContext) {
39
43
  createTemplate(server, ctx)
40
44
  updateTemplate(server, ctx)
41
45
  deleteTemplate(server, ctx)
46
+ listMembers(server, ctx)
47
+ addMember(server, ctx)
48
+ updateMember(server, ctx)
49
+ deleteMember(server, ctx)
42
50
  chat(server, ctx)
43
51
  proxied(server, ctx)
44
52
  getConfig(server, ctx)
@@ -141,4 +141,21 @@ export default function (server: Server, ctx: AppContext) {
141
141
  }
142
142
  },
143
143
  })
144
+
145
+ server.com.atproto.admin.searchAccounts({
146
+ auth: ctx.authVerifier.moderator,
147
+ handler: async (request) => {
148
+ if (!ctx.pdsAgent) {
149
+ throw new Error('PDS not configured')
150
+ }
151
+ const res = await ctx.pdsAgent.api.com.atproto.admin.searchAccounts(
152
+ request.params,
153
+ await ctx.pdsAuth(),
154
+ )
155
+ return {
156
+ encoding: 'application/json',
157
+ body: res.data,
158
+ }
159
+ },
160
+ })
144
161
  }
@@ -1,4 +1,4 @@
1
- import { Server } from '../../lexicon'
1
+ import { Server, TOOLS_OZONE_TEAM } from '../../lexicon'
2
2
  import AppContext from '../../context'
3
3
 
4
4
  export default function (server: Server, ctx: AppContext) {
@@ -22,10 +22,10 @@ export default function (server: Server, ctx: AppContext) {
22
22
  },
23
23
  viewer: {
24
24
  role: auth.credentials.isAdmin
25
- ? 'tools.ozone.moderator.defs#modRoleAdmin'
25
+ ? TOOLS_OZONE_TEAM.DefsRoleAdmin
26
26
  : auth.credentials.isModerator
27
- ? 'tools.ozone.moderator.defs#modRoleModerator'
28
- : 'tools.ozone.moderator.defs#modRoleTriage',
27
+ ? TOOLS_OZONE_TEAM.DefsRoleModerator
28
+ : TOOLS_OZONE_TEAM.DefsRoleTriage,
29
29
  },
30
30
  },
31
31
  }
@@ -0,0 +1,46 @@
1
+ import { AuthRequiredError, InvalidRequestError } from '@atproto/xrpc-server'
2
+ import { Server } from '../../lexicon'
3
+ import AppContext from '../../context'
4
+ import { getMemberRole } from '../util'
5
+
6
+ export default function (server: Server, ctx: AppContext) {
7
+ server.tools.ozone.team.addMember({
8
+ auth: ctx.authVerifier.modOrAdminToken,
9
+ handler: async ({ input, auth }) => {
10
+ const access = auth.credentials
11
+ const db = ctx.db
12
+ const { did, role } = input.body
13
+
14
+ if (!access.isAdmin) {
15
+ throw new AuthRequiredError('Must be an admin to add a member')
16
+ }
17
+
18
+ const newMember = await db.transaction(async (dbTxn) => {
19
+ const teamService = ctx.teamService(dbTxn)
20
+ const alreadyExists = await teamService.doesMemberExist(did)
21
+
22
+ if (alreadyExists) {
23
+ throw new InvalidRequestError(
24
+ 'member already exists',
25
+ 'MemberAlreadyExists',
26
+ )
27
+ }
28
+
29
+ const member = await teamService.create({
30
+ did,
31
+ disabled: false,
32
+ role: getMemberRole(role),
33
+ lastUpdatedBy:
34
+ access.type === 'admin_token' ? 'admin_token' : access.iss,
35
+ })
36
+ const memberView = await teamService.view([member], ctx)
37
+ return memberView[0]
38
+ })
39
+
40
+ return {
41
+ encoding: 'application/json',
42
+ body: newMember,
43
+ }
44
+ },
45
+ })
46
+ }