@vezlo/assistant-server 1.4.0 → 2.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 (107) hide show
  1. package/README.md +56 -4
  2. package/database-schema.sql +193 -33
  3. package/dist/knexfile.d.ts.map +1 -1
  4. package/dist/knexfile.js +17 -8
  5. package/dist/knexfile.js.map +1 -1
  6. package/dist/src/config/database.d.ts.map +1 -1
  7. package/dist/src/config/database.js +9 -1
  8. package/dist/src/config/database.js.map +1 -1
  9. package/dist/src/config/knex.d.ts.map +1 -1
  10. package/dist/src/config/knex.js +22 -2
  11. package/dist/src/config/knex.js.map +1 -1
  12. package/dist/src/config/swagger.d.ts.map +1 -1
  13. package/dist/src/config/swagger.js +18 -71
  14. package/dist/src/config/swagger.js.map +1 -1
  15. package/dist/src/controllers/ApiKeyController.d.ts +17 -0
  16. package/dist/src/controllers/ApiKeyController.d.ts.map +1 -0
  17. package/dist/src/controllers/ApiKeyController.js +84 -0
  18. package/dist/src/controllers/ApiKeyController.js.map +1 -0
  19. package/dist/src/controllers/AuthController.d.ts +14 -0
  20. package/dist/src/controllers/AuthController.d.ts.map +1 -0
  21. package/dist/src/controllers/AuthController.js +212 -0
  22. package/dist/src/controllers/AuthController.js.map +1 -0
  23. package/dist/src/controllers/ChatController.d.ts +8 -5
  24. package/dist/src/controllers/ChatController.d.ts.map +1 -1
  25. package/dist/src/controllers/ChatController.js +139 -31
  26. package/dist/src/controllers/ChatController.js.map +1 -1
  27. package/dist/src/controllers/KnowledgeController.d.ts +5 -4
  28. package/dist/src/controllers/KnowledgeController.d.ts.map +1 -1
  29. package/dist/src/controllers/KnowledgeController.js +54 -16
  30. package/dist/src/controllers/KnowledgeController.js.map +1 -1
  31. package/dist/src/middleware/auth.d.ts +51 -0
  32. package/dist/src/middleware/auth.d.ts.map +1 -0
  33. package/dist/src/middleware/auth.js +232 -0
  34. package/dist/src/middleware/auth.js.map +1 -0
  35. package/dist/src/middleware/errorHandler.d.ts.map +1 -1
  36. package/dist/src/middleware/errorHandler.js +13 -19
  37. package/dist/src/middleware/errorHandler.js.map +1 -1
  38. package/dist/src/migrations/001_initial_schema.d.ts.map +1 -1
  39. package/dist/src/migrations/001_initial_schema.js +39 -64
  40. package/dist/src/migrations/001_initial_schema.js.map +1 -1
  41. package/dist/src/migrations/002_multitenancy_schema.d.ts +4 -0
  42. package/dist/src/migrations/002_multitenancy_schema.d.ts.map +1 -0
  43. package/dist/src/migrations/002_multitenancy_schema.js +119 -0
  44. package/dist/src/migrations/002_multitenancy_schema.js.map +1 -0
  45. package/dist/src/schemas/AuthSchemas.d.ts +89 -0
  46. package/dist/src/schemas/AuthSchemas.d.ts.map +1 -0
  47. package/dist/src/schemas/AuthSchemas.js +63 -0
  48. package/dist/src/schemas/AuthSchemas.js.map +1 -0
  49. package/dist/src/schemas/CommonSchemas.d.ts +62 -0
  50. package/dist/src/schemas/CommonSchemas.d.ts.map +1 -0
  51. package/dist/src/schemas/CommonSchemas.js +65 -0
  52. package/dist/src/schemas/CommonSchemas.js.map +1 -0
  53. package/dist/src/schemas/ConversationSchemas.d.ts +64 -27
  54. package/dist/src/schemas/ConversationSchemas.d.ts.map +1 -1
  55. package/dist/src/schemas/ConversationSchemas.js +28 -9
  56. package/dist/src/schemas/ConversationSchemas.js.map +1 -1
  57. package/dist/src/schemas/FeedbackSchemas.d.ts +43 -5
  58. package/dist/src/schemas/FeedbackSchemas.d.ts.map +1 -1
  59. package/dist/src/schemas/FeedbackSchemas.js +20 -2
  60. package/dist/src/schemas/FeedbackSchemas.js.map +1 -1
  61. package/dist/src/schemas/KnowledgeSchemas.d.ts +114 -35
  62. package/dist/src/schemas/KnowledgeSchemas.d.ts.map +1 -1
  63. package/dist/src/schemas/KnowledgeSchemas.js +58 -16
  64. package/dist/src/schemas/KnowledgeSchemas.js.map +1 -1
  65. package/dist/src/schemas/MessageSchemas.d.ts +57 -8
  66. package/dist/src/schemas/MessageSchemas.d.ts.map +1 -1
  67. package/dist/src/schemas/MessageSchemas.js +22 -3
  68. package/dist/src/schemas/MessageSchemas.js.map +1 -1
  69. package/dist/src/schemas/index.d.ts +410 -68
  70. package/dist/src/schemas/index.d.ts.map +1 -1
  71. package/dist/src/schemas/index.js +8 -2
  72. package/dist/src/schemas/index.js.map +1 -1
  73. package/dist/src/server.js +1047 -613
  74. package/dist/src/server.js.map +1 -1
  75. package/dist/src/services/AIService.d.ts +1 -1
  76. package/dist/src/services/AIService.d.ts.map +1 -1
  77. package/dist/src/services/AIService.js +6 -2
  78. package/dist/src/services/AIService.js.map +1 -1
  79. package/dist/src/services/ApiKeyService.d.ts +38 -0
  80. package/dist/src/services/ApiKeyService.d.ts.map +1 -0
  81. package/dist/src/services/ApiKeyService.js +123 -0
  82. package/dist/src/services/ApiKeyService.js.map +1 -0
  83. package/dist/src/services/KnowledgeBaseService.d.ts +2 -2
  84. package/dist/src/services/KnowledgeBaseService.d.ts.map +1 -1
  85. package/dist/src/services/KnowledgeBaseService.js +9 -2
  86. package/dist/src/services/KnowledgeBaseService.js.map +1 -1
  87. package/dist/src/services/MigrationService.d.ts +1 -1
  88. package/dist/src/services/MigrationService.d.ts.map +1 -1
  89. package/dist/src/services/MigrationService.js +4 -8
  90. package/dist/src/services/MigrationService.js.map +1 -1
  91. package/dist/src/services/SetupService.d.ts +102 -0
  92. package/dist/src/services/SetupService.d.ts.map +1 -0
  93. package/dist/src/services/SetupService.js +343 -0
  94. package/dist/src/services/SetupService.js.map +1 -0
  95. package/dist/src/storage/ConversationRepository.d.ts.map +1 -1
  96. package/dist/src/storage/ConversationRepository.js +42 -8
  97. package/dist/src/storage/ConversationRepository.js.map +1 -1
  98. package/dist/src/storage/MessageRepository.d.ts.map +1 -1
  99. package/dist/src/storage/MessageRepository.js +23 -27
  100. package/dist/src/storage/MessageRepository.js.map +1 -1
  101. package/env.example +5 -0
  102. package/knexfile.ts +17 -8
  103. package/package.json +10 -2
  104. package/scripts/generate-key.js +124 -0
  105. package/scripts/seed-default.js +72 -0
  106. package/scripts/setup.js +148 -13
  107. package/scripts/validate-db.js +22 -6
