@vezlo/assistant-server 1.4.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +56 -4
- package/database-schema.sql +200 -35
- package/dist/knexfile.d.ts.map +1 -1
- package/dist/knexfile.js +17 -8
- package/dist/knexfile.js.map +1 -1
- package/dist/src/config/database.d.ts.map +1 -1
- package/dist/src/config/database.js +9 -1
- package/dist/src/config/database.js.map +1 -1
- package/dist/src/config/knex.d.ts.map +1 -1
- package/dist/src/config/knex.js +22 -2
- package/dist/src/config/knex.js.map +1 -1
- package/dist/src/config/swagger.d.ts.map +1 -1
- package/dist/src/config/swagger.js +18 -71
- package/dist/src/config/swagger.js.map +1 -1
- package/dist/src/controllers/ApiKeyController.d.ts +17 -0
- package/dist/src/controllers/ApiKeyController.d.ts.map +1 -0
- package/dist/src/controllers/ApiKeyController.js +84 -0
- package/dist/src/controllers/ApiKeyController.js.map +1 -0
- package/dist/src/controllers/AuthController.d.ts +14 -0
- package/dist/src/controllers/AuthController.d.ts.map +1 -0
- package/dist/src/controllers/AuthController.js +212 -0
- package/dist/src/controllers/AuthController.js.map +1 -0
- package/dist/src/controllers/ChatController.d.ts +8 -5
- package/dist/src/controllers/ChatController.d.ts.map +1 -1
- package/dist/src/controllers/ChatController.js +139 -31
- package/dist/src/controllers/ChatController.js.map +1 -1
- package/dist/src/controllers/KnowledgeController.d.ts +5 -4
- package/dist/src/controllers/KnowledgeController.d.ts.map +1 -1
- package/dist/src/controllers/KnowledgeController.js +54 -16
- package/dist/src/controllers/KnowledgeController.js.map +1 -1
- package/dist/src/middleware/auth.d.ts +51 -0
- package/dist/src/middleware/auth.d.ts.map +1 -0
- package/dist/src/middleware/auth.js +232 -0
- package/dist/src/middleware/auth.js.map +1 -0
- package/dist/src/middleware/errorHandler.d.ts.map +1 -1
- package/dist/src/middleware/errorHandler.js +13 -19
- package/dist/src/middleware/errorHandler.js.map +1 -1
- package/dist/src/migrations/001_initial_schema.d.ts.map +1 -1
- package/dist/src/migrations/001_initial_schema.js +40 -64
- package/dist/src/migrations/001_initial_schema.js.map +1 -1
- package/dist/src/migrations/002_multitenancy_schema.d.ts +4 -0
- package/dist/src/migrations/002_multitenancy_schema.d.ts.map +1 -0
- package/dist/src/migrations/002_multitenancy_schema.js +119 -0
- package/dist/src/migrations/002_multitenancy_schema.js.map +1 -0
- package/dist/src/migrations/003_drop_content_index.d.ts +4 -0
- package/dist/src/migrations/003_drop_content_index.d.ts.map +1 -0
- package/dist/src/migrations/003_drop_content_index.js +19 -0
- package/dist/src/migrations/003_drop_content_index.js.map +1 -0
- package/dist/src/schemas/AuthSchemas.d.ts +89 -0
- package/dist/src/schemas/AuthSchemas.d.ts.map +1 -0
- package/dist/src/schemas/AuthSchemas.js +63 -0
- package/dist/src/schemas/AuthSchemas.js.map +1 -0
- package/dist/src/schemas/CommonSchemas.d.ts +62 -0
- package/dist/src/schemas/CommonSchemas.d.ts.map +1 -0
- package/dist/src/schemas/CommonSchemas.js +65 -0
- package/dist/src/schemas/CommonSchemas.js.map +1 -0
- package/dist/src/schemas/ConversationSchemas.d.ts +64 -27
- package/dist/src/schemas/ConversationSchemas.d.ts.map +1 -1
- package/dist/src/schemas/ConversationSchemas.js +28 -9
- package/dist/src/schemas/ConversationSchemas.js.map +1 -1
- package/dist/src/schemas/FeedbackSchemas.d.ts +43 -5
- package/dist/src/schemas/FeedbackSchemas.d.ts.map +1 -1
- package/dist/src/schemas/FeedbackSchemas.js +20 -2
- package/dist/src/schemas/FeedbackSchemas.js.map +1 -1
- package/dist/src/schemas/KnowledgeSchemas.d.ts +114 -35
- package/dist/src/schemas/KnowledgeSchemas.d.ts.map +1 -1
- package/dist/src/schemas/KnowledgeSchemas.js +58 -16
- package/dist/src/schemas/KnowledgeSchemas.js.map +1 -1
- package/dist/src/schemas/MessageSchemas.d.ts +57 -8
- package/dist/src/schemas/MessageSchemas.d.ts.map +1 -1
- package/dist/src/schemas/MessageSchemas.js +22 -3
- package/dist/src/schemas/MessageSchemas.js.map +1 -1
- package/dist/src/schemas/index.d.ts +410 -68
- package/dist/src/schemas/index.d.ts.map +1 -1
- package/dist/src/schemas/index.js +8 -2
- package/dist/src/schemas/index.js.map +1 -1
- package/dist/src/server.js +1047 -613
- package/dist/src/server.js.map +1 -1
- package/dist/src/services/AIService.d.ts +1 -1
- package/dist/src/services/AIService.d.ts.map +1 -1
- package/dist/src/services/AIService.js +6 -2
- package/dist/src/services/AIService.js.map +1 -1
- package/dist/src/services/ApiKeyService.d.ts +38 -0
- package/dist/src/services/ApiKeyService.d.ts.map +1 -0
- package/dist/src/services/ApiKeyService.js +123 -0
- package/dist/src/services/ApiKeyService.js.map +1 -0
- package/dist/src/services/KnowledgeBaseService.d.ts +2 -2
- package/dist/src/services/KnowledgeBaseService.d.ts.map +1 -1
- package/dist/src/services/KnowledgeBaseService.js +9 -2
- package/dist/src/services/KnowledgeBaseService.js.map +1 -1
- package/dist/src/services/MigrationService.d.ts +1 -1
- package/dist/src/services/MigrationService.d.ts.map +1 -1
- package/dist/src/services/MigrationService.js +4 -8
- package/dist/src/services/MigrationService.js.map +1 -1
- package/dist/src/services/SetupService.d.ts +102 -0
- package/dist/src/services/SetupService.d.ts.map +1 -0
- package/dist/src/services/SetupService.js +343 -0
- package/dist/src/services/SetupService.js.map +1 -0
- package/dist/src/storage/ConversationRepository.d.ts.map +1 -1
- package/dist/src/storage/ConversationRepository.js +42 -8
- package/dist/src/storage/ConversationRepository.js.map +1 -1
- package/dist/src/storage/MessageRepository.d.ts.map +1 -1
- package/dist/src/storage/MessageRepository.js +23 -27
- package/dist/src/storage/MessageRepository.js.map +1 -1
- package/env.example +5 -0
- package/knexfile.ts +17 -8
- package/package.json +10 -2
- package/scripts/generate-key.js +124 -0
- package/scripts/seed-default.js +72 -0
- package/scripts/setup.js +148 -13
- 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
|
-
####
|
|
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
|
-
####
|
|
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
|
-
|
|
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**:
|
|
703
|
+
**Status**: ✅ Production Ready | **Version**: 2.0.1 | **Node.js**: 20+ | **TypeScript**: 5+
|
package/database-schema.sql
CHANGED
|
@@ -1,49 +1,132 @@
|
|
|
1
|
-
-- Vezlo AI Assistant -
|
|
2
|
-
--
|
|
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
|
-
--
|
|
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
|
+
INSERT INTO knex_migrations (name, batch, migration_time)
|
|
38
|
+
SELECT '003_drop_content_index.ts', 1, NOW()
|
|
39
|
+
WHERE NOT EXISTS (SELECT 1 FROM knex_migrations WHERE name = '003_drop_content_index.ts');
|
|
40
|
+
|
|
41
|
+
-- Set migration lock to unlocked (0 = unlocked, 1 = locked)
|
|
42
|
+
INSERT INTO knex_migrations_lock (index, is_locked)
|
|
43
|
+
VALUES (1, 0)
|
|
44
|
+
ON CONFLICT (index) DO UPDATE SET is_locked = 0;
|
|
45
|
+
|
|
46
|
+
-- ============================================================================
|
|
47
|
+
-- USERS & COMPANIES SCHEMA (Multi-tenancy)
|
|
48
|
+
-- ============================================================================
|
|
49
|
+
|
|
50
|
+
CREATE TABLE IF NOT EXISTS vezlo_users (
|
|
51
|
+
id BIGSERIAL PRIMARY KEY,
|
|
52
|
+
uuid UUID DEFAULT gen_random_uuid() UNIQUE NOT NULL,
|
|
53
|
+
email TEXT UNIQUE NOT NULL,
|
|
54
|
+
name TEXT NOT NULL,
|
|
55
|
+
password_hash TEXT NOT NULL,
|
|
56
|
+
user_type TEXT DEFAULT 'internal', -- internal, external, admin
|
|
57
|
+
token_updated_at TIMESTAMPTZ DEFAULT NOW(),
|
|
58
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
59
|
+
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
CREATE TABLE IF NOT EXISTS vezlo_companies (
|
|
63
|
+
id BIGSERIAL PRIMARY KEY,
|
|
64
|
+
uuid UUID DEFAULT gen_random_uuid() UNIQUE NOT NULL,
|
|
65
|
+
name TEXT NOT NULL,
|
|
66
|
+
domain TEXT UNIQUE,
|
|
67
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
68
|
+
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
CREATE TABLE IF NOT EXISTS vezlo_user_company_profiles (
|
|
72
|
+
id BIGSERIAL PRIMARY KEY,
|
|
73
|
+
uuid UUID DEFAULT gen_random_uuid() UNIQUE NOT NULL,
|
|
74
|
+
user_id BIGINT NOT NULL REFERENCES vezlo_users(id) ON DELETE CASCADE,
|
|
75
|
+
company_id BIGINT NOT NULL REFERENCES vezlo_companies(id) ON DELETE CASCADE,
|
|
76
|
+
role TEXT DEFAULT 'user', -- admin, user, viewer
|
|
77
|
+
status TEXT DEFAULT 'active', -- active, inactive
|
|
78
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
79
|
+
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
80
|
+
UNIQUE(user_id, company_id)
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
CREATE TABLE IF NOT EXISTS vezlo_api_keys (
|
|
84
|
+
id BIGSERIAL PRIMARY KEY,
|
|
85
|
+
uuid UUID DEFAULT gen_random_uuid() UNIQUE NOT NULL,
|
|
86
|
+
company_id BIGINT NOT NULL REFERENCES vezlo_companies(id) ON DELETE CASCADE,
|
|
87
|
+
name TEXT NOT NULL,
|
|
88
|
+
key_hash TEXT NOT NULL,
|
|
89
|
+
expires_at TIMESTAMPTZ,
|
|
90
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
91
|
+
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
-- ============================================================================
|
|
95
|
+
-- CONVERSATIONS & MESSAGES SCHEMA
|
|
11
96
|
-- ============================================================================
|
|
12
97
|
|
|
13
|
-
-- Conversations table (renamed from chat_sessions)
|
|
14
98
|
CREATE TABLE IF NOT EXISTS vezlo_conversations (
|
|
15
99
|
id BIGSERIAL PRIMARY KEY,
|
|
16
100
|
uuid UUID DEFAULT gen_random_uuid() UNIQUE NOT NULL,
|
|
17
|
-
company_id BIGINT,
|
|
18
|
-
creator_id BIGINT NOT NULL,
|
|
101
|
+
company_id BIGINT, -- Foreign key added in migration 002
|
|
102
|
+
creator_id BIGINT NOT NULL,
|
|
19
103
|
title TEXT NOT NULL,
|
|
20
104
|
message_count INTEGER DEFAULT 0,
|
|
21
|
-
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
22
|
-
updated_at TIMESTAMPTZ DEFAULT NOW(),
|
|
23
|
-
deleted_at TIMESTAMPTZ
|
|
105
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
106
|
+
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
107
|
+
deleted_at TIMESTAMPTZ -- Soft delete
|
|
24
108
|
);
|
|
25
109
|
|
|
26
|
-
-- Messages table (supports parent-child relationships for regeneration)
|
|
27
110
|
CREATE TABLE IF NOT EXISTS vezlo_messages (
|
|
28
111
|
id BIGSERIAL PRIMARY KEY,
|
|
29
112
|
uuid UUID DEFAULT gen_random_uuid() UNIQUE NOT NULL,
|
|
30
113
|
conversation_id BIGINT NOT NULL REFERENCES vezlo_conversations(id) ON DELETE CASCADE,
|
|
31
114
|
parent_message_id BIGINT REFERENCES vezlo_messages(id), -- For regeneration chains
|
|
32
|
-
type TEXT NOT NULL,
|
|
115
|
+
type TEXT NOT NULL, -- user, assistant, system
|
|
33
116
|
content TEXT NOT NULL,
|
|
34
|
-
status TEXT DEFAULT 'completed',
|
|
35
|
-
metadata JSONB DEFAULT '{}',
|
|
36
|
-
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
37
|
-
updated_at TIMESTAMPTZ DEFAULT NOW()
|
|
117
|
+
status TEXT DEFAULT 'completed', -- generating, completed, stopped, failed
|
|
118
|
+
metadata JSONB DEFAULT '{}', -- For tool_calls, tool_results, etc.
|
|
119
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
120
|
+
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
38
121
|
);
|
|
39
122
|
|
|
40
|
-
-- Message feedback table
|
|
41
123
|
CREATE TABLE IF NOT EXISTS vezlo_message_feedback (
|
|
42
124
|
id BIGSERIAL PRIMARY KEY,
|
|
43
125
|
uuid UUID DEFAULT gen_random_uuid() UNIQUE NOT NULL,
|
|
44
126
|
message_id BIGINT NOT NULL REFERENCES vezlo_messages(id) ON DELETE CASCADE,
|
|
45
|
-
user_id BIGINT NOT NULL,
|
|
46
|
-
|
|
127
|
+
user_id BIGINT NOT NULL, -- Foreign key added in migration 002
|
|
128
|
+
company_id BIGINT, -- Added in migration 002 with foreign key
|
|
129
|
+
rating TEXT NOT NULL, -- positive, negative
|
|
47
130
|
category TEXT,
|
|
48
131
|
comment TEXT,
|
|
49
132
|
suggested_improvement TEXT,
|
|
@@ -51,34 +134,98 @@ CREATE TABLE IF NOT EXISTS vezlo_message_feedback (
|
|
|
51
134
|
);
|
|
52
135
|
|
|
53
136
|
-- ============================================================================
|
|
54
|
-
-- KNOWLEDGE BASE SCHEMA
|
|
137
|
+
-- KNOWLEDGE BASE SCHEMA
|
|
55
138
|
-- ============================================================================
|
|
56
139
|
|
|
57
|
-
-- Knowledge items table (folders, documents, files, URLs - everything)
|
|
58
140
|
CREATE TABLE IF NOT EXISTS vezlo_knowledge_items (
|
|
59
141
|
id BIGSERIAL PRIMARY KEY,
|
|
60
142
|
uuid UUID DEFAULT gen_random_uuid() UNIQUE NOT NULL,
|
|
61
143
|
parent_id BIGINT REFERENCES vezlo_knowledge_items(id), -- Hierarchical structure
|
|
62
|
-
company_id BIGINT,
|
|
144
|
+
company_id BIGINT, -- Foreign key added in migration 002
|
|
63
145
|
title TEXT NOT NULL,
|
|
64
146
|
description TEXT,
|
|
65
|
-
type TEXT NOT NULL,
|
|
66
|
-
content TEXT,
|
|
67
|
-
file_url TEXT,
|
|
68
|
-
file_size BIGINT,
|
|
69
|
-
file_type TEXT,
|
|
70
|
-
metadata JSONB DEFAULT '{}',
|
|
71
|
-
embedding vector(1536),
|
|
72
|
-
processed_at TIMESTAMPTZ,
|
|
147
|
+
type TEXT NOT NULL, -- folder, document, file, url, url_directory
|
|
148
|
+
content TEXT, -- For document type
|
|
149
|
+
file_url TEXT, -- For file/url types
|
|
150
|
+
file_size BIGINT, -- File size in bytes
|
|
151
|
+
file_type TEXT, -- MIME type for files
|
|
152
|
+
metadata JSONB DEFAULT '{}', -- Flexible metadata storage
|
|
153
|
+
embedding vector(1536), -- OpenAI embeddings for search
|
|
154
|
+
processed_at TIMESTAMPTZ, -- When embedding was generated
|
|
73
155
|
created_by BIGINT NOT NULL,
|
|
74
|
-
created_at TIMESTAMPTZ DEFAULT NOW(),
|
|
75
|
-
updated_at TIMESTAMPTZ DEFAULT NOW()
|
|
156
|
+
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
|
|
157
|
+
updated_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
|
|
76
158
|
);
|
|
77
159
|
|
|
160
|
+
-- ============================================================================
|
|
161
|
+
-- ADD FOREIGN KEY CONSTRAINTS (Matching Migration 002)
|
|
162
|
+
-- These constraints use explicit names matching Knex migration naming convention
|
|
163
|
+
-- for proper rollback compatibility: {table}_{column}_foreign
|
|
164
|
+
-- ============================================================================
|
|
165
|
+
|
|
166
|
+
-- Add foreign keys to vezlo_conversations (added in migration 002)
|
|
167
|
+
DO $$
|
|
168
|
+
BEGIN
|
|
169
|
+
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'vezlo_conversations_company_id_foreign') THEN
|
|
170
|
+
ALTER TABLE vezlo_conversations
|
|
171
|
+
ADD CONSTRAINT vezlo_conversations_company_id_foreign
|
|
172
|
+
FOREIGN KEY (company_id) REFERENCES vezlo_companies(id) ON DELETE CASCADE;
|
|
173
|
+
END IF;
|
|
174
|
+
END $$;
|
|
175
|
+
|
|
176
|
+
-- Add foreign keys to vezlo_knowledge_items (added in migration 002)
|
|
177
|
+
DO $$
|
|
178
|
+
BEGIN
|
|
179
|
+
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'vezlo_knowledge_items_company_id_foreign') THEN
|
|
180
|
+
ALTER TABLE vezlo_knowledge_items
|
|
181
|
+
ADD CONSTRAINT vezlo_knowledge_items_company_id_foreign
|
|
182
|
+
FOREIGN KEY (company_id) REFERENCES vezlo_companies(id) ON DELETE CASCADE;
|
|
183
|
+
END IF;
|
|
184
|
+
END $$;
|
|
185
|
+
|
|
186
|
+
-- Add foreign keys to vezlo_message_feedback (added in migration 002)
|
|
187
|
+
DO $$
|
|
188
|
+
BEGIN
|
|
189
|
+
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'vezlo_message_feedback_user_id_foreign') THEN
|
|
190
|
+
ALTER TABLE vezlo_message_feedback
|
|
191
|
+
ADD CONSTRAINT vezlo_message_feedback_user_id_foreign
|
|
192
|
+
FOREIGN KEY (user_id) REFERENCES vezlo_users(id) ON DELETE CASCADE;
|
|
193
|
+
END IF;
|
|
194
|
+
|
|
195
|
+
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'vezlo_message_feedback_company_id_foreign') THEN
|
|
196
|
+
ALTER TABLE vezlo_message_feedback
|
|
197
|
+
ADD CONSTRAINT vezlo_message_feedback_company_id_foreign
|
|
198
|
+
FOREIGN KEY (company_id) REFERENCES vezlo_companies(id) ON DELETE CASCADE;
|
|
199
|
+
END IF;
|
|
200
|
+
END $$;
|
|
201
|
+
|
|
78
202
|
-- ============================================================================
|
|
79
203
|
-- INDEXES FOR PERFORMANCE
|
|
80
204
|
-- ============================================================================
|
|
81
205
|
|
|
206
|
+
-- Users indexes
|
|
207
|
+
CREATE INDEX IF NOT EXISTS idx_vezlo_users_uuid ON vezlo_users(uuid);
|
|
208
|
+
CREATE INDEX IF NOT EXISTS idx_vezlo_users_email ON vezlo_users(email);
|
|
209
|
+
CREATE INDEX IF NOT EXISTS idx_vezlo_users_user_type ON vezlo_users(user_type);
|
|
210
|
+
CREATE INDEX IF NOT EXISTS idx_vezlo_users_token_updated_at ON vezlo_users(token_updated_at);
|
|
211
|
+
|
|
212
|
+
-- Companies indexes
|
|
213
|
+
CREATE INDEX IF NOT EXISTS idx_vezlo_companies_uuid ON vezlo_companies(uuid);
|
|
214
|
+
CREATE INDEX IF NOT EXISTS idx_vezlo_companies_domain ON vezlo_companies(domain);
|
|
215
|
+
|
|
216
|
+
-- User company profiles indexes
|
|
217
|
+
CREATE INDEX IF NOT EXISTS idx_vezlo_user_company_profiles_uuid ON vezlo_user_company_profiles(uuid);
|
|
218
|
+
CREATE INDEX IF NOT EXISTS idx_vezlo_user_company_profiles_user_id ON vezlo_user_company_profiles(user_id);
|
|
219
|
+
CREATE INDEX IF NOT EXISTS idx_vezlo_user_company_profiles_company_id ON vezlo_user_company_profiles(company_id);
|
|
220
|
+
CREATE INDEX IF NOT EXISTS idx_vezlo_user_company_profiles_role ON vezlo_user_company_profiles(role);
|
|
221
|
+
CREATE INDEX IF NOT EXISTS idx_vezlo_user_company_profiles_status ON vezlo_user_company_profiles(status);
|
|
222
|
+
|
|
223
|
+
-- API keys indexes
|
|
224
|
+
CREATE INDEX IF NOT EXISTS idx_vezlo_api_keys_uuid ON vezlo_api_keys(uuid);
|
|
225
|
+
CREATE INDEX IF NOT EXISTS idx_vezlo_api_keys_company_id ON vezlo_api_keys(company_id);
|
|
226
|
+
CREATE INDEX IF NOT EXISTS idx_vezlo_api_keys_key_hash ON vezlo_api_keys(key_hash);
|
|
227
|
+
CREATE INDEX IF NOT EXISTS idx_vezlo_api_keys_expires_at ON vezlo_api_keys(expires_at);
|
|
228
|
+
|
|
82
229
|
-- Conversations indexes
|
|
83
230
|
CREATE INDEX IF NOT EXISTS idx_vezlo_conversations_uuid ON vezlo_conversations(uuid);
|
|
84
231
|
CREATE INDEX IF NOT EXISTS idx_vezlo_conversations_company_id ON vezlo_conversations(company_id);
|
|
@@ -98,6 +245,7 @@ CREATE INDEX IF NOT EXISTS idx_vezlo_messages_created_at ON vezlo_messages(creat
|
|
|
98
245
|
CREATE INDEX IF NOT EXISTS idx_vezlo_feedback_uuid ON vezlo_message_feedback(uuid);
|
|
99
246
|
CREATE INDEX IF NOT EXISTS idx_vezlo_feedback_message_id ON vezlo_message_feedback(message_id);
|
|
100
247
|
CREATE INDEX IF NOT EXISTS idx_vezlo_feedback_user_id ON vezlo_message_feedback(user_id);
|
|
248
|
+
CREATE INDEX IF NOT EXISTS idx_vezlo_feedback_company_id ON vezlo_message_feedback(company_id);
|
|
101
249
|
CREATE INDEX IF NOT EXISTS idx_vezlo_feedback_rating ON vezlo_message_feedback(rating);
|
|
102
250
|
|
|
103
251
|
-- Knowledge items indexes
|
|
@@ -118,8 +266,9 @@ ON vezlo_knowledge_items USING ivfflat (embedding vector_cosine_ops)
|
|
|
118
266
|
WHERE embedding IS NOT NULL;
|
|
119
267
|
|
|
120
268
|
-- Sparse indexes for better performance
|
|
121
|
-
|
|
122
|
-
|
|
269
|
+
-- Note: idx_vezlo_knowledge_content was removed in migration 003
|
|
270
|
+
-- because btree indexes fail on large content (>2704 bytes).
|
|
271
|
+
-- Full-text search is handled by the GIN index above.
|
|
123
272
|
|
|
124
273
|
CREATE INDEX IF NOT EXISTS idx_vezlo_knowledge_file_url
|
|
125
274
|
ON vezlo_knowledge_items(file_url) WHERE file_url IS NOT NULL;
|
|
@@ -129,12 +278,28 @@ ON vezlo_knowledge_items(file_url) WHERE file_url IS NOT NULL;
|
|
|
129
278
|
-- ============================================================================
|
|
130
279
|
|
|
131
280
|
-- Enable RLS on all tables
|
|
281
|
+
ALTER TABLE vezlo_users ENABLE ROW LEVEL SECURITY;
|
|
282
|
+
ALTER TABLE vezlo_companies ENABLE ROW LEVEL SECURITY;
|
|
283
|
+
ALTER TABLE vezlo_user_company_profiles ENABLE ROW LEVEL SECURITY;
|
|
284
|
+
ALTER TABLE vezlo_api_keys ENABLE ROW LEVEL SECURITY;
|
|
132
285
|
ALTER TABLE vezlo_conversations ENABLE ROW LEVEL SECURITY;
|
|
133
286
|
ALTER TABLE vezlo_messages ENABLE ROW LEVEL SECURITY;
|
|
134
287
|
ALTER TABLE vezlo_message_feedback ENABLE ROW LEVEL SECURITY;
|
|
135
288
|
ALTER TABLE vezlo_knowledge_items ENABLE ROW LEVEL SECURITY;
|
|
136
289
|
|
|
137
290
|
-- Policies for service role access (full access)
|
|
291
|
+
CREATE POLICY "Service role can access all users" ON vezlo_users
|
|
292
|
+
FOR ALL USING (auth.role() = 'service_role');
|
|
293
|
+
|
|
294
|
+
CREATE POLICY "Service role can access all companies" ON vezlo_companies
|
|
295
|
+
FOR ALL USING (auth.role() = 'service_role');
|
|
296
|
+
|
|
297
|
+
CREATE POLICY "Service role can access all user company profiles" ON vezlo_user_company_profiles
|
|
298
|
+
FOR ALL USING (auth.role() = 'service_role');
|
|
299
|
+
|
|
300
|
+
CREATE POLICY "Service role can access all API keys" ON vezlo_api_keys
|
|
301
|
+
FOR ALL USING (auth.role() = 'service_role');
|
|
302
|
+
|
|
138
303
|
CREATE POLICY "Service role can access all conversations" ON vezlo_conversations
|
|
139
304
|
FOR ALL USING (auth.role() = 'service_role');
|
|
140
305
|
|
|
@@ -150,6 +315,6 @@ CREATE POLICY "Service role can access all knowledge items" ON vezlo_knowledge_i
|
|
|
150
315
|
-- Example company-based policies (uncomment and modify as needed)
|
|
151
316
|
-- CREATE POLICY "Users can access their company conversations" ON vezlo_conversations
|
|
152
317
|
-- FOR ALL USING (company_id = auth.jwt() ->> 'company_id');
|
|
153
|
-
|
|
318
|
+
--
|
|
154
319
|
-- CREATE POLICY "Users can access their company knowledge" ON vezlo_knowledge_items
|
|
155
320
|
-- FOR ALL USING (company_id = auth.jwt() ->> 'company_id');
|
package/dist/knexfile.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knexfile.d.ts","sourceRoot":"","sources":["../knexfile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,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
|
-
|
|
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: '
|
|
60
|
+
extension: 'js'
|
|
59
61
|
},
|
|
60
62
|
seeds: {
|
|
61
|
-
directory: '
|
|
62
|
-
extension: '
|
|
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
|
-
|
|
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: '
|
|
87
|
-
|
|
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
|
};
|
package/dist/knexfile.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"knexfile.js","sourceRoot":"","sources":["../knexfile.ts"],"names":[],"mappings":";;;;;AACA,oDAA4B;
|
|
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,
|
|
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,
|
|
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;
|
|
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"}
|
package/dist/src/config/knex.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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;
|
|
1
|
+
{"version":3,"file":"knex.js","sourceRoot":"","sources":["../../../src/config/knex.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"swagger.d.ts","sourceRoot":"","sources":["../../../src/config/swagger.ts"],"names":[],"mappings":"AAEA,OAAO,SAAS,MAAM,oBAAoB,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"}
|