@kelpie/server 0.7.0 → 0.8.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/lib/consumerEmailDomains.d.ts +2 -0
- package/dist/lib/consumerEmailDomains.d.ts.map +1 -0
- package/dist/lib/consumerEmailDomains.js +62 -0
- package/dist/lib/consumerEmailDomains.js.map +1 -0
- package/dist/lib/email.d.ts +7 -0
- package/dist/lib/email.d.ts.map +1 -1
- package/dist/lib/email.js.map +1 -1
- package/dist/lib/emailContent.d.ts +33 -0
- package/dist/lib/emailContent.d.ts.map +1 -0
- package/dist/lib/emailContent.js +54 -0
- package/dist/lib/emailContent.js.map +1 -0
- package/dist/lib/emailDomainAutoLink.d.ts +27 -0
- package/dist/lib/emailDomainAutoLink.d.ts.map +1 -0
- package/dist/lib/emailDomainAutoLink.js +119 -0
- package/dist/lib/emailDomainAutoLink.js.map +1 -0
- package/dist/lib/ids.d.ts +2 -0
- package/dist/lib/ids.d.ts.map +1 -1
- package/dist/lib/ids.js +2 -0
- package/dist/lib/ids.js.map +1 -1
- package/dist/modules/attachedRecords.d.ts.map +1 -1
- package/dist/modules/attachedRecords.js +4 -2
- package/dist/modules/attachedRecords.js.map +1 -1
- package/dist/modules/auth/preferences.d.ts +11 -1
- package/dist/modules/auth/preferences.d.ts.map +1 -1
- package/dist/modules/auth/preferences.js +11 -0
- package/dist/modules/auth/preferences.js.map +1 -1
- package/dist/modules/auth/routes.d.ts.map +1 -1
- package/dist/modules/auth/routes.js +18 -0
- package/dist/modules/auth/routes.js.map +1 -1
- package/dist/modules/auth/schema.d.ts +20 -0
- package/dist/modules/auth/schema.d.ts.map +1 -1
- package/dist/modules/auth/schema.js +11 -1
- package/dist/modules/auth/schema.js.map +1 -1
- package/dist/modules/auth/service.d.ts.map +1 -1
- package/dist/modules/auth/service.js +27 -3
- package/dist/modules/auth/service.js.map +1 -1
- package/dist/modules/companies/repository.d.ts +2 -0
- package/dist/modules/companies/repository.d.ts.map +1 -1
- package/dist/modules/companies/repository.js +1 -0
- package/dist/modules/companies/repository.js.map +1 -1
- package/dist/modules/companies/routes.d.ts +2 -0
- package/dist/modules/companies/routes.d.ts.map +1 -1
- package/dist/modules/companies/routes.js +11 -0
- package/dist/modules/companies/routes.js.map +1 -1
- package/dist/modules/companies/schema.d.ts +17 -0
- package/dist/modules/companies/schema.d.ts.map +1 -1
- package/dist/modules/companies/schema.js +5 -1
- package/dist/modules/companies/schema.js.map +1 -1
- package/dist/modules/companies/service.d.ts +1 -0
- package/dist/modules/companies/service.d.ts.map +1 -1
- package/dist/modules/companies/service.js +22 -0
- package/dist/modules/companies/service.js.map +1 -1
- package/dist/modules/core.d.ts.map +1 -1
- package/dist/modules/core.js +11 -0
- package/dist/modules/core.js.map +1 -1
- package/dist/modules/email-domain-linker/index.d.ts +12 -0
- package/dist/modules/email-domain-linker/index.d.ts.map +1 -0
- package/dist/modules/email-domain-linker/index.js +34 -0
- package/dist/modules/email-domain-linker/index.js.map +1 -0
- package/dist/modules/email-domain-linker/routes.d.ts +14 -0
- package/dist/modules/email-domain-linker/routes.d.ts.map +1 -0
- package/dist/modules/email-domain-linker/routes.js +15 -0
- package/dist/modules/email-domain-linker/routes.js.map +1 -0
- package/dist/modules/email-domain-linker/service.d.ts +37 -0
- package/dist/modules/email-domain-linker/service.d.ts.map +1 -0
- package/dist/modules/email-domain-linker/service.js +63 -0
- package/dist/modules/email-domain-linker/service.js.map +1 -0
- package/dist/modules/eventCatalogs.d.ts +1 -0
- package/dist/modules/eventCatalogs.d.ts.map +1 -1
- package/dist/modules/eventCatalogs.js +1 -0
- package/dist/modules/eventCatalogs.js.map +1 -1
- package/dist/modules/lists/events.d.ts +42 -0
- package/dist/modules/lists/events.d.ts.map +1 -0
- package/dist/modules/lists/events.js +16 -0
- package/dist/modules/lists/events.js.map +1 -0
- package/dist/modules/lists/index.d.ts +10 -0
- package/dist/modules/lists/index.d.ts.map +1 -0
- package/dist/modules/lists/index.js +35 -0
- package/dist/modules/lists/index.js.map +1 -0
- package/dist/modules/lists/repository.d.ts +69 -0
- package/dist/modules/lists/repository.d.ts.map +1 -0
- package/dist/modules/lists/repository.js +165 -0
- package/dist/modules/lists/repository.js.map +1 -0
- package/dist/modules/lists/routes.d.ts +51 -0
- package/dist/modules/lists/routes.d.ts.map +1 -0
- package/dist/modules/lists/routes.js +160 -0
- package/dist/modules/lists/routes.js.map +1 -0
- package/dist/modules/lists/schema.d.ts +264 -0
- package/dist/modules/lists/schema.d.ts.map +1 -0
- package/dist/modules/lists/schema.js +73 -0
- package/dist/modules/lists/schema.js.map +1 -0
- package/dist/modules/lists/service.d.ts +70 -0
- package/dist/modules/lists/service.d.ts.map +1 -0
- package/dist/modules/lists/service.js +214 -0
- package/dist/modules/lists/service.js.map +1 -0
- package/dist/modules/lists/tools.d.ts +4 -0
- package/dist/modules/lists/tools.d.ts.map +1 -0
- package/dist/modules/lists/tools.js +86 -0
- package/dist/modules/lists/tools.js.map +1 -0
- package/dist/modules/people/repository.d.ts +11 -0
- package/dist/modules/people/repository.d.ts.map +1 -1
- package/dist/modules/people/repository.js +16 -0
- package/dist/modules/people/repository.js.map +1 -1
- package/dist/modules/people/service.d.ts.map +1 -1
- package/dist/modules/people/service.js +18 -0
- package/dist/modules/people/service.js.map +1 -1
- package/dist/modules/positions/routes.d.ts.map +1 -1
- package/dist/modules/positions/routes.js +4 -2
- package/dist/modules/positions/routes.js.map +1 -1
- package/dist/modules/sample-data/fixture.d.ts +139 -0
- package/dist/modules/sample-data/fixture.d.ts.map +1 -0
- package/dist/modules/sample-data/fixture.js +461 -0
- package/dist/modules/sample-data/fixture.js.map +1 -0
- package/dist/modules/sample-data/index.d.ts +11 -0
- package/dist/modules/sample-data/index.d.ts.map +1 -0
- package/dist/modules/sample-data/index.js +43 -0
- package/dist/modules/sample-data/index.js.map +1 -0
- package/dist/modules/sample-data/routes.d.ts +15 -0
- package/dist/modules/sample-data/routes.d.ts.map +1 -0
- package/dist/modules/sample-data/routes.js +24 -0
- package/dist/modules/sample-data/routes.js.map +1 -0
- package/dist/modules/sample-data/service.d.ts +38 -0
- package/dist/modules/sample-data/service.d.ts.map +1 -0
- package/dist/modules/sample-data/service.js +412 -0
- package/dist/modules/sample-data/service.js.map +1 -0
- package/dist/modules/sample-data/tools.d.ts +4 -0
- package/dist/modules/sample-data/tools.d.ts.map +1 -0
- package/dist/modules/sample-data/tools.js +22 -0
- package/dist/modules/sample-data/tools.js.map +1 -0
- package/dist/modules/smtp-email/index.d.ts +1 -0
- package/dist/modules/smtp-email/index.d.ts.map +1 -1
- package/dist/modules/smtp-email/index.js +1 -0
- package/dist/modules/smtp-email/index.js.map +1 -1
- package/dist/modules/workspace/service.d.ts.map +1 -1
- package/dist/modules/workspace/service.js +10 -1
- package/dist/modules/workspace/service.js.map +1 -1
- package/dist/schema/index.d.ts +1 -0
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +1 -0
- package/dist/schema/index.js.map +1 -1
- package/migrations/0021_certain_maggott.sql +30 -0
- package/migrations/0022_stormy_manta.sql +1 -0
- package/migrations/0023_funny_maddog.sql +1 -0
- package/migrations/meta/0021_snapshot.json +5389 -0
- package/migrations/meta/0022_snapshot.json +5396 -0
- package/migrations/meta/0023_snapshot.json +5403 -0
- package/migrations/meta/_journal.json +21 -0
- package/package.json +3 -2
- package/src/lib/consumerEmailDomains.ts +62 -0
- package/src/lib/email.ts +7 -0
- package/src/lib/emailContent.ts +91 -0
- package/src/lib/emailDomainAutoLink.ts +165 -0
- package/src/lib/ids.ts +2 -0
- package/src/modules/attachedRecords.ts +9 -2
- package/src/modules/auth/preferences.ts +13 -1
- package/src/modules/auth/routes.ts +22 -0
- package/src/modules/auth/schema.ts +12 -2
- package/src/modules/auth/service.ts +37 -3
- package/src/modules/companies/repository.ts +3 -0
- package/src/modules/companies/routes.ts +13 -0
- package/src/modules/companies/schema.ts +5 -1
- package/src/modules/companies/service.ts +25 -0
- package/src/modules/core.ts +11 -0
- package/src/modules/email-domain-linker/index.ts +40 -0
- package/src/modules/email-domain-linker/routes.ts +40 -0
- package/src/modules/email-domain-linker/service.ts +122 -0
- package/src/modules/eventCatalogs.ts +1 -0
- package/src/modules/lists/events.ts +41 -0
- package/src/modules/lists/index.ts +41 -0
- package/src/modules/lists/repository.ts +313 -0
- package/src/modules/lists/routes.ts +247 -0
- package/src/modules/lists/schema.ts +85 -0
- package/src/modules/lists/service.ts +404 -0
- package/src/modules/lists/tools.ts +128 -0
- package/src/modules/people/repository.ts +26 -0
- package/src/modules/people/service.ts +20 -0
- package/src/modules/positions/routes.ts +4 -2
- package/src/modules/sample-data/fixture.ts +627 -0
- package/src/modules/sample-data/index.ts +50 -0
- package/src/modules/sample-data/routes.ts +49 -0
- package/src/modules/sample-data/service.ts +590 -0
- package/src/modules/sample-data/tools.ts +32 -0
- package/src/modules/smtp-email/index.ts +8 -1
- package/src/modules/workspace/service.ts +13 -1
- package/src/schema/index.ts +1 -0
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { and, eq, ilike, inArray, sql } from 'drizzle-orm';
|
|
2
|
+
import { keysetCondition, orderByWindow, textSort, timestampSort } from '../../lib/pagination.js';
|
|
3
|
+
import { containsPattern } from '../../lib/search.js';
|
|
4
|
+
import { listMembers, lists } from './schema.js';
|
|
5
|
+
export const LIST_SORTS = {
|
|
6
|
+
name: textSort(lists.name, (list) => list.name),
|
|
7
|
+
created_at: timestampSort(lists.createdAt, (list) => list.createdAt),
|
|
8
|
+
updated_at: timestampSort(lists.updatedAt, (list) => list.updatedAt),
|
|
9
|
+
};
|
|
10
|
+
export const DEFAULT_LIST_SORT = '-updated_at';
|
|
11
|
+
function conditionsFor(workspaceId, filters) {
|
|
12
|
+
const term = filters.term;
|
|
13
|
+
const targetType = filters.targetType;
|
|
14
|
+
return [
|
|
15
|
+
eq(lists.workspaceId, workspaceId),
|
|
16
|
+
term === undefined ? undefined : ilike(lists.name, containsPattern(term)),
|
|
17
|
+
targetType === undefined ? undefined : eq(lists.targetType, targetType),
|
|
18
|
+
];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* @returns Up to `window.fetchLimit` rows: one more than the page, so the
|
|
22
|
+
* caller can tell there is a next one. Each row carries the count of members
|
|
23
|
+
* attached to it.
|
|
24
|
+
*/
|
|
25
|
+
export async function listLists(db, workspaceId, filters, window) {
|
|
26
|
+
const rows = await db
|
|
27
|
+
.select()
|
|
28
|
+
.from(lists)
|
|
29
|
+
.where(and(...conditionsFor(workspaceId, filters), keysetCondition(window, lists.id)))
|
|
30
|
+
.orderBy(...orderByWindow(window, lists.id))
|
|
31
|
+
.limit(window.fetchLimit);
|
|
32
|
+
const counts = await countMembersFor(db, rows.map((row) => row.id));
|
|
33
|
+
return rows.map((row) => ({ ...row, memberCount: counts.get(row.id) ?? 0 }));
|
|
34
|
+
}
|
|
35
|
+
async function countMembersFor(db, listIds) {
|
|
36
|
+
if (listIds.length === 0) {
|
|
37
|
+
return new Map();
|
|
38
|
+
}
|
|
39
|
+
const rows = await db
|
|
40
|
+
.select({ listId: listMembers.listId, count: sql `count(*)::int` })
|
|
41
|
+
.from(listMembers)
|
|
42
|
+
.where(inArray(listMembers.listId, [...listIds]))
|
|
43
|
+
.groupBy(listMembers.listId);
|
|
44
|
+
return new Map(rows.map((row) => [row.listId, Number(row.count)]));
|
|
45
|
+
}
|
|
46
|
+
export async function findList(db, workspaceId, id) {
|
|
47
|
+
const [found] = await db
|
|
48
|
+
.select()
|
|
49
|
+
.from(lists)
|
|
50
|
+
.where(and(eq(lists.workspaceId, workspaceId), eq(lists.id, id)))
|
|
51
|
+
.limit(1);
|
|
52
|
+
if (found === undefined) {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
return { ...found, memberCount: await countMembers(db, id) };
|
|
56
|
+
}
|
|
57
|
+
async function countMembers(db, listId) {
|
|
58
|
+
const [row] = await db
|
|
59
|
+
.select({ count: sql `count(*)::int` })
|
|
60
|
+
.from(listMembers)
|
|
61
|
+
.where(eq(listMembers.listId, listId));
|
|
62
|
+
return Number(row?.count ?? 0);
|
|
63
|
+
}
|
|
64
|
+
export async function insertList(db, values) {
|
|
65
|
+
const [created] = await db.insert(lists).values(values).returning();
|
|
66
|
+
if (created === undefined) {
|
|
67
|
+
throw new Error(`Inserting list ${values.id} returned no row`);
|
|
68
|
+
}
|
|
69
|
+
return created;
|
|
70
|
+
}
|
|
71
|
+
export async function updateList(db, workspaceId, id, changes) {
|
|
72
|
+
const [updated] = await db
|
|
73
|
+
.update(lists)
|
|
74
|
+
.set(changes)
|
|
75
|
+
.where(and(eq(lists.workspaceId, workspaceId), eq(lists.id, id)))
|
|
76
|
+
.returning();
|
|
77
|
+
return updated;
|
|
78
|
+
}
|
|
79
|
+
export async function deleteList(db, workspaceId, id) {
|
|
80
|
+
const deleted = await db
|
|
81
|
+
.delete(lists)
|
|
82
|
+
.where(and(eq(lists.workspaceId, workspaceId), eq(lists.id, id)))
|
|
83
|
+
.returning({ id: lists.id });
|
|
84
|
+
return deleted.length;
|
|
85
|
+
}
|
|
86
|
+
/** Members: no cursor pagination yet. A list's members render on one page today. */
|
|
87
|
+
export const LIST_MEMBER_SORTS = {
|
|
88
|
+
added_at: timestampSort(listMembers.addedAt, (row) => row.addedAt),
|
|
89
|
+
};
|
|
90
|
+
export const DEFAULT_LIST_MEMBER_SORT = '-added_at';
|
|
91
|
+
function memberConditionsFor(workspaceId, filters) {
|
|
92
|
+
const targetType = filters.targetType;
|
|
93
|
+
return [
|
|
94
|
+
eq(listMembers.workspaceId, workspaceId),
|
|
95
|
+
eq(listMembers.listId, filters.listId),
|
|
96
|
+
targetType === undefined ? undefined : eq(listMembers.targetType, targetType),
|
|
97
|
+
];
|
|
98
|
+
}
|
|
99
|
+
export function listListMembers(db, workspaceId, filters, window) {
|
|
100
|
+
return db
|
|
101
|
+
.select()
|
|
102
|
+
.from(listMembers)
|
|
103
|
+
.where(and(...memberConditionsFor(workspaceId, filters), keysetCondition(window, listMembers.id)))
|
|
104
|
+
.orderBy(...orderByWindow(window, listMembers.id))
|
|
105
|
+
.limit(window.fetchLimit);
|
|
106
|
+
}
|
|
107
|
+
export async function findListMember(db, workspaceId, listId, id) {
|
|
108
|
+
const [found] = await db
|
|
109
|
+
.select()
|
|
110
|
+
.from(listMembers)
|
|
111
|
+
.where(and(eq(listMembers.workspaceId, workspaceId), eq(listMembers.listId, listId), eq(listMembers.id, id)))
|
|
112
|
+
.limit(1);
|
|
113
|
+
return found;
|
|
114
|
+
}
|
|
115
|
+
export async function insertListMember(db, values) {
|
|
116
|
+
const [created] = await db.insert(listMembers).values(values).returning();
|
|
117
|
+
if (created === undefined) {
|
|
118
|
+
throw new Error(`Inserting list_member ${values.id} returned no row`);
|
|
119
|
+
}
|
|
120
|
+
return created;
|
|
121
|
+
}
|
|
122
|
+
export async function deleteListMember(db, workspaceId, listId, id) {
|
|
123
|
+
const deleted = await db
|
|
124
|
+
.delete(listMembers)
|
|
125
|
+
.where(and(eq(listMembers.workspaceId, workspaceId), eq(listMembers.listId, listId), eq(listMembers.id, id)))
|
|
126
|
+
.returning({ id: listMembers.id });
|
|
127
|
+
return deleted.length;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* "Which lists is this record on?"
|
|
131
|
+
*
|
|
132
|
+
* Ordered by list name so a record's Lists tab reads alphabetically and the
|
|
133
|
+
* order does not shift as memberships are added.
|
|
134
|
+
*/
|
|
135
|
+
export async function listMembershipsForTarget(db, workspaceId, targetType, targetId) {
|
|
136
|
+
return db
|
|
137
|
+
.select({
|
|
138
|
+
id: listMembers.id,
|
|
139
|
+
listId: listMembers.listId,
|
|
140
|
+
listName: lists.name,
|
|
141
|
+
listTargetType: lists.targetType,
|
|
142
|
+
targetType: listMembers.targetType,
|
|
143
|
+
targetId: listMembers.targetId,
|
|
144
|
+
addedAt: listMembers.addedAt,
|
|
145
|
+
})
|
|
146
|
+
.from(listMembers)
|
|
147
|
+
.innerJoin(lists, eq(listMembers.listId, lists.id))
|
|
148
|
+
.where(and(eq(listMembers.workspaceId, workspaceId), eq(listMembers.targetType, targetType), eq(listMembers.targetId, targetId)))
|
|
149
|
+
.orderBy(lists.name);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Removes every list membership for one target.
|
|
153
|
+
*
|
|
154
|
+
* The target is polymorphic and carries no foreign key of its own, so nothing
|
|
155
|
+
* in the database deletes these when the target goes. The service that deletes
|
|
156
|
+
* the target calls this inside the same transaction.
|
|
157
|
+
*/
|
|
158
|
+
export async function deleteMembershipsForTarget(db, workspaceId, targetType, targetId) {
|
|
159
|
+
const deleted = await db
|
|
160
|
+
.delete(listMembers)
|
|
161
|
+
.where(and(eq(listMembers.workspaceId, workspaceId), eq(listMembers.targetType, targetType), eq(listMembers.targetId, targetId)))
|
|
162
|
+
.returning({ id: listMembers.id });
|
|
163
|
+
return deleted.length;
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/modules/lists/repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { Hono } from 'hono';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import type { CredentialDependencies } from '../auth/credentials.ts';
|
|
4
|
+
import type { AddListMemberInput, CreateListInput, ListMemberView, ListMembershipView, ListView, ListsService, UpdateListInput } from './service.ts';
|
|
5
|
+
/**
|
|
6
|
+
* Wire shapes for `/v1/lists`.
|
|
7
|
+
*
|
|
8
|
+
* `target_type` is required on create and absent from update: a list's type is
|
|
9
|
+
* fixed for its lifetime. Bodies are strict, so a caller sending `target_type`
|
|
10
|
+
* on PATCH hears about it as a 422 rather than silently ignored.
|
|
11
|
+
*/
|
|
12
|
+
export declare const createBody: z.ZodObject<{
|
|
13
|
+
name: z.ZodString;
|
|
14
|
+
target_type: z.ZodEnum<{
|
|
15
|
+
candidate: "candidate";
|
|
16
|
+
company: "company";
|
|
17
|
+
deal: "deal";
|
|
18
|
+
opportunity: "opportunity";
|
|
19
|
+
partnership: "partnership";
|
|
20
|
+
person: "person";
|
|
21
|
+
raise: "raise";
|
|
22
|
+
}>;
|
|
23
|
+
description: z.ZodDefault<z.ZodNullable<z.ZodString>>;
|
|
24
|
+
}, z.core.$strict>;
|
|
25
|
+
export declare const updateBody: z.ZodObject<{
|
|
26
|
+
name: z.ZodOptional<z.ZodString>;
|
|
27
|
+
description: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
28
|
+
}, z.core.$strict>;
|
|
29
|
+
export declare const addMemberBody: z.ZodObject<{
|
|
30
|
+
target_type: z.ZodEnum<{
|
|
31
|
+
candidate: "candidate";
|
|
32
|
+
company: "company";
|
|
33
|
+
deal: "deal";
|
|
34
|
+
opportunity: "opportunity";
|
|
35
|
+
partnership: "partnership";
|
|
36
|
+
person: "person";
|
|
37
|
+
raise: "raise";
|
|
38
|
+
}>;
|
|
39
|
+
target_id: z.ZodString;
|
|
40
|
+
}, z.core.$strict>;
|
|
41
|
+
export interface ListsRoutesDependencies extends CredentialDependencies {
|
|
42
|
+
readonly service: ListsService;
|
|
43
|
+
}
|
|
44
|
+
export declare function toCreateInput(body: z.infer<typeof createBody>): CreateListInput;
|
|
45
|
+
export declare function toUpdateInput(body: z.infer<typeof updateBody>): UpdateListInput;
|
|
46
|
+
export declare function toAddMemberInput(body: z.infer<typeof addMemberBody>): AddListMemberInput;
|
|
47
|
+
export declare function listResponse(list: ListView): Record<string, unknown>;
|
|
48
|
+
export declare function listMembershipResponse(membership: ListMembershipView): Record<string, unknown>;
|
|
49
|
+
export declare function listMemberResponse(member: ListMemberView): Record<string, unknown>;
|
|
50
|
+
export declare function mountListsRoutes(router: Hono, dependencies: ListsRoutesDependencies): void;
|
|
51
|
+
//# sourceMappingURL=routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/modules/lists/routes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,IAAI,EAAE,MAAM,MAAM,CAAA;AACzC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAMvB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAIpE,OAAO,KAAK,EACV,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,QAAQ,EACR,YAAY,EACZ,eAAe,EAChB,MAAM,cAAc,CAAA;AAErB;;;;;;GAMG;AAEH,eAAO,MAAM,UAAU;;;;;;;;;;;;kBAIrB,CAAA;AAEF,eAAO,MAAM,UAAU;;;kBAKX,CAAA;AAEZ,eAAO,MAAM,aAAa;;;;;;;;;;;kBAGxB,CAAA;AAEF,MAAM,WAAW,uBAAwB,SAAQ,sBAAsB;IACrE,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAA;CAC/B;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,GAAG,eAAe,CAM/E;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,GAAG,eAAe,CAK/E;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,GAAG,kBAAkB,CAKxF;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUpE;AAED,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,kBAAkB,GAC7B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUzB;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CASlF;AA4CD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,uBAAuB,GAAG,IAAI,CA8F1F"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { AppError } from '../../lib/errors.js';
|
|
3
|
+
import { pageBody, readJsonBody, readListParameters } from '../../lib/http.js';
|
|
4
|
+
import { resolveActorFrom } from '../auth/credentials.js';
|
|
5
|
+
import { isRecordTargetType } from '../recordTargets.js';
|
|
6
|
+
import { RECORD_TARGET_TYPES } from './schema.js';
|
|
7
|
+
/**
|
|
8
|
+
* Wire shapes for `/v1/lists`.
|
|
9
|
+
*
|
|
10
|
+
* `target_type` is required on create and absent from update: a list's type is
|
|
11
|
+
* fixed for its lifetime. Bodies are strict, so a caller sending `target_type`
|
|
12
|
+
* on PATCH hears about it as a 422 rather than silently ignored.
|
|
13
|
+
*/
|
|
14
|
+
export const createBody = z.strictObject({
|
|
15
|
+
name: z.string().min(1),
|
|
16
|
+
target_type: z.enum(RECORD_TARGET_TYPES),
|
|
17
|
+
description: z.string().nullable().default(null),
|
|
18
|
+
});
|
|
19
|
+
export const updateBody = z
|
|
20
|
+
.strictObject({
|
|
21
|
+
name: z.string().min(1),
|
|
22
|
+
description: z.string().nullable(),
|
|
23
|
+
})
|
|
24
|
+
.partial();
|
|
25
|
+
export const addMemberBody = z.strictObject({
|
|
26
|
+
target_type: z.enum(RECORD_TARGET_TYPES),
|
|
27
|
+
target_id: z.string().min(1),
|
|
28
|
+
});
|
|
29
|
+
export function toCreateInput(body) {
|
|
30
|
+
return {
|
|
31
|
+
name: body.name,
|
|
32
|
+
targetType: body.target_type,
|
|
33
|
+
description: body.description,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export function toUpdateInput(body) {
|
|
37
|
+
return {
|
|
38
|
+
...(body.name === undefined ? {} : { name: body.name }),
|
|
39
|
+
...(body.description === undefined ? {} : { description: body.description }),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
export function toAddMemberInput(body) {
|
|
43
|
+
return {
|
|
44
|
+
targetType: body.target_type,
|
|
45
|
+
targetId: body.target_id,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
export function listResponse(list) {
|
|
49
|
+
return {
|
|
50
|
+
id: list.id,
|
|
51
|
+
name: list.name,
|
|
52
|
+
description: list.description,
|
|
53
|
+
target_type: list.targetType,
|
|
54
|
+
member_count: list.memberCount,
|
|
55
|
+
created_at: list.createdAt.toISOString(),
|
|
56
|
+
updated_at: list.updatedAt.toISOString(),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
export function listMembershipResponse(membership) {
|
|
60
|
+
return {
|
|
61
|
+
id: membership.id,
|
|
62
|
+
list_id: membership.listId,
|
|
63
|
+
list_name: membership.listName,
|
|
64
|
+
list_target_type: membership.listTargetType,
|
|
65
|
+
target_type: membership.targetType,
|
|
66
|
+
target_id: membership.targetId,
|
|
67
|
+
added_at: membership.addedAt.toISOString(),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
export function listMemberResponse(member) {
|
|
71
|
+
return {
|
|
72
|
+
id: member.id,
|
|
73
|
+
list_id: member.listId,
|
|
74
|
+
target_type: member.targetType,
|
|
75
|
+
target_id: member.targetId,
|
|
76
|
+
target_name: member.targetName,
|
|
77
|
+
added_at: member.addedAt.toISOString(),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function readTargetTypeFilter(context) {
|
|
81
|
+
const raw = context.req.query('target_type');
|
|
82
|
+
if (raw === undefined) {
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
if (!isRecordTargetType(raw)) {
|
|
86
|
+
throw AppError.validationFailed('That is not a record type a list holds', [
|
|
87
|
+
{ field: 'target_type', message: `Unknown target type "${raw}"` },
|
|
88
|
+
]);
|
|
89
|
+
}
|
|
90
|
+
return raw;
|
|
91
|
+
}
|
|
92
|
+
function readMembershipTarget(context) {
|
|
93
|
+
const rawType = context.req.query('target_type');
|
|
94
|
+
const targetId = context.req.query('target_id');
|
|
95
|
+
if (rawType === undefined || targetId === undefined || targetId.length === 0) {
|
|
96
|
+
throw AppError.validationFailed('A memberships list always names the record it is for', [
|
|
97
|
+
{ field: 'target_type', message: 'Required' },
|
|
98
|
+
{ field: 'target_id', message: 'Required' },
|
|
99
|
+
]);
|
|
100
|
+
}
|
|
101
|
+
if (!isRecordTargetType(rawType)) {
|
|
102
|
+
throw AppError.validationFailed('That is not a record type a list holds', [
|
|
103
|
+
{ field: 'target_type', message: `Unknown target type "${rawType}"` },
|
|
104
|
+
]);
|
|
105
|
+
}
|
|
106
|
+
return { targetType: rawType, targetId };
|
|
107
|
+
}
|
|
108
|
+
export function mountListsRoutes(router, dependencies) {
|
|
109
|
+
const requireActor = (context) => resolveActorFrom(dependencies, context);
|
|
110
|
+
router.get('/list-memberships', async (context) => {
|
|
111
|
+
const { targetType, targetId } = readMembershipTarget(context);
|
|
112
|
+
const memberships = await dependencies.service.membershipsFor(await requireActor(context), targetType, targetId);
|
|
113
|
+
// Not paged. A record has a small number of memberships in practice; the
|
|
114
|
+
// `next_cursor: null` is here so the standard list envelope reader accepts
|
|
115
|
+
// this response without a special case.
|
|
116
|
+
return context.json({
|
|
117
|
+
data: memberships.map(listMembershipResponse),
|
|
118
|
+
next_cursor: null,
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
router.get('/lists', async (context) => {
|
|
122
|
+
const page = await dependencies.service.list(await requireActor(context), {
|
|
123
|
+
term: context.req.query('q'),
|
|
124
|
+
targetType: readTargetTypeFilter(context),
|
|
125
|
+
}, readListParameters(context));
|
|
126
|
+
return context.json(pageBody(page, listResponse));
|
|
127
|
+
});
|
|
128
|
+
router.post('/lists', async (context) => {
|
|
129
|
+
const body = await readJsonBody(context, createBody);
|
|
130
|
+
const list = await dependencies.service.create(await requireActor(context), toCreateInput(body));
|
|
131
|
+
return context.json(listResponse(list), 201);
|
|
132
|
+
});
|
|
133
|
+
router.get('/lists/:id', async (context) => {
|
|
134
|
+
const list = await dependencies.service.get(await requireActor(context), context.req.param('id'));
|
|
135
|
+
return context.json(listResponse(list));
|
|
136
|
+
});
|
|
137
|
+
router.patch('/lists/:id', async (context) => {
|
|
138
|
+
const body = await readJsonBody(context, updateBody);
|
|
139
|
+
const list = await dependencies.service.update(await requireActor(context), context.req.param('id'), toUpdateInput(body));
|
|
140
|
+
return context.json(listResponse(list));
|
|
141
|
+
});
|
|
142
|
+
router.delete('/lists/:id', async (context) => {
|
|
143
|
+
await dependencies.service.remove(await requireActor(context), context.req.param('id'));
|
|
144
|
+
return context.body(null, 204);
|
|
145
|
+
});
|
|
146
|
+
router.get('/lists/:id/members', async (context) => {
|
|
147
|
+
const page = await dependencies.service.listMembers(await requireActor(context), { listId: context.req.param('id') }, readListParameters(context));
|
|
148
|
+
return context.json(pageBody(page, listMemberResponse));
|
|
149
|
+
});
|
|
150
|
+
router.post('/lists/:id/members', async (context) => {
|
|
151
|
+
const body = await readJsonBody(context, addMemberBody);
|
|
152
|
+
const member = await dependencies.service.addMember(await requireActor(context), context.req.param('id'), toAddMemberInput(body));
|
|
153
|
+
return context.json(listMemberResponse(member), 201);
|
|
154
|
+
});
|
|
155
|
+
router.delete('/lists/:id/members/:memberId', async (context) => {
|
|
156
|
+
await dependencies.service.removeMember(await requireActor(context), context.req.param('id'), context.req.param('memberId'));
|
|
157
|
+
return context.body(null, 204);
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../../src/modules/lists/routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The target types come from `@kelpie/schemas`, so this check constraint, the
|
|
3
|
+
* route's Zod enum, and the browser's decoder are one list rather than three
|
|
4
|
+
* copies. Re-exported because `routes.ts` reads them from here, and the tables
|
|
5
|
+
* they constrain are the reason they matter.
|
|
6
|
+
*/
|
|
7
|
+
export { RECORD_TARGET_TYPES } from '@kelpie/schemas';
|
|
8
|
+
export type { RecordTargetType } from '@kelpie/schemas';
|
|
9
|
+
/**
|
|
10
|
+
* A named collection of records of one type.
|
|
11
|
+
*
|
|
12
|
+
* The `target_type` is chosen at creation and never changes. A `list_members`
|
|
13
|
+
* row's `(list_id, target_type)` foreign-keys back into the composite unique on
|
|
14
|
+
* this table, so adding a person to a company list is refused by the database
|
|
15
|
+
* rather than trusted to the service.
|
|
16
|
+
*
|
|
17
|
+
* `(workspace_id, name)` is unique so the sidebar never shows two lists with the
|
|
18
|
+
* same label. Renaming to an in-use name returns 409.
|
|
19
|
+
*/
|
|
20
|
+
export declare const lists: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
21
|
+
name: "lists";
|
|
22
|
+
schema: undefined;
|
|
23
|
+
columns: {
|
|
24
|
+
id: import("drizzle-orm/pg-core").PgColumn<{
|
|
25
|
+
name: "id";
|
|
26
|
+
tableName: "lists";
|
|
27
|
+
dataType: "string";
|
|
28
|
+
columnType: "PgText";
|
|
29
|
+
data: string;
|
|
30
|
+
driverParam: string;
|
|
31
|
+
notNull: true;
|
|
32
|
+
hasDefault: false;
|
|
33
|
+
isPrimaryKey: true;
|
|
34
|
+
isAutoincrement: false;
|
|
35
|
+
hasRuntimeDefault: false;
|
|
36
|
+
enumValues: [string, ...string[]];
|
|
37
|
+
baseColumn: never;
|
|
38
|
+
identity: undefined;
|
|
39
|
+
generated: undefined;
|
|
40
|
+
}, {}, {}>;
|
|
41
|
+
workspaceId: import("drizzle-orm/pg-core").PgColumn<{
|
|
42
|
+
name: "workspace_id";
|
|
43
|
+
tableName: "lists";
|
|
44
|
+
dataType: "string";
|
|
45
|
+
columnType: "PgText";
|
|
46
|
+
data: string;
|
|
47
|
+
driverParam: string;
|
|
48
|
+
notNull: true;
|
|
49
|
+
hasDefault: false;
|
|
50
|
+
isPrimaryKey: false;
|
|
51
|
+
isAutoincrement: false;
|
|
52
|
+
hasRuntimeDefault: false;
|
|
53
|
+
enumValues: [string, ...string[]];
|
|
54
|
+
baseColumn: never;
|
|
55
|
+
identity: undefined;
|
|
56
|
+
generated: undefined;
|
|
57
|
+
}, {}, {}>;
|
|
58
|
+
name: import("drizzle-orm/pg-core").PgColumn<{
|
|
59
|
+
name: "name";
|
|
60
|
+
tableName: "lists";
|
|
61
|
+
dataType: "string";
|
|
62
|
+
columnType: "PgText";
|
|
63
|
+
data: string;
|
|
64
|
+
driverParam: string;
|
|
65
|
+
notNull: true;
|
|
66
|
+
hasDefault: false;
|
|
67
|
+
isPrimaryKey: false;
|
|
68
|
+
isAutoincrement: false;
|
|
69
|
+
hasRuntimeDefault: false;
|
|
70
|
+
enumValues: [string, ...string[]];
|
|
71
|
+
baseColumn: never;
|
|
72
|
+
identity: undefined;
|
|
73
|
+
generated: undefined;
|
|
74
|
+
}, {}, {}>;
|
|
75
|
+
description: import("drizzle-orm/pg-core").PgColumn<{
|
|
76
|
+
name: "description";
|
|
77
|
+
tableName: "lists";
|
|
78
|
+
dataType: "string";
|
|
79
|
+
columnType: "PgText";
|
|
80
|
+
data: string;
|
|
81
|
+
driverParam: string;
|
|
82
|
+
notNull: false;
|
|
83
|
+
hasDefault: false;
|
|
84
|
+
isPrimaryKey: false;
|
|
85
|
+
isAutoincrement: false;
|
|
86
|
+
hasRuntimeDefault: false;
|
|
87
|
+
enumValues: [string, ...string[]];
|
|
88
|
+
baseColumn: never;
|
|
89
|
+
identity: undefined;
|
|
90
|
+
generated: undefined;
|
|
91
|
+
}, {}, {}>;
|
|
92
|
+
targetType: import("drizzle-orm/pg-core").PgColumn<{
|
|
93
|
+
name: "target_type";
|
|
94
|
+
tableName: "lists";
|
|
95
|
+
dataType: "string";
|
|
96
|
+
columnType: "PgText";
|
|
97
|
+
data: string;
|
|
98
|
+
driverParam: string;
|
|
99
|
+
notNull: true;
|
|
100
|
+
hasDefault: false;
|
|
101
|
+
isPrimaryKey: false;
|
|
102
|
+
isAutoincrement: false;
|
|
103
|
+
hasRuntimeDefault: false;
|
|
104
|
+
enumValues: [string, ...string[]];
|
|
105
|
+
baseColumn: never;
|
|
106
|
+
identity: undefined;
|
|
107
|
+
generated: undefined;
|
|
108
|
+
}, {}, {}>;
|
|
109
|
+
createdAt: import("drizzle-orm/pg-core").PgColumn<{
|
|
110
|
+
name: "created_at";
|
|
111
|
+
tableName: "lists";
|
|
112
|
+
dataType: "date";
|
|
113
|
+
columnType: "PgTimestamp";
|
|
114
|
+
data: Date;
|
|
115
|
+
driverParam: string;
|
|
116
|
+
notNull: true;
|
|
117
|
+
hasDefault: true;
|
|
118
|
+
isPrimaryKey: false;
|
|
119
|
+
isAutoincrement: false;
|
|
120
|
+
hasRuntimeDefault: false;
|
|
121
|
+
enumValues: undefined;
|
|
122
|
+
baseColumn: never;
|
|
123
|
+
identity: undefined;
|
|
124
|
+
generated: undefined;
|
|
125
|
+
}, {}, {}>;
|
|
126
|
+
updatedAt: import("drizzle-orm/pg-core").PgColumn<{
|
|
127
|
+
name: "updated_at";
|
|
128
|
+
tableName: "lists";
|
|
129
|
+
dataType: "date";
|
|
130
|
+
columnType: "PgTimestamp";
|
|
131
|
+
data: Date;
|
|
132
|
+
driverParam: string;
|
|
133
|
+
notNull: true;
|
|
134
|
+
hasDefault: true;
|
|
135
|
+
isPrimaryKey: false;
|
|
136
|
+
isAutoincrement: false;
|
|
137
|
+
hasRuntimeDefault: false;
|
|
138
|
+
enumValues: undefined;
|
|
139
|
+
baseColumn: never;
|
|
140
|
+
identity: undefined;
|
|
141
|
+
generated: undefined;
|
|
142
|
+
}, {}, {}>;
|
|
143
|
+
};
|
|
144
|
+
dialect: 'pg';
|
|
145
|
+
}>;
|
|
146
|
+
/**
|
|
147
|
+
* A record's membership in a list.
|
|
148
|
+
*
|
|
149
|
+
* `(list_id, target_type)` foreign-keys back to the list's own unique key, so
|
|
150
|
+
* the member's type must equal its parent list's. The target itself is
|
|
151
|
+
* polymorphic and carries no foreign key of its own; the owning service checks
|
|
152
|
+
* existence with `missingTargets` and removes the row when the target goes
|
|
153
|
+
* (`attachedRecords.ts`).
|
|
154
|
+
*/
|
|
155
|
+
export declare const listMembers: import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
156
|
+
name: "list_members";
|
|
157
|
+
schema: undefined;
|
|
158
|
+
columns: {
|
|
159
|
+
id: import("drizzle-orm/pg-core").PgColumn<{
|
|
160
|
+
name: "id";
|
|
161
|
+
tableName: "list_members";
|
|
162
|
+
dataType: "string";
|
|
163
|
+
columnType: "PgText";
|
|
164
|
+
data: string;
|
|
165
|
+
driverParam: string;
|
|
166
|
+
notNull: true;
|
|
167
|
+
hasDefault: false;
|
|
168
|
+
isPrimaryKey: true;
|
|
169
|
+
isAutoincrement: false;
|
|
170
|
+
hasRuntimeDefault: false;
|
|
171
|
+
enumValues: [string, ...string[]];
|
|
172
|
+
baseColumn: never;
|
|
173
|
+
identity: undefined;
|
|
174
|
+
generated: undefined;
|
|
175
|
+
}, {}, {}>;
|
|
176
|
+
workspaceId: import("drizzle-orm/pg-core").PgColumn<{
|
|
177
|
+
name: "workspace_id";
|
|
178
|
+
tableName: "list_members";
|
|
179
|
+
dataType: "string";
|
|
180
|
+
columnType: "PgText";
|
|
181
|
+
data: string;
|
|
182
|
+
driverParam: string;
|
|
183
|
+
notNull: true;
|
|
184
|
+
hasDefault: false;
|
|
185
|
+
isPrimaryKey: false;
|
|
186
|
+
isAutoincrement: false;
|
|
187
|
+
hasRuntimeDefault: false;
|
|
188
|
+
enumValues: [string, ...string[]];
|
|
189
|
+
baseColumn: never;
|
|
190
|
+
identity: undefined;
|
|
191
|
+
generated: undefined;
|
|
192
|
+
}, {}, {}>;
|
|
193
|
+
listId: import("drizzle-orm/pg-core").PgColumn<{
|
|
194
|
+
name: "list_id";
|
|
195
|
+
tableName: "list_members";
|
|
196
|
+
dataType: "string";
|
|
197
|
+
columnType: "PgText";
|
|
198
|
+
data: string;
|
|
199
|
+
driverParam: string;
|
|
200
|
+
notNull: true;
|
|
201
|
+
hasDefault: false;
|
|
202
|
+
isPrimaryKey: false;
|
|
203
|
+
isAutoincrement: false;
|
|
204
|
+
hasRuntimeDefault: false;
|
|
205
|
+
enumValues: [string, ...string[]];
|
|
206
|
+
baseColumn: never;
|
|
207
|
+
identity: undefined;
|
|
208
|
+
generated: undefined;
|
|
209
|
+
}, {}, {}>;
|
|
210
|
+
targetType: import("drizzle-orm/pg-core").PgColumn<{
|
|
211
|
+
name: "target_type";
|
|
212
|
+
tableName: "list_members";
|
|
213
|
+
dataType: "string";
|
|
214
|
+
columnType: "PgText";
|
|
215
|
+
data: string;
|
|
216
|
+
driverParam: string;
|
|
217
|
+
notNull: true;
|
|
218
|
+
hasDefault: false;
|
|
219
|
+
isPrimaryKey: false;
|
|
220
|
+
isAutoincrement: false;
|
|
221
|
+
hasRuntimeDefault: false;
|
|
222
|
+
enumValues: [string, ...string[]];
|
|
223
|
+
baseColumn: never;
|
|
224
|
+
identity: undefined;
|
|
225
|
+
generated: undefined;
|
|
226
|
+
}, {}, {}>;
|
|
227
|
+
targetId: import("drizzle-orm/pg-core").PgColumn<{
|
|
228
|
+
name: "target_id";
|
|
229
|
+
tableName: "list_members";
|
|
230
|
+
dataType: "string";
|
|
231
|
+
columnType: "PgText";
|
|
232
|
+
data: string;
|
|
233
|
+
driverParam: string;
|
|
234
|
+
notNull: true;
|
|
235
|
+
hasDefault: false;
|
|
236
|
+
isPrimaryKey: false;
|
|
237
|
+
isAutoincrement: false;
|
|
238
|
+
hasRuntimeDefault: false;
|
|
239
|
+
enumValues: [string, ...string[]];
|
|
240
|
+
baseColumn: never;
|
|
241
|
+
identity: undefined;
|
|
242
|
+
generated: undefined;
|
|
243
|
+
}, {}, {}>;
|
|
244
|
+
addedAt: import("drizzle-orm/pg-core").PgColumn<{
|
|
245
|
+
name: "added_at";
|
|
246
|
+
tableName: "list_members";
|
|
247
|
+
dataType: "date";
|
|
248
|
+
columnType: "PgTimestamp";
|
|
249
|
+
data: Date;
|
|
250
|
+
driverParam: string;
|
|
251
|
+
notNull: true;
|
|
252
|
+
hasDefault: true;
|
|
253
|
+
isPrimaryKey: false;
|
|
254
|
+
isAutoincrement: false;
|
|
255
|
+
hasRuntimeDefault: false;
|
|
256
|
+
enumValues: undefined;
|
|
257
|
+
baseColumn: never;
|
|
258
|
+
identity: undefined;
|
|
259
|
+
generated: undefined;
|
|
260
|
+
}, {}, {}>;
|
|
261
|
+
};
|
|
262
|
+
dialect: 'pg';
|
|
263
|
+
}>;
|
|
264
|
+
//# sourceMappingURL=schema.d.ts.map
|