package/README.md CHANGED
@@ -2,6 +2,24 @@
2
2
 
3
3
  🚀 **Production-ready Node.js/TypeScript API server** for the Vezlo AI Assistant platform - Complete backend APIs with Docker deployment and database migrations.
4
4
 
5
+ ## 🚨 Breaking Change Notice (v2.0.0)
6
+
7
+ **This version introduces multi-tenancy support with breaking changes. Existing data will not be migrated automatically.**
8
+
9
+ ### Migration Required
10
+ - **Database Schema**: New authentication and multi-tenancy tables
11
+ - **Auth Model**: Endpoints now use a mix of auth modes — some support JWT or API key, and select public endpoints remain for the chat widget
12
+ - **Data Structure**: Foreign key relationships updated for multi-tenancy
13
+
14
+ ### Quick Migration Steps
15
+ 1. **Upgrade**: `npm install @vezlo/assistant-server@latest`
16
+ 2. **Run migrations**: `npm run migrate:latest`
17
+ 3. **Setup**: `npm run seed-default`
18
+
19
+ See [CHANGELOG.md](./CHANGELOG.md) for complete migration guide.
20
+
21
+ ---
22
+
5
23
  ## 🏗️ Architecture
6
24
 
7
25
  - **Backend APIs** - RESTful API endpoints for AI chat and knowledge management
@@ -74,6 +92,8 @@ The wizard will guide you through:
74
92
  3. **Validation (non‑blocking)** - Tests Supabase API and DB connectivity
75
93
  4. **Migrations** - Runs Knex migrations if DB validation passes; otherwise shows how to run later
76
94
  5. **Environment** - Generates `.env` (does not overwrite if it already exists)
95
+ 6. **Default Data Seeding** - Creates default admin user and company
96
+ 7. **API Key Generation** - Generates API key for the default company
77
97
 
78
98
  After setup completes, start the server:
79
99
 
@@ -131,13 +151,22 @@ npm run migrate:latest
131
151
  curl "http://localhost:3000/api/migrate?key=$MIGRATION_SECRET_KEY"
132
152
  ```
133
153
 
154
+ #### 4. Create Default Admin & Generate API Key
155
+ ```bash
156
+ # Create default admin user and company (if not exists)
157
+ npm run seed-default
158
+
159
+ # Generate API key for library integration
160
+ npm run generate-key
161
+ ```
162
+
134
163
  Optional fallback (not recommended if using migrations):
135
164
  ```bash
136
165
  # Run raw SQL in Supabase Dashboard → SQL Editor
137
166
  cat database-schema.sql
138
167
  ```
139
168
 
140
- #### 4. Validate Setup
169
+ #### 5. Validate Setup
141
170
 
142
171
  ```bash
143
172
  # Verify database connection and tables
@@ -147,7 +176,7 @@ vezlo-validate
147
176
  npm run validate
148
177
  ```
149
178
 
150
- #### 5. Start Server
179
+ #### 6. Start Server
151
180
 
152
181
  ```bash
153
182
  # If installed globally
@@ -246,6 +275,11 @@ AI_MAX_TOKENS=1000
246
275
  # REQUIRED - Database Migration Security
247
276
  MIGRATION_SECRET_KEY=your-secure-migration-key-here
248
277
 
278
+ # REQUIRED - Authentication
279
+ JWT_SECRET=your-super-secret-jwt-key-here-change-this-in-production
280
+ DEFAULT_ADMIN_EMAIL=admin@vezlo.org
281
+ DEFAULT_ADMIN_PASSWORD=admin123
282
+
249
283
  # OPTIONAL - Server Configuration
250
284
  PORT=3000
251
285
  NODE_ENV=production
@@ -275,20 +309,36 @@ CHUNK_OVERLAP=200
275
309
  The package provides these command-line tools:
276
310
 
277
311
  ### vezlo-setup
278
- **Interactive setup wizard** that guides you through the complete configuration process. This CLI tool provides the same functionality as the web-based setup wizard but runs in your terminal.
312
+ Interactive setup wizard that guides you through configuration.
279
313
 
280
314
  ```bash
281
315
  vezlo-setup
282
316
  ```
