@atproto/ozone 0.1.25 → 0.1.27

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 (158) hide show
  1. package/CHANGELOG.md +19 -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 +30 -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/context.d.ts +3 -0
  36. package/dist/context.d.ts.map +1 -1
  37. package/dist/context.js +7 -3
  38. package/dist/context.js.map +1 -1
  39. package/dist/db/migrations/20240521T211332580Z-member.d.ts +4 -0
  40. package/dist/db/migrations/20240521T211332580Z-member.d.ts.map +1 -0
  41. package/dist/db/migrations/20240521T211332580Z-member.js +20 -0
  42. package/dist/db/migrations/20240521T211332580Z-member.js.map +1 -0
  43. package/dist/db/migrations/index.d.ts +1 -0
  44. package/dist/db/migrations/index.d.ts.map +1 -1
  45. package/dist/db/migrations/index.js +2 -1
  46. package/dist/db/migrations/index.js.map +1 -1
  47. package/dist/db/schema/index.d.ts +2 -1
  48. package/dist/db/schema/index.d.ts.map +1 -1
  49. package/dist/db/schema/member.d.ts +14 -0
  50. package/dist/db/schema/member.d.ts.map +1 -0
  51. package/dist/db/schema/member.js +5 -0
  52. package/dist/db/schema/member.js.map +1 -0
  53. package/dist/index.d.ts +1 -0
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +25 -0
  56. package/dist/index.js.map +1 -1
  57. package/dist/lexicon/index.d.ts +25 -0
  58. package/dist/lexicon/index.d.ts.map +1 -1
  59. package/dist/lexicon/index.js +54 -1
  60. package/dist/lexicon/index.js.map +1 -1
  61. package/dist/lexicon/lexicons.d.ts +536 -0
  62. package/dist/lexicon/lexicons.d.ts.map +1 -1
  63. package/dist/lexicon/lexicons.js +561 -1
  64. package/dist/lexicon/lexicons.js.map +1 -1
  65. package/dist/lexicon/types/app/bsky/actor/defs.d.ts +5 -0
  66. package/dist/lexicon/types/app/bsky/actor/defs.d.ts.map +1 -1
  67. package/dist/lexicon/types/app/bsky/actor/defs.js.map +1 -1
  68. package/dist/lexicon/types/app/bsky/actor/profile.d.ts +3 -0
  69. package/dist/lexicon/types/app/bsky/actor/profile.d.ts.map +1 -1
  70. package/dist/lexicon/types/app/bsky/actor/profile.js.map +1 -1
  71. package/dist/lexicon/types/app/bsky/graph/defs.d.ts +36 -1
  72. package/dist/lexicon/types/app/bsky/graph/defs.d.ts.map +1 -1
  73. package/dist/lexicon/types/app/bsky/graph/defs.js +23 -1
  74. package/dist/lexicon/types/app/bsky/graph/defs.js.map +1 -1
  75. package/dist/lexicon/types/app/bsky/graph/getActorStarterPacks.d.ts +39 -0
  76. package/dist/lexicon/types/app/bsky/graph/getActorStarterPacks.d.ts.map +1 -0
  77. package/dist/lexicon/types/app/bsky/graph/getActorStarterPacks.js +3 -0
  78. package/dist/lexicon/types/app/bsky/graph/getActorStarterPacks.js.map +1 -0
  79. package/dist/lexicon/types/app/bsky/graph/getStarterPack.d.ts +37 -0
  80. package/dist/lexicon/types/app/bsky/graph/getStarterPack.d.ts.map +1 -0
  81. package/dist/lexicon/types/app/bsky/graph/getStarterPack.js +3 -0
  82. package/dist/lexicon/types/app/bsky/graph/getStarterPack.js.map +1 -0
  83. package/dist/lexicon/types/app/bsky/graph/getStarterPacks.d.ts +36 -0
  84. package/dist/lexicon/types/app/bsky/graph/getStarterPacks.d.ts.map +1 -0
  85. package/dist/lexicon/types/app/bsky/graph/getStarterPacks.js +3 -0
  86. package/dist/lexicon/types/app/bsky/graph/getStarterPacks.js.map +1 -0
  87. package/dist/lexicon/types/app/bsky/graph/starterpack.d.ts +25 -0
  88. package/dist/lexicon/types/app/bsky/graph/starterpack.d.ts.map +1 -0
  89. package/dist/lexicon/types/app/bsky/graph/starterpack.js +27 -0
  90. package/dist/lexicon/types/app/bsky/graph/starterpack.js.map +1 -0
  91. package/dist/lexicon/types/app/bsky/notification/listNotifications.d.ts +2 -2
  92. package/dist/lexicon/types/app/bsky/notification/listNotifications.d.ts.map +1 -1
  93. package/dist/lexicon/types/app/bsky/notification/listNotifications.js.map +1 -1
  94. package/dist/lexicon/types/tools/ozone/team/addMember.d.ts +40 -0
  95. package/dist/lexicon/types/tools/ozone/team/addMember.d.ts.map +1 -0
  96. package/dist/lexicon/types/tools/ozone/team/addMember.js +3 -0
  97. package/dist/lexicon/types/tools/ozone/team/addMember.js.map +1 -0
  98. package/dist/lexicon/types/tools/ozone/team/defs.d.ts +24 -0
  99. package/dist/lexicon/types/tools/ozone/team/defs.d.ts.map +1 -0
  100. package/dist/lexicon/types/tools/ozone/team/defs.js +22 -0
  101. package/dist/lexicon/types/tools/ozone/team/defs.js.map +1 -0
  102. package/dist/lexicon/types/tools/ozone/team/deleteMember.d.ts +30 -0
  103. package/dist/lexicon/types/tools/ozone/team/deleteMember.d.ts.map +1 -0
  104. package/dist/lexicon/types/tools/ozone/team/deleteMember.js +3 -0
  105. package/dist/lexicon/types/tools/ozone/team/deleteMember.js.map +1 -0
  106. package/dist/lexicon/types/tools/ozone/team/listMembers.d.ts +38 -0
  107. package/dist/lexicon/types/tools/ozone/team/listMembers.d.ts.map +1 -0
  108. package/dist/lexicon/types/tools/ozone/team/listMembers.js +3 -0
  109. package/dist/lexicon/types/tools/ozone/team/listMembers.js.map +1 -0
  110. package/dist/lexicon/types/tools/ozone/team/updateMember.d.ts +41 -0
  111. package/dist/lexicon/types/tools/ozone/team/updateMember.d.ts.map +1 -0
  112. package/dist/lexicon/types/tools/ozone/team/updateMember.js +3 -0
  113. package/dist/lexicon/types/tools/ozone/team/updateMember.js.map +1 -0
  114. package/dist/team/index.d.ts +37 -0
  115. package/dist/team/index.d.ts.map +1 -0
  116. package/dist/team/index.js +144 -0
  117. package/dist/team/index.js.map +1 -0
  118. package/package.json +4 -4
  119. package/src/api/index.ts +8 -0
  120. package/src/api/proxied.ts +43 -0
  121. package/src/api/server/getConfig.ts +4 -4
  122. package/src/api/team/addMember.ts +46 -0
  123. package/src/api/team/deleteMember.ts +29 -0
  124. package/src/api/team/listMembers.ts +20 -0
  125. package/src/api/team/updateMember.ts +47 -0
  126. package/src/api/util.ts +15 -0
  127. package/src/auth-verifier.ts +14 -12
  128. package/src/context.ts +9 -3
  129. package/src/db/migrations/20240521T211332580Z-member.ts +17 -0
  130. package/src/db/migrations/index.ts +1 -0
  131. package/src/db/schema/index.ts +3 -1
  132. package/src/db/schema/member.ts +19 -0
  133. package/src/index.ts +36 -0
  134. package/src/lexicon/index.ts +100 -0
  135. package/src/lexicon/lexicons.ts +566 -1
  136. package/src/lexicon/types/app/bsky/actor/defs.ts +5 -0
  137. package/src/lexicon/types/app/bsky/actor/profile.ts +3 -0
  138. package/src/lexicon/types/app/bsky/graph/defs.ts +58 -0
  139. package/src/lexicon/types/app/bsky/graph/getActorStarterPacks.ts +49 -0
  140. package/src/lexicon/types/app/bsky/graph/getStarterPack.ts +47 -0
  141. package/src/lexicon/types/app/bsky/graph/getStarterPacks.ts +46 -0
  142. package/src/lexicon/types/app/bsky/graph/starterpack.ts +50 -0
  143. package/src/lexicon/types/app/bsky/notification/listNotifications.ts +2 -1
  144. package/src/lexicon/types/tools/ozone/team/addMember.ts +53 -0
  145. package/src/lexicon/types/tools/ozone/team/defs.ts +42 -0
  146. package/src/lexicon/types/tools/ozone/team/deleteMember.ts +39 -0
  147. package/src/lexicon/types/tools/ozone/team/listMembers.ts +48 -0
  148. package/src/lexicon/types/tools/ozone/team/updateMember.ts +54 -0
  149. package/src/team/index.ts +213 -0
  150. package/tests/__snapshots__/get-record.test.ts.snap +2 -0
  151. package/tests/__snapshots__/get-repo.test.ts.snap +1 -0
  152. package/tests/__snapshots__/get-starter-pack.test.ts.snap +466 -0
  153. package/tests/__snapshots__/moderation-events.test.ts.snap +1 -0
  154. package/tests/__snapshots__/team.test.ts.snap +688 -0
  155. package/tests/get-config.test.ts +3 -4
  156. package/tests/get-starter-pack.test.ts +104 -0
  157. package/tests/server.test.ts +1 -1
  158. package/tests/team.test.ts +163 -0
