@plandesk/api 0.5.1 → 0.6.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/dist/events.d.ts +11 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/routes/notes.d.ts +4 -0
- package/dist/routes/notes.js +74 -0
- package/dist/serialize.d.ts +10 -1
- package/dist/serialize.js +10 -0
- package/dist/server.js +3 -1
- package/dist/services/index.d.ts +2 -0
- package/dist/services/index.js +3 -0
- package/dist/services/notes.d.ts +27 -0
- package/dist/services/notes.js +74 -0
- package/dist/services/projects.js +2 -1
- package/package.json +2 -2
- package/web/assets/{index-BZ806G5x.js → index-cyyf9-Uw.js} +60 -60
- package/web/index.html +1 -1
package/dist/events.d.ts
CHANGED
|
@@ -24,6 +24,16 @@ export type CommentUpdatedEvent = {
|
|
|
24
24
|
documentId: string;
|
|
25
25
|
projectId: string;
|
|
26
26
|
};
|
|
27
|
+
export type NoteCreatedEvent = {
|
|
28
|
+
type: 'note_created';
|
|
29
|
+
noteId: string;
|
|
30
|
+
projectId: string;
|
|
31
|
+
};
|
|
32
|
+
export type NoteUpdatedEvent = {
|
|
33
|
+
type: 'note_updated';
|
|
34
|
+
noteId: string;
|
|
35
|
+
projectId: string;
|
|
36
|
+
};
|
|
27
37
|
export type AgentRunStartedEvent = {
|
|
28
38
|
type: 'agent_run_started';
|
|
29
39
|
runId: string;
|
|
@@ -43,7 +53,7 @@ export type SubmissionsPulledEvent = {
|
|
|
43
53
|
type: 'submissions_pulled';
|
|
44
54
|
projectId: string;
|
|
45
55
|
};
|
|
46
|
-
export type PlankDeskEvent = TaskUpdatedEvent | CanvasUpdatedEvent | DocumentCreatedEvent | CommentCreatedEvent | CommentUpdatedEvent | AgentRunStartedEvent | AgentRunProgressEvent | AgentRunCompletedEvent | SubmissionsPulledEvent;
|
|
56
|
+
export type PlankDeskEvent = TaskUpdatedEvent | CanvasUpdatedEvent | DocumentCreatedEvent | CommentCreatedEvent | CommentUpdatedEvent | NoteCreatedEvent | NoteUpdatedEvent | AgentRunStartedEvent | AgentRunProgressEvent | AgentRunCompletedEvent | SubmissionsPulledEvent;
|
|
47
57
|
export type EventListener = (event: PlankDeskEvent) => void;
|
|
48
58
|
export type EventBus = {
|
|
49
59
|
subscribe(listener: EventListener): () => void;
|
package/dist/index.d.ts
CHANGED
|
@@ -8,9 +8,11 @@ export type { ProjectService } from './services/projects.js';
|
|
|
8
8
|
export type { TaskService } from './services/tasks.js';
|
|
9
9
|
export type { CanvasService } from './services/canvas.js';
|
|
10
10
|
export type { DocumentService } from './services/documents.js';
|
|
11
|
+
export type { NoteService } from './services/notes.js';
|
|
11
12
|
export type { CommentService } from './services/comments.js';
|
|
12
13
|
export type { AgentRunService } from './services/agent-runs.js';
|
|
13
14
|
export { InvalidDocumentError } from './services/documents.js';
|
|
15
|
+
export { InvalidNoteError } from './services/notes.js';
|
|
14
16
|
export { InvalidCommentError } from './services/comments.js';
|
|
15
17
|
export { InvalidCanvasError } from './services/canvas.js';
|
|
16
18
|
export { InvalidAgentRunError } from './services/agent-runs.js';
|
package/dist/index.js
CHANGED
|
@@ -5,6 +5,7 @@ export { mountStatic } from './static.js';
|
|
|
5
5
|
export { createServices } from './services/index.js';
|
|
6
6
|
export { createEventBus } from './events.js';
|
|
7
7
|
export { InvalidDocumentError } from './services/documents.js';
|
|
8
|
+
export { InvalidNoteError } from './services/notes.js';
|
|
8
9
|
export { InvalidCommentError } from './services/comments.js';
|
|
9
10
|
export { InvalidCanvasError } from './services/canvas.js';
|
|
10
11
|
export { InvalidAgentRunError } from './services/agent-runs.js';
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import { InvalidNoteError } from '../services/notes.js';
|
|
3
|
+
import { parsePaginationParams } from '../serialize.js';
|
|
4
|
+
export function createNotesRouter(noteService) {
|
|
5
|
+
const router = new Hono();
|
|
6
|
+
router.get('/projects/:id/notes', (c) => {
|
|
7
|
+
const pagination = parsePaginationParams(c.req.query('limit'), c.req.query('offset'));
|
|
8
|
+
if (pagination === 'invalid') {
|
|
9
|
+
return c.json({ error: 'invalid_argument' }, 400);
|
|
10
|
+
}
|
|
11
|
+
const notes = noteService.list(c.req.param('id'), pagination);
|
|
12
|
+
if (!notes) {
|
|
13
|
+
return c.json({ error: 'not_found' }, 404);
|
|
14
|
+
}
|
|
15
|
+
return c.json(notes);
|
|
16
|
+
});
|
|
17
|
+
router.post('/projects/:id/notes', async (c) => {
|
|
18
|
+
const body = await c.req.json();
|
|
19
|
+
if (typeof body.title !== 'string' || body.title.trim() === '') {
|
|
20
|
+
return c.json({ error: 'invalid_argument' }, 400);
|
|
21
|
+
}
|
|
22
|
+
try {
|
|
23
|
+
const note = noteService.create(c.req.param('id'), {
|
|
24
|
+
title: body.title,
|
|
25
|
+
body: body.body,
|
|
26
|
+
});
|
|
27
|
+
if (!note) {
|
|
28
|
+
return c.json({ error: 'not_found' }, 404);
|
|
29
|
+
}
|
|
30
|
+
return c.json(note, 201);
|
|
31
|
+
}
|
|
32
|
+
catch (error) {
|
|
33
|
+
if (error instanceof InvalidNoteError) {
|
|
34
|
+
return c.json({ error: 'invalid_argument' }, 400);
|
|
35
|
+
}
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
router.get('/notes/:id', (c) => {
|
|
40
|
+
const note = noteService.get(c.req.param('id'));
|
|
41
|
+
if (!note) {
|
|
42
|
+
return c.json({ error: 'not_found' }, 404);
|
|
43
|
+
}
|
|
44
|
+
return c.json(note);
|
|
45
|
+
});
|
|
46
|
+
router.patch('/notes/:id', async (c) => {
|
|
47
|
+
const body = await c.req.json();
|
|
48
|
+
try {
|
|
49
|
+
const note = noteService.update(c.req.param('id'), {
|
|
50
|
+
...(body.title !== undefined ? { title: body.title } : {}),
|
|
51
|
+
...(body.body !== undefined ? { body: body.body } : {}),
|
|
52
|
+
});
|
|
53
|
+
if (!note) {
|
|
54
|
+
return c.json({ error: 'not_found' }, 404);
|
|
55
|
+
}
|
|
56
|
+
return c.json(note);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
if (error instanceof InvalidNoteError) {
|
|
60
|
+
return c.json({ error: 'invalid_argument' }, 400);
|
|
61
|
+
}
|
|
62
|
+
throw error;
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
router.delete('/notes/:id', (c) => {
|
|
66
|
+
const deleted = noteService.delete(c.req.param('id'));
|
|
67
|
+
if (!deleted) {
|
|
68
|
+
return c.json({ error: 'not_found' }, 404);
|
|
69
|
+
}
|
|
70
|
+
return c.body(null, 204);
|
|
71
|
+
});
|
|
72
|
+
return router;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=notes.js.map
|
package/dist/serialize.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AgentRun, AgentRunEvent, Document, DocumentComment, Edge, Project, Task, TaskStatus } from '@plandesk/db';
|
|
1
|
+
import type { AgentRun, AgentRunEvent, Document, DocumentComment, Edge, Note, Project, Task, TaskStatus } from '@plandesk/db';
|
|
2
2
|
export type PaginationParams = {
|
|
3
3
|
limit?: number;
|
|
4
4
|
offset?: number;
|
|
@@ -49,6 +49,15 @@ export type SerializedDocumentTree = SerializedDocument & {
|
|
|
49
49
|
children: SerializedDocumentTree[];
|
|
50
50
|
};
|
|
51
51
|
export declare function serializeDocument(document: Document): SerializedDocument;
|
|
52
|
+
export type SerializedNote = {
|
|
53
|
+
id: string;
|
|
54
|
+
project_id: string;
|
|
55
|
+
title: string;
|
|
56
|
+
body: string | null;
|
|
57
|
+
created_at: string;
|
|
58
|
+
updated_at: string;
|
|
59
|
+
};
|
|
60
|
+
export declare function serializeNote(note: Note): SerializedNote;
|
|
52
61
|
export type SerializedComment = {
|
|
53
62
|
id: string;
|
|
54
63
|
document_id: string;
|
package/dist/serialize.js
CHANGED
|
@@ -64,6 +64,16 @@ export function serializeDocument(document) {
|
|
|
64
64
|
updated_at: document.updatedAt.toISOString(),
|
|
65
65
|
};
|
|
66
66
|
}
|
|
67
|
+
export function serializeNote(note) {
|
|
68
|
+
return {
|
|
69
|
+
id: note.id,
|
|
70
|
+
project_id: note.projectId,
|
|
71
|
+
title: note.title,
|
|
72
|
+
body: note.body,
|
|
73
|
+
created_at: note.createdAt.toISOString(),
|
|
74
|
+
updated_at: note.updatedAt.toISOString(),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
67
77
|
export function serializeComment(comment) {
|
|
68
78
|
return {
|
|
69
79
|
id: comment.id,
|
package/dist/server.js
CHANGED
|
@@ -6,6 +6,7 @@ import { createTasksRouter } from './routes/tasks.js';
|
|
|
6
6
|
import { createCanvasRouter } from './routes/canvas.js';
|
|
7
7
|
import { createCommentsRouter } from './routes/comments.js';
|
|
8
8
|
import { createDocumentsRouter } from './routes/documents.js';
|
|
9
|
+
import { createNotesRouter } from './routes/notes.js';
|
|
9
10
|
import { createEventsRouter } from './routes/events.js';
|
|
10
11
|
import { createTokensRouter } from './routes/tokens.js';
|
|
11
12
|
import { createAgentRunsRouter } from './routes/agent-runs.js';
|
|
@@ -13,7 +14,7 @@ import { mountStatic } from './static.js';
|
|
|
13
14
|
import { createServices } from './services/index.js';
|
|
14
15
|
export function createApp(deps) {
|
|
15
16
|
const services = deps.services ?? createServices({ db: deps.db, eventBus: deps.eventBus });
|
|
16
|
-
const { eventBus, projectService, taskService, canvasService, documentService, commentService, agentRunService, tokenService, } = services;
|
|
17
|
+
const { eventBus, projectService, taskService, canvasService, documentService, noteService, commentService, agentRunService, tokenService, } = services;
|
|
17
18
|
const app = new Hono();
|
|
18
19
|
if (deps.authPassword !== undefined && deps.authPassword.length > 0) {
|
|
19
20
|
app.use('*', createAuthMiddleware(deps.authPassword));
|
|
@@ -23,6 +24,7 @@ export function createApp(deps) {
|
|
|
23
24
|
app.route('/api/v1', createTasksRouter(taskService));
|
|
24
25
|
app.route('/api/v1', createCanvasRouter(canvasService));
|
|
25
26
|
app.route('/api/v1', createDocumentsRouter(documentService));
|
|
27
|
+
app.route('/api/v1', createNotesRouter(noteService));
|
|
26
28
|
app.route('/api/v1', createCommentsRouter(commentService));
|
|
27
29
|
app.route('/api/v1', createTokensRouter(tokenService));
|
|
28
30
|
app.route('/api/v1', createAgentRunsRouter(agentRunService));
|
package/dist/services/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { type EventBus } from '../events.js';
|
|
|
3
3
|
import { type CanvasService } from './canvas.js';
|
|
4
4
|
import { type CommentService } from './comments.js';
|
|
5
5
|
import { type DocumentService } from './documents.js';
|
|
6
|
+
import { type NoteService } from './notes.js';
|
|
6
7
|
import { type ProjectService } from './projects.js';
|
|
7
8
|
import { type AgentRunService } from './agent-runs.js';
|
|
8
9
|
import { type TaskService } from './tasks.js';
|
|
@@ -19,6 +20,7 @@ export type Services = {
|
|
|
19
20
|
taskService: TaskService;
|
|
20
21
|
canvasService: CanvasService;
|
|
21
22
|
documentService: DocumentService;
|
|
23
|
+
noteService: NoteService;
|
|
22
24
|
commentService: CommentService;
|
|
23
25
|
agentRunService: AgentRunService;
|
|
24
26
|
tokenService: TokenService;
|
package/dist/services/index.js
CHANGED
|
@@ -2,6 +2,7 @@ import { createEventBus } from '../events.js';
|
|
|
2
2
|
import { createCanvasService } from './canvas.js';
|
|
3
3
|
import { createCommentService } from './comments.js';
|
|
4
4
|
import { createDocumentService } from './documents.js';
|
|
5
|
+
import { createNoteService } from './notes.js';
|
|
5
6
|
import { createProjectService } from './projects.js';
|
|
6
7
|
import { createAgentRunService } from './agent-runs.js';
|
|
7
8
|
import { createTaskService } from './tasks.js';
|
|
@@ -14,6 +15,7 @@ export function createServices(deps) {
|
|
|
14
15
|
const taskService = createTaskService({ db: deps.db, eventBus });
|
|
15
16
|
const canvasService = createCanvasService({ db: deps.db, eventBus });
|
|
16
17
|
const documentService = createDocumentService({ db: deps.db, eventBus });
|
|
18
|
+
const noteService = createNoteService({ db: deps.db, eventBus });
|
|
17
19
|
const commentService = createCommentService({ db: deps.db, eventBus });
|
|
18
20
|
const agentRunService = createAgentRunService({ db: deps.db, eventBus });
|
|
19
21
|
const tokenService = createTokenService({ db: deps.db });
|
|
@@ -25,6 +27,7 @@ export function createServices(deps) {
|
|
|
25
27
|
taskService,
|
|
26
28
|
canvasService,
|
|
27
29
|
documentService,
|
|
30
|
+
noteService,
|
|
28
31
|
commentService,
|
|
29
32
|
agentRunService,
|
|
30
33
|
tokenService,
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type Db } from '@plandesk/db';
|
|
2
|
+
import { type PaginationParams, type SerializedNote } from '../serialize.js';
|
|
3
|
+
import type { EventBus } from '../events.js';
|
|
4
|
+
export type NoteServiceDeps = {
|
|
5
|
+
db: Db;
|
|
6
|
+
eventBus: EventBus;
|
|
7
|
+
};
|
|
8
|
+
export type CreateNoteInput = {
|
|
9
|
+
title: string;
|
|
10
|
+
body?: string | null;
|
|
11
|
+
};
|
|
12
|
+
export type UpdateNoteInput = {
|
|
13
|
+
title?: string;
|
|
14
|
+
body?: string | null;
|
|
15
|
+
};
|
|
16
|
+
export declare class InvalidNoteError extends Error {
|
|
17
|
+
constructor(message: string);
|
|
18
|
+
}
|
|
19
|
+
export declare function createNoteService(deps: NoteServiceDeps): {
|
|
20
|
+
list(projectId: string, pagination?: PaginationParams): SerializedNote[] | undefined;
|
|
21
|
+
create(projectId: string, input: CreateNoteInput): SerializedNote | undefined;
|
|
22
|
+
get(id: string): SerializedNote | undefined;
|
|
23
|
+
update(id: string, input: UpdateNoteInput): SerializedNote | undefined;
|
|
24
|
+
delete(id: string): boolean;
|
|
25
|
+
};
|
|
26
|
+
export type NoteService = ReturnType<typeof createNoteService>;
|
|
27
|
+
//# sourceMappingURL=notes.d.ts.map
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { createNote as dbCreateNote, deleteNote as dbDeleteNote, getNote as dbGetNote, getProject, listNotes as dbListNotes, updateNote as dbUpdateNote, } from '@plandesk/db';
|
|
2
|
+
import { serializeNote } from '../serialize.js';
|
|
3
|
+
export class InvalidNoteError extends Error {
|
|
4
|
+
constructor(message) {
|
|
5
|
+
super(message);
|
|
6
|
+
this.name = 'InvalidNoteError';
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
function assertNonEmptyTitle(title) {
|
|
10
|
+
if (title.trim() === '') {
|
|
11
|
+
throw new InvalidNoteError('Note title must not be empty');
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function createNoteService(deps) {
|
|
15
|
+
const { db, eventBus } = deps;
|
|
16
|
+
return {
|
|
17
|
+
list(projectId, pagination = {}) {
|
|
18
|
+
const project = getProject(db, projectId);
|
|
19
|
+
if (!project) {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
return dbListNotes(db, projectId, pagination).map(serializeNote);
|
|
23
|
+
},
|
|
24
|
+
create(projectId, input) {
|
|
25
|
+
const project = getProject(db, projectId);
|
|
26
|
+
if (!project) {
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
assertNonEmptyTitle(input.title);
|
|
30
|
+
const note = dbCreateNote(db, {
|
|
31
|
+
projectId,
|
|
32
|
+
title: input.title,
|
|
33
|
+
body: input.body,
|
|
34
|
+
});
|
|
35
|
+
eventBus.emit({ type: 'note_created', noteId: note.id, projectId });
|
|
36
|
+
return serializeNote(note);
|
|
37
|
+
},
|
|
38
|
+
get(id) {
|
|
39
|
+
const note = dbGetNote(db, id);
|
|
40
|
+
if (!note) {
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
return serializeNote(note);
|
|
44
|
+
},
|
|
45
|
+
update(id, input) {
|
|
46
|
+
const existing = dbGetNote(db, id);
|
|
47
|
+
if (!existing) {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
if (input.title !== undefined) {
|
|
51
|
+
assertNonEmptyTitle(input.title);
|
|
52
|
+
}
|
|
53
|
+
const note = dbUpdateNote(db, id, input);
|
|
54
|
+
if (!note) {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
eventBus.emit({ type: 'note_updated', noteId: note.id, projectId: note.projectId });
|
|
58
|
+
return serializeNote(note);
|
|
59
|
+
},
|
|
60
|
+
delete(id) {
|
|
61
|
+
const existing = dbGetNote(db, id);
|
|
62
|
+
if (!existing) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
const deleted = dbDeleteNote(db, id);
|
|
66
|
+
if (!deleted) {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
eventBus.emit({ type: 'note_updated', noteId: id, projectId: existing.projectId });
|
|
70
|
+
return true;
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=notes.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { clearDocumentParentRefsByProject, createDocument, createEdge, createProject as dbCreateProject, createTask, deleteAgentRun, deleteAgentRunEventsByRunId, deleteCommentsByProjectId, deleteDocumentsByProjectId, deleteEdgesByProjectId, deleteShareSubmissionsByProjectId, deleteSharesByProjectId, deleteSyncRemoteByProjectId, deleteSyncStateByProjectId, deleteProject as dbDeleteProject, deleteTasksByProjectId, getProject as dbGetProject, InvalidTaskStatusError, isTaskStatus, listAgentRuns, listProjects as dbListProjects, listTasks, updateProject as dbUpdateProject, } from '@plandesk/db';
|
|
1
|
+
import { clearDocumentParentRefsByProject, createDocument, createEdge, createProject as dbCreateProject, createTask, deleteAgentRun, deleteAgentRunEventsByRunId, deleteCommentsByProjectId, deleteDocumentsByProjectId, deleteNotesByProjectId, deleteEdgesByProjectId, deleteShareSubmissionsByProjectId, deleteSharesByProjectId, deleteSyncRemoteByProjectId, deleteSyncStateByProjectId, deleteProject as dbDeleteProject, deleteTasksByProjectId, getProject as dbGetProject, InvalidTaskStatusError, isTaskStatus, listAgentRuns, listProjects as dbListProjects, listTasks, updateProject as dbUpdateProject, } from '@plandesk/db';
|
|
2
2
|
import { emptyTaskStatusSummary, serializeDocument, serializeEdge, serializeProject, serializeProjectDetail, serializeTask, } from '../serialize.js';
|
|
3
3
|
export class InvalidScaffoldError extends Error {
|
|
4
4
|
constructor(message) {
|
|
@@ -89,6 +89,7 @@ export function createProjectService(deps) {
|
|
|
89
89
|
clearDocumentParentRefsByProject(tx, id);
|
|
90
90
|
deleteCommentsByProjectId(tx, id);
|
|
91
91
|
deleteDocumentsByProjectId(tx, id);
|
|
92
|
+
deleteNotesByProjectId(tx, id);
|
|
92
93
|
deleteTasksByProjectId(tx, id);
|
|
93
94
|
deleteShareSubmissionsByProjectId(tx, id);
|
|
94
95
|
deleteSyncStateByProjectId(tx, id);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@plandesk/api",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": {
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"devDependencies": {
|
|
19
19
|
"typescript": "^6.0.3",
|
|
20
20
|
"vitest": "^3.2.6",
|
|
21
|
-
"@plandesk/db": "0.
|
|
21
|
+
"@plandesk/db": "0.5.0",
|
|
22
22
|
"@plandesk/sync-server": "0.4.2"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|