@axova/shared 1.0.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.
Files changed (112) hide show
  1. package/CONFIGURATION_GUIDE.md +1 -0
  2. package/README.md +384 -0
  3. package/SCHEMA_ORGANIZATION.md +209 -0
  4. package/dist/configs/index.d.ts +85 -0
  5. package/dist/configs/index.js +555 -0
  6. package/dist/events/kafka.d.ts +40 -0
  7. package/dist/events/kafka.js +311 -0
  8. package/dist/index.d.ts +13 -0
  9. package/dist/index.js +41 -0
  10. package/dist/interfaces/customer-events.d.ts +85 -0
  11. package/dist/interfaces/customer-events.js +2 -0
  12. package/dist/interfaces/inventory-events.d.ts +453 -0
  13. package/dist/interfaces/inventory-events.js +3 -0
  14. package/dist/interfaces/inventory-types.d.ts +894 -0
  15. package/dist/interfaces/inventory-types.js +3 -0
  16. package/dist/interfaces/order-events.d.ts +320 -0
  17. package/dist/interfaces/order-events.js +3 -0
  18. package/dist/lib/auditLogger.d.ts +162 -0
  19. package/dist/lib/auditLogger.js +626 -0
  20. package/dist/lib/authOrganization.d.ts +24 -0
  21. package/dist/lib/authOrganization.js +110 -0
  22. package/dist/lib/db.d.ts +6 -0
  23. package/dist/lib/db.js +88 -0
  24. package/dist/middleware/serviceAuth.d.ts +60 -0
  25. package/dist/middleware/serviceAuth.js +272 -0
  26. package/dist/middleware/storeOwnership.d.ts +15 -0
  27. package/dist/middleware/storeOwnership.js +156 -0
  28. package/dist/middleware/storeValidationMiddleware.d.ts +44 -0
  29. package/dist/middleware/storeValidationMiddleware.js +180 -0
  30. package/dist/middleware/userAuth.d.ts +27 -0
  31. package/dist/middleware/userAuth.js +218 -0
  32. package/dist/schemas/admin/admin-schema.d.ts +741 -0
  33. package/dist/schemas/admin/admin-schema.js +111 -0
  34. package/dist/schemas/ai-moderation/ai-moderation-schema.d.ts +648 -0
  35. package/dist/schemas/ai-moderation/ai-moderation-schema.js +88 -0
  36. package/dist/schemas/common/common-schemas.d.ts +436 -0
  37. package/dist/schemas/common/common-schemas.js +94 -0
  38. package/dist/schemas/compliance/compliance-schema.d.ts +3388 -0
  39. package/dist/schemas/compliance/compliance-schema.js +472 -0
  40. package/dist/schemas/compliance/kyc-schema.d.ts +2642 -0
  41. package/dist/schemas/compliance/kyc-schema.js +361 -0
  42. package/dist/schemas/customer/customer-schema.d.ts +2727 -0
  43. package/dist/schemas/customer/customer-schema.js +399 -0
  44. package/dist/schemas/index.d.ts +27 -0
  45. package/dist/schemas/index.js +138 -0
  46. package/dist/schemas/inventory/inventory-tables.d.ts +9476 -0
  47. package/dist/schemas/inventory/inventory-tables.js +1470 -0
  48. package/dist/schemas/inventory/lot-tables.d.ts +3281 -0
  49. package/dist/schemas/inventory/lot-tables.js +608 -0
  50. package/dist/schemas/order/order-schema.d.ts +5825 -0
  51. package/dist/schemas/order/order-schema.js +954 -0
  52. package/dist/schemas/product/discount-relations.d.ts +15 -0
  53. package/dist/schemas/product/discount-relations.js +34 -0
  54. package/dist/schemas/product/discount-schema.d.ts +1975 -0
  55. package/dist/schemas/product/discount-schema.js +297 -0
  56. package/dist/schemas/product/product-relations.d.ts +41 -0
  57. package/dist/schemas/product/product-relations.js +133 -0
  58. package/dist/schemas/product/product-schema.d.ts +4544 -0
  59. package/dist/schemas/product/product-schema.js +671 -0
  60. package/dist/schemas/store/store-audit-schema.d.ts +4135 -0
  61. package/dist/schemas/store/store-audit-schema.js +556 -0
  62. package/dist/schemas/store/store-schema.d.ts +3100 -0
  63. package/dist/schemas/store/store-schema.js +381 -0
  64. package/dist/schemas/store/store-settings-schema.d.ts +665 -0
  65. package/dist/schemas/store/store-settings-schema.js +141 -0
  66. package/dist/schemas/types.d.ts +50 -0
  67. package/dist/schemas/types.js +3 -0
  68. package/dist/types/events.d.ts +2396 -0
  69. package/dist/types/events.js +505 -0
  70. package/dist/utils/errorHandler.d.ts +12 -0
  71. package/dist/utils/errorHandler.js +36 -0
  72. package/dist/utils/subdomain.d.ts +6 -0
  73. package/dist/utils/subdomain.js +20 -0
  74. package/nul +8 -0
  75. package/package.json +43 -0
  76. package/src/configs/index.ts +654 -0
  77. package/src/events/kafka.ts +429 -0
  78. package/src/index.ts +26 -0
  79. package/src/interfaces/customer-events.ts +106 -0
  80. package/src/interfaces/inventory-events.ts +545 -0
  81. package/src/interfaces/inventory-types.ts +1004 -0
  82. package/src/interfaces/order-events.ts +381 -0
  83. package/src/lib/auditLogger.ts +1117 -0
  84. package/src/lib/authOrganization.ts +153 -0
  85. package/src/lib/db.ts +64 -0
  86. package/src/middleware/serviceAuth.ts +328 -0
  87. package/src/middleware/storeOwnership.ts +199 -0
  88. package/src/middleware/storeValidationMiddleware.ts +247 -0
  89. package/src/middleware/userAuth.ts +248 -0
  90. package/src/schemas/admin/admin-schema.ts +208 -0
  91. package/src/schemas/ai-moderation/ai-moderation-schema.ts +180 -0
  92. package/src/schemas/common/common-schemas.ts +108 -0
  93. package/src/schemas/compliance/compliance-schema.ts +927 -0
  94. package/src/schemas/compliance/kyc-schema.ts +649 -0
  95. package/src/schemas/customer/customer-schema.ts +576 -0
  96. package/src/schemas/index.ts +189 -0
  97. package/src/schemas/inventory/inventory-tables.ts +1927 -0
  98. package/src/schemas/inventory/lot-tables.ts +799 -0
  99. package/src/schemas/order/order-schema.ts +1400 -0
  100. package/src/schemas/product/discount-relations.ts +44 -0
  101. package/src/schemas/product/discount-schema.ts +464 -0
  102. package/src/schemas/product/product-relations.ts +187 -0
  103. package/src/schemas/product/product-schema.ts +955 -0
  104. package/src/schemas/store/ethiopian_business_api.md.resolved +212 -0
  105. package/src/schemas/store/store-audit-schema.ts +1257 -0
  106. package/src/schemas/store/store-schema.ts +661 -0
  107. package/src/schemas/store/store-settings-schema.ts +231 -0
  108. package/src/schemas/types.ts +67 -0
  109. package/src/types/events.ts +646 -0
  110. package/src/utils/errorHandler.ts +44 -0
  111. package/src/utils/subdomain.ts +19 -0
  112. package/tsconfig.json +21 -0