@@ -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' | 'CannotDeleteSelf';
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,GAAG,kBAAkB,CAAA;CAC9C;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":""}
@@ -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.25",
3
+ "version": "0.1.27",
4
4
  "license": "MIT",
5
5
  "description": "Backend service for moderating the Bluesky network.",
6
6
  "keywords": [
@@ -32,14 +32,14 @@
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.20",
35
+ "@atproto/api": "^0.12.22",
36
36
  "@atproto/common": "^0.4.0",
37
37
  "@atproto/crypto": "^0.4.0",
38
38
  "@atproto/identity": "^0.4.0",
39
39
  "@atproto/lexicon": "^0.4.0",
40
40
  "@atproto/syntax": "^0.3.0",
41
41
  "@atproto/xrpc": "^0.5.0",
42
- "@atproto/xrpc-server": "^0.5.1"
42
+ "@atproto/xrpc-server": "^0.5.2"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@did-plc/server": "^0.0.1",
@@ -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.36"
55
+ "@atproto/pds": "^0.4.38"
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)
@@ -158,4 +158,47 @@ export default function (server: Server, ctx: AppContext) {
158
158
  }
159
159
  },
160
160
  })
161
+
162
+ server.app.bsky.graph.getStarterPack({
163
+ auth: ctx.authVerifier.moderator,
164
+ handler: async (request) => {
165
+ const res = await ctx.appviewAgent.api.app.bsky.graph.getStarterPack(
166
+ request.params,
167
+ await ctx.appviewAuth(),
168
+ )
169
+ return {
170
+ encoding: 'application/json',
171
+ body: res.data,
172
+ }
173
+ },
174
+ })
175
+
176
+ server.app.bsky.graph.getStarterPacks({
177
+ auth: ctx.authVerifier.moderator,
178
+ handler: async (request) => {
179
+ const res = await ctx.appviewAgent.api.app.bsky.graph.getStarterPacks(
180
+ request.params,
181
+ await ctx.appviewAuth(),
182
+ )
183
+ return {
184
+ encoding: 'application/json',
185
+ body: res.data,
186
+ }
187
+ },
188
+ })
189
+
190
+ server.app.bsky.graph.getActorStarterPacks({
191
+ auth: ctx.authVerifier.moderator,
192
+ handler: async (request) => {
193
+ const res =
194
+ await ctx.appviewAgent.api.app.bsky.graph.getActorStarterPacks(
195
+ request.params,
196
+ await ctx.appviewAuth(),
197
+ )
198
+ return {
199
+ encoding: 'application/json',
200
+ body: res.data,
201
+ }
202
+ },
203
+ })
161
204
  }
