@adonis-agora/collaboration 0.9.2 → 0.10.0
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 +110 -0
- package/dist/providers/collaboration_provider.d.ts +15 -5
- package/dist/providers/collaboration_provider.d.ts.map +1 -1
- package/dist/providers/collaboration_provider.js +53 -24
- package/dist/providers/collaboration_provider.js.map +1 -1
- package/dist/src/auth/token.d.ts +20 -2
- package/dist/src/auth/token.d.ts.map +1 -1
- package/dist/src/auth/token.js +31 -8
- package/dist/src/auth/token.js.map +1 -1
- package/dist/src/codegen_init.d.ts.map +1 -1
- package/dist/src/codegen_init.js +11 -1
- package/dist/src/codegen_init.js.map +1 -1
- package/dist/src/collaboration_manager.d.ts.map +1 -1
- package/dist/src/collaboration_manager.js +4 -0
- package/dist/src/collaboration_manager.js.map +1 -1
- package/dist/src/define_config.d.ts +32 -1
- package/dist/src/define_config.d.ts.map +1 -1
- package/dist/src/define_config.js +6 -0
- package/dist/src/define_config.js.map +1 -1
- package/dist/src/drivers/automerge/automerge_driver.d.ts +7 -1
- package/dist/src/drivers/automerge/automerge_driver.d.ts.map +1 -1
- package/dist/src/drivers/automerge/automerge_driver.js +74 -11
- package/dist/src/drivers/automerge/automerge_driver.js.map +1 -1
- package/dist/src/drivers/yjs/yjs_driver.d.ts +20 -0
- package/dist/src/drivers/yjs/yjs_driver.d.ts.map +1 -1
- package/dist/src/drivers/yjs/yjs_driver.js +84 -19
- package/dist/src/drivers/yjs/yjs_driver.js.map +1 -1
- package/dist/src/http/types.d.ts +24 -1
- package/dist/src/http/types.d.ts.map +1 -1
- package/dist/src/http/types.js.map +1 -1
- package/dist/src/index.d.ts +4 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/observability.d.ts +52 -0
- package/dist/src/observability.d.ts.map +1 -0
- package/dist/src/observability.js +50 -0
- package/dist/src/observability.js.map +1 -0
- package/dist/src/routes.d.ts +35 -5
- package/dist/src/routes.d.ts.map +1 -1
- package/dist/src/routes.js +117 -26
- package/dist/src/routes.js.map +1 -1
- package/dist/src/services/comment_service.d.ts +9 -0
- package/dist/src/services/comment_service.d.ts.map +1 -1
- package/dist/src/services/comment_service.js +17 -4
- package/dist/src/services/comment_service.js.map +1 -1
- package/dist/src/storage/lucid_storage.d.ts +7 -0
- package/dist/src/storage/lucid_storage.d.ts.map +1 -1
- package/dist/src/storage/lucid_storage.js +34 -11
- package/dist/src/storage/lucid_storage.js.map +1 -1
- package/dist/src/types.d.ts +14 -4
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/versioning.d.ts +6 -0
- package/dist/src/versioning.d.ts.map +1 -1
- package/dist/src/versioning.js +10 -0
- package/dist/src/versioning.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observability.d.ts","sourceRoot":"","sources":["../../src/observability.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,uEAAuE;AACvE,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvE;AAED,yCAAyC;AACzC,MAAM,WAAW,gBAAgB;IAC/B,6BAA6B;IAC7B,KAAK,EAAE,SAAS,GAAG,WAAW,CAAC;IAC/B,sDAAsD;IACtD,SAAS,EAAE,MAAM,CAAC;IAClB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oCAAoC;IACpC,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,wBAAwB,CAAC;AAExD,+EAA+E;AAC/E,eAAO,MAAM,mBAAmB,uBAAqB,CAAC;AAItD,gFAAgF;AAChF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,YAAY,GAAG,SAAS,GAAG,IAAI,CAE3E;AAED,+DAA+D;AAC/D,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,GAAG,MAAM,IAAI,CAK5F;AAED,6EAA6E;AAC7E,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CA8BtE"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
/**
|
|
3
|
+
* Event name used on {@link collaborationEvents}.
|
|
4
|
+
*
|
|
5
|
+
* Deliberately NOT `'error'`: an EventEmitter with no listener for `'error'`
|
|
6
|
+
* throws, which would turn an observability hook into a second outage.
|
|
7
|
+
*/
|
|
8
|
+
export const COLLAB_ERROR_EVENT = 'collaboration:error';
|
|
9
|
+
/** Emitter carrying {@link CollabErrorEvent} on {@link COLLAB_ERROR_EVENT}. */
|
|
10
|
+
export const collaborationEvents = new EventEmitter();
|
|
11
|
+
let logger;
|
|
12
|
+
/** Installs the logger every report is written to (the provider calls this). */
|
|
13
|
+
export function setCollaborationLogger(next) {
|
|
14
|
+
logger = next;
|
|
15
|
+
}
|
|
16
|
+
/** Subscribes to failures; returns an unsubscribe function. */
|
|
17
|
+
export function onCollaborationError(listener) {
|
|
18
|
+
collaborationEvents.on(COLLAB_ERROR_EVENT, listener);
|
|
19
|
+
return () => {
|
|
20
|
+
collaborationEvents.off(COLLAB_ERROR_EVENT, listener);
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
/** Reports a failure to the logger and/or the event stream. Never throws. */
|
|
24
|
+
export function reportCollaborationError(event) {
|
|
25
|
+
const where = event.docName ? ` for document "${event.docName}"` : '';
|
|
26
|
+
const message = `[@adonis-agora/collaboration] ${event.scope}.${event.operation} failed${where}`;
|
|
27
|
+
if (logger) {
|
|
28
|
+
try {
|
|
29
|
+
logger.error({
|
|
30
|
+
err: event.error,
|
|
31
|
+
scope: event.scope,
|
|
32
|
+
operation: event.operation,
|
|
33
|
+
...(event.docName ? { docName: event.docName } : {}),
|
|
34
|
+
}, message);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
// A broken logger must not escalate into a second failure.
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
const hasListener = collaborationEvents.listenerCount(COLLAB_ERROR_EVENT) > 0;
|
|
41
|
+
if (hasListener) {
|
|
42
|
+
collaborationEvents.emit(COLLAB_ERROR_EVENT, event);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (!logger) {
|
|
46
|
+
// Neither sink configured — still better than silence.
|
|
47
|
+
console.error(message, event.error);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=observability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observability.js","sourceRoot":"","sources":["../../src/observability.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAwC3C;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,qBAAqB,CAAC;AAExD,+EAA+E;AAC/E,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,YAAY,EAAE,CAAC;AAEtD,IAAI,MAAgC,CAAC;AAErC,gFAAgF;AAChF,MAAM,UAAU,sBAAsB,CAAC,IAA8B;IACnE,MAAM,GAAG,IAAI,CAAC;AAChB,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,oBAAoB,CAAC,QAA2C;IAC9E,mBAAmB,CAAC,EAAE,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;IACrD,OAAO,GAAG,EAAE;QACV,mBAAmB,CAAC,GAAG,CAAC,kBAAkB,EAAE,QAAQ,CAAC,CAAC;IACxD,CAAC,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,wBAAwB,CAAC,KAAuB;IAC9D,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACtE,MAAM,OAAO,GAAG,iCAAiC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,UAAU,KAAK,EAAE,CAAC;IAEjG,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,CAAC;YACH,MAAM,CAAC,KAAK,CACV;gBACE,GAAG,EAAE,KAAK,CAAC,KAAK;gBAChB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACrD,EACD,OAAO,CACR,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,2DAA2D;QAC7D,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,mBAAmB,CAAC,aAAa,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAC9E,IAAI,WAAW,EAAE,CAAC;QAChB,mBAAmB,CAAC,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,uDAAuD;QACvD,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;AACH,CAAC"}
|
package/dist/src/routes.d.ts
CHANGED
|
@@ -1,6 +1,24 @@
|
|
|
1
1
|
import { type CollabManagerLike, type CollabRoutesRuntime } from './http/types.js';
|
|
2
|
+
import type { CollabPermission } from './types.js';
|
|
2
3
|
/** Timing-safe comparison for shared secrets. */
|
|
3
4
|
export declare function secretsMatch(received: string | undefined, expected: string | undefined): boolean;
|
|
5
|
+
/**
|
|
6
|
+
* Who may resolve or delete an existing comment.
|
|
7
|
+
*
|
|
8
|
+
* `canComment` is permission to *add* an annotation — it is not permission to
|
|
9
|
+
* silence someone else's. The rule, stated once so it can be tested once:
|
|
10
|
+
*
|
|
11
|
+
* - the **author** may always resolve or delete their own comment;
|
|
12
|
+
* - anyone else needs the elevated capability on the document (`canWrite`) —
|
|
13
|
+
* an editor moderating a thread, not a fellow commenter.
|
|
14
|
+
*/
|
|
15
|
+
export declare function canMutateComment(input: {
|
|
16
|
+
comment: {
|
|
17
|
+
userId?: string | null;
|
|
18
|
+
} | null | undefined;
|
|
19
|
+
userId: string;
|
|
20
|
+
permission: CollabPermission;
|
|
21
|
+
}): boolean;
|
|
4
22
|
/** Minimal structural contract satisfied by the Adonis Router. */
|
|
5
23
|
export interface CollabRouteGroupContract {
|
|
6
24
|
prefix(prefix: string): this;
|
|
@@ -16,14 +34,26 @@ export interface CollaborationRouterContract {
|
|
|
16
34
|
/**
|
|
17
35
|
* Registers every collaboration REST endpoint under an optional prefix
|
|
18
36
|
* (default `/collaboration`).
|
|
37
|
+
*
|
|
38
|
+
* **Synchronous on purpose.** `RouteGroup` closes as soon as its callback
|
|
39
|
+
* returns, so anything registered after an `await` lands outside the group —
|
|
40
|
+
* which made it impossible to wrap these routes in an app's own middleware.
|
|
41
|
+
* Everything that needs the booted app is resolved at request time instead.
|
|
19
42
|
*/
|
|
20
|
-
export declare function collaborationRoutes(router: CollaborationRouterContract, options
|
|
43
|
+
export declare function collaborationRoutes(router: CollaborationRouterContract, options?: CollabRoutesRuntime & {
|
|
21
44
|
managerFallback?: () => Promise<CollabManagerLike>;
|
|
22
|
-
}):
|
|
45
|
+
}): void;
|
|
23
46
|
/**
|
|
24
|
-
* Default auth resolution
|
|
25
|
-
*
|
|
26
|
-
*
|
|
47
|
+
* Default auth resolution.
|
|
48
|
+
*
|
|
49
|
+
* Reads `ctx.auth.user` — but *authenticates first* when the auth stack has
|
|
50
|
+
* not run yet. With a lazily-resolving guard `ctx.auth.user` is simply
|
|
51
|
+
* `undefined` until something calls `check()`/`authenticate()`, which is why
|
|
52
|
+
* every app ended up bolting a global middleware onto a hardcoded
|
|
53
|
+
* `/collaboration` prefix. Here `check()` is preferred because it reports
|
|
54
|
+
* failure by returning `false` instead of throwing.
|
|
55
|
+
*
|
|
56
|
+
* Still fails closed: no user, no request.
|
|
27
57
|
*/
|
|
28
58
|
export declare const defaultResolveUser: NonNullable<CollabRoutesRuntime['resolveUser']>;
|
|
29
59
|
//# sourceMappingURL=routes.d.ts.map
|
package/dist/src/routes.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/routes.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,iBAAiB,EAEtB,KAAK,mBAAmB,EAEzB,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/routes.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,iBAAiB,EAEtB,KAAK,mBAAmB,EAEzB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAuInD,iDAAiD;AACjD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAKhG;AAID;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IACtC,OAAO,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,GAAG,SAAS,CAAC;IACvD,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,gBAAgB,CAAC;CAC9B,GAAG,OAAO,CAIV;AAsSD,kEAAkE;AAClE,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,CAAC,UAAU,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CACzC;AAED,MAAM,WAAW,2BAA2B;IAC1C,KAAK,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,wBAAwB,CAAC;IACtD,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;IAChD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;IACjD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;IAClD,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;CACpD;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,2BAA2B,EACnC,OAAO,GAAE,mBAAmB,GAAG;IAAE,eAAe,CAAC,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAA;CAAO,GACzF,IAAI,CAoCN;AAcD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAAC,mBAAmB,CAAC,aAAa,CAAC,CA8B9E,CAAC"}
|
package/dist/src/routes.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { createHmac, timingSafeEqual } from 'node:crypto';
|
|
2
2
|
import { CollabForbiddenError, issueToken } from './auth/token.js';
|
|
3
3
|
import { CollabUnauthorizedError, } from './http/types.js';
|
|
4
|
+
/** The permission granted when nothing anywhere declares a rule. */
|
|
5
|
+
const DENY_ALL = { canRead: false, canWrite: false, canComment: false };
|
|
4
6
|
let cachedAppConfig;
|
|
5
7
|
async function readAppConfig() {
|
|
6
8
|
if (cachedAppConfig)
|
|
@@ -15,8 +17,13 @@ async function readAppConfig() {
|
|
|
15
17
|
}
|
|
16
18
|
return cachedAppConfig;
|
|
17
19
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
+
/**
|
|
21
|
+
* Builds the runtime **synchronously** — every value that needs the booted
|
|
22
|
+
* app is read on first request instead of at registration time. That is what
|
|
23
|
+
* lets `collaborationRoutes` stay synchronous and therefore composable inside
|
|
24
|
+
* `router.group()`.
|
|
25
|
+
*/
|
|
26
|
+
function resolveRuntime(options, managerFallback) {
|
|
20
27
|
const managerFn = () => {
|
|
21
28
|
const provided = options.manager;
|
|
22
29
|
if (provided) {
|
|
@@ -29,14 +36,33 @@ async function resolveRuntime(options, managerFallback) {
|
|
|
29
36
|
// Default: booted container singleton via services/main.
|
|
30
37
|
return import('./services/main.js').then((module) => module.default.current);
|
|
31
38
|
};
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
+
const settings = async () => {
|
|
40
|
+
const appConfig = await readAppConfig();
|
|
41
|
+
return {
|
|
42
|
+
engine: options.engine ?? appConfig.engine ?? 'yjs',
|
|
43
|
+
path: options.path ?? appConfig.path ?? '/collaboration',
|
|
44
|
+
partykit: options.partykit ?? appConfig.partykit ?? {},
|
|
45
|
+
};
|
|
39
46
|
};
|
|
47
|
+
/**
|
|
48
|
+
* The asymmetry this closes: `authorize` used to be read from `options`
|
|
49
|
+
* only, so manual mode had none — and one code path then denied everything
|
|
50
|
+
* while another skipped the check entirely. There is exactly one resolution
|
|
51
|
+
* order now, and its last step is a denial.
|
|
52
|
+
*/
|
|
53
|
+
const authorize = options.authorize ??
|
|
54
|
+
(async (ctx, docName) => {
|
|
55
|
+
const manager = await managerFn().catch(() => undefined);
|
|
56
|
+
if (manager && typeof manager.authorize === 'function') {
|
|
57
|
+
return manager.authorize(ctx, docName);
|
|
58
|
+
}
|
|
59
|
+
const appConfig = await readAppConfig();
|
|
60
|
+
if (typeof appConfig.authorize === 'function') {
|
|
61
|
+
return appConfig.authorize(ctx, docName);
|
|
62
|
+
}
|
|
63
|
+
return DENY_ALL;
|
|
64
|
+
});
|
|
65
|
+
return { settings, manager: managerFn, authorize };
|
|
40
66
|
}
|
|
41
67
|
/** Timing-safe comparison for shared secrets. */
|
|
42
68
|
export function secretsMatch(received, expected) {
|
|
@@ -46,6 +72,23 @@ export function secretsMatch(received, expected) {
|
|
|
46
72
|
return timingSafeEqual(digest(received), digest(expected));
|
|
47
73
|
}
|
|
48
74
|
/* ───────────────────────────── permissions ───────────────────────────── */
|
|
75
|
+
/**
|
|
76
|
+
* Who may resolve or delete an existing comment.
|
|
77
|
+
*
|
|
78
|
+
* `canComment` is permission to *add* an annotation — it is not permission to
|
|
79
|
+
* silence someone else's. The rule, stated once so it can be tested once:
|
|
80
|
+
*
|
|
81
|
+
* - the **author** may always resolve or delete their own comment;
|
|
82
|
+
* - anyone else needs the elevated capability on the document (`canWrite`) —
|
|
83
|
+
* an editor moderating a thread, not a fellow commenter.
|
|
84
|
+
*/
|
|
85
|
+
export function canMutateComment(input) {
|
|
86
|
+
if (!input.comment)
|
|
87
|
+
return false;
|
|
88
|
+
if (input.comment.userId != null && String(input.comment.userId) === input.userId)
|
|
89
|
+
return true;
|
|
90
|
+
return input.permission.canWrite === true;
|
|
91
|
+
}
|
|
49
92
|
/**
|
|
50
93
|
* Resolve the caller and the permission they hold on `docName` — the same
|
|
51
94
|
* `authorize` the WebSocket handshake runs, so a document's rule cannot be
|
|
@@ -72,11 +115,7 @@ async function guard(ctx, runtime, userResolver, docName, capability) {
|
|
|
72
115
|
if (!user) {
|
|
73
116
|
return { denied: ctx.response.status(401).json({ error: 'unauthenticated' }) };
|
|
74
117
|
}
|
|
75
|
-
|
|
76
|
-
// fail closed rather than serving every document to every caller.
|
|
77
|
-
const permission = runtime.authorize
|
|
78
|
-
? await runtime.authorize({ userId: user.id, ...(user.name ? { user: { name: user.name } } : {}) }, docName)
|
|
79
|
-
: { canRead: false, canWrite: false, canComment: false };
|
|
118
|
+
const permission = await runtime.authorize({ userId: user.id, ...(user.name ? { user: { name: user.name } } : {}) }, docName);
|
|
80
119
|
if (!permission[capability]) {
|
|
81
120
|
return {
|
|
82
121
|
denied: ctx.response
|
|
@@ -84,7 +123,7 @@ async function guard(ctx, runtime, userResolver, docName, capability) {
|
|
|
84
123
|
.json({ error: `no ${capability} access to document "${docName}"` }),
|
|
85
124
|
};
|
|
86
125
|
}
|
|
87
|
-
return { user, docName };
|
|
126
|
+
return { user, docName, permission };
|
|
88
127
|
}
|
|
89
128
|
function isDenied(result) {
|
|
90
129
|
return 'denied' in result;
|
|
@@ -109,9 +148,10 @@ async function handleToken(ctx, runtime, userResolver) {
|
|
|
109
148
|
return ctx.response.status(401).json({ error: 'unauthenticated' });
|
|
110
149
|
}
|
|
111
150
|
try {
|
|
151
|
+
const settings = await runtime.settings();
|
|
112
152
|
const manager = await runtime.manager();
|
|
113
|
-
const engine = manager.engineFor ? await manager.engineFor({ docName }) :
|
|
114
|
-
return await issueToken({ engine, path:
|
|
153
|
+
const engine = manager.engineFor ? await manager.engineFor({ docName }) : settings.engine;
|
|
154
|
+
return await issueToken({ engine, path: settings.path, partykit: settings.partykit }, user, docName, runtime.authorize);
|
|
115
155
|
}
|
|
116
156
|
catch (error) {
|
|
117
157
|
if (error instanceof CollabForbiddenError) {
|
|
@@ -144,6 +184,24 @@ async function handleCreateComment(ctx, runtime, resolveUser) {
|
|
|
144
184
|
authorName: body.authorName ?? allowed.user.name ?? null,
|
|
145
185
|
});
|
|
146
186
|
}
|
|
187
|
+
/**
|
|
188
|
+
* Loads the comment being mutated and checks {@link canMutateComment}.
|
|
189
|
+
* Returns the response to send when the mutation must not happen.
|
|
190
|
+
*/
|
|
191
|
+
async function guardCommentMutation(ctx, manager, allowed, commentId) {
|
|
192
|
+
// One comment, not the document's whole comment list: this runs on every
|
|
193
|
+
// PATCH and DELETE, and scanning every comment to authorize one of them made
|
|
194
|
+
// the check grow with the discussion.
|
|
195
|
+
const comment = (await manager.comments.get(allowed.docName, commentId));
|
|
196
|
+
if (!comment) {
|
|
197
|
+
return { denied: ctx.response.status(404).json({ error: 'comment not found' }) };
|
|
198
|
+
}
|
|
199
|
+
if (!canMutateComment({ comment, userId: allowed.user.id, permission: allowed.permission })) {
|
|
200
|
+
const error = 'only the comment author, or someone who can write the document, may do that';
|
|
201
|
+
return { denied: ctx.response.status(403).json({ error }) };
|
|
202
|
+
}
|
|
203
|
+
return { ok: true };
|
|
204
|
+
}
|
|
147
205
|
async function handleResolveComment(ctx, runtime, resolveUser) {
|
|
148
206
|
const doc = ctx.request.qs().doc;
|
|
149
207
|
const commentId = String(ctx.request.params?.id ?? '');
|
|
@@ -152,6 +210,9 @@ async function handleResolveComment(ctx, runtime, resolveUser) {
|
|
|
152
210
|
if (isDenied(allowed))
|
|
153
211
|
return allowed.denied;
|
|
154
212
|
const manager = await runtime.manager();
|
|
213
|
+
const mutation = await guardCommentMutation(ctx, manager, allowed, commentId);
|
|
214
|
+
if (isDenied(mutation))
|
|
215
|
+
return mutation.denied;
|
|
155
216
|
return manager.comments.resolve(allowed.docName, commentId, resolved);
|
|
156
217
|
}
|
|
157
218
|
async function handleDeleteComment(ctx, runtime, resolveUser) {
|
|
@@ -161,6 +222,9 @@ async function handleDeleteComment(ctx, runtime, resolveUser) {
|
|
|
161
222
|
if (isDenied(allowed))
|
|
162
223
|
return allowed.denied;
|
|
163
224
|
const manager = await runtime.manager();
|
|
225
|
+
const mutation = await guardCommentMutation(ctx, manager, allowed, commentId);
|
|
226
|
+
if (isDenied(mutation))
|
|
227
|
+
return mutation.denied;
|
|
164
228
|
return { deleted: await manager.comments.remove(allowed.docName, commentId) };
|
|
165
229
|
}
|
|
166
230
|
async function handleListVersions(ctx, runtime, resolveUser) {
|
|
@@ -211,8 +275,8 @@ async function handleSaveState(ctx, runtime) {
|
|
|
211
275
|
if (!doc) {
|
|
212
276
|
return ctx.response.status(400).json({ error: 'query param "doc" is required' });
|
|
213
277
|
}
|
|
214
|
-
const
|
|
215
|
-
if (!secretsMatch(ctx.request.header('x-collab-worker-secret'),
|
|
278
|
+
const { partykit } = await runtime.settings();
|
|
279
|
+
if (!secretsMatch(ctx.request.header('x-collab-worker-secret'), partykit.jwtSecret)) {
|
|
216
280
|
return ctx.response.status(403).json({ error: 'invalid worker secret' });
|
|
217
281
|
}
|
|
218
282
|
const manager = await runtime.manager();
|
|
@@ -228,9 +292,14 @@ async function handleSaveState(ctx, runtime) {
|
|
|
228
292
|
/**
|
|
229
293
|
* Registers every collaboration REST endpoint under an optional prefix
|
|
230
294
|
* (default `/collaboration`).
|
|
295
|
+
*
|
|
296
|
+
* **Synchronous on purpose.** `RouteGroup` closes as soon as its callback
|
|
297
|
+
* returns, so anything registered after an `await` lands outside the group —
|
|
298
|
+
* which made it impossible to wrap these routes in an app's own middleware.
|
|
299
|
+
* Everything that needs the booted app is resolved at request time instead.
|
|
231
300
|
*/
|
|
232
|
-
export
|
|
233
|
-
const runtime =
|
|
301
|
+
export function collaborationRoutes(router, options = {}) {
|
|
302
|
+
const runtime = resolveRuntime(options, options.managerFallback);
|
|
234
303
|
const resolveUser = options.resolveUser ?? defaultResolveUser;
|
|
235
304
|
router
|
|
236
305
|
.group(() => {
|
|
@@ -253,12 +322,34 @@ function registerRoute(router, method, pattern, handler) {
|
|
|
253
322
|
router[method](pattern, handler);
|
|
254
323
|
}
|
|
255
324
|
/**
|
|
256
|
-
* Default auth resolution
|
|
257
|
-
*
|
|
258
|
-
*
|
|
325
|
+
* Default auth resolution.
|
|
326
|
+
*
|
|
327
|
+
* Reads `ctx.auth.user` — but *authenticates first* when the auth stack has
|
|
328
|
+
* not run yet. With a lazily-resolving guard `ctx.auth.user` is simply
|
|
329
|
+
* `undefined` until something calls `check()`/`authenticate()`, which is why
|
|
330
|
+
* every app ended up bolting a global middleware onto a hardcoded
|
|
331
|
+
* `/collaboration` prefix. Here `check()` is preferred because it reports
|
|
332
|
+
* failure by returning `false` instead of throwing.
|
|
333
|
+
*
|
|
334
|
+
* Still fails closed: no user, no request.
|
|
259
335
|
*/
|
|
260
|
-
export const defaultResolveUser = (ctx) => {
|
|
261
|
-
const
|
|
336
|
+
export const defaultResolveUser = async (ctx) => {
|
|
337
|
+
const auth = ctx.auth;
|
|
338
|
+
if (auth && !auth.user) {
|
|
339
|
+
try {
|
|
340
|
+
if (typeof auth.check === 'function') {
|
|
341
|
+
await auth.check();
|
|
342
|
+
}
|
|
343
|
+
else if (typeof auth.authenticate === 'function') {
|
|
344
|
+
await auth.authenticate();
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
catch {
|
|
348
|
+
// A failed authentication is an absent user — reported as 401 below,
|
|
349
|
+
// never as a 500.
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
const user = auth?.user;
|
|
262
353
|
if (!user || user.id === undefined || user.id === null) {
|
|
263
354
|
throw new CollabUnauthorizedError('no authenticated user on context — protect these routes with your auth middleware or provide routes.resolveUser in config/collaboration.ts');
|
|
264
355
|
}
|
package/dist/src/routes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/routes.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAoB,oBAAoB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACrF,OAAO,EAKL,uBAAuB,GACxB,MAAM,iBAAiB,CAAC;AAqDzB,oEAAoE;AACpE,MAAM,QAAQ,GAAqB,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;AAU1F,IAAI,eAA2C,CAAC;AAEhD,KAAK,UAAU,aAAa;IAC1B,IAAI,eAAe;QAAE,OAAO,eAAe,CAAC;IAC5C,IAAI,CAAC;QACH,uDAAuD;QACvD,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAC,6BAA6B,CAAC,CAAC,CAAC,OAEzD,CAAC;QACF,eAAe,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,EAAE,CAAmB,CAAC;IAC1E,CAAC;IAAC,MAAM,CAAC;QACP,eAAe,GAAG,EAAE,CAAC;IACvB,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC;AAED;;;;;GAKG;AACH,SAAS,cAAc,CACrB,OAA4B,EAC5B,eAAkD;IAElD,MAAM,SAAS,GAAG,GAA+B,EAAE;QACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;QACjC,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,OAAO,QAAQ,KAAK,UAAU;gBACnC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAC7B,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,eAAe;YAAE,OAAO,eAAe,EAAE,CAAC;QAC9C,yDAAyD;QACzD,OAAO,MAAM,CAAC,oBAAoB,CAAC,CAAC,IAAI,CACtC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,OAAuC,CACnE,CAAC;IACJ,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,KAAK,IAA8B,EAAE;QACpD,MAAM,SAAS,GAAG,MAAM,aAAa,EAAE,CAAC;QACxC,OAAO;YACL,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,IAAI,KAAK;YACnD,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,IAAI,gBAAgB;YACxD,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,SAAS,CAAC,QAAQ,IAAI,EAAE;SACvD,CAAC;IACJ,CAAC,CAAC;IAEF;;;;;OAKG;IACH,MAAM,SAAS,GACb,OAAO,CAAC,SAAS;QACjB,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;YACtB,MAAM,OAAO,GAAG,MAAM,SAAS,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YACzD,IAAI,OAAO,IAAI,OAAO,OAAO,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;gBACvD,OAAO,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YACzC,CAAC;YACD,MAAM,SAAS,GAAG,MAAM,aAAa,EAAE,CAAC;YACxC,IAAI,OAAO,SAAS,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;gBAC9C,OAAO,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAC3C,CAAC;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC,CAAC,CAAC;IAEL,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AACrD,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,YAAY,CAAC,QAA4B,EAAE,QAA4B;IACrF,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IACzC,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,EAAE,CAC/B,UAAU,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;IACtE,OAAO,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,6EAA6E;AAE7E;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAIhC;IACC,IAAI,CAAC,KAAK,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IACjC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,IAAI,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAC/F,OAAO,KAAK,CAAC,UAAU,CAAC,QAAQ,KAAK,IAAI,CAAC;AAC5C,CAAC;AASD;;;;;;;;GAQG;AACH,KAAK,UAAU,KAAK,CAClB,GAAsB,EACtB,OAAgB,EAChB,YAA6D,EAC7D,OAA2B,EAC3B,UAAiD;IAEjD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAC,EAAE,CAAC;IAC7F,CAAC;IAED,IAAI,IAA4B,CAAC;IACjC,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,uBAAuB,EAAE,CAAC;YAC7C,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QAC7E,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC;IACjF,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,SAAS,CACxC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EACxE,OAAO,CACR,CAAC;IAEF,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,OAAO;YACL,MAAM,EAAE,GAAG,CAAC,QAAQ;iBACjB,MAAM,CAAC,GAAG,CAAC;iBACX,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,UAAU,wBAAwB,OAAO,GAAG,EAAE,CAAC;SACvE,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;AACvC,CAAC;AAED,SAAS,QAAQ,CAAC,MAAc;IAC9B,OAAO,QAAQ,IAAI,MAAM,CAAC;AAC5B,CAAC;AAED,0EAA0E;AAE1E,KAAK,UAAU,WAAW,CACxB,GAAsB,EACtB,OAAgB,EAChB,YAA6D;IAE7D,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC;IACrC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,IAAI,IAA4B,CAAC;IACjC,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,uBAAuB,EAAE,CAAC;YAC7C,OAAO,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC1F,OAAO,MAAM,UAAU,CACrB,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAC5D,IAAI,EACJ,OAAO,EACP,OAAO,CAAC,SAAS,CAClB,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,oBAAoB,EAAE,CAAC;YAC1C,OAAO,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,GAAsB,EACtB,OAAgB,EAChB,WAA4D;IAE5D,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAsC,CAAC;IAC5E,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IACvE,IAAI,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC;IAE7C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IACxC,OAAO,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AACvD,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,GAAsB,EACtB,OAAgB,EAChB,WAA4D;IAE5D,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAMzB,CAAC;IACL,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACnF,IAAI,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC;IAE7C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IACxC,OAAO,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE;QAC9C,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,yEAAyE;QACzE,iEAAiE;QACjE,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE;QACvB,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI;KACzD,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,oBAAoB,CACjC,GAAsB,EACtB,OAA0B,EAC1B,OAAgB,EAChB,SAAiB;IAEjB,yEAAyE;IACzE,6EAA6E;IAC7E,sCAAsC;IACtC,MAAM,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAG1D,CAAC;IAEd,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,EAAE,CAAC;IACnF,CAAC;IACD,IAAI,CAAC,gBAAgB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC;QAC5F,MAAM,KAAK,GAAG,6EAA6E,CAAC;QAC5F,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IAC9D,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,GAAsB,EACtB,OAAgB,EAChB,WAA4D;IAE5D,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,GAAyB,CAAC;IACvD,MAAM,SAAS,GAAG,MAAM,CAAE,GAAG,CAAC,OAAO,CAAC,MAA8C,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAChG,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAA0B,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;IACtF,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;IAC1E,IAAI,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC;IAE7C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IACxC,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IAC9E,IAAI,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC,MAAM,CAAC;IAE/C,OAAO,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AACxE,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,GAAsB,EACtB,OAAgB,EAChB,WAA4D;IAE5D,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,GAAyB,CAAC;IACvD,MAAM,SAAS,GAAG,MAAM,CAAE,GAAG,CAAC,OAAO,CAAC,MAA8C,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAChG,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;IAC1E,IAAI,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC;IAE7C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IACxC,MAAM,QAAQ,GAAG,MAAM,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;IAC9E,IAAI,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC,MAAM,CAAC;IAE/C,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;AAChF,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,GAAsB,EACtB,OAAgB,EAChB,WAA4D;IAE5D,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,GAAyB,CAAC;IACvD,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IACvE,IAAI,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC;IAE7C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IACxC,OAAO,OAAO,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,GAAsB,EACtB,OAAgB,EAChB,WAA4D;IAE5D,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAuC,CAAC;IACrE,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACjF,IAAI,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC;IAE7C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IACxC,OAAO,OAAO,CAAC,aAAa,CAAC;QAC3B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE;QAC1B,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI;KAC1B,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,GAAsB,EACtB,OAAgB,EAChB,WAA4D;IAE5D,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAA0C,CAAC;IACxE,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACjF,IAAI,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC;IAE7C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IACxC,MAAM,OAAO,CAAC,cAAc,CAAC;QAC3B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE;KAC5B,CAAC,CAAC;IACH,OAAO,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;AAClC,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,GAAsB,EACtB,OAAgB,EAChB,WAA4D;IAE5D,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,GAAyB,CAAC;IACvD,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IACvE,IAAI,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC;IAE7C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IACxC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3E,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;IAChE,OAAO,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,GAAsB,EAAE,OAAgB;IACrE,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;IAC/C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAC,CAAC;IACnF,CAAC;IACD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,OAAO,CAAC,QAAQ,EAAE,CAAC;IAC9C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,wBAAwB,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACpF,OAAO,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IACxC,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;QAC7B,OAAO,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnC,KAAK,EAAE,mEAAmE;SAC3E,CAAC,CAAC;IACL,CAAC;IACD,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IAC9B,MAAM,OAAO,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,UAAU,CAAC,GAAG,IAAI,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAClG,OAAO,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;AAClC,CAAC;AAkBD;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAmC,EACnC,UAAwF,EAAE;IAE1F,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IACjE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,kBAAkB,CAAC;IAE9D,MAAM;SACH,KAAK,CAAC,GAAG,EAAE;QACV,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;QAExF,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CAChD,kBAAkB,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,CAC9C,CAAC;QACF,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CACjD,mBAAmB,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,CAC/C,CAAC;QACF,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,GAAG,EAAE,EAAE,CACtD,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,CAChD,CAAC;QACF,aAAa,CAAC,MAAM,EAAE,QAAQ,EAAE,eAAe,EAAE,CAAC,GAAG,EAAE,EAAE,CACvD,mBAAmB,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,CAC/C,CAAC;QAEF,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CAChD,kBAAkB,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,CAC9C,CAAC;QACF,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CACjD,mBAAmB,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,CAC/C,CAAC;QACF,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC,GAAG,EAAE,EAAE,CACzD,oBAAoB,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,CAChD,CAAC;QAEF,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;QAC3F,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;IAClF,CAAC,CAAC;SACD,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,gBAAgB,CAAC;SAC1C,UAAU,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC;AAID,kFAAkF;AAClF,SAAS,aAAa,CACpB,MAAmC,EACnC,MAAkB,EAClB,OAAe,EACf,OAAqD;IAErD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACnC,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAoD,KAAK,EAAE,GAAG,EAAE,EAAE;IAC/F,MAAM,IAAI,GAAG,GAAG,CAAC,IAOJ,CAAC;IAEd,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;gBACrC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACrB,CAAC;iBAAM,IAAI,OAAO,IAAI,CAAC,YAAY,KAAK,UAAU,EAAE,CAAC;gBACnD,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;YAC5B,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,qEAAqE;YACrE,kBAAkB;QACpB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,EAAE,IAAoD,CAAC;IACxE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,KAAK,SAAS,IAAI,IAAI,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;QACvD,MAAM,IAAI,uBAAuB,CAC/B,4IAA4I,CAC7I,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,EAAG,IAAI,CAAC,IAA2B,IAAI,IAAI,EAAE,CAAC;AAClF,CAAC,CAAC"}
|
|
@@ -11,6 +11,15 @@ export declare class CommentService {
|
|
|
11
11
|
private storage;
|
|
12
12
|
constructor(storage: CollaborationStorage);
|
|
13
13
|
list(docName: string, space?: string): Promise<CollabComment[]>;
|
|
14
|
+
/**
|
|
15
|
+
* One comment by id, without loading the document's whole comment list.
|
|
16
|
+
*
|
|
17
|
+
* The permission check on a PATCH/DELETE needs exactly one comment; doing it
|
|
18
|
+
* through `list()` made every mutation O(n) in the document's comments and
|
|
19
|
+
* grew with the discussion. Storages that can index the lookup implement
|
|
20
|
+
* `getComment`; the rest keep the old scan, but behind this call.
|
|
21
|
+
*/
|
|
22
|
+
get(docName: string, commentId: string): Promise<CollabComment | null>;
|
|
14
23
|
create(docName: string, comment: Omit<CollabComment, 'id' | 'createdAt' | 'updatedAt' | 'resolvedAt'>): Promise<CollabComment>;
|
|
15
24
|
resolve(docName: string, commentId: string, resolved: boolean): Promise<CollabComment | null>;
|
|
16
25
|
remove(docName: string, commentId: string): Promise<boolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"comment_service.d.ts","sourceRoot":"","sources":["../../../src/services/comment_service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEvE;;;;;;;GAOG;AACH,qBAAa,cAAc;IACb,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,oBAAoB;IAE3C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"comment_service.d.ts","sourceRoot":"","sources":["../../../src/services/comment_service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEvE;;;;;;;GAOG;AACH,qBAAa,cAAc;IACb,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAE,oBAAoB;IAE3C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAKrE;;;;;;;OAOG;IACG,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAQtE,MAAM,CACV,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,IAAI,GAAG,WAAW,GAAG,WAAW,GAAG,YAAY,CAAC,GAC5E,OAAO,CAAC,aAAa,CAAC;IAcnB,OAAO,CACX,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,OAAO,GAChB,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAa1B,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAMnE"}
|
|
@@ -16,6 +16,21 @@ export class CommentService {
|
|
|
16
16
|
const comments = await this.storage.listComments(docName, space);
|
|
17
17
|
return comments.sort((a, b) => a.createdAt.localeCompare(b.createdAt));
|
|
18
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* One comment by id, without loading the document's whole comment list.
|
|
21
|
+
*
|
|
22
|
+
* The permission check on a PATCH/DELETE needs exactly one comment; doing it
|
|
23
|
+
* through `list()` made every mutation O(n) in the document's comments and
|
|
24
|
+
* grew with the discussion. Storages that can index the lookup implement
|
|
25
|
+
* `getComment`; the rest keep the old scan, but behind this call.
|
|
26
|
+
*/
|
|
27
|
+
async get(docName, commentId) {
|
|
28
|
+
if (this.storage.getComment) {
|
|
29
|
+
return this.storage.getComment(docName, commentId);
|
|
30
|
+
}
|
|
31
|
+
const comments = await this.storage.listComments(docName);
|
|
32
|
+
return comments.find((comment) => comment.id === commentId) ?? null;
|
|
33
|
+
}
|
|
19
34
|
async create(docName, comment) {
|
|
20
35
|
const now = new Date().toISOString();
|
|
21
36
|
const created = {
|
|
@@ -30,8 +45,7 @@ export class CommentService {
|
|
|
30
45
|
return created;
|
|
31
46
|
}
|
|
32
47
|
async resolve(docName, commentId, resolved) {
|
|
33
|
-
const
|
|
34
|
-
const target = comments.find((comment) => comment.id === commentId);
|
|
48
|
+
const target = await this.get(docName, commentId);
|
|
35
49
|
if (!target)
|
|
36
50
|
return null;
|
|
37
51
|
const updated = {
|
|
@@ -43,8 +57,7 @@ export class CommentService {
|
|
|
43
57
|
return updated;
|
|
44
58
|
}
|
|
45
59
|
async remove(docName, commentId) {
|
|
46
|
-
const
|
|
47
|
-
const exists = comments.some((comment) => comment.id === commentId);
|
|
60
|
+
const exists = (await this.get(docName, commentId)) !== null;
|
|
48
61
|
if (!exists)
|
|
49
62
|
return false;
|
|
50
63
|
await this.storage.deleteComment(docName, commentId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"comment_service.js","sourceRoot":"","sources":["../../../src/services/comment_service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC;;;;;;;GAOG;AACH,MAAM,OAAO,cAAc;IACL;IAApB,YAAoB,OAA6B;QAA7B,YAAO,GAAP,OAAO,CAAsB;IAAG,CAAC;IAErD,KAAK,CAAC,IAAI,CAAC,OAAe,EAAE,KAAc;QACxC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACjE,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,KAAK,CAAC,MAAM,CACV,OAAe,EACf,OAA6E;QAE7E,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,OAAO,GAAkB;YAC7B,GAAG,OAAO;YACV,YAAY,EAAE,OAAO;YACrB,EAAE,EAAE,UAAU,EAAE;YAChB,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,IAAI;SAChB,CAAC;QACF,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,OAAO,CACX,OAAe,EACf,SAAiB,EACjB,QAAiB;QAEjB,MAAM,
|
|
1
|
+
{"version":3,"file":"comment_service.js","sourceRoot":"","sources":["../../../src/services/comment_service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC;;;;;;;GAOG;AACH,MAAM,OAAO,cAAc;IACL;IAApB,YAAoB,OAA6B;QAA7B,YAAO,GAAP,OAAO,CAAsB;IAAG,CAAC;IAErD,KAAK,CAAC,IAAI,CAAC,OAAe,EAAE,KAAc;QACxC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACjE,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IACzE,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,GAAG,CAAC,OAAe,EAAE,SAAiB;QAC1C,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACrD,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QAC1D,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,KAAK,SAAS,CAAC,IAAI,IAAI,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,MAAM,CACV,OAAe,EACf,OAA6E;QAE7E,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,OAAO,GAAkB;YAC7B,GAAG,OAAO;YACV,YAAY,EAAE,OAAO;YACrB,EAAE,EAAE,UAAU,EAAE;YAChB,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,IAAI;SAChB,CAAC;QACF,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,OAAO,CACX,OAAe,EACf,SAAiB,EACjB,QAAiB;QAEjB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QAEzB,MAAM,OAAO,GAAkB;YAC7B,GAAG,MAAM;YACT,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI;YACtD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QACF,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAe,EAAE,SAAiB;QAC7C,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,KAAK,IAAI,CAAC;QAC7D,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC1B,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|
|
@@ -37,6 +37,13 @@ export declare class LucidStorage implements CollaborationStorage {
|
|
|
37
37
|
loadVersionSnapshot(docName: string, versionId: string): Promise<Uint8Array | null>;
|
|
38
38
|
pruneVersions({ keep, docName, dryRun }: PruneVersionsOptions): Promise<number>;
|
|
39
39
|
listComments(docName: string, space?: string): Promise<CollabComment[]>;
|
|
40
|
+
private toComment;
|
|
41
|
+
/**
|
|
42
|
+
* Indexed single-row lookup — the reason {@link CollaborationStorage.getComment}
|
|
43
|
+
* exists. The permission check on a comment mutation used to read every
|
|
44
|
+
* comment on the document to find one.
|
|
45
|
+
*/
|
|
46
|
+
getComment(docName: string, commentId: string): Promise<CollabComment | null>;
|
|
40
47
|
saveComment(docName: string, comment: CollabComment): Promise<void>;
|
|
41
48
|
deleteComment(docName: string, commentId: string): Promise<void>;
|
|
42
49
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lucid_storage.d.ts","sourceRoot":"","sources":["../../../src/storage/lucid_storage.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,aAAa,CAAC;AAGrB;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACpC;AAKD;;;;;;;;;;GAUG;AACH,qBAAa,YAAa,YAAW,oBAAoB;IAKrD,OAAO,CAAC,UAAU,CAAC;IAJrB,OAAO,CAAC,KAAK,CAA8B;gBAGzC,EAAE,CAAC,EAAE,mBAAmB,EAChB,UAAU,CAAC,EAAE,MAAM,YAAA;IAM7B,6EAA6E;IAC7E,OAAO,CAAC,MAAM;IAOd,OAAO,CAAC,MAAM,CAAC,GAAG,CAAoC;IAEtD,yFAAyF;YAC3E,IAAI;YAWJ,YAAY;IAmDpB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,UAAU,CAAA;KAAE,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"lucid_storage.d.ts","sourceRoot":"","sources":["../../../src/storage/lucid_storage.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,oBAAoB,EACpB,oBAAoB,EACrB,MAAM,aAAa,CAAC;AAGrB;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACpC;AAKD;;;;;;;;;;GAUG;AACH,qBAAa,YAAa,YAAW,oBAAoB;IAKrD,OAAO,CAAC,UAAU,CAAC;IAJrB,OAAO,CAAC,KAAK,CAA8B;gBAGzC,EAAE,CAAC,EAAE,mBAAmB,EAChB,UAAU,CAAC,EAAE,MAAM,YAAA;IAM7B,6EAA6E;IAC7E,OAAO,CAAC,MAAM;IAOd,OAAO,CAAC,MAAM,CAAC,GAAG,CAAoC;IAEtD,yFAAyF;YAC3E,IAAI;YAWJ,YAAY;IAmDpB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,UAAU,CAAA;KAAE,GAAG,IAAI,CAAC;IAUpE,YAAY,CAChB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,UAAU,EACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC;IAoBV,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAgBvD,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBzF,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAYnF,aAAa,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,oBAAoB,GAAG,OAAO,CAAC,MAAM,CAAC;IAoC/E,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAS7E,OAAO,CAAC,SAAS;IAqBjB;;;;OAIG;IACG,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAY7E,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BnE,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAKvE;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,YAAY,CAEhF"}
|
|
@@ -88,7 +88,10 @@ export class LucidStorage {
|
|
|
88
88
|
}
|
|
89
89
|
async loadDocument(docName) {
|
|
90
90
|
await this.ensure();
|
|
91
|
-
const row = await (await this.knex())
|
|
91
|
+
const row = await (await this.knex())
|
|
92
|
+
.from('collab_documents')
|
|
93
|
+
.where('doc_name', docName)
|
|
94
|
+
.first();
|
|
92
95
|
if (!row?.state)
|
|
93
96
|
return null;
|
|
94
97
|
return { state: new Uint8Array(row.state) };
|
|
@@ -106,9 +109,7 @@ export class LucidStorage {
|
|
|
106
109
|
await knex.from('collab_documents').where('doc_name', docName).update(payload);
|
|
107
110
|
}
|
|
108
111
|
else {
|
|
109
|
-
await knex
|
|
110
|
-
.table('collab_documents')
|
|
111
|
-
.insert({
|
|
112
|
+
await knex.table('collab_documents').insert({
|
|
112
113
|
doc_name: docName,
|
|
113
114
|
...payload,
|
|
114
115
|
created_at: new Date(),
|
|
@@ -200,7 +201,10 @@ export class LucidStorage {
|
|
|
200
201
|
if (space)
|
|
201
202
|
query = query.where('space', space);
|
|
202
203
|
const rows = await query;
|
|
203
|
-
return rows.map((row) => (
|
|
204
|
+
return rows.map((row) => this.toComment(row));
|
|
205
|
+
}
|
|
206
|
+
toComment(row) {
|
|
207
|
+
return {
|
|
204
208
|
id: row.id,
|
|
205
209
|
documentName: row.doc_name,
|
|
206
210
|
space: row.space ?? 'text',
|
|
@@ -208,10 +212,31 @@ export class LucidStorage {
|
|
|
208
212
|
body: row.body,
|
|
209
213
|
userId: row.user_id,
|
|
210
214
|
authorName: row.author_name ?? null,
|
|
211
|
-
resolvedAt: row.resolved_at?.toISOString?.() ??
|
|
215
|
+
resolvedAt: row.resolved_at?.toISOString?.() ??
|
|
216
|
+
row.resolved_at ??
|
|
217
|
+
null,
|
|
212
218
|
createdAt: row.created_at?.toISOString?.() ?? String(row.created_at),
|
|
213
|
-
updatedAt: row.updated_at?.toISOString?.() ??
|
|
214
|
-
|
|
219
|
+
updatedAt: row.updated_at?.toISOString?.() ??
|
|
220
|
+
row.updated_at ??
|
|
221
|
+
null,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Indexed single-row lookup — the reason {@link CollaborationStorage.getComment}
|
|
226
|
+
* exists. The permission check on a comment mutation used to read every
|
|
227
|
+
* comment on the document to find one.
|
|
228
|
+
*/
|
|
229
|
+
async getComment(docName, commentId) {
|
|
230
|
+
await this.ensure();
|
|
231
|
+
const knex = await this.knex();
|
|
232
|
+
const row = await knex
|
|
233
|
+
.from('collab_comments')
|
|
234
|
+
.where('doc_name', docName)
|
|
235
|
+
.where('id', commentId)
|
|
236
|
+
.first();
|
|
237
|
+
if (!row)
|
|
238
|
+
return null;
|
|
239
|
+
return this.toComment(row);
|
|
215
240
|
}
|
|
216
241
|
async saveComment(docName, comment) {
|
|
217
242
|
await this.ensure();
|
|
@@ -231,9 +256,7 @@ export class LucidStorage {
|
|
|
231
256
|
await knex.from('collab_comments').where('id', comment.id).update(payload);
|
|
232
257
|
}
|
|
233
258
|
else {
|
|
234
|
-
await knex
|
|
235
|
-
.table('collab_comments')
|
|
236
|
-
.insert({
|
|
259
|
+
await knex.table('collab_comments').insert({
|
|
237
260
|
id: comment.id,
|
|
238
261
|
...payload,
|
|
239
262
|
created_at: new Date(comment.createdAt),
|