@@ -0,0 +1,381 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.storeBlogsRelations = exports.storeSocialProfilesRelations = exports.storeContactsRelations = exports.storeBusinessDetailsRelations = exports.storesRelations = exports.storeBlogs = exports.storeSocialProfiles = exports.storeContacts = exports.storeBusinessDetails = exports.stores = void 0;
4
+ const cuid2_1 = require("@paralleldrive/cuid2");
5
+ const drizzle_orm_1 = require("drizzle-orm");
6
+ const pg_core_1 = require("drizzle-orm/pg-core");
7
+ // Core Store Table - Enhanced with performance optimizations
8
+ exports.stores = (0, pg_core_1.pgTable)("stores", {
9
+ id: (0, pg_core_1.text)("id")
10
+ .primaryKey()
11
+ .$defaultFn(() => (0, cuid2_1.createId)()),
12
+ userId: (0, pg_core_1.text)("user_id").notNull(),
13
+ organizationId: (0, pg_core_1.text)("organization_id"), // Organization ID from Fastify Better Auth
14
+ storeName: (0, pg_core_1.varchar)("store_name", { length: 255 }).notNull(),
15
+ subdomain: (0, pg_core_1.varchar)("subdomain", { length: 63 }).notNull(),
16
+ storeUrl: (0, pg_core_1.varchar)("store_url", { length: 255 }),
17
+ // Core Settings
18
+ timezone: (0, pg_core_1.varchar)("timezone", { length: 50 }).notNull().default("UTC"),
19
+ currency: (0, pg_core_1.varchar)("currency", { length: 3 }).notNull().default("USD"),
20
+ languages: (0, pg_core_1.jsonb)("languages").$type().notNull().default(["en"]),
21
+ // Store Configuration
22
+ storeType: (0, pg_core_1.varchar)("store_type", { length: 50 })
23
+ .notNull()
24
+ .default("STANDARD")
25
+ .$type(),
26
+ plan: (0, pg_core_1.varchar)("plan", { length: 50 })
27
+ .notNull()
28
+ .default("FREE")
29
+ .$type(),
30
+ // Ethiopian Business Registration
31
+ tinNumber: (0, pg_core_1.varchar)("tin_number", { length: 50 }),
32
+ businessType: (0, pg_core_1.varchar)("business_type", { length: 20 })
33
+ .$type()
34
+ .default("starter"),
35
+ region: (0, pg_core_1.varchar)("region", { length: 100 }),
36
+ subcity: (0, pg_core_1.varchar)("subcity", { length: 100 }),
37
+ woreda: (0, pg_core_1.varchar)("woreda", { length: 100 }),
38
+ houseNumber: (0, pg_core_1.varchar)("house_number", { length: 50 }),
39
+ tradeNames: (0, pg_core_1.jsonb)("trade_names").$type().default([]),
40
+ // Store Additional Details
41
+ attributes: (0, pg_core_1.jsonb)("attributes")
42
+ .$type()
43
+ .default({}),
44
+ settings: (0, pg_core_1.jsonb)("settings")
45
+ .$type()
46
+ .default({}),
47
+ // Performance metrics
48
+ monthlyVisitors: (0, pg_core_1.integer)("monthly_visitors").default(0),
49
+ totalOrders: (0, pg_core_1.integer)("total_orders").default(0),
50
+ totalRevenue: (0, pg_core_1.integer)("total_revenue").default(0), // in cents
51
+ // Status and lifecycle
52
+ isActive: (0, pg_core_1.boolean)("is_active").notNull().default(true),
53
+ isPublished: (0, pg_core_1.boolean)("is_published").notNull().default(false),
54
+ launchedAt: (0, pg_core_1.timestamp)("launched_at", { withTimezone: true }),
55
+ // Audit fields
56
+ createdAt: (0, pg_core_1.timestamp)("created_at", { withTimezone: true })
57
+ .defaultNow()
58
+ .notNull(),
59
+ updatedAt: (0, pg_core_1.timestamp)("updated_at", { withTimezone: true })
60
+ .defaultNow()
61
+ .notNull(),
62
+ deletedAt: (0, pg_core_1.timestamp)("deleted_at", { withTimezone: true }),
63
+ }, (table) => ({
64
+ // Primary indexes for performance
65
+ subdomainUnique: (0, pg_core_1.unique)("idx_stores_subdomain_unique").on(table.subdomain),
66
+ storeNameIndex: (0, pg_core_1.index)("idx_stores_name").on(table.storeName),
67
+ userIdIndex: (0, pg_core_1.index)("idx_stores_user_id").on(table.userId),
68
+ organizationIdIndex: (0, pg_core_1.index)("idx_stores_organization_id").on(table.organizationId),
69
+ // Composite indexes for common queries
70
+ userActiveStoresIndex: (0, pg_core_1.index)("idx_stores_user_active").on(table.userId, table.isActive),
71
+ activePublishedIndex: (0, pg_core_1.index)("idx_stores_active_published").on(table.isActive, table.isPublished),
72
+ planTypeIndex: (0, pg_core_1.index)("idx_stores_plan_type").on(table.plan, table.storeType),
73
+ // Performance tracking indexes
74
+ visitorsIndex: (0, pg_core_1.index)("idx_stores_monthly_visitors").on(table.monthlyVisitors),
75
+ revenueIndex: (0, pg_core_1.index)("idx_stores_total_revenue").on(table.totalRevenue),
76
+ // Temporal indexes
77
+ createdAtIndex: (0, pg_core_1.index)("idx_stores_created_at").on(table.createdAt),
78
+ launchedAtIndex: (0, pg_core_1.index)("idx_stores_launched_at").on(table.launchedAt),
79
+ // Ethiopian business indexes
80
+ tinNumberIndex: (0, pg_core_1.index)("idx_stores_tin_number").on(table.tinNumber),
81
+ businessTypeIndex: (0, pg_core_1.index)("idx_stores_business_type").on(table.businessType),
82
+ locationIndex: (0, pg_core_1.index)("idx_stores_location").on(table.region, table.subcity, table.woreda),
83
+ }));
84
+ // Store Business Details Table - Enhanced
85
+ exports.storeBusinessDetails = (0, pg_core_1.pgTable)("store_business_details", {
86
+ id: (0, pg_core_1.text)("id")
87
+ .primaryKey()
88
+ .$defaultFn(() => (0, cuid2_1.createId)()),
89
+ storeId: (0, pg_core_1.text)("store_id")
90
+ .notNull()
91
+ .references(() => exports.stores.id, { onDelete: "cascade" }),
92
+ // Business Type and Legal Structure
93
+ businessType: (0, pg_core_1.varchar)("business_type", { length: 20 })
94
+ .notNull()
95
+ .$type()
96
+ .default("INDIVIDUAL"),
97
+ legalStructure: (0, pg_core_1.varchar)("legal_structure", { length: 30 }).$type(),
98
+ // Ethiopian Registration Details
99
+ legalBusinessNameAmh: (0, pg_core_1.varchar)("legal_business_name_amh", { length: 255 }),
100
+ registrationDate: (0, pg_core_1.timestamp)("registration_date", { withTimezone: true }),
101
+ paidUpCapital: (0, pg_core_1.numeric)("paid_up_capital", { precision: 15, scale: 2 }),
102
+ licenseDetails: (0, pg_core_1.jsonb)("license_details").$type().default([]),
103
+ associateInfo: (0, pg_core_1.jsonb)("associate_info").$type().default([]),
104
+ tradeNames: (0, pg_core_1.jsonb)("trade_names").$type().default([]),
105
+ // Business Details
106
+ businessName: (0, pg_core_1.varchar)("business_name", { length: 255 }),
107
+ dbaName: (0, pg_core_1.varchar)("dba_name", { length: 255 }), // "Doing Business As"
108
+ businessRegistrationNumber: (0, pg_core_1.varchar)("business_registration_number", {
109
+ length: 100,
110
+ }),
111
+ taxIdentificationNumber: (0, pg_core_1.varchar)("tax_identification_number", {
112
+ length: 100,
113
+ }),
114
+ vatNumber: (0, pg_core_1.varchar)("vat_number", { length: 50 }),
115
+ // Address Information
116
+ businessAddress: (0, pg_core_1.jsonb)("business_address").$type(),
117
+ mailingAddress: (0, pg_core_1.jsonb)("mailing_address").$type(),
118
+ // Industry and Size
119
+ industry: (0, pg_core_1.varchar)("industry", { length: 100 }),
120
+ subIndustry: (0, pg_core_1.varchar)("sub_industry", { length: 100 }),
121
+ employeeCount: (0, pg_core_1.varchar)("employee_count", { length: 20 }).$type(),
122
+ // Financial Information
123
+ annualRevenue: (0, pg_core_1.varchar)("annual_revenue", { length: 30 }).$type(),
124
+ // Verification Status
125
+ isVerified: (0, pg_core_1.boolean)("is_verified").notNull().default(false),
126
+ verificationStatus: (0, pg_core_1.varchar)("verification_status", { length: 30 })
127
+ .notNull()
128
+ .default("PENDING")
129
+ .$type(),
130
+ verificationDocuments: (0, pg_core_1.jsonb)("verification_documents").$type(),
131
+ verifiedAt: (0, pg_core_1.timestamp)("verified_at", { withTimezone: true }),
132
+ verifiedBy: (0, pg_core_1.text)("verified_by"),
133
+ createdAt: (0, pg_core_1.timestamp)("created_at", { withTimezone: true })
134
+ .defaultNow()
135
+ .notNull(),
136
+ updatedAt: (0, pg_core_1.timestamp)("updated_at", { withTimezone: true })
137
+ .defaultNow()
138
+ .notNull(),
139
+ }, (table) => ({
140
+ storeIdIndex: (0, pg_core_1.index)("idx_business_details_store_id").on(table.storeId),
141
+ businessTypeIndex: (0, pg_core_1.index)("idx_business_details_type").on(table.businessType),
142
+ verificationStatusIndex: (0, pg_core_1.index)("idx_business_details_verification").on(table.verificationStatus),
143
+ industryIndex: (0, pg_core_1.index)("idx_business_details_industry").on(table.industry),
144
+ // Composite indexes for verification workflows
145
+ verificationWorkflowIndex: (0, pg_core_1.index)("idx_business_verification_workflow").on(table.verificationStatus, table.businessType),
146
+ // Ethiopian indexes
147
+ tinIndex: (0, pg_core_1.index)("idx_business_details_tin").on(table.taxIdentificationNumber),
148
+ registrationDateIndex: (0, pg_core_1.index)("idx_business_details_registration_date").on(table.registrationDate),
149
+ }));
150
+ // Store Contacts Table - Enhanced
151
+ exports.storeContacts = (0, pg_core_1.pgTable)("store_contacts", {
152
+ id: (0, pg_core_1.text)("id")
153
+ .primaryKey()
154
+ .$defaultFn(() => (0, cuid2_1.createId)()),
155
+ storeId: (0, pg_core_1.text)("store_id")
156
+ .notNull()
157
+ .references(() => exports.stores.id, { onDelete: "cascade" }),
158
+ // Primary Contact Information
159
+ contactEmail: (0, pg_core_1.varchar)("contact_email", { length: 255 }).notNull(),
160
+ contactName: (0, pg_core_1.varchar)("contact_name", { length: 255 }),
161
+ contactTitle: (0, pg_core_1.varchar)("contact_title", { length: 100 }),
162
+ // Departmental Emails
163
+ supportEmail: (0, pg_core_1.varchar)("support_email", { length: 255 }),
164
+ salesEmail: (0, pg_core_1.varchar)("sales_email", { length: 255 }),
165
+ technicalEmail: (0, pg_core_1.varchar)("technical_email", { length: 255 }),
166
+ billingEmail: (0, pg_core_1.varchar)("billing_email", { length: 255 }),
167
+ marketingEmail: (0, pg_core_1.varchar)("marketing_email", { length: 255 }),
168
+ legalEmail: (0, pg_core_1.varchar)("legal_email", { length: 255 }),
169
+ // Phone Numbers with international support
170
+ primaryPhone: (0, pg_core_1.varchar)("primary_phone", { length: 20 }),
171
+ supportPhone: (0, pg_core_1.varchar)("support_phone", { length: 20 }),
172
+ whatsappNumber: (0, pg_core_1.varchar)("whatsapp_number", { length: 20 }),
173
+ faxNumber: (0, pg_core_1.varchar)("fax_number", { length: 20 }),
174
+ // Business Hours
175
+ businessHours: (0, pg_core_1.jsonb)("business_hours").$type(),
176
+ // Emergency and After-hours Contact
177
+ emergencyContact: (0, pg_core_1.jsonb)("emergency_contact").$type(),
178
+ // Communication Preferences
179
+ preferredContactMethod: (0, pg_core_1.varchar)("preferred_contact_method", { length: 20 })
180
+ .$type()
181
+ .default("EMAIL"),
182
+ // Social Media and Other Channels
183
+ communicationChannels: (0, pg_core_1.jsonb)("communication_channels").$type(),
184
+ createdAt: (0, pg_core_1.timestamp)("created_at", { withTimezone: true })
185
+ .defaultNow()
186
+ .notNull(),
187
+ updatedAt: (0, pg_core_1.timestamp)("updated_at", { withTimezone: true })
188
+ .defaultNow()
189
+ .notNull(),
190
+ }, (table) => ({
191
+ storeIdIndex: (0, pg_core_1.index)("idx_contacts_store_id").on(table.storeId),
192
+ contactEmailIndex: (0, pg_core_1.index)("idx_contacts_email").on(table.contactEmail),
193
+ preferredMethodIndex: (0, pg_core_1.index)("idx_contacts_preferred_method").on(table.preferredContactMethod),
194
+ }));
195
+ // Store Social Profiles Table - Enhanced
196
+ exports.storeSocialProfiles = (0, pg_core_1.pgTable)("store_social_profiles", {
197
+ id: (0, pg_core_1.text)("id")
198
+ .primaryKey()
199
+ .$defaultFn(() => (0, cuid2_1.createId)()),
200
+ storeId: (0, pg_core_1.text)("store_id")
201
+ .notNull()
202
+ .references(() => exports.stores.id, { onDelete: "cascade" }),
203
+ // Major Social Platforms
204
+ facebookUrl: (0, pg_core_1.varchar)("facebook_url", { length: 500 }),
205
+ facebookEnabled: (0, pg_core_1.boolean)("facebook_enabled").notNull().default(false),
206
+ facebookPageId: (0, pg_core_1.varchar)("facebook_page_id", { length: 100 }),
207
+ instagramUrl: (0, pg_core_1.varchar)("instagram_url", { length: 500 }),
208
+ instagramEnabled: (0, pg_core_1.boolean)("instagram_enabled").notNull().default(false),
209
+ instagramHandle: (0, pg_core_1.varchar)("instagram_handle", { length: 100 }),
210
+ twitterUrl: (0, pg_core_1.varchar)("twitter_url", { length: 500 }),
211
+ twitterEnabled: (0, pg_core_1.boolean)("twitter_enabled").notNull().default(false),
212
+ twitterHandle: (0, pg_core_1.varchar)("twitter_handle", { length: 100 }),
213
+ linkedinUrl: (0, pg_core_1.varchar)("linkedin_url", { length: 500 }),
214
+ linkedinEnabled: (0, pg_core_1.boolean)("linkedin_enabled").notNull().default(false),
215
+ linkedinPageId: (0, pg_core_1.varchar)("linkedin_page_id", { length: 100 }),
216
+ youtubeUrl: (0, pg_core_1.varchar)("youtube_url", { length: 500 }),
217
+ youtubeEnabled: (0, pg_core_1.boolean)("youtube_enabled").notNull().default(false),
218
+ youtubeChannelId: (0, pg_core_1.varchar)("youtube_channel_id", { length: 100 }),
219
+ tiktokUrl: (0, pg_core_1.varchar)("tiktok_url", { length: 500 }),
220
+ tiktokEnabled: (0, pg_core_1.boolean)("tiktok_enabled").notNull().default(false),
221
+ tiktokHandle: (0, pg_core_1.varchar)("tiktok_handle", { length: 100 }),
222
+ pinterestUrl: (0, pg_core_1.varchar)("pinterest_url", { length: 500 }),
223
+ pinterestEnabled: (0, pg_core_1.boolean)("pinterest_enabled").notNull().default(false),
224
+ pinterestHandle: (0, pg_core_1.varchar)("pinterest_handle", { length: 100 }),
225
+ // Professional and Niche Platforms
226
+ githubUrl: (0, pg_core_1.varchar)("github_url", { length: 500 }),
227
+ githubEnabled: (0, pg_core_1.boolean)("github_enabled").notNull().default(false),
228
+ snapchatUrl: (0, pg_core_1.varchar)("snapchat_url", { length: 500 }),
229
+ snapchatEnabled: (0, pg_core_1.boolean)("snapchat_enabled").notNull().default(false),
230
+ redditUrl: (0, pg_core_1.varchar)("reddit_url", { length: 500 }),
231
+ redditEnabled: (0, pg_core_1.boolean)("reddit_enabled").notNull().default(false),
232
+ // Messaging Platforms
233
+ discordUrl: (0, pg_core_1.varchar)("discord_url", { length: 500 }),
234
+ discordEnabled: (0, pg_core_1.boolean)("discord_enabled").notNull().default(false),
235
+ telegramUrl: (0, pg_core_1.varchar)("telegram_url", { length: 500 }),
236
+ telegramEnabled: (0, pg_core_1.boolean)("telegram_enabled").notNull().default(false),
237
+ whatsappUrl: (0, pg_core_1.varchar)("whatsapp_url", { length: 500 }),
238
+ whatsappEnabled: (0, pg_core_1.boolean)("whatsapp_enabled").notNull().default(false),
239
+ // Custom and Regional Platforms
240
+ customPlatforms: (0, pg_core_1.jsonb)("custom_platforms")
241
+ .$type()
242
+ .default([]),
243
+ // Social Media Strategy
244
+ socialMediaStrategy: (0, pg_core_1.jsonb)("social_media_strategy").$type(),
245
+ // Analytics and Tracking
246
+ socialAnalytics: (0, pg_core_1.jsonb)("social_analytics")
247
+ .$type()
248
+ .default({ trackingEnabled: false }),
249
+ createdAt: (0, pg_core_1.timestamp)("created_at", { withTimezone: true })
250
+ .defaultNow()
251
+ .notNull(),
252
+ updatedAt: (0, pg_core_1.timestamp)("updated_at", { withTimezone: true })
253
+ .defaultNow()
254
+ .notNull(),
255
+ }, (table) => ({
256
+ storeIdIndex: (0, pg_core_1.index)("idx_social_store_id").on(table.storeId),
257
+ // Index for enabled platforms for quick filtering
258
+ enabledPlatformsIndex: (0, pg_core_1.index)("idx_social_enabled_facebook").on(table.storeId, table.facebookEnabled),
259
+ enabledInstagramIndex: (0, pg_core_1.index)("idx_social_enabled_instagram").on(table.storeId, table.instagramEnabled),
260
+ enabledTwitterIndex: (0, pg_core_1.index)("idx_social_enabled_twitter").on(table.storeId, table.twitterEnabled),
261
+ }));
262
+ // Store Blogs Table - Enhanced
263
+ exports.storeBlogs = (0, pg_core_1.pgTable)("store_blogs", {
264
+ id: (0, pg_core_1.text)("id")
265
+ .primaryKey()
266
+ .$defaultFn(() => (0, cuid2_1.createId)()),
267
+ storeId: (0, pg_core_1.text)("store_id")
268
+ .notNull()
269
+ .references(() => exports.stores.id, { onDelete: "cascade" }),
270
+ // Content
271
+ title: (0, pg_core_1.varchar)("title", { length: 255 }).notNull(),
272
+ slug: (0, pg_core_1.varchar)("slug", { length: 255 }).notNull(),
273
+ excerpt: (0, pg_core_1.text)("excerpt"),
274
+ content: (0, pg_core_1.text)("content").notNull(),
275
+ // Media
276
+ featuredImage: (0, pg_core_1.varchar)("featured_image", { length: 500 }),
277
+ gallery: (0, pg_core_1.jsonb)("gallery").$type().default([]),
278
+ media: (0, pg_core_1.jsonb)("media")
279
+ .$type()
280
+ .default([]),
281
+ // SEO and Metadata
282
+ metaTitle: (0, pg_core_1.varchar)("meta_title", { length: 255 }),
283
+ metaDescription: (0, pg_core_1.text)("meta_description"),
284
+ metaKeywords: (0, pg_core_1.jsonb)("meta_keywords").$type().default([]),
285
+ canonicalUrl: (0, pg_core_1.varchar)("canonical_url", { length: 500 }),
286
+ // Content Organization
287
+ categoryId: (0, pg_core_1.text)("category_id"),
288
+ tags: (0, pg_core_1.jsonb)("tags").$type().notNull().default([]),
289
+ topics: (0, pg_core_1.jsonb)("topics").$type().default([]),
290
+ // Publishing
291
+ status: (0, pg_core_1.varchar)("status", { length: 20 })
292
+ .notNull()
293
+ .default("draft")
294
+ .$type(),
295
+ publishedAt: (0, pg_core_1.timestamp)("published_at", { withTimezone: true }),
296
+ scheduledFor: (0, pg_core_1.timestamp)("scheduled_for", { withTimezone: true }),
297
+ // Authoring
298
+ authors: (0, pg_core_1.jsonb)("authors")
299
+ .$type()
300
+ .notNull()
301
+ .default([]),
302
+ // Engagement and Analytics
303
+ viewCount: (0, pg_core_1.integer)("view_count").default(0),
304
+ likeCount: (0, pg_core_1.integer)("like_count").default(0),
305
+ shareCount: (0, pg_core_1.integer)("share_count").default(0),
306
+ commentCount: (0, pg_core_1.integer)("comment_count").default(0),
307
+ // Content Settings
308
+ allowComments: (0, pg_core_1.boolean)("allow_comments").notNull().default(true),
309
+ allowSharing: (0, pg_core_1.boolean)("allow_sharing").notNull().default(true),
310
+ allowRating: (0, pg_core_1.boolean)("allow_rating").notNull().default(false),
311
+ // Features
312
+ isFeatured: (0, pg_core_1.boolean)("is_featured").notNull().default(false),
313
+ isSticky: (0, pg_core_1.boolean)("is_sticky").notNull().default(false),
314
+ isPremium: (0, pg_core_1.boolean)("is_premium").notNull().default(false),
315
+ // Reading Experience
316
+ estimatedReadTime: (0, pg_core_1.integer)("estimated_read_time"), // in minutes
317
+ difficulty: (0, pg_core_1.varchar)("difficulty", { length: 20 }).$type(),
318
+ // Language and Localization
319
+ language: (0, pg_core_1.varchar)("language", { length: 10 }).default("en"),
320
+ translations: (0, pg_core_1.jsonb)("translations")
321
+ .$type()
322
+ .default({}),
323
+ createdAt: (0, pg_core_1.timestamp)("created_at", { withTimezone: true })
324
+ .defaultNow()
325
+ .notNull(),
326
+ updatedAt: (0, pg_core_1.timestamp)("updated_at", { withTimezone: true })
327
+ .defaultNow()
328
+ .notNull(),
329
+ }, (table) => ({
330
+ storeIdIndex: (0, pg_core_1.index)("idx_blog_store_id").on(table.storeId),
331
+ slugUniqueIndex: (0, pg_core_1.unique)("idx_blog_slug_unique").on(table.storeId, table.slug),
332
+ statusIndex: (0, pg_core_1.index)("idx_blog_status").on(table.status),
333
+ publishedAtIndex: (0, pg_core_1.index)("idx_blog_published_at").on(table.publishedAt),
334
+ // Content discovery indexes
335
+ featuredIndex: (0, pg_core_1.index)("idx_blog_featured").on(table.isFeatured, table.status),
336
+ categoryIndex: (0, pg_core_1.index)("idx_blog_category").on(table.categoryId, table.status),
337
+ // Performance indexes
338
+ viewCountIndex: (0, pg_core_1.index)("idx_blog_view_count").on(table.viewCount),
339
+ // Publishing workflow indexes
340
+ publishingWorkflowIndex: (0, pg_core_1.index)("idx_blog_publishing_workflow").on(table.status, table.scheduledFor),
341
+ }));
342
+ // Relations
343
+ exports.storesRelations = (0, drizzle_orm_1.relations)(exports.stores, ({ one, many }) => ({
344
+ businessDetails: one(exports.storeBusinessDetails, {
345
+ fields: [exports.stores.id],
346
+ references: [exports.storeBusinessDetails.storeId],
347
+ }),
348
+ contacts: one(exports.storeContacts, {
349
+ fields: [exports.stores.id],
350
+ references: [exports.storeContacts.storeId],
351
+ }),
352
+ socialProfiles: one(exports.storeSocialProfiles, {
353
+ fields: [exports.stores.id],
354
+ references: [exports.storeSocialProfiles.storeId],
355
+ }),
356
+ blogs: many(exports.storeBlogs),
357
+ }));
358
+ exports.storeBusinessDetailsRelations = (0, drizzle_orm_1.relations)(exports.storeBusinessDetails, ({ one }) => ({
359
+ store: one(exports.stores, {
360
+ fields: [exports.storeBusinessDetails.storeId],
361
+ references: [exports.stores.id],
362
+ }),
363
+ }));
364
+ exports.storeContactsRelations = (0, drizzle_orm_1.relations)(exports.storeContacts, ({ one }) => ({
365
+ store: one(exports.stores, {
366
+ fields: [exports.storeContacts.storeId],
367
+ references: [exports.stores.id],
368
+ }),
369
+ }));
370
+ exports.storeSocialProfilesRelations = (0, drizzle_orm_1.relations)(exports.storeSocialProfiles, ({ one }) => ({
371
+ store: one(exports.stores, {
372
+ fields: [exports.storeSocialProfiles.storeId],
373
+ references: [exports.stores.id],
374
+ }),
375
+ }));
376
+ exports.storeBlogsRelations = (0, drizzle_orm_1.relations)(exports.storeBlogs, ({ one }) => ({
377
+ store: one(exports.stores, {
378
+ fields: [exports.storeBlogs.storeId],
379
+ references: [exports.stores.id],
380
+ }),
381
+ }));