283
317
 
318
+ ### vezlo-seed-default
319
+ Creates default admin user and company.
320
+
321
+ ```bash
322
+ vezlo-seed-default
323
+ ```
324
+
325
+ ### vezlo-generate-key
326
+ Generates API key for the default admin's company. The API key is used by src-to-kb library.
327
+
328
+ ```bash
329
+ vezlo-generate-key
330
+ ```
331
+
284
332
  ### vezlo-validate
285
333
  Validates database connection and verifies all tables exist.
334
+
286
335
  ```bash
287
336
  vezlo-validate
288
337
  ```
289
338
 
290
339
  ### vezlo-server
291
340
  Starts the API server.
341
+
292
342
  ```bash
293
343
  vezlo-server
294
344
  ```
@@ -562,6 +612,8 @@ Ensure all required environment variables are set:
562
612
  - `SUPABASE_DB_HOST`, `SUPABASE_DB_PASSWORD` (required for migrations)
563
613
  - `OPENAI_API_KEY` (required)
564
614
  - `MIGRATION_SECRET_KEY` (required for migration endpoints)
615
+ - `JWT_SECRET` (required for authentication)
616
+ - `DEFAULT_ADMIN_EMAIL` and `DEFAULT_ADMIN_PASSWORD` (required for initial setup)
565
617
  - `NODE_ENV=production`
566
618
  - `CORS_ORIGINS` (set to your domain)
567
619
  - `BASE_URL` (optional, for custom Swagger server URL)
@@ -648,4 +700,4 @@ This project is dual-licensed:
648
700
 
649
701
  ---
650
702
 
651
- **Status**: ✅ Production Ready | **Version**: 1.4.0 | **Node.js**: 20+ | **TypeScript**: 5+
703
+ **Status**: ✅ Production Ready | **Version**: 2.0.0 | **Node.js**: 20+ | **TypeScript**: 5+
@@ -1,49 +1,128 @@
1
- -- Vezlo AI Assistant - Modern Database Schema
2
- -- Finalized schema with conversation-based chat and unified knowledge base
1
+ -- Vezlo AI Assistant - Database Schema
2
+ -- Simplified schema dump with all tables, indexes, and constraints
3
3
  -- Run this in your Supabase SQL Editor
4
- -- All tables prefixed with 'vezlo_' to avoid conflicts with existing user tables
5
4
 
6
5
  -- Enable required extensions
7
6
  CREATE EXTENSION IF NOT EXISTS vector;
8
7
 
9
8
  -- ============================================================================
10
- -- CONVERSATIONS & MESSAGES SCHEMA (Modern 2-API Flow)
9
+ -- KNEX MIGRATION TRACKING TABLES
10
+ -- ============================================================================
11
+
12
+ -- Knex.js migration tracking table
13
+ CREATE TABLE IF NOT EXISTS knex_migrations (
14
+ id SERIAL PRIMARY KEY,
15
+ name VARCHAR(255) NOT NULL,
16
+ batch INTEGER NOT NULL,
17
+ migration_time TIMESTAMPTZ DEFAULT NOW()
18
+ );
19
+
20
+ -- Knex.js migration lock table
21
+ CREATE TABLE IF NOT EXISTS knex_migrations_lock (
22
+ index INTEGER PRIMARY KEY,
23
+ is_locked INTEGER
24
+ );
25
+
26
+ -- Insert initial migration entries (marks migrations as already run)
27
+ -- This ensures Knex knows the schema was created manually
28
+ -- Only insert if they don't already exist
29
+ INSERT INTO knex_migrations (name, batch, migration_time)
30
+ SELECT '001_initial_schema.ts', 1, NOW()
31
+ WHERE NOT EXISTS (SELECT 1 FROM knex_migrations WHERE name = '001_initial_schema.ts');
32
+
33
+ INSERT INTO knex_migrations (name, batch, migration_time)
34
+ SELECT '002_multitenancy_schema.ts', 1, NOW()
35
+ WHERE NOT EXISTS (SELECT 1 FROM knex_migrations WHERE name = '002_multitenancy_schema.ts');
36
+
37
+ -- Set migration lock to unlocked (0 = unlocked, 1 = locked)
38
+ INSERT INTO knex_migrations_lock (index, is_locked)
39
+ VALUES (1, 0)
40
+ ON CONFLICT (index) DO UPDATE SET is_locked = 0;
41
+
42
+ -- ============================================================================
43
+ -- USERS & COMPANIES SCHEMA (Multi-tenancy)
44
+ -- ============================================================================
45
+
46
+ CREATE TABLE IF NOT EXISTS vezlo_users (
47
+ id BIGSERIAL PRIMARY KEY,
48
+ uuid UUID DEFAULT gen_random_uuid() UNIQUE NOT NULL,
49
+ email TEXT UNIQUE NOT NULL,
50
+ name TEXT NOT NULL,
51
+ password_hash TEXT NOT NULL,
52
+ user_type TEXT DEFAULT 'internal', -- internal, external, admin
53
+ token_updated_at TIMESTAMPTZ DEFAULT NOW(),
54
+ created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
55
+ updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
56
+ );
57
+
58
+ CREATE TABLE IF NOT EXISTS vezlo_companies (
59
+ id BIGSERIAL PRIMARY KEY,
60
+ uuid UUID DEFAULT gen_random_uuid() UNIQUE NOT NULL,
61
+ name TEXT NOT NULL,
62
+ domain TEXT UNIQUE,
63
+ created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
64
+ updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
65
+ );
66
+
67
+ CREATE TABLE IF NOT EXISTS vezlo_user_company_profiles (
68
+ id BIGSERIAL PRIMARY KEY,
69
+ uuid UUID DEFAULT gen_random_uuid() UNIQUE NOT NULL,
70
+ user_id BIGINT NOT NULL REFERENCES vezlo_users(id) ON DELETE CASCADE,
71
+ company_id BIGINT NOT NULL REFERENCES vezlo_companies(id) ON DELETE CASCADE,
72
+ role TEXT DEFAULT 'user', -- admin, user, viewer
73
+ status TEXT DEFAULT 'active', -- active, inactive
74
+ created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
75
+ updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
76
+ UNIQUE(user_id, company_id)
77
+ );
78
+
79
+ CREATE TABLE IF NOT EXISTS vezlo_api_keys (
80
+ id BIGSERIAL PRIMARY KEY,
81
+ uuid UUID DEFAULT gen_random_uuid() UNIQUE NOT NULL,
82
+ company_id BIGINT NOT NULL REFERENCES vezlo_companies(id) ON DELETE CASCADE,
83
+ name TEXT NOT NULL,
84
+ key_hash TEXT NOT NULL,
85
+ expires_at TIMESTAMPTZ,
86
+ created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
87
+ updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
88
+ );
89
+
90
+ -- ============================================================================
91
+ -- CONVERSATIONS & MESSAGES SCHEMA
11
92
  -- ============================================================================
