@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.
- package/CHANGELOG.md +19 -0
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +8 -0
- package/dist/api/index.js.map +1 -1
- package/dist/api/proxied.d.ts.map +1 -1
- package/dist/api/proxied.js +30 -0
- package/dist/api/proxied.js.map +1 -1
- package/dist/api/server/getConfig.d.ts.map +1 -1
- package/dist/api/server/getConfig.js +4 -3
- package/dist/api/server/getConfig.js.map +1 -1
- package/dist/api/team/addMember.d.ts +4 -0
- package/dist/api/team/addMember.d.ts.map +1 -0
- package/dist/api/team/addMember.js +38 -0
- package/dist/api/team/addMember.js.map +1 -0
- package/dist/api/team/deleteMember.d.ts +4 -0
- package/dist/api/team/deleteMember.d.ts.map +1 -0
- package/dist/api/team/deleteMember.js +26 -0
- package/dist/api/team/deleteMember.js.map +1 -0
- package/dist/api/team/listMembers.d.ts +4 -0
- package/dist/api/team/listMembers.d.ts.map +1 -0
- package/dist/api/team/listMembers.js +20 -0
- package/dist/api/team/listMembers.js.map +1 -0
- package/dist/api/team/updateMember.d.ts +4 -0
- package/dist/api/team/updateMember.d.ts.map +1 -0
- package/dist/api/team/updateMember.js +40 -0
- package/dist/api/team/updateMember.js.map +1 -0
- package/dist/api/util.d.ts +1 -0
- package/dist/api/util.d.ts.map +1 -1
- package/dist/api/util.js +10 -1
- package/dist/api/util.js.map +1 -1
- package/dist/auth-verifier.d.ts +3 -6
- package/dist/auth-verifier.d.ts.map +1 -1
- package/dist/auth-verifier.js +7 -19
- package/dist/auth-verifier.js.map +1 -1
- package/dist/context.d.ts +3 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +7 -3
- package/dist/context.js.map +1 -1
- package/dist/db/migrations/20240521T211332580Z-member.d.ts +4 -0
- package/dist/db/migrations/20240521T211332580Z-member.d.ts.map +1 -0
- package/dist/db/migrations/20240521T211332580Z-member.js +20 -0
- package/dist/db/migrations/20240521T211332580Z-member.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/schema/index.d.ts +2 -1
- package/dist/db/schema/index.d.ts.map +1 -1
- package/dist/db/schema/member.d.ts +14 -0
- package/dist/db/schema/member.d.ts.map +1 -0
- package/dist/db/schema/member.js +5 -0
- package/dist/db/schema/member.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -1
- package/dist/lexicon/index.d.ts +25 -0
- package/dist/lexicon/index.d.ts.map +1 -1
- package/dist/lexicon/index.js +54 -1
- package/dist/lexicon/index.js.map +1 -1
- package/dist/lexicon/lexicons.d.ts +536 -0
- package/dist/lexicon/lexicons.d.ts.map +1 -1
- package/dist/lexicon/lexicons.js +561 -1
- package/dist/lexicon/lexicons.js.map +1 -1
- package/dist/lexicon/types/app/bsky/actor/defs.d.ts +5 -0
- package/dist/lexicon/types/app/bsky/actor/defs.d.ts.map +1 -1
- package/dist/lexicon/types/app/bsky/actor/defs.js.map +1 -1
- package/dist/lexicon/types/app/bsky/actor/profile.d.ts +3 -0
- package/dist/lexicon/types/app/bsky/actor/profile.d.ts.map +1 -1
- package/dist/lexicon/types/app/bsky/actor/profile.js.map +1 -1
- package/dist/lexicon/types/app/bsky/graph/defs.d.ts +36 -1
- package/dist/lexicon/types/app/bsky/graph/defs.d.ts.map +1 -1
- package/dist/lexicon/types/app/bsky/graph/defs.js +23 -1
- package/dist/lexicon/types/app/bsky/graph/defs.js.map +1 -1
- package/dist/lexicon/types/app/bsky/graph/getActorStarterPacks.d.ts +39 -0
- package/dist/lexicon/types/app/bsky/graph/getActorStarterPacks.d.ts.map +1 -0
- package/dist/lexicon/types/app/bsky/graph/getActorStarterPacks.js +3 -0
- package/dist/lexicon/types/app/bsky/graph/getActorStarterPacks.js.map +1 -0
- package/dist/lexicon/types/app/bsky/graph/getStarterPack.d.ts +37 -0
- package/dist/lexicon/types/app/bsky/graph/getStarterPack.d.ts.map +1 -0
- package/dist/lexicon/types/app/bsky/graph/getStarterPack.js +3 -0
- package/dist/lexicon/types/app/bsky/graph/getStarterPack.js.map +1 -0
- package/dist/lexicon/types/app/bsky/graph/getStarterPacks.d.ts +36 -0
- package/dist/lexicon/types/app/bsky/graph/getStarterPacks.d.ts.map +1 -0
- package/dist/lexicon/types/app/bsky/graph/getStarterPacks.js +3 -0
- package/dist/lexicon/types/app/bsky/graph/getStarterPacks.js.map +1 -0
- package/dist/lexicon/types/app/bsky/graph/starterpack.d.ts +25 -0
- package/dist/lexicon/types/app/bsky/graph/starterpack.d.ts.map +1 -0
- package/dist/lexicon/types/app/bsky/graph/starterpack.js +27 -0
- package/dist/lexicon/types/app/bsky/graph/starterpack.js.map +1 -0
- package/dist/lexicon/types/app/bsky/notification/listNotifications.d.ts +2 -2
- package/dist/lexicon/types/app/bsky/notification/listNotifications.d.ts.map +1 -1
- package/dist/lexicon/types/app/bsky/notification/listNotifications.js.map +1 -1
- package/dist/lexicon/types/tools/ozone/team/addMember.d.ts +40 -0
- package/dist/lexicon/types/tools/ozone/team/addMember.d.ts.map +1 -0
- package/dist/lexicon/types/tools/ozone/team/addMember.js +3 -0
- package/dist/lexicon/types/tools/ozone/team/addMember.js.map +1 -0
- package/dist/lexicon/types/tools/ozone/team/defs.d.ts +24 -0
- package/dist/lexicon/types/tools/ozone/team/defs.d.ts.map +1 -0
- package/dist/lexicon/types/tools/ozone/team/defs.js +22 -0
- package/dist/lexicon/types/tools/ozone/team/defs.js.map +1 -0
- package/dist/lexicon/types/tools/ozone/team/deleteMember.d.ts +30 -0
- package/dist/lexicon/types/tools/ozone/team/deleteMember.d.ts.map +1 -0
- package/dist/lexicon/types/tools/ozone/team/deleteMember.js +3 -0
- package/dist/lexicon/types/tools/ozone/team/deleteMember.js.map +1 -0
- package/dist/lexicon/types/tools/ozone/team/listMembers.d.ts +38 -0
- package/dist/lexicon/types/tools/ozone/team/listMembers.d.ts.map +1 -0
- package/dist/lexicon/types/tools/ozone/team/listMembers.js +3 -0
- package/dist/lexicon/types/tools/ozone/team/listMembers.js.map +1 -0
- package/dist/lexicon/types/tools/ozone/team/updateMember.d.ts +41 -0
- package/dist/lexicon/types/tools/ozone/team/updateMember.d.ts.map +1 -0
- package/dist/lexicon/types/tools/ozone/team/updateMember.js +3 -0
- package/dist/lexicon/types/tools/ozone/team/updateMember.js.map +1 -0
- package/dist/team/index.d.ts +37 -0
- package/dist/team/index.d.ts.map +1 -0
- package/dist/team/index.js +144 -0
- package/dist/team/index.js.map +1 -0
- package/package.json +4 -4
- package/src/api/index.ts +8 -0
- package/src/api/proxied.ts +43 -0
- package/src/api/server/getConfig.ts +4 -4
- package/src/api/team/addMember.ts +46 -0
- package/src/api/team/deleteMember.ts +29 -0
- package/src/api/team/listMembers.ts +20 -0
- package/src/api/team/updateMember.ts +47 -0
- package/src/api/util.ts +15 -0
- package/src/auth-verifier.ts +14 -12
- package/src/context.ts +9 -3
- package/src/db/migrations/20240521T211332580Z-member.ts +17 -0
- package/src/db/migrations/index.ts +1 -0
- package/src/db/schema/index.ts +3 -1
- package/src/db/schema/member.ts +19 -0
- package/src/index.ts +36 -0
- package/src/lexicon/index.ts +100 -0
- package/src/lexicon/lexicons.ts +566 -1
- package/src/lexicon/types/app/bsky/actor/defs.ts +5 -0
- package/src/lexicon/types/app/bsky/actor/profile.ts +3 -0
- package/src/lexicon/types/app/bsky/graph/defs.ts +58 -0
- package/src/lexicon/types/app/bsky/graph/getActorStarterPacks.ts +49 -0
- package/src/lexicon/types/app/bsky/graph/getStarterPack.ts +47 -0
- package/src/lexicon/types/app/bsky/graph/getStarterPacks.ts +46 -0
- package/src/lexicon/types/app/bsky/graph/starterpack.ts +50 -0
- package/src/lexicon/types/app/bsky/notification/listNotifications.ts +2 -1
- package/src/lexicon/types/tools/ozone/team/addMember.ts +53 -0
- package/src/lexicon/types/tools/ozone/team/defs.ts +42 -0
- package/src/lexicon/types/tools/ozone/team/deleteMember.ts +39 -0
- package/src/lexicon/types/tools/ozone/team/listMembers.ts +48 -0
- package/src/lexicon/types/tools/ozone/team/updateMember.ts +54 -0
- package/src/team/index.ts +213 -0
- package/tests/__snapshots__/get-record.test.ts.snap +2 -0
- package/tests/__snapshots__/get-repo.test.ts.snap +1 -0
- package/tests/__snapshots__/get-starter-pack.test.ts.snap +466 -0
- package/tests/__snapshots__/moderation-events.test.ts.snap +1 -0
- package/tests/__snapshots__/team.test.ts.snap +688 -0
- package/tests/get-config.test.ts +3 -4
- package/tests/get-starter-pack.test.ts +104 -0
- package/tests/server.test.ts +1 -1
- 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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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":";;;AAKA,sDAA0D;AAC1D,4CAA4C;AAE5C,sCAAsC;AAItC,MAAa,WAAW;IACtB,YAAmB,EAAY;QAAnB;;;;mBAAO,EAAE;WAAU;IAAG,CAAC;IAEnC,MAAM,CAAC,OAAO;QACZ,OAAO,CAAC,EAAY,EAAE,EAAE,CAAC,IAAI,WAAW,CAAC,EAAE,CAAC,CAAA;IAC9C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EACT,MAAM,EACN,KAAK,GAAG,EAAE,GAIX;QACC,IAAI,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,SAAS,EAAE,CAAA;QACzD,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;QAC7D,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,OAAO;aAC1B,KAAK,CAAC,KAAK,CAAC;aACZ,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC;aAC3B,OAAO,EAAE,CAAA;QAEZ,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,WAAW,EAAE,EAAE,CAAA;IACrE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EACX,IAAI,EACJ,GAAG,EACH,QAAQ,EACR,SAAS,EACT,SAAS,EACT,aAAa,GAId;QACC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;QACtB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aAC/B,UAAU,CAAC,QAAQ,CAAC;aACpB,MAAM,CAAC;YACN,IAAI;YACJ,GAAG;YACH,QAAQ;YACR,aAAa;YACb,SAAS,EAAE,SAAS,IAAI,GAAG;YAC3B,SAAS,EAAE,SAAS,IAAI,GAAG;SAC5B,CAAC;aACD,YAAY,EAAE;aACd,uBAAuB,EAAE,CAAA;QAE5B,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EACX,IAAI,EACJ,GAAG,EACH,aAAa,GAId;QACC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAA;QACtB,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aACb,UAAU,CAAC,QAAQ,CAAC;aACpB,MAAM,CAAC;YACN,IAAI;YACJ,GAAG;YACH,aAAa;YACb,QAAQ,EAAE,KAAK;YACf,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;SACf,CAAC;aACD,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CACjB,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,CACtE;aACA,OAAO,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,MAAM,CACV,GAAW,EACX,OAKC;QAED,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,GAAG,IAAI,IAAI,EAAE,EAAE,GAAG,OAAO,CAAA;QACzE,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aACnC,WAAW,CAAC,QAAQ,CAAC;aACrB,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC;aACtB,GAAG,CAAC;YACH,IAAI;YACJ,QAAQ;YACR,aAAa;YACb,SAAS;SACV,CAAC;aACD,YAAY,EAAE;aACd,uBAAuB,EAAE,CAAA;QAE5B,OAAO,aAAa,CAAA;IACtB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW;QACtB,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAA;IACxE,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,GAAW;QAC/B,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;QAEpD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,iCAAmB,CAAC,kBAAkB,EAAE,gBAAgB,CAAC,CAAA;QACrE,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,GAAW;QAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aAC5B,UAAU,CAAC,QAAQ,CAAC;aACpB,MAAM,CAAC,KAAK,CAAC;aACb,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC;aACtB,gBAAgB,EAAE,CAAA;QAErB,OAAO,CAAC,CAAC,MAAM,CAAA;IACjB,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,GAAW;QACzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,EAAE;aAC5B,UAAU,CAAC,QAAQ,CAAC;aACpB,SAAS,EAAE;aACX,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC;aACtB,gBAAgB,EAAE,CAAA;QAErB,OAAO,MAAM,CAAA;IACf,CAAC;IAED,aAAa,CAAC,MAA2B;QACvC,MAAM,OAAO,GAAG,MAAM,EAAE,IAAI,KAAK,iCAAiC,CAAA;QAClE,MAAM,WAAW,GACf,OAAO,IAAI,MAAM,EAAE,IAAI,KAAK,qCAAqC,CAAA;QACnE,MAAM,QAAQ,GACZ,WAAW,IAAI,MAAM,EAAE,IAAI,KAAK,kCAAkC,CAAA;QAEpE,OAAO;YACL,WAAW;YACX,OAAO;YACP,QAAQ;SACT,CAAA;IACH,CAAC;IAED,4EAA4E;IAC5E,KAAK,CAAC,WAAW,CACf,IAAc,EACd,GAAe;QAEf,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA+B,CAAA;QAEvD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,WAAW,EAAE,CAAA;YAEvC,KAAK,MAAM,MAAM,IAAI,IAAA,mBAAU,EAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;gBAC1C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CACpE,EAAE,MAAM,EAAE,EACV,OAAO,CACR,CAAA;gBAED,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;oBAChC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;gBACpC,CAAC,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,mBAAU,CAAC,KAAK,CACd,EAAE,KAAK,EAAE,IAAI,EAAE,EACf,yCAAyC,CAC1C,CAAA;QACH,CAAC;QAED,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,KAAK,CAAC,IAAI,CACR,OAA6B,EAC7B,GAAe;QAEf,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CACrC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAC7B,GAAG,CACJ,CAAA;QACD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YAC5B,OAAO;gBACL,GAAG,EAAE,MAAM,CAAC,GAAG;gBACf,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC;gBACjC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE;gBACzC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE;gBACzC,aAAa,EAAE,MAAM,CAAC,aAAa;aACpC,CAAA;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;CACF;AAxMD,kCAwMC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atproto/ozone",
|
|
3
|
-
"version": "0.1.
|
|
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.
|
|
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.
|
|
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.
|
|
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)
|
package/src/api/proxied.ts
CHANGED
|
@@ -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
|
-
?
|
|
25
|
+
? TOOLS_OZONE_TEAM.DefsRoleAdmin
|
|
26
26
|
: auth.credentials.isModerator
|
|
27
|
-
?
|
|
28
|
-
:
|
|
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
|
+
}
|