@actuate-media/cms-core 0.5.0 → 0.9.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/api/handlers.d.ts.map +1 -1
- package/dist/api/handlers.js +797 -0
- package/dist/api/handlers.js.map +1 -1
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +1 -0
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/reset-email.d.ts +10 -0
- package/dist/auth/reset-email.d.ts.map +1 -0
- package/dist/auth/reset-email.js +30 -0
- package/dist/auth/reset-email.js.map +1 -0
- package/dist/auth/reset.d.ts +35 -0
- package/dist/auth/reset.d.ts.map +1 -0
- package/dist/auth/reset.js +83 -0
- package/dist/auth/reset.js.map +1 -0
- package/dist/config/types.d.ts +3 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +0 -1
- package/dist/config/types.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/page-builder/__tests__/a11y-fix.test.d.ts +2 -0
- package/dist/page-builder/__tests__/a11y-fix.test.d.ts.map +1 -0
- package/dist/page-builder/__tests__/a11y-fix.test.js +246 -0
- package/dist/page-builder/__tests__/a11y-fix.test.js.map +1 -0
- package/dist/page-builder/__tests__/blocks.test.d.ts +2 -0
- package/dist/page-builder/__tests__/blocks.test.d.ts.map +1 -0
- package/dist/page-builder/__tests__/blocks.test.js +87 -0
- package/dist/page-builder/__tests__/blocks.test.js.map +1 -0
- package/dist/page-builder/__tests__/design-scorer.test.d.ts +2 -0
- package/dist/page-builder/__tests__/design-scorer.test.d.ts.map +1 -0
- package/dist/page-builder/__tests__/design-scorer.test.js +268 -0
- package/dist/page-builder/__tests__/design-scorer.test.js.map +1 -0
- package/dist/page-builder/__tests__/schema.test.d.ts +2 -0
- package/dist/page-builder/__tests__/schema.test.d.ts.map +1 -0
- package/dist/page-builder/__tests__/schema.test.js +191 -0
- package/dist/page-builder/__tests__/schema.test.js.map +1 -0
- package/dist/page-builder/__tests__/seo-analyzer.test.d.ts +2 -0
- package/dist/page-builder/__tests__/seo-analyzer.test.d.ts.map +1 -0
- package/dist/page-builder/__tests__/seo-analyzer.test.js +332 -0
- package/dist/page-builder/__tests__/seo-analyzer.test.js.map +1 -0
- package/dist/page-builder/__tests__/tree.test.d.ts +2 -0
- package/dist/page-builder/__tests__/tree.test.d.ts.map +1 -0
- package/dist/page-builder/__tests__/tree.test.js +257 -0
- package/dist/page-builder/__tests__/tree.test.js.map +1 -0
- package/dist/page-builder/a11y-fix.d.ts +20 -0
- package/dist/page-builder/a11y-fix.d.ts.map +1 -0
- package/dist/page-builder/a11y-fix.js +182 -0
- package/dist/page-builder/a11y-fix.js.map +1 -0
- package/dist/page-builder/ai-pipeline.d.ts +43 -0
- package/dist/page-builder/ai-pipeline.d.ts.map +1 -0
- package/dist/page-builder/ai-pipeline.js +167 -0
- package/dist/page-builder/ai-pipeline.js.map +1 -0
- package/dist/page-builder/blocks.d.ts +10 -0
- package/dist/page-builder/blocks.d.ts.map +1 -0
- package/dist/page-builder/blocks.js +252 -0
- package/dist/page-builder/blocks.js.map +1 -0
- package/dist/page-builder/design-scorer.d.ts +27 -0
- package/dist/page-builder/design-scorer.d.ts.map +1 -0
- package/dist/page-builder/design-scorer.js +404 -0
- package/dist/page-builder/design-scorer.js.map +1 -0
- package/dist/page-builder/index.d.ts +18 -0
- package/dist/page-builder/index.d.ts.map +1 -0
- package/dist/page-builder/index.js +20 -0
- package/dist/page-builder/index.js.map +1 -0
- package/dist/page-builder/schema.d.ts +107 -0
- package/dist/page-builder/schema.d.ts.map +1 -0
- package/dist/page-builder/schema.js +90 -0
- package/dist/page-builder/schema.js.map +1 -0
- package/dist/page-builder/seo-analyzer.d.ts +61 -0
- package/dist/page-builder/seo-analyzer.d.ts.map +1 -0
- package/dist/page-builder/seo-analyzer.js +582 -0
- package/dist/page-builder/seo-analyzer.js.map +1 -0
- package/dist/page-builder/templates.d.ts +9 -0
- package/dist/page-builder/templates.d.ts.map +1 -0
- package/dist/page-builder/templates.js +401 -0
- package/dist/page-builder/templates.js.map +1 -0
- package/dist/page-builder/tree.d.ts +17 -0
- package/dist/page-builder/tree.d.ts.map +1 -0
- package/dist/page-builder/tree.js +160 -0
- package/dist/page-builder/tree.js.map +1 -0
- package/dist/page-builder/types.d.ts +112 -0
- package/dist/page-builder/types.d.ts.map +1 -0
- package/dist/page-builder/types.js +4 -0
- package/dist/page-builder/types.js.map +1 -0
- package/dist/page-builder/validate.d.ts +6 -0
- package/dist/page-builder/validate.d.ts.map +1 -0
- package/dist/page-builder/validate.js +87 -0
- package/dist/page-builder/validate.js.map +1 -0
- package/package.json +6 -1
- package/prisma/migrations/0004_script_tags/migration.sql +21 -0
- package/prisma/migrations/0005_password_reset_tokens/migration.sql +20 -0
- package/prisma/migrations/0006_page_builder/migration.sql +38 -0
- package/prisma/schema.prisma +75 -11
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import type { FieldDefinition } from '../config/types.js';
|
|
2
|
+
export interface SectionSettings {
|
|
3
|
+
background?: string;
|
|
4
|
+
backgroundImage?: string;
|
|
5
|
+
backgroundGradient?: string;
|
|
6
|
+
paddingTop?: string;
|
|
7
|
+
paddingBottom?: string;
|
|
8
|
+
marginTop?: string;
|
|
9
|
+
marginBottom?: string;
|
|
10
|
+
visibility?: 'visible' | 'hidden';
|
|
11
|
+
htmlId?: string;
|
|
12
|
+
htmlClass?: string;
|
|
13
|
+
}
|
|
14
|
+
export interface ContainerSettings {
|
|
15
|
+
maxWidth?: string;
|
|
16
|
+
alignment?: 'left' | 'center' | 'right';
|
|
17
|
+
padding?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface RowSettings {
|
|
20
|
+
gap?: string;
|
|
21
|
+
verticalAlign?: 'top' | 'center' | 'bottom' | 'stretch';
|
|
22
|
+
reverseOnMobile?: boolean;
|
|
23
|
+
wrapOnMobile?: boolean;
|
|
24
|
+
}
|
|
25
|
+
export interface ColumnSettings {
|
|
26
|
+
width: number;
|
|
27
|
+
verticalAlign?: 'top' | 'center' | 'bottom';
|
|
28
|
+
padding?: string;
|
|
29
|
+
background?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface BlockSettings {
|
|
32
|
+
blockType: string;
|
|
33
|
+
variant?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface SavedSectionRefSettings {
|
|
36
|
+
refId: string;
|
|
37
|
+
}
|
|
38
|
+
export interface ResponsiveOverrides {
|
|
39
|
+
mobile?: Record<string, unknown>;
|
|
40
|
+
tablet?: Record<string, unknown>;
|
|
41
|
+
}
|
|
42
|
+
interface BaseNode {
|
|
43
|
+
id: string;
|
|
44
|
+
responsive?: ResponsiveOverrides;
|
|
45
|
+
}
|
|
46
|
+
export interface PageNode extends BaseNode {
|
|
47
|
+
type: 'page';
|
|
48
|
+
children: (SectionNode | SavedSectionRefNode)[];
|
|
49
|
+
}
|
|
50
|
+
export interface SectionNode extends BaseNode {
|
|
51
|
+
type: 'section';
|
|
52
|
+
settings: SectionSettings;
|
|
53
|
+
children: (ContainerNode | RowNode)[];
|
|
54
|
+
}
|
|
55
|
+
export interface ContainerNode extends BaseNode {
|
|
56
|
+
type: 'container';
|
|
57
|
+
settings: ContainerSettings;
|
|
58
|
+
children: RowNode[];
|
|
59
|
+
}
|
|
60
|
+
export interface RowNode extends BaseNode {
|
|
61
|
+
type: 'row';
|
|
62
|
+
settings: RowSettings;
|
|
63
|
+
children: ColumnNode[];
|
|
64
|
+
}
|
|
65
|
+
export interface ColumnNode extends BaseNode {
|
|
66
|
+
type: 'column';
|
|
67
|
+
settings: ColumnSettings;
|
|
68
|
+
children: (BlockNode | ContainerNode)[];
|
|
69
|
+
}
|
|
70
|
+
export interface BlockNode extends BaseNode {
|
|
71
|
+
type: 'block';
|
|
72
|
+
settings: BlockSettings;
|
|
73
|
+
data: Record<string, unknown>;
|
|
74
|
+
}
|
|
75
|
+
export interface SavedSectionRefNode extends BaseNode {
|
|
76
|
+
type: 'savedSectionRef';
|
|
77
|
+
settings: SavedSectionRefSettings;
|
|
78
|
+
}
|
|
79
|
+
export type BuilderNode = PageNode | SectionNode | ContainerNode | RowNode | ColumnNode | BlockNode | SavedSectionRefNode;
|
|
80
|
+
export type NodeType = BuilderNode['type'];
|
|
81
|
+
export interface VariantDefinition {
|
|
82
|
+
name: string;
|
|
83
|
+
label: string;
|
|
84
|
+
description: string;
|
|
85
|
+
thumbnail?: string;
|
|
86
|
+
defaultSettings?: Record<string, unknown>;
|
|
87
|
+
defaultData?: Record<string, unknown>;
|
|
88
|
+
}
|
|
89
|
+
export interface BlockTypeDefinition {
|
|
90
|
+
type: string;
|
|
91
|
+
label: string;
|
|
92
|
+
icon: string;
|
|
93
|
+
description?: string;
|
|
94
|
+
variants: VariantDefinition[];
|
|
95
|
+
fields: Record<string, FieldDefinition>;
|
|
96
|
+
defaultData?: Record<string, unknown>;
|
|
97
|
+
}
|
|
98
|
+
export interface PreviewTheme {
|
|
99
|
+
fontFamily?: string;
|
|
100
|
+
headingFontFamily?: string;
|
|
101
|
+
primaryColor?: string;
|
|
102
|
+
secondaryColor?: string;
|
|
103
|
+
borderRadius?: string;
|
|
104
|
+
}
|
|
105
|
+
export interface PageBuilderConfig {
|
|
106
|
+
blocks?: BlockTypeDefinition[];
|
|
107
|
+
previewTheme?: PreviewTheme;
|
|
108
|
+
}
|
|
109
|
+
export type ParentNode = PageNode | SectionNode | ContainerNode | RowNode | ColumnNode;
|
|
110
|
+
export declare function hasChildren(node: BuilderNode): node is ParentNode;
|
|
111
|
+
export {};
|
|
112
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/page-builder/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/page-builder/types.ts"],"names":[],"mappings":"AAuJA,MAAM,UAAU,WAAW,CAAC,IAAiB;IAC3C,OAAO,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB,CAAA;AACjE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/page-builder/validate.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,MAAM,EAAE,CAAA;CACjB;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,oBAAoB,CA8BhE"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { pageNodeSchema } from './schema.js';
|
|
2
|
+
const MAX_DEPTH = 9;
|
|
3
|
+
export function validateTree(tree) {
|
|
4
|
+
const errors = [];
|
|
5
|
+
if (tree === null ||
|
|
6
|
+
tree === undefined ||
|
|
7
|
+
typeof tree !== 'object' ||
|
|
8
|
+
!('type' in tree) ||
|
|
9
|
+
tree.type !== 'page') {
|
|
10
|
+
errors.push('Root node must be of type "page"');
|
|
11
|
+
return { valid: false, errors };
|
|
12
|
+
}
|
|
13
|
+
const result = pageNodeSchema.safeParse(tree);
|
|
14
|
+
if (!result.success) {
|
|
15
|
+
for (const issue of result.error.issues) {
|
|
16
|
+
const path = issue.path.length > 0 ? ` at ${issue.path.join('.')}` : '';
|
|
17
|
+
errors.push(`${issue.message}${path}`);
|
|
18
|
+
}
|
|
19
|
+
return { valid: false, errors };
|
|
20
|
+
}
|
|
21
|
+
const pageNode = tree;
|
|
22
|
+
checkColumnWidths(pageNode, errors);
|
|
23
|
+
checkDepth(pageNode, 1, errors);
|
|
24
|
+
checkBlockNoChildren(pageNode, errors);
|
|
25
|
+
checkNestingRules(pageNode, errors);
|
|
26
|
+
return { valid: errors.length === 0, errors };
|
|
27
|
+
}
|
|
28
|
+
function checkColumnWidths(node, errors) {
|
|
29
|
+
if (!node || typeof node !== 'object')
|
|
30
|
+
return;
|
|
31
|
+
const n = node;
|
|
32
|
+
if (n.type === 'row' && Array.isArray(n.children)) {
|
|
33
|
+
const columns = n.children;
|
|
34
|
+
const sum = columns.reduce((acc, col) => acc + (col.settings?.width ?? 0), 0);
|
|
35
|
+
if (sum !== 12) {
|
|
36
|
+
errors.push(`Row "${n.id}" columns sum to ${sum}, expected 12`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if ('children' in n && Array.isArray(n.children)) {
|
|
40
|
+
for (const child of n.children) {
|
|
41
|
+
checkColumnWidths(child, errors);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function checkDepth(node, depth, errors) {
|
|
46
|
+
if (!node || typeof node !== 'object')
|
|
47
|
+
return;
|
|
48
|
+
const n = node;
|
|
49
|
+
if (depth > MAX_DEPTH) {
|
|
50
|
+
errors.push(`Maximum nesting depth of ${MAX_DEPTH} exceeded at node "${n.id}"`);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if ('children' in n && Array.isArray(n.children)) {
|
|
54
|
+
for (const child of n.children) {
|
|
55
|
+
checkDepth(child, depth + 1, errors);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function checkBlockNoChildren(node, errors) {
|
|
60
|
+
if (!node || typeof node !== 'object')
|
|
61
|
+
return;
|
|
62
|
+
const n = node;
|
|
63
|
+
if (n.type === 'block' &&
|
|
64
|
+
'children' in n &&
|
|
65
|
+
Array.isArray(n.children) &&
|
|
66
|
+
n.children.length > 0) {
|
|
67
|
+
errors.push(`Block node "${n.id}" must not have children`);
|
|
68
|
+
}
|
|
69
|
+
if ('children' in n && Array.isArray(n.children)) {
|
|
70
|
+
for (const child of n.children) {
|
|
71
|
+
checkBlockNoChildren(child, errors);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function checkNestingRules(node, errors) {
|
|
76
|
+
if (!node || typeof node !== 'object')
|
|
77
|
+
return;
|
|
78
|
+
const n = node;
|
|
79
|
+
if (n.type === 'page' && Array.isArray(n.children)) {
|
|
80
|
+
for (const child of n.children) {
|
|
81
|
+
if (child.type !== 'section' && child.type !== 'savedSectionRef') {
|
|
82
|
+
errors.push(`Page node can only contain section or savedSectionRef children, found "${child.type}" ("${child.id}")`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/page-builder/validate.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@actuate-media/cms-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/actuate-media/actuatecms.git",
|
|
@@ -49,6 +49,11 @@
|
|
|
49
49
|
"import": "./dist/api/index.js",
|
|
50
50
|
"default": "./dist/api/index.js"
|
|
51
51
|
},
|
|
52
|
+
"./page-builder": {
|
|
53
|
+
"types": "./dist/page-builder/index.d.ts",
|
|
54
|
+
"import": "./dist/page-builder/index.js",
|
|
55
|
+
"default": "./dist/page-builder/index.js"
|
|
56
|
+
},
|
|
52
57
|
"./generated/client": {
|
|
53
58
|
"types": "./generated/client.d.ts",
|
|
54
59
|
"import": "./generated/client.js",
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
-- CreateTable
|
|
2
|
+
CREATE TABLE "actuate_script_tags" (
|
|
3
|
+
"id" TEXT NOT NULL,
|
|
4
|
+
"name" TEXT NOT NULL,
|
|
5
|
+
"code" TEXT NOT NULL,
|
|
6
|
+
"placement" TEXT NOT NULL,
|
|
7
|
+
"scope" TEXT NOT NULL,
|
|
8
|
+
"targetPaths" TEXT[],
|
|
9
|
+
"priority" INTEGER NOT NULL DEFAULT 100,
|
|
10
|
+
"enabled" BOOLEAN NOT NULL DEFAULT true,
|
|
11
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
12
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
13
|
+
|
|
14
|
+
CONSTRAINT "actuate_script_tags_pkey" PRIMARY KEY ("id")
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
-- CreateIndex
|
|
18
|
+
CREATE INDEX "actuate_script_tags_enabled_idx" ON "actuate_script_tags"("enabled");
|
|
19
|
+
|
|
20
|
+
-- CreateIndex
|
|
21
|
+
CREATE INDEX "actuate_script_tags_placement_idx" ON "actuate_script_tags"("placement");
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
-- CreateTable
|
|
2
|
+
CREATE TABLE "actuate_password_reset_tokens" (
|
|
3
|
+
"id" TEXT NOT NULL,
|
|
4
|
+
"userId" TEXT NOT NULL,
|
|
5
|
+
"tokenHash" TEXT NOT NULL,
|
|
6
|
+
"expiresAt" TIMESTAMP(3) NOT NULL,
|
|
7
|
+
"usedAt" TIMESTAMP(3),
|
|
8
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
9
|
+
|
|
10
|
+
CONSTRAINT "actuate_password_reset_tokens_pkey" PRIMARY KEY ("id")
|
|
11
|
+
);
|
|
12
|
+
|
|
13
|
+
-- CreateIndex
|
|
14
|
+
CREATE INDEX "actuate_password_reset_tokens_tokenHash_idx" ON "actuate_password_reset_tokens"("tokenHash");
|
|
15
|
+
|
|
16
|
+
-- CreateIndex
|
|
17
|
+
CREATE INDEX "actuate_password_reset_tokens_userId_idx" ON "actuate_password_reset_tokens"("userId");
|
|
18
|
+
|
|
19
|
+
-- AddForeignKey
|
|
20
|
+
ALTER TABLE "actuate_password_reset_tokens" ADD CONSTRAINT "actuate_password_reset_tokens_userId_fkey" FOREIGN KEY ("userId") REFERENCES "actuate_users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
-- CreateTable
|
|
2
|
+
CREATE TABLE "actuate_page_templates" (
|
|
3
|
+
"id" TEXT NOT NULL,
|
|
4
|
+
"name" TEXT NOT NULL,
|
|
5
|
+
"description" TEXT,
|
|
6
|
+
"category" TEXT NOT NULL DEFAULT 'content',
|
|
7
|
+
"tree" JSONB NOT NULL,
|
|
8
|
+
"thumbnail" TEXT,
|
|
9
|
+
"builtIn" BOOLEAN NOT NULL DEFAULT false,
|
|
10
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
11
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
12
|
+
|
|
13
|
+
CONSTRAINT "actuate_page_templates_pkey" PRIMARY KEY ("id")
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
-- CreateTable
|
|
17
|
+
CREATE TABLE "actuate_saved_sections" (
|
|
18
|
+
"id" TEXT NOT NULL,
|
|
19
|
+
"name" TEXT NOT NULL,
|
|
20
|
+
"description" TEXT,
|
|
21
|
+
"category" TEXT NOT NULL DEFAULT 'content',
|
|
22
|
+
"tree" JSONB NOT NULL,
|
|
23
|
+
"thumbnail" TEXT,
|
|
24
|
+
"usageCount" INTEGER NOT NULL DEFAULT 0,
|
|
25
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
26
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
27
|
+
|
|
28
|
+
CONSTRAINT "actuate_saved_sections_pkey" PRIMARY KEY ("id")
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
-- CreateIndex
|
|
32
|
+
CREATE INDEX "actuate_page_templates_category_idx" ON "actuate_page_templates"("category");
|
|
33
|
+
|
|
34
|
+
-- CreateIndex
|
|
35
|
+
CREATE INDEX "actuate_page_templates_builtIn_idx" ON "actuate_page_templates"("builtIn");
|
|
36
|
+
|
|
37
|
+
-- CreateIndex
|
|
38
|
+
CREATE INDEX "actuate_saved_sections_category_idx" ON "actuate_saved_sections"("category");
|
package/prisma/schema.prisma
CHANGED
|
@@ -129,17 +129,18 @@ model User {
|
|
|
129
129
|
createdAt DateTime @default(now())
|
|
130
130
|
updatedAt DateTime @updatedAt
|
|
131
131
|
|
|
132
|
-
sessions
|
|
133
|
-
oauthAccounts
|
|
134
|
-
apiKeys
|
|
135
|
-
documents
|
|
136
|
-
updatedDocuments
|
|
137
|
-
versions
|
|
138
|
-
media
|
|
139
|
-
contentLocks
|
|
140
|
-
notifications
|
|
141
|
-
contentTemplates
|
|
142
|
-
workflowAssigned
|
|
132
|
+
sessions Session[]
|
|
133
|
+
oauthAccounts OAuthAccount[]
|
|
134
|
+
apiKeys ApiKey[]
|
|
135
|
+
documents Document[] @relation("CreatedDocuments")
|
|
136
|
+
updatedDocuments Document[] @relation("UpdatedDocuments")
|
|
137
|
+
versions Version[]
|
|
138
|
+
media Media[]
|
|
139
|
+
contentLocks ContentLock[]
|
|
140
|
+
notifications InAppNotification[]
|
|
141
|
+
contentTemplates ContentTemplate[]
|
|
142
|
+
workflowAssigned WorkflowState[]
|
|
143
|
+
passwordResetTokens PasswordResetToken[]
|
|
143
144
|
|
|
144
145
|
@@map("actuate_users")
|
|
145
146
|
}
|
|
@@ -483,3 +484,66 @@ model WebhookDeliveryLog {
|
|
|
483
484
|
@@index([nextRetryAt])
|
|
484
485
|
@@map("actuate_webhook_deliveries")
|
|
485
486
|
}
|
|
487
|
+
|
|
488
|
+
model PasswordResetToken {
|
|
489
|
+
id String @id @default(cuid())
|
|
490
|
+
userId String
|
|
491
|
+
tokenHash String
|
|
492
|
+
expiresAt DateTime
|
|
493
|
+
usedAt DateTime?
|
|
494
|
+
createdAt DateTime @default(now())
|
|
495
|
+
|
|
496
|
+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
497
|
+
|
|
498
|
+
@@index([tokenHash])
|
|
499
|
+
@@index([userId])
|
|
500
|
+
@@map("actuate_password_reset_tokens")
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
model ScriptTag {
|
|
504
|
+
id String @id @default(cuid())
|
|
505
|
+
name String
|
|
506
|
+
code String @db.Text
|
|
507
|
+
placement String
|
|
508
|
+
scope String
|
|
509
|
+
targetPaths String[]
|
|
510
|
+
priority Int @default(100)
|
|
511
|
+
enabled Boolean @default(true)
|
|
512
|
+
createdAt DateTime @default(now())
|
|
513
|
+
updatedAt DateTime @updatedAt
|
|
514
|
+
|
|
515
|
+
@@index([enabled])
|
|
516
|
+
@@index([placement])
|
|
517
|
+
@@map("actuate_script_tags")
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
model PageTemplate {
|
|
521
|
+
id String @id @default(cuid())
|
|
522
|
+
name String
|
|
523
|
+
description String?
|
|
524
|
+
category String @default("content")
|
|
525
|
+
tree Json
|
|
526
|
+
thumbnail String?
|
|
527
|
+
builtIn Boolean @default(false)
|
|
528
|
+
createdAt DateTime @default(now())
|
|
529
|
+
updatedAt DateTime @updatedAt
|
|
530
|
+
|
|
531
|
+
@@index([category])
|
|
532
|
+
@@index([builtIn])
|
|
533
|
+
@@map("actuate_page_templates")
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
model SavedSection {
|
|
537
|
+
id String @id @default(cuid())
|
|
538
|
+
name String
|
|
539
|
+
description String?
|
|
540
|
+
category String @default("content")
|
|
541
|
+
tree Json
|
|
542
|
+
thumbnail String?
|
|
543
|
+
usageCount Int @default(0)
|
|
544
|
+
createdAt DateTime @default(now())
|
|
545
|
+
updatedAt DateTime @updatedAt
|
|
546
|
+
|
|
547
|
+
@@index([category])
|
|
548
|
+
@@map("actuate_saved_sections")
|
|
549
|
+
}
|