12
93
 
13
- -- Conversations table (renamed from chat_sessions)
14
94
  CREATE TABLE IF NOT EXISTS vezlo_conversations (
15
95
  id BIGSERIAL PRIMARY KEY,
16
96
  uuid UUID DEFAULT gen_random_uuid() UNIQUE NOT NULL,
17
- company_id BIGINT, -- Multi-tenancy support
18
- creator_id BIGINT NOT NULL, -- User who created conversation
97
+ company_id BIGINT, -- Foreign key added in migration 002
98
+ creator_id BIGINT NOT NULL,
19
99
  title TEXT NOT NULL,
20
100
  message_count INTEGER DEFAULT 0,
21
- created_at TIMESTAMPTZ DEFAULT NOW(),
22
- updated_at TIMESTAMPTZ DEFAULT NOW(),
23
- deleted_at TIMESTAMPTZ -- Soft delete
101
+ created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
102
+ updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
103
+ deleted_at TIMESTAMPTZ -- Soft delete
24
104
  );
25
105
 
26
- -- Messages table (supports parent-child relationships for regeneration)
27
106
  CREATE TABLE IF NOT EXISTS vezlo_messages (
28
107
  id BIGSERIAL PRIMARY KEY,
29
108
  uuid UUID DEFAULT gen_random_uuid() UNIQUE NOT NULL,
30
109
  conversation_id BIGINT NOT NULL REFERENCES vezlo_conversations(id) ON DELETE CASCADE,
31
110
  parent_message_id BIGINT REFERENCES vezlo_messages(id), -- For regeneration chains
32
- type TEXT NOT NULL, -- user, assistant, system
111
+ type TEXT NOT NULL, -- user, assistant, system
33
112
  content TEXT NOT NULL,
34
- status TEXT DEFAULT 'completed', -- generating, completed, stopped, failed
35
- metadata JSONB DEFAULT '{}', -- For tool_calls, tool_results, etc.
36
- created_at TIMESTAMPTZ DEFAULT NOW(),
37
- updated_at TIMESTAMPTZ DEFAULT NOW()
113
+ status TEXT DEFAULT 'completed', -- generating, completed, stopped, failed
114
+ metadata JSONB DEFAULT '{}', -- For tool_calls, tool_results, etc.
115
+ created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
116
+ updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
38
117
  );
39
118
 
