@omnicoreos/planka-mcp 0.2.0 → 0.3.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/.agents/plugins/marketplace.json +20 -0
- package/.claude-plugin/marketplace.json +26 -0
- package/.claude-plugin/plugin.json +45 -0
- package/.codex-plugin/mcp.json +16 -0
- package/.codex-plugin/plugin.json +27 -0
- package/.mcp.json +17 -0
- package/CHANGELOG.md +510 -0
- package/README.es.md +294 -55
- package/README.md +293 -55
- package/dist/cli/init.d.ts +101 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +481 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/client.d.ts +32 -4
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +106 -32
- package/dist/client.js.map +1 -1
- package/dist/config/policy.d.ts +82 -0
- package/dist/config/policy.d.ts.map +1 -0
- package/dist/config/policy.js +226 -0
- package/dist/config/policy.js.map +1 -0
- package/dist/errors.d.ts +5 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +62 -5
- package/dist/errors.js.map +1 -1
- package/dist/identity.generated.d.ts +2 -1
- package/dist/identity.generated.d.ts.map +1 -1
- package/dist/identity.generated.js +2 -1
- package/dist/identity.generated.js.map +1 -1
- package/dist/index.js +85 -10
- package/dist/index.js.map +1 -1
- package/dist/instructions.d.ts +21 -0
- package/dist/instructions.d.ts.map +1 -0
- package/dist/instructions.js +37 -0
- package/dist/instructions.js.map +1 -0
- package/dist/operations/actions.d.ts +654 -0
- package/dist/operations/actions.d.ts.map +1 -0
- package/dist/operations/actions.js +154 -0
- package/dist/operations/actions.js.map +1 -0
- package/dist/operations/archive.d.ts +28 -0
- package/dist/operations/archive.d.ts.map +1 -0
- package/dist/operations/archive.js +74 -0
- package/dist/operations/archive.js.map +1 -0
- package/dist/operations/attachments.d.ts +1 -1
- package/dist/operations/attachments.d.ts.map +1 -1
- package/dist/operations/attachments.js +3 -1
- package/dist/operations/attachments.js.map +1 -1
- package/dist/operations/board-id.d.ts +1 -1
- package/dist/operations/board-id.d.ts.map +1 -1
- package/dist/operations/board-id.js +13 -7
- package/dist/operations/board-id.js.map +1 -1
- package/dist/operations/boards.d.ts +96 -19
- package/dist/operations/boards.d.ts.map +1 -1
- package/dist/operations/boards.js +377 -93
- package/dist/operations/boards.js.map +1 -1
- package/dist/operations/card-brief.d.ts +91 -0
- package/dist/operations/card-brief.d.ts.map +1 -0
- package/dist/operations/card-brief.js +79 -0
- package/dist/operations/card-brief.js.map +1 -0
- package/dist/operations/cards.d.ts +34 -9
- package/dist/operations/cards.d.ts.map +1 -1
- package/dist/operations/cards.js +60 -14
- package/dist/operations/cards.js.map +1 -1
- package/dist/operations/comments.d.ts +61 -4
- package/dist/operations/comments.d.ts.map +1 -1
- package/dist/operations/comments.js +91 -8
- package/dist/operations/comments.js.map +1 -1
- package/dist/operations/duplicate.d.ts +16 -0
- package/dist/operations/duplicate.d.ts.map +1 -0
- package/dist/operations/duplicate.js +43 -0
- package/dist/operations/duplicate.js.map +1 -0
- package/dist/operations/labels.d.ts +1 -1
- package/dist/operations/labels.d.ts.map +1 -1
- package/dist/operations/labels.js +7 -4
- package/dist/operations/labels.js.map +1 -1
- package/dist/operations/lists.d.ts +63 -1
- package/dist/operations/lists.d.ts.map +1 -1
- package/dist/operations/lists.js +97 -2
- package/dist/operations/lists.js.map +1 -1
- package/dist/operations/members.d.ts +39 -0
- package/dist/operations/members.d.ts.map +1 -0
- package/dist/operations/members.js +107 -0
- package/dist/operations/members.js.map +1 -0
- package/dist/operations/projects.d.ts +16 -0
- package/dist/operations/projects.d.ts.map +1 -1
- package/dist/operations/projects.js +54 -9
- package/dist/operations/projects.js.map +1 -1
- package/dist/operations/tasks.d.ts +1 -1
- package/dist/operations/tasks.d.ts.map +1 -1
- package/dist/operations/tasks.js +5 -3
- package/dist/operations/tasks.js.map +1 -1
- package/dist/operations/users.d.ts +123 -0
- package/dist/operations/users.d.ts.map +1 -0
- package/dist/operations/users.js +180 -0
- package/dist/operations/users.js.map +1 -0
- package/dist/operations/verify.d.ts +84 -0
- package/dist/operations/verify.d.ts.map +1 -0
- package/dist/operations/verify.js +124 -0
- package/dist/operations/verify.js.map +1 -0
- package/dist/prompts.d.ts +48 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +155 -0
- package/dist/prompts.js.map +1 -0
- package/dist/resources.d.ts +38 -0
- package/dist/resources.d.ts.map +1 -0
- package/dist/resources.js +127 -0
- package/dist/resources.js.map +1 -0
- package/dist/schemas/entities.d.ts +115 -24
- package/dist/schemas/entities.d.ts.map +1 -1
- package/dist/schemas/entities.js +48 -0
- package/dist/schemas/entities.js.map +1 -1
- package/dist/schemas/requests.d.ts +121 -46
- package/dist/schemas/requests.d.ts.map +1 -1
- package/dist/schemas/requests.js +57 -12
- package/dist/schemas/requests.js.map +1 -1
- package/dist/schemas/responses.d.ts +541 -186
- package/dist/schemas/responses.d.ts.map +1 -1
- package/dist/schemas/responses.js +13 -2
- package/dist/schemas/responses.js.map +1 -1
- package/dist/tools/activity.d.ts +150 -0
- package/dist/tools/activity.d.ts.map +1 -0
- package/dist/tools/activity.js +198 -0
- package/dist/tools/activity.js.map +1 -0
- package/dist/tools/annotations.d.ts +52 -0
- package/dist/tools/annotations.d.ts.map +1 -0
- package/dist/tools/annotations.js +214 -0
- package/dist/tools/annotations.js.map +1 -0
- package/dist/tools/attachments.d.ts +28 -4
- package/dist/tools/attachments.d.ts.map +1 -1
- package/dist/tools/attachments.js +53 -34
- package/dist/tools/attachments.js.map +1 -1
- package/dist/tools/card-ops.d.ts +232 -0
- package/dist/tools/card-ops.d.ts.map +1 -0
- package/dist/tools/card-ops.js +333 -0
- package/dist/tools/card-ops.js.map +1 -0
- package/dist/tools/cards.d.ts +90 -8
- package/dist/tools/cards.d.ts.map +1 -1
- package/dist/tools/cards.js +411 -128
- package/dist/tools/cards.js.map +1 -1
- package/dist/tools/comments.d.ts +226 -22
- package/dist/tools/comments.d.ts.map +1 -1
- package/dist/tools/comments.js +163 -134
- package/dist/tools/comments.js.map +1 -1
- package/dist/tools/dispatch.d.ts +47 -0
- package/dist/tools/dispatch.d.ts.map +1 -0
- package/dist/tools/dispatch.js +63 -0
- package/dist/tools/dispatch.js.map +1 -0
- package/dist/tools/guard.d.ts +9 -0
- package/dist/tools/guard.d.ts.map +1 -0
- package/dist/tools/guard.js +20 -0
- package/dist/tools/guard.js.map +1 -0
- package/dist/tools/index.d.ts +748 -450
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +136 -17
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/labels.d.ts +213 -18
- package/dist/tools/labels.d.ts.map +1 -1
- package/dist/tools/labels.js +218 -203
- package/dist/tools/labels.js.map +1 -1
- package/dist/tools/lists.d.ts +222 -15
- package/dist/tools/lists.d.ts.map +1 -1
- package/dist/tools/lists.js +175 -156
- package/dist/tools/lists.js.map +1 -1
- package/dist/tools/members.d.ts +128 -0
- package/dist/tools/members.d.ts.map +1 -0
- package/dist/tools/members.js +150 -0
- package/dist/tools/members.js.map +1 -0
- package/dist/tools/navigation.d.ts +22 -2
- package/dist/tools/navigation.d.ts.map +1 -1
- package/dist/tools/navigation.js +60 -15
- package/dist/tools/navigation.js.map +1 -1
- package/dist/tools/queries.d.ts +196 -166
- package/dist/tools/queries.d.ts.map +1 -1
- package/dist/tools/queries.js +125 -155
- package/dist/tools/queries.js.map +1 -1
- package/dist/tools/tasks.d.ts +26 -6
- package/dist/tools/tasks.d.ts.map +1 -1
- package/dist/tools/tasks.js +110 -55
- package/dist/tools/tasks.js.map +1 -1
- package/dist/tools/users.d.ts +130 -0
- package/dist/tools/users.d.ts.map +1 -0
- package/dist/tools/users.js +165 -0
- package/dist/tools/users.js.map +1 -0
- package/docs/planka-2x-gotchas.md +121 -5
- package/docs/tools.md +771 -187
- package/docs/troubleshooting.md +137 -5
- package/hooks/hooks.json +15 -0
- package/hooks/preflight.mjs +100 -0
- package/package.json +6 -1
- package/scripts/setup.sh +8 -26
- package/scripts/sync-identity.mjs +55 -1
- package/server.json +87 -6
- package/tests/smoke/planka-smoke.mjs +512 -72
- package/workflow/skills/planka-close-card/SKILL.md +18 -5
- package/workflow/skills/planka-orchestrator/SKILL.md +36 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"members.js","sourceRoot":"","sources":["../../src/operations/members.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,8 +17,24 @@ export declare function getProjects(): Promise<{
|
|
|
17
17
|
projects: Project[];
|
|
18
18
|
boards: Board[];
|
|
19
19
|
}>;
|
|
20
|
+
/**
|
|
21
|
+
* Trims what Planka answered down to what this server is allowed to show.
|
|
22
|
+
*
|
|
23
|
+
* Filtering here (and not only at call time) is the point: an agent that
|
|
24
|
+
* cannot SEE the other boards never tries to touch them, and the error paths
|
|
25
|
+
* that list "known boards" stop leaking names from projects out of scope.
|
|
26
|
+
*/
|
|
27
|
+
export declare function applyAllowlists(projects: Project[], boards: Board[]): {
|
|
28
|
+
projects: Project[];
|
|
29
|
+
boards: Board[];
|
|
30
|
+
};
|
|
20
31
|
/**
|
|
21
32
|
* Get the full structure: projects -> boards -> lists.
|
|
33
|
+
*
|
|
34
|
+
* `GET /api/projects` already carries every visible board, so with
|
|
35
|
+
* `withLists: false` the whole structure is ONE request. With lists (the
|
|
36
|
+
* default, kept so existing callers keep their column IDs) it costs one board
|
|
37
|
+
* read per board — the N+1 that `planka_board_summary` avoids.
|
|
22
38
|
*/
|
|
23
39
|
export declare function getStructure(input?: GetStructureInput): Promise<ProjectStructure[]>;
|
|
24
40
|
//# sourceMappingURL=projects.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/operations/projects.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/operations/projects.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAsB,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG/E;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,KAAK,CAAC;QACZ,KAAK,EAAE,KAAK,CAAC;QACb,KAAK,EAAE,IAAI,EAAE,CAAC;KACf,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC;IAC3C,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,MAAM,EAAE,KAAK,EAAE,CAAC;CACjB,CAAC,CAQD;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,OAAO,EAAE,EACnB,MAAM,EAAE,KAAK,EAAE,GACd;IAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAAC,MAAM,EAAE,KAAK,EAAE,CAAA;CAAE,CAoB1C;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAChC,KAAK,GAAE,iBAAsB,GAC5B,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA2E7B"}
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* Project operations for PLANKA API.
|
|
3
3
|
*/
|
|
4
4
|
import { plankaClient } from "../client.js";
|
|
5
|
-
import { parseInput } from "../errors.js";
|
|
5
|
+
import { parseInput, PlankaError } from "../errors.js";
|
|
6
|
+
import { assertProjectAllowed, getPolicy, isBoardAllowed, isProjectAllowed, } from "../config/policy.js";
|
|
6
7
|
import { ProjectsResponse, ProjectsIncludedSchema } from "../schemas/responses.js";
|
|
7
8
|
import { GetStructureSchema } from "../schemas/requests.js";
|
|
8
9
|
import { z } from "zod";
|
|
@@ -13,26 +14,70 @@ export async function getProjects() {
|
|
|
13
14
|
const response = await plankaClient.get("/api/projects");
|
|
14
15
|
const parsed = ProjectsResponse.parse(response);
|
|
15
16
|
const included = ProjectsIncludedSchema.parse(response.included || {});
|
|
16
|
-
return
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
return applyAllowlists(parsed.items, included.boards || []);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Trims what Planka answered down to what this server is allowed to show.
|
|
21
|
+
*
|
|
22
|
+
* Filtering here (and not only at call time) is the point: an agent that
|
|
23
|
+
* cannot SEE the other boards never tries to touch them, and the error paths
|
|
24
|
+
* that list "known boards" stop leaking names from projects out of scope.
|
|
25
|
+
*/
|
|
26
|
+
export function applyAllowlists(projects, boards) {
|
|
27
|
+
const policy = getPolicy();
|
|
28
|
+
if (policy.allowedProjectIds === null && policy.allowedBoardIds === null) {
|
|
29
|
+
return { projects, boards };
|
|
30
|
+
}
|
|
31
|
+
let visibleProjects = projects.filter((p) => isProjectAllowed(p.id, policy));
|
|
32
|
+
const projectIds = new Set(visibleProjects.map((p) => p.id));
|
|
33
|
+
const visibleBoards = boards.filter((b) => projectIds.has(b.projectId) && isBoardAllowed(b.id, policy));
|
|
34
|
+
// With a board allowlist, a project with no allowed board is noise.
|
|
35
|
+
if (policy.allowedBoardIds !== null) {
|
|
36
|
+
const withBoards = new Set(visibleBoards.map((b) => b.projectId));
|
|
37
|
+
visibleProjects = visibleProjects.filter((p) => withBoards.has(p.id));
|
|
38
|
+
}
|
|
39
|
+
return { projects: visibleProjects, boards: visibleBoards };
|
|
20
40
|
}
|
|
21
41
|
/**
|
|
22
42
|
* Get the full structure: projects -> boards -> lists.
|
|
43
|
+
*
|
|
44
|
+
* `GET /api/projects` already carries every visible board, so with
|
|
45
|
+
* `withLists: false` the whole structure is ONE request. With lists (the
|
|
46
|
+
* default, kept so existing callers keep their column IDs) it costs one board
|
|
47
|
+
* read per board — the N+1 that `planka_board_summary` avoids.
|
|
23
48
|
*/
|
|
24
49
|
export async function getStructure(input = {}) {
|
|
25
|
-
const { projectId } = parseInput(GetStructureSchema, input);
|
|
50
|
+
const { projectId, withLists } = parseInput(GetStructureSchema, input);
|
|
51
|
+
// Outside the allowlist: say so instead of answering an empty structure.
|
|
52
|
+
if (projectId)
|
|
53
|
+
assertProjectAllowed(projectId);
|
|
26
54
|
const { projects, boards } = await getProjects();
|
|
27
55
|
// Filter to specific project if requested
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
56
|
+
let targetProjects = projects;
|
|
57
|
+
if (projectId) {
|
|
58
|
+
targetProjects = projects.filter((p) => p.id === projectId);
|
|
59
|
+
if (targetProjects.length === 0) {
|
|
60
|
+
const known = projects
|
|
61
|
+
.map((p) => ` - ${p.id} — "${p.name}"`)
|
|
62
|
+
.join("\n");
|
|
63
|
+
throw new PlankaError(`No project with id ${projectId} is visible to this account. ` +
|
|
64
|
+
(projects.length
|
|
65
|
+
? `Visible projects:\n${known}`
|
|
66
|
+
: "No projects are visible at all — check the credentials and the board memberships of the Planka user."), "NOT_FOUND", 404);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
31
69
|
const structures = [];
|
|
32
70
|
for (const project of targetProjects) {
|
|
33
71
|
const projectBoards = boards.filter((b) => b.projectId === project.id);
|
|
34
72
|
const boardsWithLists = [];
|
|
35
73
|
for (const board of projectBoards) {
|
|
74
|
+
// Planka has no per-board list endpoint: the columns only come inside a
|
|
75
|
+
// full board read (every card, every attachment). One per board — so it
|
|
76
|
+
// only happens when the caller asked for the lists.
|
|
77
|
+
if (!withLists) {
|
|
78
|
+
boardsWithLists.push({ board, lists: [] });
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
36
81
|
// Get board details to get lists
|
|
37
82
|
const boardResponse = await plankaClient.get(`/api/boards/${board.id}`);
|
|
38
83
|
const included = boardResponse.included;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/operations/projects.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/operations/projects.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,7 +22,7 @@ export declare function updateTask(input: UpdateTaskParamsInput): Promise<Task>;
|
|
|
22
22
|
/**
|
|
23
23
|
* Delete a task.
|
|
24
24
|
*/
|
|
25
|
-
export declare function deleteTask(input: TaskIdInput): Promise<
|
|
25
|
+
export declare function deleteTask(input: TaskIdInput): Promise<Task | null>;
|
|
26
26
|
/**
|
|
27
27
|
* Delete a task-list and all its tasks.
|
|
28
28
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/operations/tasks.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAEL,qBAAqB,EAGrB,mBAAmB,EAEnB,eAAe,EAEf,WAAW,EAEX,eAAe,EAEf,qBAAqB,EACtB,MAAM,wBAAwB,CAAC;AAqChC;;GAEG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,QAAQ,CAAC,CAanB;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBtE;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CA0B/E;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAUf;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/operations/tasks.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAEL,qBAAqB,EAGrB,mBAAmB,EAEnB,eAAe,EAEf,WAAW,EAEX,eAAe,EAEf,qBAAqB,EACtB,MAAM,wBAAwB,CAAC;AAqChC;;GAEG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,QAAQ,CAAC,CAanB;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBtE;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CA0B/E;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAUf;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAKzE;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAG1E"}
|
package/dist/operations/tasks.js
CHANGED
|
@@ -9,7 +9,7 @@ import { plankaClient } from "../client.js";
|
|
|
9
9
|
import { parseInput } from "../errors.js";
|
|
10
10
|
import { BatchCreateTasksSchema, CreateTaskListSchema, CreateTaskSchema, TaskIdSchema, TaskListIdSchema, UpdateTaskParamsSchema, } from "../schemas/requests.js";
|
|
11
11
|
import { TaskResponse, TaskListResponse } from "../schemas/responses.js";
|
|
12
|
-
import {
|
|
12
|
+
import { getCardLight } from "./cards.js";
|
|
13
13
|
const DEFAULT_TASK_LIST_NAME = "Tasks";
|
|
14
14
|
/**
|
|
15
15
|
* Get or create a default task-list for a card.
|
|
@@ -18,7 +18,7 @@ const DEFAULT_TASK_LIST_NAME = "Tasks";
|
|
|
18
18
|
async function getOrCreateDefaultTaskList(input) {
|
|
19
19
|
const { cardId } = input;
|
|
20
20
|
// Fetch card to see existing task-lists
|
|
21
|
-
const cardDetails = await
|
|
21
|
+
const cardDetails = await getCardLight({ cardId });
|
|
22
22
|
// Check if there's an existing task-list
|
|
23
23
|
if (cardDetails.taskLists && cardDetails.taskLists.length > 0) {
|
|
24
24
|
// Return the first task-list (sorted by position)
|
|
@@ -99,7 +99,9 @@ export async function updateTask(input) {
|
|
|
99
99
|
*/
|
|
100
100
|
export async function deleteTask(input) {
|
|
101
101
|
const { taskId } = parseInput(TaskIdSchema, input);
|
|
102
|
-
await plankaClient.delete(`/api/tasks/${taskId}`);
|
|
102
|
+
const body = await plankaClient.delete(`/api/tasks/${taskId}`);
|
|
103
|
+
const parsed = TaskResponse.safeParse(body);
|
|
104
|
+
return parsed.success ? parsed.data.item : null;
|
|
103
105
|
}
|
|
104
106
|
/**
|
|
105
107
|
* Delete a task-list and all its tasks.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/operations/tasks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EACL,sBAAsB,EAGtB,oBAAoB,EAEpB,gBAAgB,EAEhB,YAAY,EAEZ,gBAAgB,EAEhB,sBAAsB,GAEvB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../src/operations/tasks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Who exists in this Planka, and who this server is logged in as.
|
|
3
|
+
*
|
|
4
|
+
* `GET /api/users` is admin-or-projectOwner only (`policies.js`): an agent
|
|
5
|
+
* running as the recommended `boardUser` gets 403 and would be left unable to
|
|
6
|
+
* assign anybody. So every read here has a board-scoped fallback — the board
|
|
7
|
+
* show carries `included.users` and `included.boardMemberships` for exactly
|
|
8
|
+
* the people who can be assigned on that board, which is the useful set anyway.
|
|
9
|
+
*
|
|
10
|
+
* The fallback is never silent: the result says `source: "board"` so a caller
|
|
11
|
+
* knows it is looking at the board's members, not the instance's roster.
|
|
12
|
+
*/
|
|
13
|
+
import { z } from "zod";
|
|
14
|
+
declare const UserRowSchema: z.ZodObject<{
|
|
15
|
+
id: z.ZodString;
|
|
16
|
+
name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
17
|
+
username: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
18
|
+
email: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
19
|
+
role: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
20
|
+
isDeactivated: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
|
|
21
|
+
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
22
|
+
id: z.ZodString;
|
|
23
|
+
name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
24
|
+
username: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
25
|
+
email: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
26
|
+
role: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
27
|
+
isDeactivated: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
|
|
28
|
+
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
29
|
+
id: z.ZodString;
|
|
30
|
+
name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
31
|
+
username: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
32
|
+
email: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
33
|
+
role: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
34
|
+
isDeactivated: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
|
|
35
|
+
}, z.ZodTypeAny, "passthrough">>;
|
|
36
|
+
export type UserRow = z.infer<typeof UserRowSchema>;
|
|
37
|
+
declare const BoardMembershipSchema: z.ZodObject<{
|
|
38
|
+
id: z.ZodString;
|
|
39
|
+
boardId: z.ZodString;
|
|
40
|
+
userId: z.ZodString;
|
|
41
|
+
role: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
42
|
+
canComment: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
|
|
43
|
+
}, "passthrough", z.ZodTypeAny, z.objectOutputType<{
|
|
44
|
+
id: z.ZodString;
|
|
45
|
+
boardId: z.ZodString;
|
|
46
|
+
userId: z.ZodString;
|
|
47
|
+
role: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
48
|
+
canComment: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
|
|
49
|
+
}, z.ZodTypeAny, "passthrough">, z.objectInputType<{
|
|
50
|
+
id: z.ZodString;
|
|
51
|
+
boardId: z.ZodString;
|
|
52
|
+
userId: z.ZodString;
|
|
53
|
+
role: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
54
|
+
canComment: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
|
|
55
|
+
}, z.ZodTypeAny, "passthrough">>;
|
|
56
|
+
export type BoardMembership = z.infer<typeof BoardMembershipSchema>;
|
|
57
|
+
/** One user, reduced to what an assignment decision needs. */
|
|
58
|
+
export interface UserDigest {
|
|
59
|
+
id: string;
|
|
60
|
+
name: string;
|
|
61
|
+
username?: string;
|
|
62
|
+
role?: string;
|
|
63
|
+
/** Only in the board-scoped view: "editor" | "viewer". */
|
|
64
|
+
boardRole?: string;
|
|
65
|
+
canComment?: boolean;
|
|
66
|
+
/** Only with detail: "full" — an address is PII, not a routing key. */
|
|
67
|
+
email?: string;
|
|
68
|
+
isDeactivated?: boolean;
|
|
69
|
+
}
|
|
70
|
+
export interface ListUsersResult {
|
|
71
|
+
/** "instance" = GET /api/users · "board" = the board's own members. */
|
|
72
|
+
source: "instance" | "board";
|
|
73
|
+
boardId?: string;
|
|
74
|
+
users: UserDigest[];
|
|
75
|
+
/** Set when the instance roster was refused and the board answered instead. */
|
|
76
|
+
fellBackBecause?: string;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Everyone this server can see, instance-wide when allowed and board-scoped
|
|
80
|
+
* otherwise.
|
|
81
|
+
*/
|
|
82
|
+
export declare function listUsers(input?: {
|
|
83
|
+
boardId?: string;
|
|
84
|
+
detail?: "digest" | "full";
|
|
85
|
+
}): Promise<ListUsersResult>;
|
|
86
|
+
/** The board's own members, with their board role. */
|
|
87
|
+
export declare function listBoardUsers(input: {
|
|
88
|
+
boardId?: string;
|
|
89
|
+
detail?: "digest" | "full";
|
|
90
|
+
}): Promise<ListUsersResult>;
|
|
91
|
+
/** The account this server authenticates as. */
|
|
92
|
+
export declare function getCurrentUser(): Promise<UserRow>;
|
|
93
|
+
/**
|
|
94
|
+
* The Planka version.
|
|
95
|
+
*
|
|
96
|
+
* `/api/bootstrap` is the ONLY endpoint that carries it in 2.x — `/api/config`
|
|
97
|
+
* returns SMTP settings and nothing else, and `/swagger.json` is not served.
|
|
98
|
+
*/
|
|
99
|
+
export declare function getPlankaVersion(): Promise<string | null>;
|
|
100
|
+
/**
|
|
101
|
+
* This user's membership on one board, read from `/api/projects` (3 kB) rather
|
|
102
|
+
* than from the board show (~900 kB): both carry `boardMemberships`.
|
|
103
|
+
*/
|
|
104
|
+
export declare function getBoardMembership(input: {
|
|
105
|
+
boardId: string;
|
|
106
|
+
userId: string;
|
|
107
|
+
}): Promise<BoardMembership | null>;
|
|
108
|
+
/**
|
|
109
|
+
* Resolves names or usernames to user ids.
|
|
110
|
+
*
|
|
111
|
+
* Case-insensitive, exact match on `username` first and then on `name`. An
|
|
112
|
+
* ambiguous name is NOT guessed: assigning the wrong person is worse than
|
|
113
|
+
* failing, so it comes back in `failed`.
|
|
114
|
+
*/
|
|
115
|
+
export declare function resolveUserNames(names: string[], users: UserDigest[]): {
|
|
116
|
+
ids: string[];
|
|
117
|
+
failed: Array<{
|
|
118
|
+
userName: string;
|
|
119
|
+
reason: string;
|
|
120
|
+
}>;
|
|
121
|
+
};
|
|
122
|
+
export {};
|
|
123
|
+
//# sourceMappingURL=users.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../src/operations/users.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,QAAA,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;gCASH,CAAC;AACjB,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAKpD,QAAA,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;gCAQX,CAAC;AACjB,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAyBpE,8DAA8D;AAC9D,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0DAA0D;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,uEAAuE;IACvE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,+EAA+E;IAC/E,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AA0BD;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,KAAK,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAA;CAAO,GAC3D,OAAO,CAAC,eAAe,CAAC,CAqB1B;AAED,sDAAsD;AACtD,wBAAsB,cAAc,CAAC,KAAK,EAAE;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;CAC5B,GAAG,OAAO,CAAC,eAAe,CAAC,CAiB3B;AAED,gDAAgD;AAChD,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAGvD;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAG/D;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAQlC;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,EAAE,EACf,KAAK,EAAE,UAAU,EAAE,GAClB;IAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAqCxE"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Who exists in this Planka, and who this server is logged in as.
|
|
3
|
+
*
|
|
4
|
+
* `GET /api/users` is admin-or-projectOwner only (`policies.js`): an agent
|
|
5
|
+
* running as the recommended `boardUser` gets 403 and would be left unable to
|
|
6
|
+
* assign anybody. So every read here has a board-scoped fallback — the board
|
|
7
|
+
* show carries `included.users` and `included.boardMemberships` for exactly
|
|
8
|
+
* the people who can be assigned on that board, which is the useful set anyway.
|
|
9
|
+
*
|
|
10
|
+
* The fallback is never silent: the result says `source: "board"` so a caller
|
|
11
|
+
* knows it is looking at the board's members, not the instance's roster.
|
|
12
|
+
*/
|
|
13
|
+
import { z } from "zod";
|
|
14
|
+
import { plankaClient } from "../client.js";
|
|
15
|
+
import { PlankaError } from "../errors.js";
|
|
16
|
+
import { withBoardId } from "./board-id.js";
|
|
17
|
+
const UserRowSchema = z
|
|
18
|
+
.object({
|
|
19
|
+
id: z.string(),
|
|
20
|
+
name: z.string().nullable().optional(),
|
|
21
|
+
username: z.string().nullable().optional(),
|
|
22
|
+
email: z.string().nullable().optional(),
|
|
23
|
+
role: z.string().nullable().optional(),
|
|
24
|
+
isDeactivated: z.boolean().nullable().optional(),
|
|
25
|
+
})
|
|
26
|
+
.passthrough();
|
|
27
|
+
const UsersResponse = z.object({ items: z.array(UserRowSchema) });
|
|
28
|
+
const UserResponse = z.object({ item: UserRowSchema });
|
|
29
|
+
const BoardMembershipSchema = z
|
|
30
|
+
.object({
|
|
31
|
+
id: z.string(),
|
|
32
|
+
boardId: z.string(),
|
|
33
|
+
userId: z.string(),
|
|
34
|
+
role: z.string().nullable().optional(),
|
|
35
|
+
canComment: z.boolean().nullable().optional(),
|
|
36
|
+
})
|
|
37
|
+
.passthrough();
|
|
38
|
+
const BoardUsersResponse = z.object({
|
|
39
|
+
included: z
|
|
40
|
+
.object({
|
|
41
|
+
users: z.array(UserRowSchema).optional(),
|
|
42
|
+
boardMemberships: z.array(BoardMembershipSchema).optional(),
|
|
43
|
+
})
|
|
44
|
+
.passthrough()
|
|
45
|
+
.optional(),
|
|
46
|
+
});
|
|
47
|
+
const ProjectsMembershipsResponse = z.object({
|
|
48
|
+
included: z
|
|
49
|
+
.object({
|
|
50
|
+
boardMemberships: z.array(BoardMembershipSchema).optional(),
|
|
51
|
+
})
|
|
52
|
+
.passthrough()
|
|
53
|
+
.optional(),
|
|
54
|
+
});
|
|
55
|
+
const BootstrapResponse = z.object({
|
|
56
|
+
item: z.object({ version: z.string().optional() }).passthrough(),
|
|
57
|
+
});
|
|
58
|
+
function digestUser(user, membership, full) {
|
|
59
|
+
return {
|
|
60
|
+
id: user.id,
|
|
61
|
+
name: user.name ?? user.username ?? user.id,
|
|
62
|
+
...(user.username ? { username: user.username } : {}),
|
|
63
|
+
...(user.role ? { role: user.role } : {}),
|
|
64
|
+
...(membership?.role ? { boardRole: membership.role } : {}),
|
|
65
|
+
...(membership && membership.canComment !== null && membership.canComment !== undefined
|
|
66
|
+
? { canComment: membership.canComment }
|
|
67
|
+
: {}),
|
|
68
|
+
...(full && user.email ? { email: user.email } : {}),
|
|
69
|
+
...(user.isDeactivated ? { isDeactivated: true } : {}),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
/** True for the 403 Planka answers a `boardUser` asking for the roster. */
|
|
73
|
+
function isForbidden(error) {
|
|
74
|
+
return error instanceof PlankaError && (error.status === 403 || error.status === 401);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Everyone this server can see, instance-wide when allowed and board-scoped
|
|
78
|
+
* otherwise.
|
|
79
|
+
*/
|
|
80
|
+
export async function listUsers(input = {}) {
|
|
81
|
+
const full = input.detail === "full";
|
|
82
|
+
try {
|
|
83
|
+
const response = await plankaClient.get("/api/users");
|
|
84
|
+
const parsed = UsersResponse.parse(response);
|
|
85
|
+
return {
|
|
86
|
+
source: "instance",
|
|
87
|
+
users: parsed.items.map((user) => digestUser(user, undefined, full)),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
if (!isForbidden(error))
|
|
92
|
+
throw error;
|
|
93
|
+
const board = await listBoardUsers({ boardId: input.boardId, detail: input.detail });
|
|
94
|
+
return {
|
|
95
|
+
...board,
|
|
96
|
+
fellBackBecause: "GET /api/users is admin-only and this account is not an admin; " +
|
|
97
|
+
"these are the members of the board instead.",
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/** The board's own members, with their board role. */
|
|
102
|
+
export async function listBoardUsers(input) {
|
|
103
|
+
const full = input.detail === "full";
|
|
104
|
+
return withBoardId(input.boardId, async (boardId) => {
|
|
105
|
+
const response = await plankaClient.get(`/api/boards/${boardId}`);
|
|
106
|
+
const parsed = BoardUsersResponse.parse(response);
|
|
107
|
+
const memberships = parsed.included?.boardMemberships ?? [];
|
|
108
|
+
const byUser = new Map(memberships.map((m) => [m.userId, m]));
|
|
109
|
+
return {
|
|
110
|
+
source: "board",
|
|
111
|
+
boardId,
|
|
112
|
+
users: (parsed.included?.users ?? []).map((user) => digestUser(user, byUser.get(user.id), full)),
|
|
113
|
+
};
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
/** The account this server authenticates as. */
|
|
117
|
+
export async function getCurrentUser() {
|
|
118
|
+
const response = await plankaClient.get("/api/users/me");
|
|
119
|
+
return UserResponse.parse(response).item;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* The Planka version.
|
|
123
|
+
*
|
|
124
|
+
* `/api/bootstrap` is the ONLY endpoint that carries it in 2.x — `/api/config`
|
|
125
|
+
* returns SMTP settings and nothing else, and `/swagger.json` is not served.
|
|
126
|
+
*/
|
|
127
|
+
export async function getPlankaVersion() {
|
|
128
|
+
const response = await plankaClient.get("/api/bootstrap");
|
|
129
|
+
return BootstrapResponse.parse(response).item.version ?? null;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* This user's membership on one board, read from `/api/projects` (3 kB) rather
|
|
133
|
+
* than from the board show (~900 kB): both carry `boardMemberships`.
|
|
134
|
+
*/
|
|
135
|
+
export async function getBoardMembership(input) {
|
|
136
|
+
const response = await plankaClient.get("/api/projects");
|
|
137
|
+
const parsed = ProjectsMembershipsResponse.parse(response);
|
|
138
|
+
return ((parsed.included?.boardMemberships ?? []).find((m) => m.boardId === input.boardId && m.userId === input.userId) ?? null);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Resolves names or usernames to user ids.
|
|
142
|
+
*
|
|
143
|
+
* Case-insensitive, exact match on `username` first and then on `name`. An
|
|
144
|
+
* ambiguous name is NOT guessed: assigning the wrong person is worse than
|
|
145
|
+
* failing, so it comes back in `failed`.
|
|
146
|
+
*/
|
|
147
|
+
export function resolveUserNames(names, users) {
|
|
148
|
+
const ids = [];
|
|
149
|
+
const failed = [];
|
|
150
|
+
for (const raw of names) {
|
|
151
|
+
const wanted = raw.trim().toLowerCase();
|
|
152
|
+
if (!wanted) {
|
|
153
|
+
failed.push({ userName: raw, reason: "empty name" });
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
const byUsername = users.filter((u) => u.username?.toLowerCase() === wanted);
|
|
157
|
+
const matches = byUsername.length > 0
|
|
158
|
+
? byUsername
|
|
159
|
+
: users.filter((u) => u.name.toLowerCase() === wanted);
|
|
160
|
+
if (matches.length === 0) {
|
|
161
|
+
failed.push({
|
|
162
|
+
userName: raw,
|
|
163
|
+
reason: `no user named "${raw}" — call planka_list_users for the real names`,
|
|
164
|
+
});
|
|
165
|
+
continue;
|
|
166
|
+
}
|
|
167
|
+
if (matches.length > 1) {
|
|
168
|
+
failed.push({
|
|
169
|
+
userName: raw,
|
|
170
|
+
reason: `"${raw}" matches ${matches.length} users (${matches
|
|
171
|
+
.map((u) => u.id)
|
|
172
|
+
.join(", ")}); pass the userId`,
|
|
173
|
+
});
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
ids.push(matches[0].id);
|
|
177
|
+
}
|
|
178
|
+
return { ids, failed };
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=users.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"users.js","sourceRoot":"","sources":["../../src/operations/users.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
export interface VerifiedWriteResult<T, A> {
|
|
2
|
+
/** Whatever the write returned (usually Planka's `item`). */
|
|
3
|
+
result: T;
|
|
4
|
+
/** True only when the re-read confirmed the change. */
|
|
5
|
+
verified: boolean;
|
|
6
|
+
/** The re-read state, when the re-read succeeded. */
|
|
7
|
+
after?: A;
|
|
8
|
+
/** Set when the re-read itself blew up — the write may or may not have landed. */
|
|
9
|
+
verificationError?: string;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Run a write, re-read the entity, and report whether the change is really there.
|
|
13
|
+
*
|
|
14
|
+
* `landed` gets the re-read state and the write's own result; it answers the
|
|
15
|
+
* only question that matters: is what we asked for true now?
|
|
16
|
+
*/
|
|
17
|
+
export declare function verifiedWrite<T, A>(opts: {
|
|
18
|
+
write: () => Promise<T>;
|
|
19
|
+
reread: (written: T) => Promise<A>;
|
|
20
|
+
landed: (after: A, written: T) => boolean;
|
|
21
|
+
}): Promise<VerifiedWriteResult<T, A>>;
|
|
22
|
+
export interface VerifiedDeleteResult<T> {
|
|
23
|
+
/** The DELETE response body (Planka 2.x returns the deleted item). */
|
|
24
|
+
result: T;
|
|
25
|
+
/** True only when a re-read confirmed the entity is gone. */
|
|
26
|
+
verified: boolean;
|
|
27
|
+
/** Set when the confirmation could not be made at all. */
|
|
28
|
+
verificationError?: string;
|
|
29
|
+
/** Set when confirmation was structurally impossible (missing parent id). */
|
|
30
|
+
verificationUnavailable?: string;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Run a delete and confirm the entity is really gone.
|
|
34
|
+
*
|
|
35
|
+
* `confirmGone` returns true (gone), false (still there) or null (could not
|
|
36
|
+
* check — e.g. the parent id needed for the re-read is unknown).
|
|
37
|
+
*/
|
|
38
|
+
export declare function verifiedDelete<T>(opts: {
|
|
39
|
+
del: () => Promise<T>;
|
|
40
|
+
confirmGone: (deleted: T) => Promise<boolean | null>;
|
|
41
|
+
/** Message used when confirmGone answers null. */
|
|
42
|
+
unknownReason?: string;
|
|
43
|
+
}): Promise<VerifiedDeleteResult<T>>;
|
|
44
|
+
/**
|
|
45
|
+
* Confirmation helper for entities that have their own GET: a 404 on re-read
|
|
46
|
+
* is the proof of deletion. Any other failure propagates.
|
|
47
|
+
*/
|
|
48
|
+
export declare function goneOn404(reread: () => Promise<unknown>): Promise<boolean>;
|
|
49
|
+
/**
|
|
50
|
+
* Standard tool payload for a write.
|
|
51
|
+
*
|
|
52
|
+
* `success` mirrors `verified` and nothing else. "I could not check" is not a
|
|
53
|
+
* success: a payload that says `success: true` next to `verified: false` and
|
|
54
|
+
* "delete not confirmed" is read by the model as done, and the model moves on.
|
|
55
|
+
*
|
|
56
|
+
* - verified → success, no isError
|
|
57
|
+
* - unavailable → success:false, verified:false, isError, and a
|
|
58
|
+
* `verificationUnavailable` that names the parameter
|
|
59
|
+
* which would have made the check possible
|
|
60
|
+
* - anything else → isError, because the write cannot be claimed
|
|
61
|
+
*/
|
|
62
|
+
export declare function writeResult(payload: Record<string, unknown>, v: {
|
|
63
|
+
verified: boolean;
|
|
64
|
+
verificationError?: string;
|
|
65
|
+
verificationUnavailable?: string;
|
|
66
|
+
}): {
|
|
67
|
+
isError?: true | undefined;
|
|
68
|
+
content: {
|
|
69
|
+
type: "text";
|
|
70
|
+
text: string;
|
|
71
|
+
}[];
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* The "nothing to do" guard shared by the update tools: a PATCH with only an
|
|
75
|
+
* id is a no-op that Planka happily answers 200 to.
|
|
76
|
+
*/
|
|
77
|
+
export declare function nothingToDo(fields: string, extra?: string): {
|
|
78
|
+
content: {
|
|
79
|
+
type: "text";
|
|
80
|
+
text: string;
|
|
81
|
+
}[];
|
|
82
|
+
isError: true;
|
|
83
|
+
};
|
|
84
|
+
//# sourceMappingURL=verify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/operations/verify.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,mBAAmB,CAAC,CAAC,EAAE,CAAC;IACvC,6DAA6D;IAC7D,MAAM,EAAE,CAAC,CAAC;IACV,uDAAuD;IACvD,QAAQ,EAAE,OAAO,CAAC;IAClB,qDAAqD;IACrD,KAAK,CAAC,EAAE,CAAC,CAAC;IACV,kFAAkF;IAClF,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE;IAC9C,KAAK,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,OAAO,CAAC;CAC3C,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAerC;AAED,MAAM,WAAW,oBAAoB,CAAC,CAAC;IACrC,sEAAsE;IACtE,MAAM,EAAE,CAAC,CAAC;IACV,6DAA6D;IAC7D,QAAQ,EAAE,OAAO,CAAC;IAClB,0DAA0D;IAC1D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,6EAA6E;IAC7E,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE;IAC5C,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;IACtB,WAAW,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACrD,kDAAkD;IAClD,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAwBnC;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAQhF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,CAAC,EAAE;IACD,QAAQ,EAAE,OAAO,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,uBAAuB,CAAC,EAAE,MAAM,CAAC;CAClC;;;;;;EAgBF;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;;;;;;EAUzD"}
|