@@ -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
+ }
@@ -0,0 +1,29 @@
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.team.deleteMember({
7
+ auth: ctx.authVerifier.modOrAdminToken,
8
+ handler: async ({ input, auth }) => {
9
+ const access = auth.credentials
10
+ const db = ctx.db
11
+ const { did } = input.body
12
+
13
+ if (!access.isAdmin) {
14
+ throw new AuthRequiredError('Must be an admin to delete a member')
15
+ }
16
+ if ('did' in auth.credentials && did === auth.credentials.did) {
17
+ throw new InvalidRequestError(
18
+ 'You can not delete yourself from the team',
19
+ 'CannotDeleteSelf',
20
+ )
21
+ }
22
+ await db.transaction(async (dbTxn) => {
23
+ const teamService = ctx.teamService(dbTxn)
24
+ await teamService.assertCanDelete(did)
25
+ await teamService.delete(did)
26
+ })
27
+ },
28
+ })
29
+ }
@@ -0,0 +1,20 @@
1
+ import { Server } from '../../lexicon'
2
+ import AppContext from '../../context'
3
+
4
+ export default function (server: Server, ctx: AppContext) {
5
+ server.tools.ozone.team.listMembers({
6
+ auth: ctx.authVerifier.modOrAdminToken,
7
+ handler: async ({ params }) => {
8
+ const teamService = ctx.teamService(ctx.db)
9
+ const { members, cursor } = await teamService.list(params)
10
+
11
+ return {
12
+ encoding: 'application/json',
13
+ body: {
14
+ cursor,
15
+ members: await teamService.view(members, ctx),
16
+ },
17
+ }
18
+ },
19
+ })
20
+ }
@@ -0,0 +1,47 @@
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.updateMember({
8
+ auth: ctx.authVerifier.modOrAdminToken,
9
+ handler: async ({ input, auth }) => {
10
+ const access = auth.credentials
11
+ const db = ctx.db
12
+ const { did, role, ...rest } = input.body
13
+
14
+ if (!access.isAdmin) {
15
+ throw new AuthRequiredError('Must be an admin to update a member')
16
+ }
17
+
18
+ if (did === ctx.cfg.service.did) {
19
+ throw new InvalidRequestError('Can not update service owner')
20
+ }
21
+
22
+ const updatedMember = await db.transaction(async (dbTxn) => {
23
+ const teamService = ctx.teamService(dbTxn)
24
+
25
+ const memberExists = await teamService.doesMemberExist(did)
26
+
27
+ if (!memberExists) {
28
+ throw new InvalidRequestError('member not found', 'MemberNotFound')
29
+ }
30
+
31
+ const updated = await teamService.update(did, {
32
+ ...rest,
33
+ ...(role ? { role: getMemberRole(role) } : {}),
34
+ lastUpdatedBy:
35
+ access.type === 'admin_token' ? 'admin_token' : access.iss,
36
+ })
37
+ const memberView = await teamService.view([updated], ctx)
38
+ return memberView[0]
39
+ })
40
+
41
+ return {
42
+ encoding: 'application/json',
43
+ body: updatedMember,
44
+ }
45
+ },
46
+ })
47
+ }