@infuro/cms-core 1.0.6 → 1.0.8

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.
@@ -0,0 +1,39 @@
1
+ import { MigrationInterface, QueryRunner } from 'typeorm';
2
+
3
+ export class ChatAndKnowledgeBase1731800000000 implements MigrationInterface {
4
+ name = 'ChatAndKnowledgeBase1731800000000';
5
+
6
+ public async up(queryRunner: QueryRunner): Promise<void> {
7
+ await queryRunner.query(
8
+ `CREATE TABLE "knowledge_base_documents" ("id" SERIAL NOT NULL, "name" character varying NOT NULL, "sourceUrl" character varying, "content" text NOT NULL, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), CONSTRAINT "PK_knowledge_base_documents" PRIMARY KEY ("id"))`
9
+ );
10
+ await queryRunner.query(
11
+ `CREATE TABLE "knowledge_base_chunks" ("id" SERIAL NOT NULL, "documentId" integer NOT NULL, "content" text NOT NULL, "chunkIndex" integer NOT NULL DEFAULT 0, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), CONSTRAINT "PK_knowledge_base_chunks" PRIMARY KEY ("id"))`
12
+ );
13
+ await queryRunner.query(
14
+ `CREATE TABLE "chat_conversations" ("id" SERIAL NOT NULL, "contactId" integer NOT NULL, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), CONSTRAINT "PK_chat_conversations" PRIMARY KEY ("id"))`
15
+ );
16
+ await queryRunner.query(
17
+ `CREATE TABLE "chat_messages" ("id" SERIAL NOT NULL, "conversationId" integer NOT NULL, "role" character varying NOT NULL, "content" text NOT NULL, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), CONSTRAINT "PK_chat_messages" PRIMARY KEY ("id"))`
18
+ );
19
+ await queryRunner.query(
20
+ `ALTER TABLE "knowledge_base_chunks" ADD CONSTRAINT "FK_knowledge_base_chunks_document" FOREIGN KEY ("documentId") REFERENCES "knowledge_base_documents"("id") ON DELETE CASCADE ON UPDATE NO ACTION`
21
+ );
22
+ await queryRunner.query(
23
+ `ALTER TABLE "chat_conversations" ADD CONSTRAINT "FK_chat_conversations_contact" FOREIGN KEY ("contactId") REFERENCES "contacts"("id") ON DELETE CASCADE ON UPDATE NO ACTION`
24
+ );
25
+ await queryRunner.query(
26
+ `ALTER TABLE "chat_messages" ADD CONSTRAINT "FK_chat_messages_conversation" FOREIGN KEY ("conversationId") REFERENCES "chat_conversations"("id") ON DELETE CASCADE ON UPDATE NO ACTION`
27
+ );
28
+ }
29
+
30
+ public async down(queryRunner: QueryRunner): Promise<void> {
31
+ await queryRunner.query(`ALTER TABLE "chat_messages" DROP CONSTRAINT "FK_chat_messages_conversation"`);
32
+ await queryRunner.query(`ALTER TABLE "chat_conversations" DROP CONSTRAINT "FK_chat_conversations_contact"`);
33
+ await queryRunner.query(`ALTER TABLE "knowledge_base_chunks" DROP CONSTRAINT "FK_knowledge_base_chunks_document"`);
34
+ await queryRunner.query(`DROP TABLE "chat_messages"`);
35
+ await queryRunner.query(`DROP TABLE "chat_conversations"`);
36
+ await queryRunner.query(`DROP TABLE "knowledge_base_chunks"`);
37
+ await queryRunner.query(`DROP TABLE "knowledge_base_documents"`);
38
+ }
39
+ }
@@ -0,0 +1,17 @@
1
+ import { MigrationInterface, QueryRunner } from 'typeorm';
2
+
3
+ /** Requires pgvector extension: CREATE EXTENSION vector; (run manually if migration fails). */
4
+ export class KnowledgeBaseVector1731900000000 implements MigrationInterface {
5
+ name = 'KnowledgeBaseVector1731900000000';
6
+
7
+ public async up(queryRunner: QueryRunner): Promise<void> {
8
+ await queryRunner.query(`CREATE EXTENSION IF NOT EXISTS vector`);
9
+ await queryRunner.query(
10
+ `ALTER TABLE "knowledge_base_chunks" ADD COLUMN IF NOT EXISTS "embedding" vector(1536)`
11
+ );
12
+ }
13
+
14
+ public async down(queryRunner: QueryRunner): Promise<void> {
15
+ await queryRunner.query(`ALTER TABLE "knowledge_base_chunks" DROP COLUMN IF EXISTS "embedding"`);
16
+ }
17
+ }
@@ -0,0 +1,304 @@
1
+ import { MigrationInterface, QueryRunner } from 'typeorm';
2
+
3
+ export class InitialSchema1772178563554 implements MigrationInterface {
4
+ name = 'InitialSchema1772178563554';
5
+
6
+ public async up(queryRunner: QueryRunner): Promise<void> {
7
+ // user_groups
8
+ await queryRunner.query(
9
+ `CREATE TABLE IF NOT EXISTS "user_groups" ("id" SERIAL NOT NULL, "name" character varying NOT NULL, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP, "deleted" boolean NOT NULL DEFAULT false, "createdBy" integer, "updatedBy" integer, "deletedBy" integer, CONSTRAINT "UQ_cfdb13ccb9e22f9108f42983014" UNIQUE ("name"), CONSTRAINT "PK_ea7760dc75ee1bf0b09ab9b3289" PRIMARY KEY ("id"))`,
10
+ );
11
+ // permissions
12
+ await queryRunner.query(
13
+ `CREATE TABLE IF NOT EXISTS "permissions" ("id" SERIAL NOT NULL, "groupId" integer NOT NULL, "entity" character varying NOT NULL, "canCreate" boolean NOT NULL DEFAULT false, "canRead" boolean NOT NULL DEFAULT false, "canUpdate" boolean NOT NULL DEFAULT false, "canDelete" boolean NOT NULL DEFAULT false, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP, "deleted" boolean NOT NULL DEFAULT false, "createdBy" integer, "updatedBy" integer, "deletedBy" integer, CONSTRAINT "PK_920331560282b8bd21bb02290df" PRIMARY KEY ("id"))`,
14
+ );
15
+ // users
16
+ await queryRunner.query(
17
+ `CREATE TABLE IF NOT EXISTS "users" ("id" SERIAL NOT NULL, "name" character varying NOT NULL, "email" character varying NOT NULL, "password" character varying, "blocked" boolean NOT NULL DEFAULT false, "groupId" integer, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP, "deleted" boolean NOT NULL DEFAULT false, "createdBy" integer, "updatedBy" integer, "deletedBy" integer, CONSTRAINT "UQ_97672ac88f789774dd47f7c8be3" UNIQUE ("email"), CONSTRAINT "PK_a3ffb1c0c8416b9fc6f907b7433" PRIMARY KEY ("id"))`,
18
+ );
19
+ // password_reset_tokens
20
+ await queryRunner.query(
21
+ `CREATE TABLE IF NOT EXISTS "password_reset_tokens" ("id" SERIAL NOT NULL, "email" character varying NOT NULL, "token" character varying NOT NULL, "expiresAt" TIMESTAMP NOT NULL DEFAULT now(), "createdAt" TIMESTAMP NOT NULL DEFAULT now(), CONSTRAINT "UQ_ab673f0e63eac966762155508ee" UNIQUE ("token"), CONSTRAINT "PK_d16bebd73e844c48bca50ff8d3d" PRIMARY KEY ("id"))`,
22
+ );
23
+ // categories (unique constraint name distinct from tags)
24
+ await queryRunner.query(
25
+ `CREATE TABLE IF NOT EXISTS "categories" ("id" SERIAL NOT NULL, "name" character varying NOT NULL, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP, "deleted" boolean NOT NULL DEFAULT false, "createdBy" integer, "updatedBy" integer, "deletedBy" integer, CONSTRAINT "UQ_categories_name" UNIQUE ("name"), CONSTRAINT "PK_24dbc6126a28ff948da33e97d3b" PRIMARY KEY ("id"))`,
26
+ );
27
+ // seos
28
+ await queryRunner.query(
29
+ `CREATE TABLE IF NOT EXISTS "seos" ("id" SERIAL NOT NULL, "title" character varying, "description" character varying, "keywords" character varying, "ogTitle" character varying, "ogDescription" character varying, "ogImage" character varying, "slug" character varying NOT NULL, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP, "deleted" boolean NOT NULL DEFAULT false, "createdBy" integer, "updatedBy" integer, "deletedBy" integer, CONSTRAINT "UQ_857ec07b2e149e4b4b3daa77f0d" UNIQUE ("slug"), CONSTRAINT "PK_4e279c30300001d3650125f17cc" PRIMARY KEY ("id"))`,
30
+ );
31
+ // tags
32
+ await queryRunner.query(
33
+ `CREATE TABLE IF NOT EXISTS "tags" ("id" SERIAL NOT NULL, "name" character varying NOT NULL, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP, "deleted" boolean NOT NULL DEFAULT false, "createdBy" integer, "updatedBy" integer, "deletedBy" integer, CONSTRAINT "UQ_tags_name" UNIQUE ("name"), CONSTRAINT "PK_e7dc17249a1148a1970748eda99" PRIMARY KEY ("id"))`,
34
+ );
35
+ // blogs
36
+ await queryRunner.query(
37
+ `CREATE TABLE IF NOT EXISTS "blogs" ("id" SERIAL NOT NULL, "title" character varying NOT NULL, "content" text NOT NULL, "coverImage" character varying, "authorId" integer NOT NULL, "categoryId" integer, "seoId" integer, "published" boolean NOT NULL DEFAULT false, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP, "deleted" boolean NOT NULL DEFAULT false, "createdBy" integer, "updatedBy" integer, "deletedBy" integer, "slug" character varying NOT NULL, CONSTRAINT "UQ_7b18faaddd461656ff66f32e2d7" UNIQUE ("slug"), CONSTRAINT "PK_e113335f11c926da929a625f118" PRIMARY KEY ("id"))`,
38
+ );
39
+ // comments
40
+ await queryRunner.query(
41
+ `CREATE TABLE IF NOT EXISTS "comments" ("id" SERIAL NOT NULL, "content" text NOT NULL, "blogId" integer NOT NULL, "authorId" integer NOT NULL, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP, "deleted" boolean NOT NULL DEFAULT false, "createdBy" integer, "updatedBy" integer, "deletedBy" integer, CONSTRAINT "PK_8bf68bc960f2b69e818bdb90dcb" PRIMARY KEY ("id"))`,
42
+ );
43
+ // forms
44
+ await queryRunner.query(
45
+ `CREATE TABLE IF NOT EXISTS "forms" ("id" SERIAL NOT NULL, "name" character varying NOT NULL, "description" text, "campaign" character varying, "slug" character varying NOT NULL, "published" boolean NOT NULL DEFAULT false, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP, "deleted" boolean NOT NULL DEFAULT false, "createdBy" integer, "updatedBy" integer, "deletedBy" integer, CONSTRAINT "UQ_beb11480ce7ba6813fe893723a1" UNIQUE ("slug"), CONSTRAINT "PK_ba062fd30b06814a60756f233da" PRIMARY KEY ("id"))`,
46
+ );
47
+ // form_fields
48
+ await queryRunner.query(
49
+ `CREATE TABLE IF NOT EXISTS "form_fields" ("id" SERIAL NOT NULL, "formId" integer NOT NULL, "label" character varying NOT NULL, "type" character varying NOT NULL, "placeholder" character varying, "options" character varying, "required" boolean NOT NULL DEFAULT false, "validation" character varying, "order" integer NOT NULL, "groupId" integer NOT NULL DEFAULT 1, "columnWidth" integer NOT NULL DEFAULT 12, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP, "deleted" boolean NOT NULL DEFAULT false, "createdBy" integer, "updatedBy" integer, "deletedBy" integer, CONSTRAINT "PK_dc4b73290f2926c3a7d7c92d1e1" PRIMARY KEY ("id"))`,
50
+ );
51
+ // contacts
52
+ await queryRunner.query(
53
+ `CREATE TABLE IF NOT EXISTS "contacts" ("id" SERIAL NOT NULL, "name" character varying NOT NULL, "email" character varying NOT NULL, "phone" character varying, "type" character varying, "company" character varying, "taxId" character varying, "notes" text, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP, "deleted" boolean NOT NULL DEFAULT false, "createdBy" integer, "updatedBy" integer, "deletedBy" integer, CONSTRAINT "UQ_752866c5247ddd34fd05559537d" UNIQUE ("email"), CONSTRAINT "PK_b99cd40cfd66a99f1571f4f72e6" PRIMARY KEY ("id"))`,
54
+ );
55
+ // form_submissions
56
+ await queryRunner.query(
57
+ `CREATE TABLE IF NOT EXISTS "form_submissions" ("id" SERIAL NOT NULL, "formId" integer NOT NULL, "contactId" integer, "data" jsonb NOT NULL, "ipAddress" character varying, "userAgent" character varying, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), CONSTRAINT "PK_fb6e1e9f26cda31c358a8a1530e" PRIMARY KEY ("id"))`,
58
+ );
59
+ // configs
60
+ await queryRunner.query(
61
+ `CREATE TABLE IF NOT EXISTS "configs" ("id" SERIAL NOT NULL, "settings" character varying NOT NULL, "key" character varying NOT NULL, "value" character varying NOT NULL, "type" character varying NOT NULL DEFAULT 'private', "encrypted" boolean NOT NULL DEFAULT false, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP, "deleted" boolean NOT NULL DEFAULT false, "createdBy" integer, "updatedBy" integer, "deletedBy" integer, CONSTRAINT "UQ_5d44d56e585f5d19b52525f94d3" UNIQUE ("settings", "key"), CONSTRAINT "PK_002b633ec0d45f5c6f928fea292" PRIMARY KEY ("id"))`,
62
+ );
63
+ // media
64
+ await queryRunner.query(
65
+ `CREATE TABLE IF NOT EXISTS "media" ("id" SERIAL NOT NULL, "filename" character varying NOT NULL, "url" character varying NOT NULL, "mimeType" character varying NOT NULL, "size" integer NOT NULL DEFAULT 0, "alt" character varying, "isPublic" boolean NOT NULL DEFAULT false, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP, "deleted" boolean NOT NULL DEFAULT false, CONSTRAINT "PK_media_1" PRIMARY KEY ("id"))`,
66
+ );
67
+ // addresses
68
+ await queryRunner.query(
69
+ `CREATE TABLE IF NOT EXISTS "addresses" ("id" SERIAL NOT NULL, "contactId" integer NOT NULL, "tag" character varying, "line1" character varying, "line2" character varying, "city" character varying, "state" character varying, "postalCode" character varying, "country" character varying, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), CONSTRAINT "PK_addresses_1" PRIMARY KEY ("id"))`,
70
+ );
71
+ // product_categories
72
+ await queryRunner.query(
73
+ `CREATE TABLE IF NOT EXISTS "product_categories" ("id" SERIAL NOT NULL, "name" character varying NOT NULL, "slug" character varying NOT NULL, "parentId" integer, "image" character varying, "description" text, "metadata" jsonb, "active" boolean NOT NULL DEFAULT true, "sortOrder" integer NOT NULL DEFAULT 0, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP, "deleted" boolean NOT NULL DEFAULT false, "createdBy" integer, "updatedBy" integer, "deletedBy" integer, CONSTRAINT "UQ_product_categories_slug" UNIQUE ("slug"), CONSTRAINT "PK_product_categories_1" PRIMARY KEY ("id"))`,
74
+ );
75
+ // brands
76
+ await queryRunner.query(
77
+ `CREATE TABLE IF NOT EXISTS "brands" ("id" SERIAL NOT NULL, "name" character varying NOT NULL, "slug" character varying NOT NULL, "logo" character varying, "metadata" jsonb, "description" text, "active" boolean NOT NULL DEFAULT true, "sortOrder" integer NOT NULL DEFAULT 0, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP, "deleted" boolean NOT NULL DEFAULT false, "createdBy" integer, "updatedBy" integer, "deletedBy" integer, "seoId" integer, CONSTRAINT "UQ_brands_slug" UNIQUE ("slug"), CONSTRAINT "PK_brands_1" PRIMARY KEY ("id"))`,
78
+ );
79
+ // collections
80
+ await queryRunner.query(
81
+ `CREATE TABLE IF NOT EXISTS "collections" ("id" SERIAL NOT NULL, "categoryId" integer, "brandId" integer, "name" character varying NOT NULL, "slug" character varying NOT NULL, "description" text, "image" character varying, "metadata" jsonb, "active" boolean NOT NULL DEFAULT true, "sortOrder" integer NOT NULL DEFAULT 0, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP, "deleted" boolean NOT NULL DEFAULT false, "createdBy" integer, "updatedBy" integer, "deletedBy" integer, "seoId" integer, CONSTRAINT "UQ_collections_slug" UNIQUE ("slug"), CONSTRAINT "PK_collections_1" PRIMARY KEY ("id"))`,
82
+ );
83
+ // attributes
84
+ await queryRunner.query(
85
+ `CREATE TABLE IF NOT EXISTS "attributes" ("id" SERIAL NOT NULL, "name" character varying NOT NULL, "slug" character varying NOT NULL, "type" character varying NOT NULL DEFAULT 'text', "options" jsonb, "metadata" jsonb, "active" boolean NOT NULL DEFAULT true, "sortOrder" integer NOT NULL DEFAULT 0, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP, "deleted" boolean NOT NULL DEFAULT false, "createdBy" integer, "updatedBy" integer, "deletedBy" integer, CONSTRAINT "UQ_attributes_slug" UNIQUE ("slug"), CONSTRAINT "PK_attributes_1" PRIMARY KEY ("id"))`,
86
+ );
87
+ // products
88
+ await queryRunner.query(
89
+ `CREATE TABLE IF NOT EXISTS "products" ("id" SERIAL NOT NULL, "collectionId" integer, "brandId" integer, "categoryId" integer, "sku" character varying, "slug" character varying, "name" character varying, "price" numeric(12,2) NOT NULL, "compareAtPrice" numeric(12,2), "quantity" integer NOT NULL DEFAULT 0, "status" character varying NOT NULL DEFAULT 'draft', "featured" boolean NOT NULL DEFAULT false, "metadata" jsonb, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP, "deleted" boolean NOT NULL DEFAULT false, "createdBy" integer, "updatedBy" integer, "deletedBy" integer, "seoId" integer, CONSTRAINT "UQ_products_slug" UNIQUE ("slug"), CONSTRAINT "PK_products_1" PRIMARY KEY ("id"))`,
90
+ );
91
+ // product_attributes
92
+ await queryRunner.query(
93
+ `CREATE TABLE IF NOT EXISTS "product_attributes" ("id" SERIAL NOT NULL, "productId" integer NOT NULL, "attributeId" integer NOT NULL, "value" character varying NOT NULL, "metadata" jsonb, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), CONSTRAINT "PK_product_attributes_1" PRIMARY KEY ("id"))`,
94
+ );
95
+ // taxes
96
+ await queryRunner.query(
97
+ `CREATE TABLE IF NOT EXISTS "taxes" ("id" SERIAL NOT NULL, "name" character varying NOT NULL, "slug" character varying NOT NULL, "rate" numeric(5,2) NOT NULL, "isDefault" boolean NOT NULL DEFAULT false, "description" text, "active" boolean NOT NULL DEFAULT true, "metadata" jsonb, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP, "deleted" boolean NOT NULL DEFAULT false, "createdBy" integer, "updatedBy" integer, "deletedBy" integer, CONSTRAINT "UQ_taxes_slug" UNIQUE ("slug"), CONSTRAINT "PK_taxes_1" PRIMARY KEY ("id"))`,
98
+ );
99
+ // product_taxes
100
+ await queryRunner.query(
101
+ `CREATE TABLE IF NOT EXISTS "product_taxes" ("id" SERIAL NOT NULL, "productId" integer NOT NULL, "taxId" integer NOT NULL, "rate" numeric(5,2), "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), CONSTRAINT "PK_product_taxes_1" PRIMARY KEY ("id"))`,
102
+ );
103
+ // orders
104
+ await queryRunner.query(
105
+ `CREATE TABLE IF NOT EXISTS "orders" ("id" SERIAL NOT NULL, "orderNumber" character varying NOT NULL, "contactId" integer NOT NULL, "billingAddressId" integer, "shippingAddressId" integer, "status" character varying NOT NULL DEFAULT 'pending', "subtotal" numeric(12,2) NOT NULL DEFAULT 0, "tax" numeric(12,2) NOT NULL DEFAULT 0, "discount" numeric(12,2) NOT NULL DEFAULT 0, "total" numeric(12,2) NOT NULL DEFAULT 0, "currency" character varying NOT NULL DEFAULT 'INR', "metadata" jsonb, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP, "deleted" boolean NOT NULL DEFAULT false, "createdBy" integer, "updatedBy" integer, "deletedBy" integer, CONSTRAINT "UQ_orders_orderNumber" UNIQUE ("orderNumber"), CONSTRAINT "PK_orders_1" PRIMARY KEY ("id"))`,
106
+ );
107
+ // order_items
108
+ await queryRunner.query(
109
+ `CREATE TABLE IF NOT EXISTS "order_items" ("id" SERIAL NOT NULL, "orderId" integer NOT NULL, "productId" integer NOT NULL, "quantity" integer NOT NULL DEFAULT 1, "unitPrice" numeric(12,2) NOT NULL, "tax" numeric(12,2) NOT NULL DEFAULT 0, "total" numeric(12,2) NOT NULL, "metadata" jsonb, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), CONSTRAINT "PK_order_items_1" PRIMARY KEY ("id"))`,
110
+ );
111
+ // payments
112
+ await queryRunner.query(
113
+ `CREATE TABLE IF NOT EXISTS "payments" ("id" SERIAL NOT NULL, "orderId" integer NOT NULL, "contactId" integer, "amount" numeric(12,2) NOT NULL, "currency" character varying NOT NULL DEFAULT 'INR', "status" character varying NOT NULL DEFAULT 'pending', "method" character varying, "externalReference" character varying, "metadata" jsonb, "paidAt" TIMESTAMP, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP, "deleted" boolean NOT NULL DEFAULT false, "createdBy" integer, "updatedBy" integer, "deletedBy" integer, CONSTRAINT "PK_payments_1" PRIMARY KEY ("id"))`,
114
+ );
115
+ // pages
116
+ await queryRunner.query(
117
+ `CREATE TABLE IF NOT EXISTS "pages" ("id" SERIAL NOT NULL, "title" character varying NOT NULL, "slug" character varying NOT NULL, "content" jsonb NOT NULL DEFAULT '{}', "published" boolean NOT NULL DEFAULT false, "theme" character varying NOT NULL DEFAULT 'default', "parentId" integer, "seoId" integer, "createdAt" TIMESTAMP NOT NULL DEFAULT now(), "updatedAt" TIMESTAMP NOT NULL DEFAULT now(), "deletedAt" TIMESTAMP, "deleted" boolean NOT NULL DEFAULT false, "createdBy" integer, "updatedBy" integer, "deletedBy" integer, CONSTRAINT "UQ_pages_slug" UNIQUE ("slug"), CONSTRAINT "PK_pages_1" PRIMARY KEY ("id"))`,
118
+ );
119
+ // blog_tags (join table)
120
+ await queryRunner.query(
121
+ `CREATE TABLE IF NOT EXISTS "blog_tags" ("blogId" integer NOT NULL, "tagId" integer NOT NULL, CONSTRAINT "PK_blog_tags_1" PRIMARY KEY ("blogId", "tagId"))`,
122
+ );
123
+ await queryRunner.query(`CREATE INDEX "IDX_blog_tags_blogId" ON "blog_tags" ("blogId")`);
124
+ await queryRunner.query(`CREATE INDEX "IDX_blog_tags_tagId" ON "blog_tags" ("tagId")`);
125
+
126
+ // Foreign keys
127
+ await queryRunner.query(
128
+ `ALTER TABLE "permissions" ADD CONSTRAINT "FK_0ce20ad956af3961df1ff12d0c5" FOREIGN KEY ("groupId") REFERENCES "user_groups"("id") ON DELETE CASCADE ON UPDATE NO ACTION`,
129
+ );
130
+ await queryRunner.query(
131
+ `ALTER TABLE "users" ADD CONSTRAINT "FK_b1d770f014b76f7cfb58089dafc" FOREIGN KEY ("groupId") REFERENCES "user_groups"("id") ON DELETE SET NULL ON UPDATE NO ACTION`,
132
+ );
133
+ await queryRunner.query(
134
+ `ALTER TABLE "comments" ADD CONSTRAINT "FK_4548cc4a409b8651ec75f70e280" FOREIGN KEY ("authorId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE NO ACTION`,
135
+ );
136
+ await queryRunner.query(
137
+ `ALTER TABLE "comments" ADD CONSTRAINT "FK_42a37ec3be9f871d4e44dd21bf9" FOREIGN KEY ("blogId") REFERENCES "blogs"("id") ON DELETE CASCADE ON UPDATE NO ACTION`,
138
+ );
139
+ await queryRunner.query(
140
+ `ALTER TABLE "blogs" ADD CONSTRAINT "FK_05aa4239904d894452e339e5139" FOREIGN KEY ("authorId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE NO ACTION`,
141
+ );
142
+ await queryRunner.query(
143
+ `ALTER TABLE "blogs" ADD CONSTRAINT "FK_8c937e1b5e2c1269689bcf1138e" FOREIGN KEY ("categoryId") REFERENCES "categories"("id") ON DELETE SET NULL ON UPDATE NO ACTION`,
144
+ );
145
+ await queryRunner.query(
146
+ `ALTER TABLE "blogs" ADD CONSTRAINT "FK_f4d547526cb1933c9207f2bae4b" FOREIGN KEY ("seoId") REFERENCES "seos"("id") ON DELETE SET NULL ON UPDATE NO ACTION`,
147
+ );
148
+ await queryRunner.query(
149
+ `ALTER TABLE "form_fields" ADD CONSTRAINT "FK_be6b8d137cc480508923911b0e2" FOREIGN KEY ("formId") REFERENCES "forms"("id") ON DELETE CASCADE ON UPDATE NO ACTION`,
150
+ );
151
+ await queryRunner.query(
152
+ `ALTER TABLE "form_submissions" ADD CONSTRAINT "FK_6bb44ead8acd515f1333e5309bf" FOREIGN KEY ("formId") REFERENCES "forms"("id") ON DELETE CASCADE ON UPDATE NO ACTION`,
153
+ );
154
+ await queryRunner.query(
155
+ `ALTER TABLE "form_submissions" ADD CONSTRAINT "FK_a4b39f1fe022573d6b93039de93" FOREIGN KEY ("contactId") REFERENCES "contacts"("id") ON DELETE SET NULL ON UPDATE NO ACTION`,
156
+ );
157
+ await queryRunner.query(
158
+ `ALTER TABLE "addresses" ADD CONSTRAINT "FK_addresses_contact" FOREIGN KEY ("contactId") REFERENCES "contacts"("id") ON DELETE CASCADE ON UPDATE NO ACTION`,
159
+ );
160
+ await queryRunner.query(
161
+ `ALTER TABLE "product_categories" ADD CONSTRAINT "FK_product_categories_parent" FOREIGN KEY ("parentId") REFERENCES "product_categories"("id") ON DELETE SET NULL ON UPDATE NO ACTION`,
162
+ );
163
+ await queryRunner.query(
164
+ `ALTER TABLE "brands" ADD CONSTRAINT "FK_brands_seo" FOREIGN KEY ("seoId") REFERENCES "seos"("id") ON DELETE SET NULL ON UPDATE NO ACTION`,
165
+ );
166
+ await queryRunner.query(
167
+ `ALTER TABLE "collections" ADD CONSTRAINT "FK_collections_category" FOREIGN KEY ("categoryId") REFERENCES "product_categories"("id") ON DELETE SET NULL ON UPDATE NO ACTION`,
168
+ );
169
+ await queryRunner.query(
170
+ `ALTER TABLE "collections" ADD CONSTRAINT "FK_collections_brand" FOREIGN KEY ("brandId") REFERENCES "brands"("id") ON DELETE SET NULL ON UPDATE NO ACTION`,
171
+ );
172
+ await queryRunner.query(
173
+ `ALTER TABLE "collections" ADD CONSTRAINT "FK_collections_seo" FOREIGN KEY ("seoId") REFERENCES "seos"("id") ON DELETE SET NULL ON UPDATE NO ACTION`,
174
+ );
175
+ await queryRunner.query(
176
+ `ALTER TABLE "products" ADD CONSTRAINT "FK_products_seo" FOREIGN KEY ("seoId") REFERENCES "seos"("id") ON DELETE SET NULL ON UPDATE NO ACTION`,
177
+ );
178
+ await queryRunner.query(
179
+ `ALTER TABLE "products" ADD CONSTRAINT "FK_products_collection" FOREIGN KEY ("collectionId") REFERENCES "collections"("id") ON DELETE SET NULL ON UPDATE NO ACTION`,
180
+ );
181
+ await queryRunner.query(
182
+ `ALTER TABLE "products" ADD CONSTRAINT "FK_products_brand" FOREIGN KEY ("brandId") REFERENCES "brands"("id") ON DELETE SET NULL ON UPDATE NO ACTION`,
183
+ );
184
+ await queryRunner.query(
185
+ `ALTER TABLE "products" ADD CONSTRAINT "FK_products_category" FOREIGN KEY ("categoryId") REFERENCES "product_categories"("id") ON DELETE SET NULL ON UPDATE NO ACTION`,
186
+ );
187
+ await queryRunner.query(
188
+ `ALTER TABLE "product_attributes" ADD CONSTRAINT "FK_product_attributes_product" FOREIGN KEY ("productId") REFERENCES "products"("id") ON DELETE CASCADE ON UPDATE NO ACTION`,
189
+ );
190
+ await queryRunner.query(
191
+ `ALTER TABLE "product_attributes" ADD CONSTRAINT "FK_product_attributes_attribute" FOREIGN KEY ("attributeId") REFERENCES "attributes"("id") ON DELETE CASCADE ON UPDATE NO ACTION`,
192
+ );
193
+ await queryRunner.query(
194
+ `ALTER TABLE "product_taxes" ADD CONSTRAINT "FK_product_taxes_product" FOREIGN KEY ("productId") REFERENCES "products"("id") ON DELETE CASCADE ON UPDATE NO ACTION`,
195
+ );
196
+ await queryRunner.query(
197
+ `ALTER TABLE "product_taxes" ADD CONSTRAINT "FK_product_taxes_tax" FOREIGN KEY ("taxId") REFERENCES "taxes"("id") ON DELETE CASCADE ON UPDATE NO ACTION`,
198
+ );
199
+ await queryRunner.query(
200
+ `ALTER TABLE "orders" ADD CONSTRAINT "FK_orders_contact" FOREIGN KEY ("contactId") REFERENCES "contacts"("id") ON DELETE CASCADE ON UPDATE NO ACTION`,
201
+ );
202
+ await queryRunner.query(
203
+ `ALTER TABLE "orders" ADD CONSTRAINT "FK_orders_billing_address" FOREIGN KEY ("billingAddressId") REFERENCES "addresses"("id") ON DELETE SET NULL ON UPDATE NO ACTION`,
204
+ );
205
+ await queryRunner.query(
206
+ `ALTER TABLE "orders" ADD CONSTRAINT "FK_orders_shipping_address" FOREIGN KEY ("shippingAddressId") REFERENCES "addresses"("id") ON DELETE SET NULL ON UPDATE NO ACTION`,
207
+ );
208
+ await queryRunner.query(
209
+ `ALTER TABLE "order_items" ADD CONSTRAINT "FK_order_items_order" FOREIGN KEY ("orderId") REFERENCES "orders"("id") ON DELETE CASCADE ON UPDATE NO ACTION`,
210
+ );
211
+ await queryRunner.query(
212
+ `ALTER TABLE "order_items" ADD CONSTRAINT "FK_order_items_product" FOREIGN KEY ("productId") REFERENCES "products"("id") ON DELETE CASCADE ON UPDATE NO ACTION`,
213
+ );
214
+ await queryRunner.query(
215
+ `ALTER TABLE "payments" ADD CONSTRAINT "FK_payments_order" FOREIGN KEY ("orderId") REFERENCES "orders"("id") ON DELETE CASCADE ON UPDATE NO ACTION`,
216
+ );
217
+ await queryRunner.query(
218
+ `ALTER TABLE "payments" ADD CONSTRAINT "FK_payments_contact" FOREIGN KEY ("contactId") REFERENCES "contacts"("id") ON DELETE SET NULL ON UPDATE NO ACTION`,
219
+ );
220
+ await queryRunner.query(
221
+ `ALTER TABLE "pages" ADD CONSTRAINT "FK_pages_parent" FOREIGN KEY ("parentId") REFERENCES "pages"("id") ON DELETE SET NULL ON UPDATE NO ACTION`,
222
+ );
223
+ await queryRunner.query(
224
+ `ALTER TABLE "pages" ADD CONSTRAINT "FK_pages_seo" FOREIGN KEY ("seoId") REFERENCES "seos"("id") ON DELETE SET NULL ON UPDATE NO ACTION`,
225
+ );
226
+ await queryRunner.query(
227
+ `ALTER TABLE "blog_tags" ADD CONSTRAINT "FK_blog_tags_blog" FOREIGN KEY ("blogId") REFERENCES "blogs"("id") ON DELETE CASCADE ON UPDATE CASCADE`,
228
+ );
229
+ await queryRunner.query(
230
+ `ALTER TABLE "blog_tags" ADD CONSTRAINT "FK_blog_tags_tag" FOREIGN KEY ("tagId") REFERENCES "tags"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`,
231
+ );
232
+ }
233
+
234
+ public async down(queryRunner: QueryRunner): Promise<void> {
235
+ // Drop FKs first (reverse order to avoid dependency issues)
236
+ await queryRunner.query(`ALTER TABLE "blog_tags" DROP CONSTRAINT "FK_blog_tags_tag"`);
237
+ await queryRunner.query(`ALTER TABLE "blog_tags" DROP CONSTRAINT "FK_blog_tags_blog"`);
238
+ await queryRunner.query(`ALTER TABLE "pages" DROP CONSTRAINT "FK_pages_seo"`);
239
+ await queryRunner.query(`ALTER TABLE "pages" DROP CONSTRAINT "FK_pages_parent"`);
240
+ await queryRunner.query(`ALTER TABLE "payments" DROP CONSTRAINT "FK_payments_contact"`);
241
+ await queryRunner.query(`ALTER TABLE "payments" DROP CONSTRAINT "FK_payments_order"`);
242
+ await queryRunner.query(`ALTER TABLE "order_items" DROP CONSTRAINT "FK_order_items_product"`);
243
+ await queryRunner.query(`ALTER TABLE "order_items" DROP CONSTRAINT "FK_order_items_order"`);
244
+ await queryRunner.query(`ALTER TABLE "orders" DROP CONSTRAINT "FK_orders_shipping_address"`);
245
+ await queryRunner.query(`ALTER TABLE "orders" DROP CONSTRAINT "FK_orders_billing_address"`);
246
+ await queryRunner.query(`ALTER TABLE "orders" DROP CONSTRAINT "FK_orders_contact"`);
247
+ await queryRunner.query(`ALTER TABLE "product_taxes" DROP CONSTRAINT "FK_product_taxes_tax"`);
248
+ await queryRunner.query(`ALTER TABLE "product_taxes" DROP CONSTRAINT "FK_product_taxes_product"`);
249
+ await queryRunner.query(`ALTER TABLE "product_attributes" DROP CONSTRAINT "FK_product_attributes_attribute"`);
250
+ await queryRunner.query(`ALTER TABLE "product_attributes" DROP CONSTRAINT "FK_product_attributes_product"`);
251
+ await queryRunner.query(`ALTER TABLE "products" DROP CONSTRAINT "FK_products_category"`);
252
+ await queryRunner.query(`ALTER TABLE "products" DROP CONSTRAINT "FK_products_brand"`);
253
+ await queryRunner.query(`ALTER TABLE "products" DROP CONSTRAINT "FK_products_collection"`);
254
+ await queryRunner.query(`ALTER TABLE "products" DROP CONSTRAINT "FK_products_seo"`);
255
+ await queryRunner.query(`ALTER TABLE "collections" DROP CONSTRAINT "FK_collections_seo"`);
256
+ await queryRunner.query(`ALTER TABLE "collections" DROP CONSTRAINT "FK_collections_brand"`);
257
+ await queryRunner.query(`ALTER TABLE "collections" DROP CONSTRAINT "FK_collections_category"`);
258
+ await queryRunner.query(`ALTER TABLE "brands" DROP CONSTRAINT "FK_brands_seo"`);
259
+ await queryRunner.query(`ALTER TABLE "product_categories" DROP CONSTRAINT "FK_product_categories_parent"`);
260
+ await queryRunner.query(`ALTER TABLE "addresses" DROP CONSTRAINT "FK_addresses_contact"`);
261
+ await queryRunner.query(`ALTER TABLE "form_submissions" DROP CONSTRAINT "FK_a4b39f1fe022573d6b93039de93"`);
262
+ await queryRunner.query(`ALTER TABLE "form_submissions" DROP CONSTRAINT "FK_6bb44ead8acd515f1333e5309bf"`);
263
+ await queryRunner.query(`ALTER TABLE "form_fields" DROP CONSTRAINT "FK_be6b8d137cc480508923911b0e2"`);
264
+ await queryRunner.query(`ALTER TABLE "blogs" DROP CONSTRAINT "FK_f4d547526cb1933c9207f2bae4b"`);
265
+ await queryRunner.query(`ALTER TABLE "blogs" DROP CONSTRAINT "FK_8c937e1b5e2c1269689bcf1138e"`);
266
+ await queryRunner.query(`ALTER TABLE "blogs" DROP CONSTRAINT "FK_05aa4239904d894452e339e5139"`);
267
+ await queryRunner.query(`ALTER TABLE "comments" DROP CONSTRAINT "FK_42a37ec3be9f871d4e44dd21bf9"`);
268
+ await queryRunner.query(`ALTER TABLE "comments" DROP CONSTRAINT "FK_4548cc4a409b8651ec75f70e280"`);
269
+ await queryRunner.query(`ALTER TABLE "users" DROP CONSTRAINT "FK_b1d770f014b76f7cfb58089dafc"`);
270
+ await queryRunner.query(`ALTER TABLE "permissions" DROP CONSTRAINT "FK_0ce20ad956af3961df1ff12d0c5"`);
271
+
272
+ await queryRunner.query(`DROP INDEX "public"."IDX_blog_tags_tagId"`);
273
+ await queryRunner.query(`DROP INDEX "public"."IDX_blog_tags_blogId"`);
274
+ await queryRunner.query(`DROP TABLE "blog_tags"`);
275
+ await queryRunner.query(`DROP TABLE "pages"`);
276
+ await queryRunner.query(`DROP TABLE "payments"`);
277
+ await queryRunner.query(`DROP TABLE "order_items"`);
278
+ await queryRunner.query(`DROP TABLE "orders"`);
279
+ await queryRunner.query(`DROP TABLE "product_taxes"`);
280
+ await queryRunner.query(`DROP TABLE "product_attributes"`);
281
+ await queryRunner.query(`DROP TABLE "products"`);
282
+ await queryRunner.query(`DROP TABLE "taxes"`);
283
+ await queryRunner.query(`DROP TABLE "attributes"`);
284
+ await queryRunner.query(`DROP TABLE "collections"`);
285
+ await queryRunner.query(`DROP TABLE "brands"`);
286
+ await queryRunner.query(`DROP TABLE "product_categories"`);
287
+ await queryRunner.query(`DROP TABLE "addresses"`);
288
+ await queryRunner.query(`DROP TABLE "media"`);
289
+ await queryRunner.query(`DROP TABLE "configs"`);
290
+ await queryRunner.query(`DROP TABLE "form_submissions"`);
291
+ await queryRunner.query(`DROP TABLE "forms"`);
292
+ await queryRunner.query(`DROP TABLE "form_fields"`);
293
+ await queryRunner.query(`DROP TABLE "contacts"`);
294
+ await queryRunner.query(`DROP TABLE "comments"`);
295
+ await queryRunner.query(`DROP TABLE "blogs"`);
296
+ await queryRunner.query(`DROP TABLE "tags"`);
297
+ await queryRunner.query(`DROP TABLE "seos"`);
298
+ await queryRunner.query(`DROP TABLE "categories"`);
299
+ await queryRunner.query(`DROP TABLE "password_reset_tokens"`);
300
+ await queryRunner.query(`DROP TABLE "users"`);
301
+ await queryRunner.query(`DROP TABLE "user_groups"`);
302
+ await queryRunner.query(`DROP TABLE "permissions"`);
303
+ }
304
+ }
@@ -0,0 +1,3 @@
1
+ # Core migrations
2
+
3
+ TypeORM migrations for @infuro/cms-core schema. Shipped in `dist/migrations/` and run automatically with app migrations when you run `npm run migration:run`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@infuro/cms-core",
3
- "version": "1.0.6",
3
+ "version": "1.0.8",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -8,6 +8,9 @@
8
8
  "types": "./dist/index.d.ts",
9
9
  "description": "Infuro CMS core - headless CMS library for Next.js",
10
10
  "license": "AGPL-3.0",
11
+ "bin": {
12
+ "infuro-cms": "./dist/cli.js"
13
+ },
11
14
  "files": [
12
15
  "dist"
13
16
  ],
@@ -50,7 +53,7 @@
50
53
  "./admin.css": "./dist/admin.css"
51
54
  },
52
55
  "scripts": {
53
- "build": "tsup && cp src/admin/admin.css dist/admin.css",
56
+ "build": "tsup && cp src/admin/admin.css dist/admin.css && mkdir -p dist/migrations && cp -r src/migrations/. dist/migrations/",
54
57
  "dev": "tsup --watch",
55
58
  "link": "npm run build && npm link",
56
59
  "prepublishOnly": "npm run build"