40
- -- Message feedback table
41
119
  CREATE TABLE IF NOT EXISTS vezlo_message_feedback (
42
120
  id BIGSERIAL PRIMARY KEY,
43
121
  uuid UUID DEFAULT gen_random_uuid() UNIQUE NOT NULL,
44
122
  message_id BIGINT NOT NULL REFERENCES vezlo_messages(id) ON DELETE CASCADE,
45
- user_id BIGINT NOT NULL,
46
- rating TEXT NOT NULL, -- positive, negative
123
+ user_id BIGINT NOT NULL, -- Foreign key added in migration 002
124
+ company_id BIGINT, -- Added in migration 002 with foreign key
125
+ rating TEXT NOT NULL, -- positive, negative
47
126
  category TEXT,
48
127
  comment TEXT,
49
128
  suggested_improvement TEXT,
@@ -51,34 +130,98 @@ CREATE TABLE IF NOT EXISTS vezlo_message_feedback (
51
130
  );
52
131
 
53
132
  -- ============================================================================
54
- -- KNOWLEDGE BASE SCHEMA (Unified Single Table)
133
+ -- KNOWLEDGE BASE SCHEMA
55
134
  -- ============================================================================
56
135
 
57
- -- Knowledge items table (folders, documents, files, URLs - everything)
58
136
  CREATE TABLE IF NOT EXISTS vezlo_knowledge_items (
59
137
  id BIGSERIAL PRIMARY KEY,
60
138
  uuid UUID DEFAULT gen_random_uuid() UNIQUE NOT NULL,
61
139
  parent_id BIGINT REFERENCES vezlo_knowledge_items(id), -- Hierarchical structure
62
- company_id BIGINT, -- Multi-tenancy support
140
+ company_id BIGINT, -- Foreign key added in migration 002
63
141
  title TEXT NOT NULL,
64
142
  description TEXT,
65
- type TEXT NOT NULL, -- folder, document, file, url, url_directory
66
- content TEXT, -- For document type
67
- file_url TEXT, -- For file/url types
68
- file_size BIGINT, -- File size in bytes
69
- file_type TEXT, -- MIME type for files
70
- metadata JSONB DEFAULT '{}', -- Flexible metadata storage
71
- embedding vector(1536), -- OpenAI embeddings for search
72
- processed_at TIMESTAMPTZ, -- When embedding was generated
143
+ type TEXT NOT NULL, -- folder, document, file, url, url_directory
144
+ content TEXT, -- For document type
145
+ file_url TEXT, -- For file/url types
146
+ file_size BIGINT, -- File size in bytes
147
+ file_type TEXT, -- MIME type for files
148
+ metadata JSONB DEFAULT '{}', -- Flexible metadata storage
149
+ embedding vector(1536), -- OpenAI embeddings for search
150
+ processed_at TIMESTAMPTZ, -- When embedding was generated
73
151
  created_by BIGINT NOT NULL,
74
- created_at TIMESTAMPTZ DEFAULT NOW(),
75
- updated_at TIMESTAMPTZ DEFAULT NOW()
152
+ created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
153
+ updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
76
154
  );
77
155
 
156
+ -- ============================================================================
157
+ -- ADD FOREIGN KEY CONSTRAINTS (Matching Migration 002)
158
+ -- These constraints use explicit names matching Knex migration naming convention
159
+ -- for proper rollback compatibility: {table}_{column}_foreign
160
+ -- ============================================================================
161
+
162
+ -- Add foreign keys to vezlo_conversations (added in migration 002)
163
+ DO $$
164
+ BEGIN
165
+ IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'vezlo_conversations_company_id_foreign') THEN
166
+ ALTER TABLE vezlo_conversations
167
+ ADD CONSTRAINT vezlo_conversations_company_id_foreign
168
+ FOREIGN KEY (company_id) REFERENCES vezlo_companies(id) ON DELETE CASCADE;
169
+ END IF;
170
+ END $$;
171
+
172
+ -- Add foreign keys to vezlo_knowledge_items (added in migration 002)
173
+ DO $$
174
+ BEGIN
175
+ IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'vezlo_knowledge_items_company_id_foreign') THEN
176
+ ALTER TABLE vezlo_knowledge_items
177
+ ADD CONSTRAINT vezlo_knowledge_items_company_id_foreign
178
+ FOREIGN KEY (company_id) REFERENCES vezlo_companies(id) ON DELETE CASCADE;
179
+ END IF;
180
+ END $$;
181
+
182
+ -- Add foreign keys to vezlo_message_feedback (added in migration 002)
183
+ DO $$
184
+ BEGIN
185
+ IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'vezlo_message_feedback_user_id_foreign') THEN
186
+ ALTER TABLE vezlo_message_feedback
187
+ ADD CONSTRAINT vezlo_message_feedback_user_id_foreign
188
+ FOREIGN KEY (user_id) REFERENCES vezlo_users(id) ON DELETE CASCADE;
189
+ END IF;
190
+
191
+ IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'vezlo_message_feedback_company_id_foreign') THEN
192
+ ALTER TABLE vezlo_message_feedback
193
+ ADD CONSTRAINT vezlo_message_feedback_company_id_foreign
194
+ FOREIGN KEY (company_id) REFERENCES vezlo_companies(id) ON DELETE CASCADE;
195
+ END IF;
196
+ END $$;
197
+
78
198
  -- ============================================================================
79
199
  -- INDEXES FOR PERFORMANCE
80
200
  -- ============================================================================
81
201
 
202
+ -- Users indexes
203
+ CREATE INDEX IF NOT EXISTS idx_vezlo_users_uuid ON vezlo_users(uuid);
204
+ CREATE INDEX IF NOT EXISTS idx_vezlo_users_email ON vezlo_users(email);
205
+ CREATE INDEX IF NOT EXISTS idx_vezlo_users_user_type ON vezlo_users(user_type);
206
+ CREATE INDEX IF NOT EXISTS idx_vezlo_users_token_updated_at ON vezlo_users(token_updated_at);
207
+
208
+ -- Companies indexes
209
+ CREATE INDEX IF NOT EXISTS idx_vezlo_companies_uuid ON vezlo_companies(uuid);
210
+ CREATE INDEX IF NOT EXISTS idx_vezlo_companies_domain ON vezlo_companies(domain);
211
+
212
+ -- User company profiles indexes
213
+ CREATE INDEX IF NOT EXISTS idx_vezlo_user_company_profiles_uuid ON vezlo_user_company_profiles(uuid);
214
+ CREATE INDEX IF NOT EXISTS idx_vezlo_user_company_profiles_user_id ON vezlo_user_company_profiles(user_id);
215
+ CREATE INDEX IF NOT EXISTS idx_vezlo_user_company_profiles_company_id ON vezlo_user_company_profiles(company_id);
216
+ CREATE INDEX IF NOT EXISTS idx_vezlo_user_company_profiles_role ON vezlo_user_company_profiles(role);
217
+ CREATE INDEX IF NOT EXISTS idx_vezlo_user_company_profiles_status ON vezlo_user_company_profiles(status);
218
+
219
+ -- API keys indexes
220
+ CREATE INDEX IF NOT EXISTS idx_vezlo_api_keys_uuid ON vezlo_api_keys(uuid);
221
+ CREATE INDEX IF NOT EXISTS idx_vezlo_api_keys_company_id ON vezlo_api_keys(company_id);
222
+ CREATE INDEX IF NOT EXISTS idx_vezlo_api_keys_key_hash ON vezlo_api_keys(key_hash);
223
+ CREATE INDEX IF NOT EXISTS idx_vezlo_api_keys_expires_at ON vezlo_api_keys(expires_at);
224
+
82
225
  -- Conversations indexes
83
226
  CREATE INDEX IF NOT EXISTS idx_vezlo_conversations_uuid ON vezlo_conversations(uuid);
84
227
  CREATE INDEX IF NOT EXISTS idx_vezlo_conversations_company_id ON vezlo_conversations(company_id);
