@sonicjs-cms/core 2.19.0 → 3.0.0-beta.2
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/README.md +4 -3
- package/dist/admin-documents-form.template-KN7JF66Q.cjs +19 -0
- package/dist/{admin-layout-catalyst.template-UMTIN66R.js.map → admin-documents-form.template-KN7JF66Q.cjs.map} +1 -1
- package/dist/admin-documents-form.template-NLSI6Z42.js +6 -0
- package/dist/{admin-layout-catalyst.template-HFD37TY5.cjs.map → admin-documents-form.template-NLSI6Z42.js.map} +1 -1
- package/dist/admin-layout-catalyst.template-WHJGSWWD.js +7 -0
- package/dist/admin-layout-catalyst.template-WHJGSWWD.js.map +1 -0
- package/dist/admin-layout-catalyst.template-ZK5HD545.cjs +17 -0
- package/dist/admin-layout-catalyst.template-ZK5HD545.cjs.map +1 -0
- package/dist/app-Bo0X1OWX.d.ts +1268 -0
- package/dist/app-Do66yCcV.d.cts +1268 -0
- package/dist/cache-DDARE4QE.js +4 -0
- package/dist/cache-DDARE4QE.js.map +1 -0
- package/dist/cache-LVYS4BPL.cjs +33 -0
- package/dist/cache-LVYS4BPL.cjs.map +1 -0
- package/dist/chunk-2CB4KY7I.cjs +771 -0
- package/dist/chunk-2CB4KY7I.cjs.map +1 -0
- package/dist/{chunk-55RDMDOP.js → chunk-3TB6AT6X.js} +148 -55
- package/dist/chunk-3TB6AT6X.js.map +1 -0
- package/dist/{chunk-ON5ZMSU4.js → chunk-6JQOUUOB.js} +3 -3
- package/dist/chunk-6JQOUUOB.js.map +1 -0
- package/dist/chunk-6OUHGKFD.js +387 -0
- package/dist/chunk-6OUHGKFD.js.map +1 -0
- package/dist/{chunk-7A4CB7T3.cjs → chunk-AAWNRBRB.cjs} +509 -91
- package/dist/chunk-AAWNRBRB.cjs.map +1 -0
- package/dist/chunk-AI663NBO.js +821 -0
- package/dist/chunk-AI663NBO.js.map +1 -0
- package/dist/chunk-BDDABDAB.cjs +1149 -0
- package/dist/chunk-BDDABDAB.cjs.map +1 -0
- package/dist/chunk-BLMTL57B.js +767 -0
- package/dist/chunk-BLMTL57B.js.map +1 -0
- package/dist/chunk-DNQCEKUK.cjs +327 -0
- package/dist/chunk-DNQCEKUK.cjs.map +1 -0
- package/dist/chunk-DSA4UX5B.cjs +276 -0
- package/dist/chunk-DSA4UX5B.cjs.map +1 -0
- package/dist/chunk-EF2NQUIQ.js +323 -0
- package/dist/chunk-EF2NQUIQ.js.map +1 -0
- package/dist/chunk-GCDZZNIN.js +192 -0
- package/dist/chunk-GCDZZNIN.js.map +1 -0
- package/dist/{chunk-ABB34XUS.cjs → chunk-H2AXVCLS.cjs} +667 -19
- package/dist/chunk-H2AXVCLS.cjs.map +1 -0
- package/dist/{chunk-XWIA3HVX.js → chunk-HDWE5FRJ.js} +6 -1249
- package/dist/chunk-HDWE5FRJ.js.map +1 -0
- package/dist/chunk-HIKBY7MS.cjs +70 -0
- package/dist/chunk-HIKBY7MS.cjs.map +1 -0
- package/dist/chunk-IESEVHXL.js +66 -0
- package/dist/chunk-IESEVHXL.js.map +1 -0
- package/dist/chunk-IVPRUGTY.js +242 -0
- package/dist/chunk-IVPRUGTY.js.map +1 -0
- package/dist/{chunk-JZVHLLSI.cjs → chunk-IXUHXTHW.cjs} +2 -151
- package/dist/chunk-IXUHXTHW.cjs.map +1 -0
- package/dist/chunk-J6JTWD2A.cjs +100 -0
- package/dist/chunk-J6JTWD2A.cjs.map +1 -0
- package/dist/chunk-JEQ7FLOD.cjs +199 -0
- package/dist/chunk-JEQ7FLOD.cjs.map +1 -0
- package/dist/chunk-K25XHMM3.js +566 -0
- package/dist/chunk-K25XHMM3.js.map +1 -0
- package/dist/chunk-LRZIAW7U.cjs +158 -0
- package/dist/chunk-LRZIAW7U.cjs.map +1 -0
- package/dist/{chunk-OHYBNCVL.cjs → chunk-MVIZJOO5.cjs} +10 -1256
- package/dist/chunk-MVIZJOO5.cjs.map +1 -0
- package/dist/{chunk-UYJ6TJHX.cjs → chunk-NAVPFIG5.cjs} +148 -55
- package/dist/chunk-NAVPFIG5.cjs.map +1 -0
- package/dist/chunk-NLJVSER2.js +273 -0
- package/dist/chunk-NLJVSER2.js.map +1 -0
- package/dist/chunk-NMPEMSU4.js +154 -0
- package/dist/chunk-NMPEMSU4.js.map +1 -0
- package/dist/chunk-NUKJ54GA.cjs +245 -0
- package/dist/chunk-NUKJ54GA.cjs.map +1 -0
- package/dist/{chunk-E4YFJBM2.cjs → chunk-QAYFOER6.cjs} +621 -829
- package/dist/chunk-QAYFOER6.cjs.map +1 -0
- package/dist/{chunk-BU7SFHGP.js → chunk-QZGABF2M.js} +3 -149
- package/dist/chunk-QZGABF2M.js.map +1 -0
- package/dist/chunk-RNZFGN4R.js +88 -0
- package/dist/chunk-RNZFGN4R.js.map +1 -0
- package/dist/{chunk-4NPCDK6B.js → chunk-RZ6H7OZK.js} +505 -90
- package/dist/chunk-RZ6H7OZK.js.map +1 -0
- package/dist/{chunk-OCL3HMEG.js → chunk-VD2EA3WT.js} +7004 -9807
- package/dist/chunk-VD2EA3WT.js.map +1 -0
- package/dist/{chunk-R4FOLLFB.cjs → chunk-VXE42MYF.cjs} +8730 -11520
- package/dist/chunk-VXE42MYF.cjs.map +1 -0
- package/dist/{chunk-4ZSNJDLS.cjs → chunk-WULONYGB.cjs} +9 -9
- package/dist/chunk-WULONYGB.cjs.map +1 -0
- package/dist/chunk-XW56B23A.cjs +408 -0
- package/dist/chunk-XW56B23A.cjs.map +1 -0
- package/dist/chunk-YA3TJ65D.cjs +575 -0
- package/dist/chunk-YA3TJ65D.cjs.map +1 -0
- package/dist/{chunk-TFNTM3OA.js → chunk-YHSQVQXX.js} +645 -15
- package/dist/chunk-YHSQVQXX.js.map +1 -0
- package/dist/chunk-YP7GW2G5.cjs +866 -0
- package/dist/chunk-YP7GW2G5.cjs.map +1 -0
- package/dist/{chunk-QFWHAFEO.js → chunk-ZEZ245PW.js} +148 -858
- package/dist/chunk-ZEZ245PW.js.map +1 -0
- package/dist/{chunk-JZV22DEV.js → chunk-ZGGXCFR6.js} +611 -817
- package/dist/chunk-ZGGXCFR6.js.map +1 -0
- package/dist/{collection-config-B4PG-AaF.d.cts → collection-config-JgHOpFCG.d.cts} +30 -2
- package/dist/{collection-config-B4PG-AaF.d.ts → collection-config-JgHOpFCG.d.ts} +30 -2
- package/dist/config-HFXANXCC.js +6 -0
- package/dist/config-HFXANXCC.js.map +1 -0
- package/dist/config-ON6FNMYX.cjs +19 -0
- package/dist/config-ON6FNMYX.cjs.map +1 -0
- package/dist/define-plugin-BzNHc1ZI.d.ts +1321 -0
- package/dist/define-plugin-IWDKYaVm.d.cts +1321 -0
- package/dist/document-projection-TDWRJX3Z.cjs +13 -0
- package/dist/document-projection-TDWRJX3Z.cjs.map +1 -0
- package/dist/document-projection-YYMC6I4U.js +4 -0
- package/dist/document-projection-YYMC6I4U.js.map +1 -0
- package/dist/index.cjs +13734 -4328
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +329 -492
- package/dist/index.d.ts +329 -492
- package/dist/index.js +13385 -3998
- package/dist/index.js.map +1 -1
- package/dist/middleware.cjs +36 -32
- package/dist/middleware.d.cts +50 -7
- package/dist/middleware.d.ts +50 -7
- package/dist/middleware.js +7 -3
- package/dist/migrations-NJJWQUKK.cjs +13 -0
- package/dist/{migrations-566IIPS2.cjs.map → migrations-NJJWQUKK.cjs.map} +1 -1
- package/dist/migrations-WCAVBD7C.js +4 -0
- package/dist/{migrations-H5IXZNCO.js.map → migrations-WCAVBD7C.js.map} +1 -1
- package/dist/{plugin-bootstrap-DfVerYV4.d.cts → plugin-bootstrap-B8ThJU21.d.cts} +4315 -1661
- package/dist/{plugin-bootstrap-P_ciLp_C.d.ts → plugin-bootstrap-qu8hJgUt.d.ts} +4315 -1661
- package/dist/plugins.cjs +171 -12
- package/dist/plugins.d.cts +36 -2
- package/dist/plugins.d.ts +36 -2
- package/dist/plugins.js +5 -2
- package/dist/rbac-O73MFKDA.js +5 -0
- package/dist/rbac-O73MFKDA.js.map +1 -0
- package/dist/rbac-VONLJJKB.cjs +14 -0
- package/dist/rbac-VONLJJKB.cjs.map +1 -0
- package/dist/routes.cjs +41 -45
- package/dist/routes.d.cts +56 -146
- package/dist/routes.d.ts +56 -146
- package/dist/routes.js +17 -9
- package/dist/services.cjs +39 -72
- package/dist/services.d.cts +79 -54
- package/dist/services.d.ts +79 -54
- package/dist/services.js +6 -3
- package/dist/templates.cjs +17 -29
- package/dist/templates.d.cts +1 -66
- package/dist/templates.d.ts +1 -66
- package/dist/templates.js +3 -3
- package/dist/types-Dea1eNxU.d.cts +286 -0
- package/dist/types-Dea1eNxU.d.ts +286 -0
- package/dist/types.d.cts +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/utils.cjs +18 -17
- package/dist/utils.d.cts +1 -1
- package/dist/utils.d.ts +1 -1
- package/dist/utils.js +2 -1
- package/migrations/0001_core.sql +184 -0
- package/migrations/0002_documents.sql +163 -0
- package/package.json +12 -7
- package/dist/admin-layout-catalyst.template-HFD37TY5.cjs +0 -17
- package/dist/admin-layout-catalyst.template-UMTIN66R.js +0 -7
- package/dist/app-C9esKLmh.d.cts +0 -112
- package/dist/app-C9esKLmh.d.ts +0 -112
- package/dist/chunk-4NPCDK6B.js.map +0 -1
- package/dist/chunk-4ZSNJDLS.cjs.map +0 -1
- package/dist/chunk-55RDMDOP.js.map +0 -1
- package/dist/chunk-635JAMSE.cjs +0 -653
- package/dist/chunk-635JAMSE.cjs.map +0 -1
- package/dist/chunk-7A4CB7T3.cjs.map +0 -1
- package/dist/chunk-ABB34XUS.cjs.map +0 -1
- package/dist/chunk-BU7SFHGP.js.map +0 -1
- package/dist/chunk-E4YFJBM2.cjs.map +0 -1
- package/dist/chunk-EXNEW5US.js +0 -648
- package/dist/chunk-EXNEW5US.js.map +0 -1
- package/dist/chunk-JZV22DEV.js.map +0 -1
- package/dist/chunk-JZVHLLSI.cjs.map +0 -1
- package/dist/chunk-OCL3HMEG.js.map +0 -1
- package/dist/chunk-OHYBNCVL.cjs.map +0 -1
- package/dist/chunk-ON5ZMSU4.js.map +0 -1
- package/dist/chunk-QFWHAFEO.js.map +0 -1
- package/dist/chunk-R4FOLLFB.cjs.map +0 -1
- package/dist/chunk-RLMUFFUD.cjs +0 -2219
- package/dist/chunk-RLMUFFUD.cjs.map +0 -1
- package/dist/chunk-TFNTM3OA.js.map +0 -1
- package/dist/chunk-UYJ6TJHX.cjs.map +0 -1
- package/dist/chunk-WAEQXGCX.cjs +0 -1898
- package/dist/chunk-WAEQXGCX.cjs.map +0 -1
- package/dist/chunk-XWIA3HVX.js.map +0 -1
- package/dist/chunk-ZYAYUIZE.js +0 -2217
- package/dist/chunk-ZYAYUIZE.js.map +0 -1
- package/dist/migrations-566IIPS2.cjs +0 -13
- package/dist/migrations-H5IXZNCO.js +0 -4
- package/dist/plugin-manager-BoM3Q7o7.d.cts +0 -328
- package/dist/plugin-manager-Efx9RyDX.d.ts +0 -328
- package/migrations/001_initial_schema.sql +0 -170
- package/migrations/002_faq_plugin.sql +0 -86
- package/migrations/003_stage5_enhancements.sql +0 -121
- package/migrations/004_stage6_user_management.sql +0 -183
- package/migrations/005_stage7_workflow_automation.sql +0 -294
- package/migrations/006_plugin_system.sql +0 -155
- package/migrations/007_demo_login_plugin.sql +0 -23
- package/migrations/008_fix_slug_validation.sql +0 -22
- package/migrations/009_system_logging.sql +0 -57
- package/migrations/011_config_managed_collections.sql +0 -15
- package/migrations/012_testimonials_plugin.sql +0 -80
- package/migrations/013_code_examples_plugin.sql +0 -177
- package/migrations/014_fix_plugin_registry.sql +0 -88
- package/migrations/015_add_remaining_plugins.sql +0 -89
- package/migrations/016_remove_duplicate_cache_plugin.sql +0 -17
- package/migrations/017_auth_configurable_fields.sql +0 -49
- package/migrations/018_settings_table.sql +0 -23
- package/migrations/019_remove_blog_posts_collection.sql +0 -15
- package/migrations/020_add_email_plugin.sql +0 -22
- package/migrations/021_add_magic_link_auth_plugin.sql +0 -42
- package/migrations/022_add_tinymce_plugin.sql +0 -25
- package/migrations/023_add_easy_mdx_plugin.sql +0 -25
- package/migrations/024_add_quill_editor_plugin.sql +0 -25
- package/migrations/025_add_easymde_plugin.sql +0 -25
- package/migrations/026_add_otp_login.sql +0 -42
- package/migrations/027_fix_slug_field_type.sql +0 -18
- package/migrations/028_fix_slug_field_type_in_schemas.sql +0 -30
- package/migrations/029_add_forms_system.sql +0 -184
- package/migrations/030_add_turnstile_to_forms.sql +0 -14
- package/migrations/031_ai_search_plugin.sql +0 -45
- package/migrations/032_user_profiles.sql +0 -37
- package/migrations/033_form_content_integration.sql +0 -19
- package/migrations/034_security_audit_plugin.sql +0 -27
- package/migrations/035_user_profiles_data_column.sql +0 -16
- package/migrations/036_analytics_events.sql +0 -22
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
-- Migration: Fix slug field type
|
|
2
|
-
-- Description: Update slug fields to use 'slug' field type instead of 'text' for proper auto-generation
|
|
3
|
-
-- Created: 2026-01-10
|
|
4
|
-
|
|
5
|
-
-- Update pages collection slug field to use 'slug' field type
|
|
6
|
-
UPDATE content_fields
|
|
7
|
-
SET field_type = 'slug'
|
|
8
|
-
WHERE field_name = 'slug' AND collection_id = 'pages-collection';
|
|
9
|
-
|
|
10
|
-
-- Update blog posts slug field if it exists
|
|
11
|
-
UPDATE content_fields
|
|
12
|
-
SET field_type = 'slug'
|
|
13
|
-
WHERE field_name = 'slug' AND collection_id = 'blog-posts-collection';
|
|
14
|
-
|
|
15
|
-
-- Update news slug field if it exists
|
|
16
|
-
UPDATE content_fields
|
|
17
|
-
SET field_type = 'slug'
|
|
18
|
-
WHERE field_name = 'slug' AND collection_id = 'news-collection';
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
-- Migration: Fix slug field type in collection schemas
|
|
2
|
-
-- Description: Update slug fields in collection schemas to use 'slug' type instead of 'string'
|
|
3
|
-
-- Created: 2026-01-10
|
|
4
|
-
|
|
5
|
-
-- Update pages-collection schema
|
|
6
|
-
UPDATE collections
|
|
7
|
-
SET schema = REPLACE(
|
|
8
|
-
schema,
|
|
9
|
-
'"slug":{"type":"string"',
|
|
10
|
-
'"slug":{"type":"slug"'
|
|
11
|
-
)
|
|
12
|
-
WHERE id = 'pages-collection' AND schema LIKE '%"slug":{"type":"string"%';
|
|
13
|
-
|
|
14
|
-
-- Update blog-posts-collection schema if it exists
|
|
15
|
-
UPDATE collections
|
|
16
|
-
SET schema = REPLACE(
|
|
17
|
-
schema,
|
|
18
|
-
'"slug":{"type":"string"',
|
|
19
|
-
'"slug":{"type":"slug"'
|
|
20
|
-
)
|
|
21
|
-
WHERE id = 'blog-posts-collection' AND schema LIKE '%"slug":{"type":"string"%';
|
|
22
|
-
|
|
23
|
-
-- Update news-collection schema if it exists
|
|
24
|
-
UPDATE collections
|
|
25
|
-
SET schema = REPLACE(
|
|
26
|
-
schema,
|
|
27
|
-
'"slug":{"type":"string"',
|
|
28
|
-
'"slug":{"type":"slug"'
|
|
29
|
-
)
|
|
30
|
-
WHERE id = 'news-collection' AND schema LIKE '%"slug":{"type":"string"%';
|
|
@@ -1,184 +0,0 @@
|
|
|
1
|
-
-- Migration: 029_add_forms_system.sql
|
|
2
|
-
-- Description: Add Form.io integration for advanced form building
|
|
3
|
-
-- Date: January 23, 2026
|
|
4
|
-
-- Phase: 1 - Database Schema
|
|
5
|
-
|
|
6
|
-
-- =====================================================
|
|
7
|
-
-- Table: forms
|
|
8
|
-
-- Description: Stores form definitions and configuration
|
|
9
|
-
-- =====================================================
|
|
10
|
-
|
|
11
|
-
CREATE TABLE IF NOT EXISTS forms (
|
|
12
|
-
id TEXT PRIMARY KEY,
|
|
13
|
-
name TEXT NOT NULL UNIQUE, -- Machine name (e.g., "contact-form")
|
|
14
|
-
display_name TEXT NOT NULL, -- Human name (e.g., "Contact Form")
|
|
15
|
-
description TEXT, -- Optional description
|
|
16
|
-
category TEXT DEFAULT 'general', -- Form category (contact, survey, registration, etc.)
|
|
17
|
-
|
|
18
|
-
-- Form.io schema (JSON)
|
|
19
|
-
formio_schema TEXT NOT NULL, -- Complete Form.io JSON schema
|
|
20
|
-
|
|
21
|
-
-- Settings
|
|
22
|
-
settings TEXT, -- JSON: {
|
|
23
|
-
-- emailNotifications: true,
|
|
24
|
-
-- notifyEmail: "admin@example.com",
|
|
25
|
-
-- successMessage: "Thank you!",
|
|
26
|
-
-- redirectUrl: "/thank-you",
|
|
27
|
-
-- allowAnonymous: true,
|
|
28
|
-
-- requireAuth: false,
|
|
29
|
-
-- maxSubmissions: null,
|
|
30
|
-
-- submitButtonText: "Submit",
|
|
31
|
-
-- saveProgress: true,
|
|
32
|
-
-- webhookUrl: null
|
|
33
|
-
-- }
|
|
34
|
-
|
|
35
|
-
-- Status & Management
|
|
36
|
-
is_active INTEGER DEFAULT 1, -- Active/inactive flag
|
|
37
|
-
is_public INTEGER DEFAULT 1, -- Public (anyone) vs private (auth required)
|
|
38
|
-
managed INTEGER DEFAULT 0, -- Code-managed (like collections)
|
|
39
|
-
|
|
40
|
-
-- Metadata
|
|
41
|
-
icon TEXT, -- Optional icon for admin UI
|
|
42
|
-
color TEXT, -- Optional color (hex) for admin UI
|
|
43
|
-
tags TEXT, -- JSON array of tags
|
|
44
|
-
|
|
45
|
-
-- Stats
|
|
46
|
-
submission_count INTEGER DEFAULT 0, -- Total submissions received
|
|
47
|
-
view_count INTEGER DEFAULT 0, -- Form views (optional tracking)
|
|
48
|
-
|
|
49
|
-
-- Ownership
|
|
50
|
-
created_by TEXT REFERENCES users(id), -- User who created the form
|
|
51
|
-
updated_by TEXT REFERENCES users(id), -- User who last updated
|
|
52
|
-
|
|
53
|
-
-- Timestamps
|
|
54
|
-
created_at INTEGER NOT NULL,
|
|
55
|
-
updated_at INTEGER NOT NULL
|
|
56
|
-
);
|
|
57
|
-
|
|
58
|
-
-- Indexes for forms
|
|
59
|
-
CREATE INDEX IF NOT EXISTS idx_forms_name ON forms(name);
|
|
60
|
-
CREATE INDEX IF NOT EXISTS idx_forms_category ON forms(category);
|
|
61
|
-
CREATE INDEX IF NOT EXISTS idx_forms_active ON forms(is_active);
|
|
62
|
-
CREATE INDEX IF NOT EXISTS idx_forms_public ON forms(is_public);
|
|
63
|
-
CREATE INDEX IF NOT EXISTS idx_forms_created_by ON forms(created_by);
|
|
64
|
-
|
|
65
|
-
-- =====================================================
|
|
66
|
-
-- Table: form_submissions
|
|
67
|
-
-- Description: Stores submitted form data
|
|
68
|
-
-- =====================================================
|
|
69
|
-
|
|
70
|
-
CREATE TABLE IF NOT EXISTS form_submissions (
|
|
71
|
-
id TEXT PRIMARY KEY,
|
|
72
|
-
form_id TEXT NOT NULL REFERENCES forms(id) ON DELETE CASCADE,
|
|
73
|
-
|
|
74
|
-
-- Submission data
|
|
75
|
-
submission_data TEXT NOT NULL, -- JSON: The actual form data submitted
|
|
76
|
-
|
|
77
|
-
-- Submission metadata
|
|
78
|
-
status TEXT DEFAULT 'pending', -- pending, reviewed, approved, rejected, spam
|
|
79
|
-
submission_number INTEGER, -- Sequential number per form
|
|
80
|
-
|
|
81
|
-
-- User information (if authenticated)
|
|
82
|
-
user_id TEXT REFERENCES users(id), -- Submitter user ID (if logged in)
|
|
83
|
-
user_email TEXT, -- Email from form (or user account)
|
|
84
|
-
|
|
85
|
-
-- Tracking information
|
|
86
|
-
ip_address TEXT, -- IP address of submitter
|
|
87
|
-
user_agent TEXT, -- Browser user agent
|
|
88
|
-
referrer TEXT, -- Page that referred to form
|
|
89
|
-
utm_source TEXT, -- UTM tracking params
|
|
90
|
-
utm_medium TEXT,
|
|
91
|
-
utm_campaign TEXT,
|
|
92
|
-
|
|
93
|
-
-- Review/Processing
|
|
94
|
-
reviewed_by TEXT REFERENCES users(id), -- Admin who reviewed
|
|
95
|
-
reviewed_at INTEGER, -- Review timestamp
|
|
96
|
-
review_notes TEXT, -- Admin notes
|
|
97
|
-
|
|
98
|
-
-- Flags
|
|
99
|
-
is_spam INTEGER DEFAULT 0, -- Spam flag
|
|
100
|
-
is_archived INTEGER DEFAULT 0, -- Archived flag
|
|
101
|
-
|
|
102
|
-
-- Timestamps
|
|
103
|
-
submitted_at INTEGER NOT NULL,
|
|
104
|
-
updated_at INTEGER NOT NULL
|
|
105
|
-
);
|
|
106
|
-
|
|
107
|
-
-- Indexes for submissions
|
|
108
|
-
CREATE INDEX IF NOT EXISTS idx_form_submissions_form_id ON form_submissions(form_id);
|
|
109
|
-
CREATE INDEX IF NOT EXISTS idx_form_submissions_status ON form_submissions(status);
|
|
110
|
-
CREATE INDEX IF NOT EXISTS idx_form_submissions_user_id ON form_submissions(user_id);
|
|
111
|
-
CREATE INDEX IF NOT EXISTS idx_form_submissions_email ON form_submissions(user_email);
|
|
112
|
-
CREATE INDEX IF NOT EXISTS idx_form_submissions_submitted_at ON form_submissions(submitted_at);
|
|
113
|
-
CREATE INDEX IF NOT EXISTS idx_form_submissions_spam ON form_submissions(is_spam);
|
|
114
|
-
|
|
115
|
-
-- Trigger to auto-increment submission_number per form
|
|
116
|
-
CREATE TRIGGER IF NOT EXISTS set_submission_number
|
|
117
|
-
AFTER INSERT ON form_submissions
|
|
118
|
-
BEGIN
|
|
119
|
-
UPDATE form_submissions
|
|
120
|
-
SET submission_number = (
|
|
121
|
-
SELECT COUNT(*)
|
|
122
|
-
FROM form_submissions
|
|
123
|
-
WHERE form_id = NEW.form_id
|
|
124
|
-
AND id <= NEW.id
|
|
125
|
-
)
|
|
126
|
-
WHERE id = NEW.id;
|
|
127
|
-
END;
|
|
128
|
-
|
|
129
|
-
-- Trigger to update form submission_count
|
|
130
|
-
CREATE TRIGGER IF NOT EXISTS increment_form_submission_count
|
|
131
|
-
AFTER INSERT ON form_submissions
|
|
132
|
-
BEGIN
|
|
133
|
-
UPDATE forms
|
|
134
|
-
SET submission_count = submission_count + 1,
|
|
135
|
-
updated_at = unixepoch() * 1000
|
|
136
|
-
WHERE id = NEW.form_id;
|
|
137
|
-
END;
|
|
138
|
-
|
|
139
|
-
-- =====================================================
|
|
140
|
-
-- Table: form_files (Optional)
|
|
141
|
-
-- Description: Link form submissions to uploaded files
|
|
142
|
-
-- =====================================================
|
|
143
|
-
|
|
144
|
-
CREATE TABLE IF NOT EXISTS form_files (
|
|
145
|
-
id TEXT PRIMARY KEY,
|
|
146
|
-
submission_id TEXT NOT NULL REFERENCES form_submissions(id) ON DELETE CASCADE,
|
|
147
|
-
media_id TEXT NOT NULL REFERENCES media(id) ON DELETE CASCADE,
|
|
148
|
-
field_name TEXT NOT NULL, -- Form field that uploaded this file
|
|
149
|
-
uploaded_at INTEGER NOT NULL
|
|
150
|
-
);
|
|
151
|
-
|
|
152
|
-
-- Indexes for form files
|
|
153
|
-
CREATE INDEX IF NOT EXISTS idx_form_files_submission ON form_files(submission_id);
|
|
154
|
-
CREATE INDEX IF NOT EXISTS idx_form_files_media ON form_files(media_id);
|
|
155
|
-
|
|
156
|
-
-- =====================================================
|
|
157
|
-
-- Sample Data: Create a default contact form
|
|
158
|
-
-- =====================================================
|
|
159
|
-
|
|
160
|
-
INSERT OR IGNORE INTO forms (
|
|
161
|
-
id,
|
|
162
|
-
name,
|
|
163
|
-
display_name,
|
|
164
|
-
description,
|
|
165
|
-
category,
|
|
166
|
-
formio_schema,
|
|
167
|
-
settings,
|
|
168
|
-
is_active,
|
|
169
|
-
is_public,
|
|
170
|
-
created_at,
|
|
171
|
-
updated_at
|
|
172
|
-
) VALUES (
|
|
173
|
-
'default-contact-form',
|
|
174
|
-
'contact',
|
|
175
|
-
'Contact Form',
|
|
176
|
-
'A simple contact form for getting in touch',
|
|
177
|
-
'contact',
|
|
178
|
-
'{"components":[]}',
|
|
179
|
-
'{"emailNotifications":false,"successMessage":"Thank you for your submission!","submitButtonText":"Submit","requireAuth":false}',
|
|
180
|
-
1,
|
|
181
|
-
1,
|
|
182
|
-
unixepoch() * 1000,
|
|
183
|
-
unixepoch() * 1000
|
|
184
|
-
);
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
-- Add Turnstile configuration to forms table
|
|
2
|
-
-- This allows per-form Turnstile settings with global fallback
|
|
3
|
-
|
|
4
|
-
-- Add columns (D1 may not support CHECK constraints in ALTER TABLE)
|
|
5
|
-
ALTER TABLE forms ADD COLUMN turnstile_enabled INTEGER DEFAULT 0;
|
|
6
|
-
ALTER TABLE forms ADD COLUMN turnstile_settings TEXT;
|
|
7
|
-
|
|
8
|
-
-- Set default to inherit global settings for existing forms
|
|
9
|
-
UPDATE forms
|
|
10
|
-
SET turnstile_settings = '{"inherit":true}'
|
|
11
|
-
WHERE turnstile_settings IS NULL;
|
|
12
|
-
|
|
13
|
-
-- Add index for faster lookups
|
|
14
|
-
CREATE INDEX IF NOT EXISTS idx_forms_turnstile ON forms(turnstile_enabled);
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
-- AI Search plugin settings
|
|
2
|
-
CREATE TABLE IF NOT EXISTS ai_search_settings (
|
|
3
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
4
|
-
enabled BOOLEAN DEFAULT 0,
|
|
5
|
-
ai_mode_enabled BOOLEAN DEFAULT 1,
|
|
6
|
-
selected_collections TEXT, -- JSON array of collection IDs to index
|
|
7
|
-
dismissed_collections TEXT, -- JSON array of collection IDs user chose not to index
|
|
8
|
-
autocomplete_enabled BOOLEAN DEFAULT 1,
|
|
9
|
-
cache_duration INTEGER DEFAULT 1, -- hours
|
|
10
|
-
results_limit INTEGER DEFAULT 20,
|
|
11
|
-
index_media BOOLEAN DEFAULT 0,
|
|
12
|
-
index_status TEXT, -- JSON object with status per collection
|
|
13
|
-
last_indexed_at INTEGER,
|
|
14
|
-
created_at INTEGER DEFAULT (strftime('%s', 'now') * 1000),
|
|
15
|
-
updated_at INTEGER DEFAULT (strftime('%s', 'now') * 1000)
|
|
16
|
-
);
|
|
17
|
-
|
|
18
|
-
-- Search history/analytics
|
|
19
|
-
CREATE TABLE IF NOT EXISTS ai_search_history (
|
|
20
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
21
|
-
query TEXT NOT NULL,
|
|
22
|
-
mode TEXT, -- 'ai' or 'keyword'
|
|
23
|
-
results_count INTEGER,
|
|
24
|
-
user_id INTEGER,
|
|
25
|
-
created_at INTEGER DEFAULT (strftime('%s', 'now') * 1000)
|
|
26
|
-
);
|
|
27
|
-
|
|
28
|
-
-- Index metadata tracking (per collection)
|
|
29
|
-
CREATE TABLE IF NOT EXISTS ai_search_index_meta (
|
|
30
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
31
|
-
collection_id INTEGER NOT NULL,
|
|
32
|
-
collection_name TEXT NOT NULL, -- Cache collection name for display
|
|
33
|
-
total_items INTEGER DEFAULT 0,
|
|
34
|
-
indexed_items INTEGER DEFAULT 0,
|
|
35
|
-
last_sync_at INTEGER,
|
|
36
|
-
status TEXT DEFAULT 'pending', -- 'pending', 'indexing', 'completed', 'error'
|
|
37
|
-
error_message TEXT,
|
|
38
|
-
UNIQUE(collection_id)
|
|
39
|
-
);
|
|
40
|
-
|
|
41
|
-
-- Indexes for performance
|
|
42
|
-
CREATE INDEX IF NOT EXISTS idx_ai_search_history_created_at ON ai_search_history(created_at);
|
|
43
|
-
CREATE INDEX IF NOT EXISTS idx_ai_search_history_mode ON ai_search_history(mode);
|
|
44
|
-
CREATE INDEX IF NOT EXISTS idx_ai_search_index_meta_collection_id ON ai_search_index_meta(collection_id);
|
|
45
|
-
CREATE INDEX IF NOT EXISTS idx_ai_search_index_meta_status ON ai_search_index_meta(status);
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
-- User Profiles Table (Core Migration)
|
|
2
|
-
-- Stores extended user profile data separate from auth concerns
|
|
3
|
-
-- Required by admin-users.ts for user edit page profile management
|
|
4
|
-
--
|
|
5
|
-
-- Originally introduced as app-level migration (my-sonicjs-app/migrations/018_user_profiles.sql)
|
|
6
|
-
-- in upstream PR #508. Core routes (admin-users.ts) were updated to query this table in PR #512,
|
|
7
|
-
-- but no corresponding core migration was added. This migration corrects that gap.
|
|
8
|
-
--
|
|
9
|
-
-- IF NOT EXISTS guards ensure idempotency for databases that already have the table
|
|
10
|
-
-- from the app-level migration.
|
|
11
|
-
|
|
12
|
-
CREATE TABLE IF NOT EXISTS user_profiles (
|
|
13
|
-
id TEXT PRIMARY KEY,
|
|
14
|
-
user_id TEXT NOT NULL UNIQUE REFERENCES users(id) ON DELETE CASCADE,
|
|
15
|
-
|
|
16
|
-
display_name TEXT,
|
|
17
|
-
bio TEXT,
|
|
18
|
-
company TEXT,
|
|
19
|
-
job_title TEXT,
|
|
20
|
-
website TEXT,
|
|
21
|
-
location TEXT,
|
|
22
|
-
date_of_birth INTEGER,
|
|
23
|
-
data TEXT DEFAULT '{}',
|
|
24
|
-
|
|
25
|
-
created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000),
|
|
26
|
-
updated_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now') * 1000)
|
|
27
|
-
);
|
|
28
|
-
|
|
29
|
-
-- Index for fast user lookups
|
|
30
|
-
CREATE INDEX IF NOT EXISTS idx_user_profiles_user_id ON user_profiles(user_id);
|
|
31
|
-
|
|
32
|
-
-- Trigger to auto-update updated_at timestamp
|
|
33
|
-
CREATE TRIGGER IF NOT EXISTS user_profiles_updated_at
|
|
34
|
-
AFTER UPDATE ON user_profiles
|
|
35
|
-
BEGIN
|
|
36
|
-
UPDATE user_profiles SET updated_at = strftime('%s', 'now') * 1000 WHERE id = NEW.id;
|
|
37
|
-
END;
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
-- Migration 033: Form-Content Integration
|
|
2
|
-
-- Adds bridge columns to link forms to collections and submissions to content items
|
|
3
|
-
|
|
4
|
-
-- Add source_type and source_id to collections for form-derived collections
|
|
5
|
-
ALTER TABLE collections ADD COLUMN source_type TEXT DEFAULT 'user';
|
|
6
|
-
ALTER TABLE collections ADD COLUMN source_id TEXT;
|
|
7
|
-
|
|
8
|
-
-- Index for efficient lookup of form-derived collections
|
|
9
|
-
CREATE INDEX IF NOT EXISTS idx_collections_source ON collections(source_type, source_id);
|
|
10
|
-
|
|
11
|
-
-- Add content_id to form_submissions for linking to content items
|
|
12
|
-
ALTER TABLE form_submissions ADD COLUMN content_id TEXT REFERENCES content(id);
|
|
13
|
-
|
|
14
|
-
-- Index for efficient lookup by content_id
|
|
15
|
-
CREATE INDEX IF NOT EXISTS idx_form_submissions_content_id ON form_submissions(content_id);
|
|
16
|
-
|
|
17
|
-
-- Create system user for anonymous form submissions
|
|
18
|
-
INSERT OR IGNORE INTO users (id, email, username, first_name, last_name, password_hash, role, is_active, created_at, updated_at)
|
|
19
|
-
VALUES ('system-form-submission', 'system-forms@sonicjs.internal', 'system-forms', 'Form', 'Submission', NULL, 'viewer', 0, strftime('%s','now') * 1000, strftime('%s','now') * 1000);
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
-- Security Audit Plugin
|
|
2
|
-
-- Tracks login attempts, registrations, and security events for monitoring and brute-force detection
|
|
3
|
-
|
|
4
|
-
CREATE TABLE IF NOT EXISTS security_events (
|
|
5
|
-
id TEXT PRIMARY KEY,
|
|
6
|
-
event_type TEXT NOT NULL,
|
|
7
|
-
severity TEXT NOT NULL DEFAULT 'info',
|
|
8
|
-
user_id TEXT,
|
|
9
|
-
email TEXT,
|
|
10
|
-
ip_address TEXT,
|
|
11
|
-
user_agent TEXT,
|
|
12
|
-
country_code TEXT,
|
|
13
|
-
request_path TEXT,
|
|
14
|
-
request_method TEXT,
|
|
15
|
-
details TEXT,
|
|
16
|
-
fingerprint TEXT,
|
|
17
|
-
blocked INTEGER NOT NULL DEFAULT 0,
|
|
18
|
-
created_at INTEGER NOT NULL
|
|
19
|
-
);
|
|
20
|
-
|
|
21
|
-
CREATE INDEX IF NOT EXISTS idx_security_events_type ON security_events(event_type);
|
|
22
|
-
CREATE INDEX IF NOT EXISTS idx_security_events_user ON security_events(user_id);
|
|
23
|
-
CREATE INDEX IF NOT EXISTS idx_security_events_email ON security_events(email);
|
|
24
|
-
CREATE INDEX IF NOT EXISTS idx_security_events_ip ON security_events(ip_address);
|
|
25
|
-
CREATE INDEX IF NOT EXISTS idx_security_events_severity ON security_events(severity);
|
|
26
|
-
CREATE INDEX IF NOT EXISTS idx_security_events_created ON security_events(created_at);
|
|
27
|
-
CREATE INDEX IF NOT EXISTS idx_security_events_fingerprint ON security_events(fingerprint);
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
-- Migration 035: Add data column to user_profiles (no-op)
|
|
2
|
-
--
|
|
3
|
-
-- This migration originally added a missing 'data' column to user_profiles.
|
|
4
|
-
-- Migration 032 has since been updated to include the column in the CREATE TABLE,
|
|
5
|
-
-- so on fresh installs the column already exists by the time this runs.
|
|
6
|
-
--
|
|
7
|
-
-- The ALTER TABLE has been removed to prevent "duplicate column name: data" errors
|
|
8
|
-
-- during fresh installs (GitHub issue #771). Wrangler's migration runner does not
|
|
9
|
-
-- gracefully handle duplicate column errors like the runtime MigrationService does.
|
|
10
|
-
--
|
|
11
|
-
-- Existing databases that ran the old 032 (without the data column) get the column
|
|
12
|
-
-- added at runtime by the core MigrationService, which skips duplicate-column errors.
|
|
13
|
-
--
|
|
14
|
-
-- This file is kept as a no-op so that wrangler's migration tracking remains
|
|
15
|
-
-- consistent (it tracks migrations by filename).
|
|
16
|
-
SELECT 1;
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
-- Migration 036: Analytics Events Table
|
|
2
|
-
-- Provides storage for user behavior event tracking (page views, custom events)
|
|
3
|
-
|
|
4
|
-
CREATE TABLE IF NOT EXISTS analytics_events (
|
|
5
|
-
id TEXT PRIMARY KEY,
|
|
6
|
-
event TEXT NOT NULL,
|
|
7
|
-
category TEXT NOT NULL DEFAULT 'user-activity',
|
|
8
|
-
properties TEXT,
|
|
9
|
-
user_id TEXT,
|
|
10
|
-
session_id TEXT,
|
|
11
|
-
ip_address TEXT,
|
|
12
|
-
user_agent TEXT,
|
|
13
|
-
path TEXT,
|
|
14
|
-
created_at INTEGER NOT NULL DEFAULT (unixepoch())
|
|
15
|
-
);
|
|
16
|
-
|
|
17
|
-
CREATE INDEX IF NOT EXISTS idx_analytics_events_event ON analytics_events(event);
|
|
18
|
-
CREATE INDEX IF NOT EXISTS idx_analytics_events_category ON analytics_events(category);
|
|
19
|
-
CREATE INDEX IF NOT EXISTS idx_analytics_events_user_id ON analytics_events(user_id);
|
|
20
|
-
CREATE INDEX IF NOT EXISTS idx_analytics_events_session_id ON analytics_events(session_id);
|
|
21
|
-
CREATE INDEX IF NOT EXISTS idx_analytics_events_created_at ON analytics_events(created_at);
|
|
22
|
-
CREATE INDEX IF NOT EXISTS idx_analytics_events_path ON analytics_events(path);
|