@kernhq/module-tracker 0.1.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/LICENSE +662 -0
- package/README.md +265 -0
- package/dist/contract/events.d.ts +140 -0
- package/dist/contract/events.d.ts.map +1 -0
- package/dist/contract/events.js +51 -0
- package/dist/contract/events.js.map +1 -0
- package/dist/contract/index.d.ts +6 -0
- package/dist/contract/index.d.ts.map +1 -0
- package/dist/contract/index.js +6 -0
- package/dist/contract/index.js.map +1 -0
- package/dist/contract/models.d.ts +2547 -0
- package/dist/contract/models.d.ts.map +1 -0
- package/dist/contract/models.js +1214 -0
- package/dist/contract/models.js.map +1 -0
- package/dist/contract/notifications.d.ts +4 -0
- package/dist/contract/notifications.d.ts.map +1 -0
- package/dist/contract/notifications.js +46 -0
- package/dist/contract/notifications.js.map +1 -0
- package/dist/contract/permissions.d.ts +161 -0
- package/dist/contract/permissions.d.ts.map +1 -0
- package/dist/contract/permissions.js +192 -0
- package/dist/contract/permissions.js.map +1 -0
- package/dist/contract/router.d.ts +9659 -0
- package/dist/contract/router.d.ts.map +1 -0
- package/dist/contract/router.js +732 -0
- package/dist/contract/router.js.map +1 -0
- package/dist/kql/ast.d.ts +90 -0
- package/dist/kql/ast.d.ts.map +1 -0
- package/dist/kql/ast.js +80 -0
- package/dist/kql/ast.js.map +1 -0
- package/dist/kql/dates.d.ts +16 -0
- package/dist/kql/dates.d.ts.map +1 -0
- package/dist/kql/dates.js +54 -0
- package/dist/kql/dates.js.map +1 -0
- package/dist/kql/fields.d.ts +61 -0
- package/dist/kql/fields.d.ts.map +1 -0
- package/dist/kql/fields.js +106 -0
- package/dist/kql/fields.js.map +1 -0
- package/dist/kql/index.d.ts +16 -0
- package/dist/kql/index.d.ts.map +1 -0
- package/dist/kql/index.js +16 -0
- package/dist/kql/index.js.map +1 -0
- package/dist/kql/lexer.d.ts +28 -0
- package/dist/kql/lexer.d.ts.map +1 -0
- package/dist/kql/lexer.js +127 -0
- package/dist/kql/lexer.js.map +1 -0
- package/dist/kql/parser.d.ts +14 -0
- package/dist/kql/parser.d.ts.map +1 -0
- package/dist/kql/parser.js +290 -0
- package/dist/kql/parser.js.map +1 -0
- package/dist/kql/suggest.d.ts +8 -0
- package/dist/kql/suggest.d.ts.map +1 -0
- package/dist/kql/suggest.js +96 -0
- package/dist/kql/suggest.js.map +1 -0
- package/dist/kql/validate.d.ts +10 -0
- package/dist/kql/validate.d.ts.map +1 -0
- package/dist/kql/validate.js +84 -0
- package/dist/kql/validate.js.map +1 -0
- package/dist/server/index.d.ts +17 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +583 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/kql/compile.d.ts +49 -0
- package/dist/server/kql/compile.d.ts.map +1 -0
- package/dist/server/kql/compile.js +372 -0
- package/dist/server/kql/compile.js.map +1 -0
- package/dist/server/rank.d.ts +23 -0
- package/dist/server/rank.d.ts.map +1 -0
- package/dist/server/rank.js +66 -0
- package/dist/server/rank.js.map +1 -0
- package/dist/server/rich.d.ts +30 -0
- package/dist/server/rich.d.ts.map +1 -0
- package/dist/server/rich.js +97 -0
- package/dist/server/rich.js.map +1 -0
- package/dist/server/router.d.ts +10589 -0
- package/dist/server/router.d.ts.map +1 -0
- package/dist/server/router.js +431 -0
- package/dist/server/router.js.map +1 -0
- package/dist/server/schema.d.ts +6622 -0
- package/dist/server/schema.d.ts.map +1 -0
- package/dist/server/schema.js +581 -0
- package/dist/server/schema.js.map +1 -0
- package/dist/server/services/access.d.ts +53 -0
- package/dist/server/services/access.d.ts.map +1 -0
- package/dist/server/services/access.js +146 -0
- package/dist/server/services/access.js.map +1 -0
- package/dist/server/services/comments.d.ts +36 -0
- package/dist/server/services/comments.d.ts.map +1 -0
- package/dist/server/services/comments.js +231 -0
- package/dist/server/services/comments.js.map +1 -0
- package/dist/server/services/config.d.ts +130 -0
- package/dist/server/services/config.d.ts.map +1 -0
- package/dist/server/services/config.js +797 -0
- package/dist/server/services/config.js.map +1 -0
- package/dist/server/services/db.d.ts +93 -0
- package/dist/server/services/db.d.ts.map +1 -0
- package/dist/server/services/db.js +519 -0
- package/dist/server/services/db.js.map +1 -0
- package/dist/server/services/imports.d.ts +37 -0
- package/dist/server/services/imports.d.ts.map +1 -0
- package/dist/server/services/imports.js +324 -0
- package/dist/server/services/imports.js.map +1 -0
- package/dist/server/services/index.d.ts +36 -0
- package/dist/server/services/index.d.ts.map +1 -0
- package/dist/server/services/index.js +57 -0
- package/dist/server/services/index.js.map +1 -0
- package/dist/server/services/intake.d.ts +47 -0
- package/dist/server/services/intake.d.ts.map +1 -0
- package/dist/server/services/intake.js +268 -0
- package/dist/server/services/intake.js.map +1 -0
- package/dist/server/services/issues.d.ts +763 -0
- package/dist/server/services/issues.d.ts.map +1 -0
- package/dist/server/services/issues.js +1381 -0
- package/dist/server/services/issues.js.map +1 -0
- package/dist/server/services/notify.d.ts +51 -0
- package/dist/server/services/notify.d.ts.map +1 -0
- package/dist/server/services/notify.js +90 -0
- package/dist/server/services/notify.js.map +1 -0
- package/dist/server/services/planning.d.ts +62 -0
- package/dist/server/services/planning.d.ts.map +1 -0
- package/dist/server/services/planning.js +614 -0
- package/dist/server/services/planning.js.map +1 -0
- package/dist/server/services/projects.d.ts +43 -0
- package/dist/server/services/projects.d.ts.map +1 -0
- package/dist/server/services/projects.js +375 -0
- package/dist/server/services/projects.js.map +1 -0
- package/dist/server/services/query.d.ts +24 -0
- package/dist/server/services/query.d.ts.map +1 -0
- package/dist/server/services/query.js +312 -0
- package/dist/server/services/query.js.map +1 -0
- package/dist/server/services/reports.d.ts +30 -0
- package/dist/server/services/reports.d.ts.map +1 -0
- package/dist/server/services/reports.js +295 -0
- package/dist/server/services/reports.js.map +1 -0
- package/dist/server/services/time.d.ts +53 -0
- package/dist/server/services/time.d.ts.map +1 -0
- package/dist/server/services/time.js +192 -0
- package/dist/server/services/time.js.map +1 -0
- package/dist/server/services/transitions.d.ts +61 -0
- package/dist/server/services/transitions.d.ts.map +1 -0
- package/dist/server/services/transitions.js +493 -0
- package/dist/server/services/transitions.js.map +1 -0
- package/dist/server/services/views.d.ts +33 -0
- package/dist/server/services/views.d.ts.map +1 -0
- package/dist/server/services/views.js +195 -0
- package/dist/server/services/views.js.map +1 -0
- package/migrations/0000_init.sql +529 -0
- package/migrations/0001_rls.sql +259 -0
- package/migrations/meta/0000_snapshot.json +4140 -0
- package/migrations/meta/_journal.json +20 -0
- package/package.json +82 -0
- package/src/client/api.ts +15 -0
- package/src/client/format.ts +164 -0
- package/src/client/group.ts +150 -0
- package/src/client/index.ts +60 -0
- package/src/client/kql.ts +492 -0
- package/src/client/rank.ts +87 -0
- package/src/client/types.ts +57 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { KernError, uuidv7 } from '@kernhq/kernel';
|
|
2
|
+
import { and, asc, eq, inArray, isNull, or, sql } from 'drizzle-orm';
|
|
3
|
+
import { ViewDisplay } from '../../contract/models.js';
|
|
4
|
+
import { parseKql } from '../../kql/parser.js';
|
|
5
|
+
import { viewPins, views } from '../schema.js';
|
|
6
|
+
import { parseDisplay, toView } from './db.js';
|
|
7
|
+
/** Saved views: the KQL query plus how to draw it (list, board, calendar, timeline, spreadsheet). */
|
|
8
|
+
export class ViewService {
|
|
9
|
+
kernel;
|
|
10
|
+
access;
|
|
11
|
+
notify;
|
|
12
|
+
constructor(kernel, access, notify) {
|
|
13
|
+
this.kernel = kernel;
|
|
14
|
+
this.access = access;
|
|
15
|
+
this.notify = notify;
|
|
16
|
+
}
|
|
17
|
+
async pinnedIds(tx, workspaceId, userId) {
|
|
18
|
+
if (!userId)
|
|
19
|
+
return new Set();
|
|
20
|
+
const rows = await tx
|
|
21
|
+
.select({ viewId: viewPins.viewId })
|
|
22
|
+
.from(viewPins)
|
|
23
|
+
.where(and(eq(viewPins.workspaceId, workspaceId), eq(viewPins.userId, userId)));
|
|
24
|
+
return new Set(rows.map((r) => r.viewId));
|
|
25
|
+
}
|
|
26
|
+
async list(tx, principal, workspaceId, projectId) {
|
|
27
|
+
const visible = await this.access.visibleProjectIds(tx, principal, workspaceId);
|
|
28
|
+
const userId = principal.userId;
|
|
29
|
+
const filters = [eq(views.workspaceId, workspaceId)];
|
|
30
|
+
if (projectId === null)
|
|
31
|
+
filters.push(isNull(views.projectId));
|
|
32
|
+
else if (projectId)
|
|
33
|
+
filters.push(eq(views.projectId, projectId));
|
|
34
|
+
else
|
|
35
|
+
filters.push(or(isNull(views.projectId), inArray(views.projectId, visible.length ? visible : [''])));
|
|
36
|
+
const rows = await tx
|
|
37
|
+
.select()
|
|
38
|
+
.from(views)
|
|
39
|
+
.where(and(...filters))
|
|
40
|
+
.orderBy(asc(views.order), asc(views.name));
|
|
41
|
+
const pinned = await this.pinnedIds(tx, workspaceId, userId);
|
|
42
|
+
return rows.filter((r) => this.readable(r, principal, visible)).map((r) => toView(r, pinned.has(r.id)));
|
|
43
|
+
}
|
|
44
|
+
readable(row, principal, visibleProjects) {
|
|
45
|
+
if (principal.instanceAdmin || principal.kind === 'service')
|
|
46
|
+
return true;
|
|
47
|
+
if (row.visibility === 'private')
|
|
48
|
+
return !!principal.userId && row.ownerId === principal.userId;
|
|
49
|
+
if (row.visibility === 'project')
|
|
50
|
+
return !row.projectId || visibleProjects.includes(row.projectId);
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
async get(tx, principal, workspaceId, id) {
|
|
54
|
+
const row = await this.row(tx, workspaceId, id);
|
|
55
|
+
const visible = await this.access.visibleProjectIds(tx, principal, workspaceId);
|
|
56
|
+
if (!this.readable(row, principal, visible))
|
|
57
|
+
throw KernError.forbidden('tracker.project.view');
|
|
58
|
+
const pinned = await this.pinnedIds(tx, workspaceId, principal.userId);
|
|
59
|
+
return toView(row, pinned.has(id));
|
|
60
|
+
}
|
|
61
|
+
async row(tx, workspaceId, id) {
|
|
62
|
+
const [row] = await tx
|
|
63
|
+
.select()
|
|
64
|
+
.from(views)
|
|
65
|
+
.where(and(eq(views.workspaceId, workspaceId), eq(views.id, id)))
|
|
66
|
+
.limit(1);
|
|
67
|
+
if (!row)
|
|
68
|
+
throw KernError.notFound('View');
|
|
69
|
+
return row;
|
|
70
|
+
}
|
|
71
|
+
assertQueryParses(kql) {
|
|
72
|
+
const parsed = parseKql(kql);
|
|
73
|
+
if (parsed.errors.length)
|
|
74
|
+
throw KernError.badRequest(parsed.errors[0].message, { errors: parsed.errors });
|
|
75
|
+
}
|
|
76
|
+
async requireShareRights(tx, principal, workspaceId, visibility, projectId) {
|
|
77
|
+
if (visibility === 'private')
|
|
78
|
+
return;
|
|
79
|
+
if (projectId)
|
|
80
|
+
await this.access.require(principal, 'tracker.view.manage_shared', workspaceId, projectId);
|
|
81
|
+
else
|
|
82
|
+
await this.kernel.authz.require(principal, 'tracker.view.manage_shared', {
|
|
83
|
+
kind: 'workspace',
|
|
84
|
+
id: workspaceId,
|
|
85
|
+
workspaceId,
|
|
86
|
+
});
|
|
87
|
+
void tx;
|
|
88
|
+
}
|
|
89
|
+
async create(tx, principal, workspaceId, input) {
|
|
90
|
+
this.assertQueryParses(input.kql);
|
|
91
|
+
const projectId = input.projectId ?? null;
|
|
92
|
+
if (projectId)
|
|
93
|
+
await this.access.requireProject(tx, principal, workspaceId, projectId);
|
|
94
|
+
await this.requireShareRights(tx, principal, workspaceId, input.visibility, projectId);
|
|
95
|
+
const [row] = await tx
|
|
96
|
+
.insert(views)
|
|
97
|
+
.values({
|
|
98
|
+
id: uuidv7(),
|
|
99
|
+
workspaceId,
|
|
100
|
+
projectId,
|
|
101
|
+
name: input.name,
|
|
102
|
+
description: input.description ?? null,
|
|
103
|
+
icon: input.icon ?? null,
|
|
104
|
+
kql: input.kql,
|
|
105
|
+
layout: input.layout,
|
|
106
|
+
display: ViewDisplay.parse(input.display ?? {}),
|
|
107
|
+
filters: input.filters ?? {},
|
|
108
|
+
visibility: input.visibility,
|
|
109
|
+
ownerId: principal.userId ?? null,
|
|
110
|
+
order: input.order ?? 0,
|
|
111
|
+
})
|
|
112
|
+
.returning();
|
|
113
|
+
await this.notify.change(workspaceId, 'view', row.id, 'created');
|
|
114
|
+
return toView(row, false);
|
|
115
|
+
}
|
|
116
|
+
async update(tx, principal, workspaceId, id, patch) {
|
|
117
|
+
const current = await this.row(tx, workspaceId, id);
|
|
118
|
+
await this.requireEdit(tx, principal, workspaceId, current);
|
|
119
|
+
if (patch.kql !== undefined)
|
|
120
|
+
this.assertQueryParses(patch.kql);
|
|
121
|
+
if (patch.visibility && patch.visibility !== current.visibility)
|
|
122
|
+
await this.requireShareRights(tx, principal, workspaceId, patch.visibility, current.projectId);
|
|
123
|
+
const display = patch.display === undefined
|
|
124
|
+
? undefined
|
|
125
|
+
: ViewDisplay.parse({ ...parseDisplay(current.display), ...patch.display });
|
|
126
|
+
const [row] = await tx
|
|
127
|
+
.update(views)
|
|
128
|
+
.set({
|
|
129
|
+
...(patch.name === undefined ? {} : { name: patch.name }),
|
|
130
|
+
...(patch.description === undefined ? {} : { description: patch.description }),
|
|
131
|
+
...(patch.icon === undefined ? {} : { icon: patch.icon }),
|
|
132
|
+
...(patch.kql === undefined ? {} : { kql: patch.kql }),
|
|
133
|
+
...(patch.layout === undefined ? {} : { layout: patch.layout }),
|
|
134
|
+
...(display === undefined ? {} : { display }),
|
|
135
|
+
...(patch.filters === undefined ? {} : { filters: patch.filters }),
|
|
136
|
+
...(patch.visibility === undefined ? {} : { visibility: patch.visibility }),
|
|
137
|
+
...(patch.projectId === undefined ? {} : { projectId: patch.projectId }),
|
|
138
|
+
...(patch.order === undefined ? {} : { order: patch.order }),
|
|
139
|
+
updatedAt: new Date(),
|
|
140
|
+
})
|
|
141
|
+
.where(and(eq(views.workspaceId, workspaceId), eq(views.id, id)))
|
|
142
|
+
.returning();
|
|
143
|
+
const pinned = await this.pinnedIds(tx, workspaceId, principal.userId);
|
|
144
|
+
await this.notify.change(workspaceId, 'view', id, 'updated');
|
|
145
|
+
return toView(row, pinned.has(id));
|
|
146
|
+
}
|
|
147
|
+
async requireEdit(tx, principal, workspaceId, row) {
|
|
148
|
+
if (principal.instanceAdmin || principal.kind === 'service')
|
|
149
|
+
return;
|
|
150
|
+
if (row.ownerId && row.ownerId === principal.userId)
|
|
151
|
+
return;
|
|
152
|
+
await this.requireShareRights(tx, principal, workspaceId, row.visibility, row.projectId);
|
|
153
|
+
}
|
|
154
|
+
async delete(tx, principal, workspaceId, id) {
|
|
155
|
+
const current = await this.row(tx, workspaceId, id);
|
|
156
|
+
if (current.builtin)
|
|
157
|
+
throw KernError.conflict('Built-in views cannot be deleted', 'tracker.view.builtin');
|
|
158
|
+
await this.requireEdit(tx, principal, workspaceId, current);
|
|
159
|
+
await tx.delete(viewPins).where(eq(viewPins.viewId, id));
|
|
160
|
+
await tx.delete(views).where(and(eq(views.workspaceId, workspaceId), eq(views.id, id)));
|
|
161
|
+
await this.notify.change(workspaceId, 'view', id, 'deleted');
|
|
162
|
+
}
|
|
163
|
+
/** Pinning is per user: it never changes the shared view row. */
|
|
164
|
+
async pin(tx, principal, workspaceId, id, pinned) {
|
|
165
|
+
const row = await this.row(tx, workspaceId, id);
|
|
166
|
+
const userId = this.access.userId(principal);
|
|
167
|
+
if (pinned)
|
|
168
|
+
await tx
|
|
169
|
+
.insert(viewPins)
|
|
170
|
+
.values({ viewId: id, workspaceId, userId })
|
|
171
|
+
.onConflictDoNothing({ target: [viewPins.viewId, viewPins.userId] });
|
|
172
|
+
else
|
|
173
|
+
await tx.delete(viewPins).where(and(eq(viewPins.viewId, id), eq(viewPins.userId, userId)));
|
|
174
|
+
return toView(row, pinned);
|
|
175
|
+
}
|
|
176
|
+
/** Views pinned by a user across the workspace (sidebar). */
|
|
177
|
+
async pinnedFor(tx, workspaceId, userId) {
|
|
178
|
+
const rows = await tx
|
|
179
|
+
.select({ view: views })
|
|
180
|
+
.from(viewPins)
|
|
181
|
+
.innerJoin(views, eq(views.id, viewPins.viewId))
|
|
182
|
+
.where(and(eq(viewPins.workspaceId, workspaceId), eq(viewPins.userId, userId)))
|
|
183
|
+
.orderBy(asc(views.order));
|
|
184
|
+
return rows.map((r) => toView(r.view, true));
|
|
185
|
+
}
|
|
186
|
+
/** Count of views in a workspace (used by the workspace overview). */
|
|
187
|
+
async count(tx, workspaceId) {
|
|
188
|
+
const [row] = await tx
|
|
189
|
+
.select({ n: sql `count(*)::int` })
|
|
190
|
+
.from(views)
|
|
191
|
+
.where(eq(views.workspaceId, workspaceId));
|
|
192
|
+
return row?.n ?? 0;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=views.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"views.js","sourceRoot":"","sources":["../../../src/server/services/views.ts"],"names":[],"mappings":"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"}
|