@@ -98,6 +241,7 @@ CREATE INDEX IF NOT EXISTS idx_vezlo_messages_created_at ON vezlo_messages(creat
98
241
  CREATE INDEX IF NOT EXISTS idx_vezlo_feedback_uuid ON vezlo_message_feedback(uuid);
99
242
  CREATE INDEX IF NOT EXISTS idx_vezlo_feedback_message_id ON vezlo_message_feedback(message_id);
100
243
  CREATE INDEX IF NOT EXISTS idx_vezlo_feedback_user_id ON vezlo_message_feedback(user_id);
244
+ CREATE INDEX IF NOT EXISTS idx_vezlo_feedback_company_id ON vezlo_message_feedback(company_id);
101
245
  CREATE INDEX IF NOT EXISTS idx_vezlo_feedback_rating ON vezlo_message_feedback(rating);
102
246
 
103
247
  -- Knowledge items indexes
@@ -129,12 +273,28 @@ ON vezlo_knowledge_items(file_url) WHERE file_url IS NOT NULL;
129
273
  -- ============================================================================
130
274
 
131
275
  -- Enable RLS on all tables
276
+ ALTER TABLE vezlo_users ENABLE ROW LEVEL SECURITY;
277
+ ALTER TABLE vezlo_companies ENABLE ROW LEVEL SECURITY;
278
+ ALTER TABLE vezlo_user_company_profiles ENABLE ROW LEVEL SECURITY;
279
+ ALTER TABLE vezlo_api_keys ENABLE ROW LEVEL SECURITY;
132
280
  ALTER TABLE vezlo_conversations ENABLE ROW LEVEL SECURITY;
133
281
  ALTER TABLE vezlo_messages ENABLE ROW LEVEL SECURITY;
134
282
  ALTER TABLE vezlo_message_feedback ENABLE ROW LEVEL SECURITY;
135
283
  ALTER TABLE vezlo_knowledge_items ENABLE ROW LEVEL SECURITY;
136
284
 
137
285
  -- Policies for service role access (full access)
286
+ CREATE POLICY "Service role can access all users" ON vezlo_users
287
+ FOR ALL USING (auth.role() = 'service_role');
288
+
289
+ CREATE POLICY "Service role can access all companies" ON vezlo_companies
290
+ FOR ALL USING (auth.role() = 'service_role');
291
+
292
+ CREATE POLICY "Service role can access all user company profiles" ON vezlo_user_company_profiles
293
+ FOR ALL USING (auth.role() = 'service_role');
294
+
295
+ CREATE POLICY "Service role can access all API keys" ON vezlo_api_keys
296
+ FOR ALL USING (auth.role() = 'service_role');
297
+
138
298
  CREATE POLICY "Service role can access all conversations" ON vezlo_conversations
139
299
  FOR ALL USING (auth.role() = 'service_role');
140
300
 
@@ -150,6 +310,6 @@ CREATE POLICY "Service role can access all knowledge items" ON vezlo_knowledge_i
150
310
  -- Example company-based policies (uncomment and modify as needed)
151
311
  -- CREATE POLICY "Users can access their company conversations" ON vezlo_conversations
152
312
  -- FOR ALL USING (company_id = auth.jwt() ->> 'company_id');
153
-
313
+ --
154
314
  -- CREATE POLICY "Users can access their company knowledge" ON vezlo_knowledge_items
155
315
  -- FOR ALL USING (company_id = auth.jwt() ->> 'company_id');
@@ -1 +1 @@
1
- {"version":3,"file":"knexfile.d.ts","sourceRoot":"","sources":["../knexfile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAcjC,QAAA,MAAM,MAAM,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;CA4EzC,CAAC;AAEF,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"knexfile.d.ts","sourceRoot":"","sources":["../knexfile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAejC,QAAA,MAAM,MAAM,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;CAoFzC,CAAC;AAEF,eAAe,MAAM,CAAC"}
package/dist/knexfile.js CHANGED
@@ -4,6 +4,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const dotenv_1 = __importDefault(require("dotenv"));
7
+ const path = require('path');
7
8
  // Load environment variables
8
9
  dotenv_1.default.config();
9
10
  // Register ts-node for TypeScript support in migrations (works in all environments)
@@ -53,13 +54,14 @@ const config = {
53
54
  max: 20
54
55
  },
55
56
  migrations: {
56
- directory: './src/migrations',
57
+ // Use absolute path based on __dirname (knexfile.js location in dist/)
58
+ directory: path.join(__dirname, 'src/migrations'),
57
59
  tableName: 'knex_migrations',
58
- extension: 'ts'
60
+ extension: 'js'
59
61
  },
60
62
  seeds: {
61
- directory: './src/seeds',
62
- extension: 'ts'
63
+ directory: path.join(__dirname, 'src/seeds'),
64
+ extension: 'js'
63
65
  }
64
66
  },
65
67
  // For Supabase connection using connection string
@@ -78,13 +80,20 @@ const config = {
78
80
  max: 10
79
81
  },
80
82
  migrations: {
81
- directory: './src/migrations',
83
+ // In production (Vercel), knexfile.js is in dist/, so use absolute path
84
+ // In development, use relative path
85
+ directory: process.env.NODE_ENV === 'production'
86
+ ? path.join(__dirname, 'src/migrations')
87
+ : path.join(process.cwd(), 'src/migrations'),
82
88
  tableName: 'knex_migrations',
83
- extension: 'ts'
89
+ extension: process.env.NODE_ENV === 'production' ? 'js' : 'ts',
90
+ loadExtensions: process.env.NODE_ENV === 'production' ? ['.js'] : ['.ts']
84
91
  },
85
92
  seeds: {
86
- directory: './src/seeds',
87
- extension: 'ts'
93
+ directory: process.env.NODE_ENV === 'production'
94
+ ? path.join(__dirname, 'src/seeds')
95
+ : path.join(process.cwd(), 'src/seeds'),
96
+ extension: process.env.NODE_ENV === 'production' ? 'js' : 'ts'
88
97
  }
89
98
  }
90
99
  };
@@ -1 +1 @@
1
- {"version":3,"file":"knexfile.js","sourceRoot":"","sources":["../knexfile.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"knexfile.js","sourceRoot":"","sources":["../knexfile.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/config/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAIrE,wBAAgB,kBAAkB,IAAI,cAAc,CAoBnD;AAED,wBAAgB,iBAAiB,IAAI,cAAc,CAKlD"}
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../../src/config/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAIrE,wBAAgB,kBAAkB,IAAI,cAAc,CA4BnD;AAED,wBAAgB,iBAAiB,IAAI,cAAc,CAKlD"}
@@ -11,12 +11,20 @@ function initializeSupabase() {
11
11
  const supabaseUrl = process.env.SUPABASE_URL;
12
12
  const supabaseKey = process.env.SUPABASE_SERVICE_KEY || process.env.SUPABASE_ANON_KEY;
13
13
  if (!supabaseUrl || !supabaseKey) {
14
- throw new Error('SUPABASE_URL and SUPABASE_SERVICE_KEY environment variables are required');
14
+ throw new Error('SUPABASE_URL and SUPABASE_SERVICE_KEY (or SUPABASE_ANON_KEY as fallback) environment variables are required');
15
15
  }
16
16
  supabaseClient = (0, supabase_js_1.createClient)(supabaseUrl, supabaseKey, {
17
17
  auth: {
18
18
  autoRefreshToken: false,
19
19
  persistSession: false
20
+ },
21
+ db: {
22
+ schema: 'public'
23
+ },
24
+ global: {
25
+ headers: {
26
+ 'x-connection-string': supabaseUrl
27
+ }
20
28
  }
21
29
  });
22
30
  return supabaseClient;
@@ -1 +1 @@
1
- {"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/config/database.ts"],"names":[],"mappings":";;AAIA,gDAoBC;AAED,8CAKC;AA/BD,uDAAqE;AAErE,IAAI,cAAc,GAA0B,IAAI,CAAC;AAEjD,SAAgB,kBAAkB;IAChC,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAC7C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAEtF,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;IAC9F,CAAC;IAED,cAAc,GAAG,IAAA,0BAAY,EAAC,WAAW,EAAE,WAAW,EAAE;QACtD,IAAI,EAAE;YACJ,gBAAgB,EAAE,KAAK;YACvB,cAAc,EAAE,KAAK;SACtB;KACF,CAAC,CAAC;IAEH,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,SAAgB,iBAAiB;IAC/B,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC"}
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../../../src/config/database.ts"],"names":[],"mappings":";;AAIA,gDA4BC;AAED,8CAKC;AAvCD,uDAAqE;AAErE,IAAI,cAAc,GAA0B,IAAI,CAAC;AAEjD,SAAgB,kBAAkB;IAChC,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAC7C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAEtF,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,6GAA6G,CAAC,CAAC;IACjI,CAAC;IAED,cAAc,GAAG,IAAA,0BAAY,EAAC,WAAW,EAAE,WAAW,EAAE;QACtD,IAAI,EAAE;YACJ,gBAAgB,EAAE,KAAK;YACvB,cAAc,EAAE,KAAK;SACtB;QACD,EAAE,EAAE;YACF,MAAM,EAAE,QAAQ;SACjB;QACD,MAAM,EAAE;YACN,OAAO,EAAE;gBACP,qBAAqB,EAAE,WAAW;aACnC;SACF;KACF,CAAC,CAAC;IAEH,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,SAAgB,iBAAiB;IAC/B,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"knex.d.ts","sourceRoot":"","sources":["../../../src/config/knex.ts"],"names":[],"mappings":"AAAA,OAAa,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAgBlC,QAAA,MAAM,EAAE,EAAE,IAAwB,CAAC;AAGnC,eAAe,EAAE,CAAC;AAGlB,YAAY,EAAE,IAAI,EAAE,CAAC;AAGrB,eAAO,MAAM,aAAa,QAAa,OAAO,CAAC,IAAI,CAQlD,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAa,OAAO,CAAC,IAAI,CAQvD,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAa,OAAO,CAAC,MAAM,CAQzD,CAAC;AAGF,eAAO,MAAM,eAAe,QAAa,OAAO,CAAC,IAAI,CAOpD,CAAC"}
1
+ {"version":3,"file":"knex.d.ts","sourceRoot":"","sources":["../../../src/config/knex.ts"],"names":[],"mappings":"AAAA,OAAa,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAqClC,QAAA,MAAM,EAAE,EAAE,IAAwB,CAAC;AAGnC,eAAe,EAAE,CAAC;AAGlB,YAAY,EAAE,IAAI,EAAE,CAAC;AAGrB,eAAO,MAAM,aAAa,QAAa,OAAO,CAAC,IAAI,CAQlD,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAa,OAAO,CAAC,IAAI,CAQvD,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAa,OAAO,CAAC,MAAM,CAQzD,CAAC;AAGF,eAAO,MAAM,eAAe,QAAa,OAAO,CAAC,IAAI,CAOpD,CAAC"}
@@ -9,11 +9,31 @@ const knexfile_1 = __importDefault(require("../../knexfile"));
9
9
  // Get the appropriate configuration based on environment
10
10
  const getConfig = () => {
11
11
  const env = process.env.NODE_ENV || 'development';
12
+ console.log('🔧 Knex config loaded:', {
13
+ NODE_ENV: process.env.NODE_ENV,
14
+ environment: env,
15
+ SUPABASE_URL: process.env.SUPABASE_URL ? 'present' : 'not present',
16
+ processCwd: process.cwd(),
17
+ hasSupabaseConfig: !!knexfile_1.default.supabase,
18
+ hasEnvConfig: !!knexfile_1.default[env]
19
+ });
12
20
  // For Supabase, we can use the supabase config or fall back to environment-based config
13
21
  if (process.env.SUPABASE_URL) {
14
- return knexfile_1.default.supabase;
22
+ console.log('📋 Using supabase config');
23
+ const supabaseConfig = knexfile_1.default.supabase;
24
+ if (supabaseConfig.migrations) {
25
+ console.log('📁 Migration directory:', supabaseConfig.migrations.directory);
26
+ console.log('📁 Migration extension:', supabaseConfig.migrations.extension);
27
+ }
28
+ return supabaseConfig;
15
29
  }
16
- return knexfile_1.default[env] || knexfile_1.default.development;
30
+ console.log('📋 Using environment config:', env);
31
+ const envConfig = knexfile_1.default[env] || knexfile_1.default.development;
32
+ if (envConfig.migrations) {
33
+ console.log('📁 Migration directory:', envConfig.migrations.directory);
34
+ console.log('📁 Migration extension:', envConfig.migrations.extension);
35
+ }
36
+ return envConfig;
17
37
  };
18
38
  // Create Knex instance
19
39
  const db = (0, knex_1.default)(getConfig());
@@ -1 +1 @@
1
- {"version":3,"file":"knex.js","sourceRoot":"","sources":["../../../src/config/knex.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAkC;AAClC,8DAAoC;AAEpC,yDAAyD;AACzD,MAAM,SAAS,GAAG,GAAgB,EAAE;IAClC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa,CAAC;IAElD,wFAAwF;IACxF,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC7B,OAAO,kBAAM,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,OAAO,kBAAM,CAAC,GAAG,CAAC,IAAI,kBAAM,CAAC,WAAW,CAAC;AAC3C,CAAC,CAAC;AAEF,uBAAuB;AACvB,MAAM,EAAE,GAAS,IAAA,cAAI,EAAC,SAAS,EAAE,CAAC,CAAC;AAEnC,2BAA2B;AAC3B,kBAAe,EAAE,CAAC;AAKlB,mCAAmC;AAC5B,MAAM,aAAa,GAAG,KAAK,IAAmB,EAAE;IACrD,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;QAC5C,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AARW,QAAA,aAAa,iBAQxB;AAEK,MAAM,kBAAkB,GAAG,KAAK,IAAmB,EAAE;IAC1D,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAC5D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;QAC3C,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AARW,QAAA,kBAAkB,sBAQ7B;AAEK,MAAM,kBAAkB,GAAG,KAAK,IAAqB,EAAE;IAC5D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACzC,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;QAC1D,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AARW,QAAA,kBAAkB,sBAQ7B;AAEF,oBAAoB;AACb,MAAM,eAAe,GAAG,KAAK,IAAmB,EAAE;IACvD,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC,CAAC;AAPW,QAAA,eAAe,mBAO1B"}
1
+ {"version":3,"file":"knex.js","sourceRoot":"","sources":["../../../src/config/knex.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAkC;AAClC,8DAAoC;AAEpC,yDAAyD;AACzD,MAAM,SAAS,GAAG,GAAgB,EAAE;IAClC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa,CAAC;IAElD,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE;QACpC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ;QAC9B,WAAW,EAAE,GAAG;QAChB,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa;QAClE,UAAU,EAAE,OAAO,CAAC,GAAG,EAAE;QACzB,iBAAiB,EAAE,CAAC,CAAC,kBAAM,CAAC,QAAQ;QACpC,YAAY,EAAE,CAAC,CAAC,kBAAM,CAAC,GAAG,CAAC;KAC5B,CAAC,CAAC;IAEH,wFAAwF;IACxF,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,MAAM,cAAc,GAAG,kBAAM,CAAC,QAAQ,CAAC;QACvC,IAAI,cAAc,CAAC,UAAU,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAG,cAAc,CAAC,UAAkB,CAAC,SAAS,CAAC,CAAC;YACrF,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAG,cAAc,CAAC,UAAkB,CAAC,SAAS,CAAC,CAAC;QACvF,CAAC;QACD,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,kBAAM,CAAC,GAAG,CAAC,IAAI,kBAAM,CAAC,WAAW,CAAC;IACpD,IAAI,SAAS,CAAC,UAAU,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAG,SAAS,CAAC,UAAkB,CAAC,SAAS,CAAC,CAAC;QAChF,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAG,SAAS,CAAC,UAAkB,CAAC,SAAS,CAAC,CAAC;IAClF,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,uBAAuB;AACvB,MAAM,EAAE,GAAS,IAAA,cAAI,EAAC,SAAS,EAAE,CAAC,CAAC;AAEnC,2BAA2B;AAC3B,kBAAe,EAAE,CAAC;AAKlB,mCAAmC;AAC5B,MAAM,aAAa,GAAG,KAAK,IAAmB,EAAE;IACrD,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;QAC5C,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AARW,QAAA,aAAa,iBAQxB;AAEK,MAAM,kBAAkB,GAAG,KAAK,IAAmB,EAAE;IAC1D,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;IAC5D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;QAC3C,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AARW,QAAA,kBAAkB,sBAQ7B;AAEK,MAAM,kBAAkB,GAAG,KAAK,IAAqB,EAAE;IAC5D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACzC,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,KAAK,CAAC,CAAC;QAC1D,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AARW,QAAA,kBAAkB,sBAQ7B;AAEF,oBAAoB;AACb,MAAM,eAAe,GAAG,KAAK,IAAmB,EAAE;IACvD,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,KAAK,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC,CAAC;AAPW,QAAA,eAAe,mBAO1B"}
@@ -1 +1 @@
1
- {"version":3,"file":"swagger.d.ts","sourceRoot":"","sources":["../../../src/config/swagger.ts"],"names":[],"mappings":"AAEA,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAiO3C,eAAO,MAAM,KAAK,QAAwB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,CAAC;AACrB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;CAoB5B,CAAC"}
1
+ {"version":3,"file":"swagger.d.ts","sourceRoot":"","sources":["../../../src/config/swagger.ts"],"names":[],"mappings":"AAEA,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAwK3C,eAAO,MAAM,KAAK,QAAwB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,CAAC;AACrB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;CAoB5B,CAAC"}