clhq-postgres-module 1.1.0-alpha.172 → 1.1.0-alpha.174

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/dist/config/data-source.local.d.ts +3 -0
  2. package/dist/config/data-source.local.js +15 -0
  3. package/dist/migrations/1713000000001-InitialSchema.d.ts +6 -0
  4. package/dist/migrations/1713000000001-InitialSchema.js +196 -0
  5. package/dist/migrations/1713000000002-CoreBusinessTables.d.ts +6 -0
  6. package/dist/migrations/1713000000002-CoreBusinessTables.js +198 -0
  7. package/dist/migrations/1713000000003-RemainingCoreTables.d.ts +6 -0
  8. package/dist/migrations/1713000000003-RemainingCoreTables.js +160 -0
  9. package/dist/migrations/1713000000004-MediaConfigReferenceTables.d.ts +6 -0
  10. package/dist/migrations/1713000000004-MediaConfigReferenceTables.js +241 -0
  11. package/dist/migrations/1713000000005-VideoMediaTables.d.ts +6 -0
  12. package/dist/migrations/1713000000005-VideoMediaTables.js +98 -0
  13. package/dist/migrations/1713000000006-AddUserReferralColumns.d.ts +6 -0
  14. package/dist/migrations/1713000000006-AddUserReferralColumns.js +55 -0
  15. package/dist/migrations/1713000000007-AddUserProfileColumns.d.ts +6 -0
  16. package/dist/migrations/1713000000007-AddUserProfileColumns.js +73 -0
  17. package/dist/migrations/1713000000008-AddBillingInfoColumn.d.ts +6 -0
  18. package/dist/migrations/1713000000008-AddBillingInfoColumn.js +23 -0
  19. package/dist/migrations/1713000000009-AddWorkspaceStorageColumns.d.ts +6 -0
  20. package/dist/migrations/1713000000009-AddWorkspaceStorageColumns.js +49 -0
  21. package/dist/migrations/1713000000010-AddUniqueIdToAssets.d.ts +6 -0
  22. package/dist/migrations/1713000000010-AddUniqueIdToAssets.js +29 -0
  23. package/dist/migrations/{1713000000003-AddDescriptionToBrandKits.d.ts → 1713000000011-CreateReferralEventsTable.d.ts} +1 -1
  24. package/dist/migrations/1713000000011-CreateReferralEventsTable.js +72 -0
  25. package/dist/migrations/1713000000012-ExtendCreditTransactions.d.ts +6 -0
  26. package/dist/migrations/1713000000012-ExtendCreditTransactions.js +70 -0
  27. package/dist/migrations/1713000000013-AiVideoMakerTables.d.ts +6 -0
  28. package/dist/migrations/1713000000013-AiVideoMakerTables.js +122 -0
  29. package/dist/migrations/1713000000014-SeedReferralRewardRules.d.ts +6 -0
  30. package/dist/migrations/1713000000014-SeedReferralRewardRules.js +135 -0
  31. package/dist/migrations/{1713000000001-CreateSocialConnectionTables.d.ts → 1713000000015-CreateCreditAllocationsTable.d.ts} +1 -1
  32. package/dist/migrations/1713000000015-CreateCreditAllocationsTable.js +49 -0
  33. package/dist/migrations/1713000000016-CreateCreditConsumptionLogTable.d.ts +6 -0
  34. package/dist/migrations/1713000000016-CreateCreditConsumptionLogTable.js +55 -0
  35. package/dist/migrations/1713000000017-UpdateSubscriptionPlansCreditFields.d.ts +6 -0
  36. package/dist/migrations/1713000000017-UpdateSubscriptionPlansCreditFields.js +121 -0
  37. package/dist/migrations/1713000000018-CreateVideoProcessingTables.d.ts +6 -0
  38. package/dist/migrations/1713000000018-CreateVideoProcessingTables.js +111 -0
  39. package/dist/migrations/1713000000019-CreateAudioWaveformsTable.d.ts +6 -0
  40. package/dist/migrations/1713000000019-CreateAudioWaveformsTable.js +62 -0
  41. package/dist/migrations/1713000000020-EnablePgvectorExtension.d.ts +6 -0
  42. package/dist/migrations/1713000000020-EnablePgvectorExtension.js +30 -0
  43. package/dist/migrations/1713000000021-CreateMetadataServiceTables.d.ts +6 -0
  44. package/dist/migrations/1713000000021-CreateMetadataServiceTables.js +410 -0
  45. package/dist/migrations/1713000000022-OptimizeMetadataIndexes.d.ts +6 -0
  46. package/dist/migrations/1713000000022-OptimizeMetadataIndexes.js +334 -0
  47. package/dist/migrations/1713000000023-CreateSceneGeneratorTables.d.ts +6 -0
  48. package/dist/migrations/1713000000023-CreateSceneGeneratorTables.js +97 -0
  49. package/dist/migrations/1713000000024-CreateRemotionRendersTable.d.ts +6 -0
  50. package/dist/migrations/1713000000024-CreateRemotionRendersTable.js +71 -0
  51. package/dist/migrations/1713000000025-ExtendCreditAllocationSystem.d.ts +6 -0
  52. package/dist/migrations/1713000000025-ExtendCreditAllocationSystem.js +114 -0
  53. package/dist/migrations/{1713000000002-AddIsActiveToWorkspaceMembers.d.ts → 1713000000026-AddStatusToCreditTransactions.d.ts} +1 -1
  54. package/dist/migrations/1713000000026-AddStatusToCreditTransactions.js +63 -0
  55. package/dist/migrations/1713000000027-MigrateProjectDurationToSeconds.d.ts +6 -0
  56. package/dist/migrations/1713000000027-MigrateProjectDurationToSeconds.js +43 -0
  57. package/dist/migrations/1713000000028-CreateSceneTimelineTables.d.ts +6 -0
  58. package/dist/migrations/1713000000028-CreateSceneTimelineTables.js +159 -0
  59. package/dist/migrations/1713000000029-ConvertScenesToSeconds.d.ts +6 -0
  60. package/dist/migrations/1713000000029-ConvertScenesToSeconds.js +106 -0
  61. package/dist/migrations/1713000000030-ChangeDurationToDecimal.d.ts +6 -0
  62. package/dist/migrations/1713000000030-ChangeDurationToDecimal.js +34 -0
  63. package/dist/migrations/1713000000031-CreateVideoSubtitlesTable.d.ts +6 -0
  64. package/dist/migrations/1713000000031-CreateVideoSubtitlesTable.js +51 -0
  65. package/dist/migrations/1713000000032-AddWebpThumbnailColumns.d.ts +6 -0
  66. package/dist/migrations/1713000000032-AddWebpThumbnailColumns.js +58 -0
  67. package/dist/migrations/1713000000033-AddFormatToProjectScenes.d.ts +6 -0
  68. package/dist/migrations/1713000000033-AddFormatToProjectScenes.js +77 -0
  69. package/dist/migrations/1713000000034-FixProjectScenesUniqueConstraint.d.ts +6 -0
  70. package/dist/migrations/1713000000034-FixProjectScenesUniqueConstraint.js +39 -0
  71. package/dist/migrations/1713000000035-AddMissingVideoSubtitlesColumns.d.ts +6 -0
  72. package/dist/migrations/1713000000035-AddMissingVideoSubtitlesColumns.js +29 -0
  73. package/dist/migrations/1713000000036-AddRemotionRenderCreditColumns.d.ts +6 -0
  74. package/dist/migrations/1713000000036-AddRemotionRenderCreditColumns.js +50 -0
  75. package/dist/migrations/1713000000037-CreateProjectSharesTable.d.ts +6 -0
  76. package/dist/migrations/1713000000037-CreateProjectSharesTable.js +60 -0
  77. package/dist/migrations/1713000000038-EnableRlsOnAllTables.d.ts +6 -0
  78. package/dist/migrations/1713000000038-EnableRlsOnAllTables.js +97 -0
  79. package/dist/migrations/1713000000039-AiVideoMakerKlingFreeColumns.d.ts +6 -0
  80. package/dist/migrations/1713000000039-AiVideoMakerKlingFreeColumns.js +85 -0
  81. package/dist/migrations/1713000000040-CreateBrandKitsTable.d.ts +6 -0
  82. package/dist/migrations/1713000000040-CreateBrandKitsTable.js +44 -0
  83. package/dist/migrations/1713000000041-CreateBrandAssetsTable.d.ts +6 -0
  84. package/dist/migrations/1713000000041-CreateBrandAssetsTable.js +57 -0
  85. package/dist/migrations/1713000000042-AddActiveBrandKitToWorkspaces.d.ts +6 -0
  86. package/dist/migrations/1713000000042-AddActiveBrandKitToWorkspaces.js +43 -0
  87. package/dist/migrations/1713000000043-CreateAssetCategoriesTable.d.ts +6 -0
  88. package/dist/migrations/1713000000043-CreateAssetCategoriesTable.js +47 -0
  89. package/dist/migrations/1713000000044-AddEnforcementModeToWorkspaces.d.ts +6 -0
  90. package/dist/migrations/1713000000044-AddEnforcementModeToWorkspaces.js +21 -0
  91. package/dist/migrations/1713000000045-CreateProjectBrandOverridesTable.d.ts +6 -0
  92. package/dist/migrations/1713000000045-CreateProjectBrandOverridesTable.js +33 -0
  93. package/dist/migrations/1713000000046-AddPdfRenderSupport.d.ts +6 -0
  94. package/dist/migrations/1713000000046-AddPdfRenderSupport.js +14 -0
  95. package/dist/migrations/1713000000047-CreateSocialConnectionTables.d.ts +6 -0
  96. package/dist/migrations/{1713000000001-CreateSocialConnectionTables.js → 1713000000047-CreateSocialConnectionTables.js} +4 -4
  97. package/dist/migrations/1713000000048-AddIsActiveToWorkspaceMembers.d.ts +6 -0
  98. package/dist/migrations/{1713000000002-AddIsActiveToWorkspaceMembers.js → 1713000000048-AddIsActiveToWorkspaceMembers.js} +4 -4
  99. package/dist/migrations/1713000000049-AddDescriptionToBrandKits.d.ts +6 -0
  100. package/dist/migrations/{1713000000003-AddDescriptionToBrandKits.js → 1713000000049-AddDescriptionToBrandKits.js} +4 -4
  101. package/dist/migrations/1713000000050-CreateKlingGenerationTables.d.ts +6 -0
  102. package/dist/migrations/1713000000050-CreateKlingGenerationTables.js +76 -0
  103. package/dist/migrations/1713000000051-AddAiVideoSceneCanvasIdsAndThumbnail.d.ts +6 -0
  104. package/dist/migrations/1713000000051-AddAiVideoSceneCanvasIdsAndThumbnail.js +49 -0
  105. package/dist/migrations/1713000000052-AddAiVideoSourceMetadataAndMusicMeta.d.ts +6 -0
  106. package/dist/migrations/1713000000052-AddAiVideoSourceMetadataAndMusicMeta.js +67 -0
  107. package/package.json +8 -1
@@ -0,0 +1,241 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MediaConfigReferenceTables1713000000004 = void 0;
4
+ class MediaConfigReferenceTables1713000000004 {
5
+ constructor() {
6
+ this.name = 'MediaConfigReferenceTables1713000000004';
7
+ }
8
+ async up(queryRunner) {
9
+ await queryRunner.query(`
10
+ CREATE TABLE assets (
11
+ id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
12
+ workspace_id UUID NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,
13
+ uploaded_by UUID NOT NULL REFERENCES users(id) ON DELETE SET NULL,
14
+ category_id UUID,
15
+ name VARCHAR(255) NOT NULL,
16
+ original_filename VARCHAR(500),
17
+ file_type VARCHAR(50) NOT NULL,
18
+ mime_type VARCHAR(100),
19
+ file_size BIGINT NOT NULL,
20
+ file_url TEXT NOT NULL,
21
+ thumbnail_url TEXT,
22
+ preview_url TEXT,
23
+ duration_ms INTEGER,
24
+ width INTEGER,
25
+ height INTEGER,
26
+ frame_rate DECIMAL(10, 2),
27
+ codec VARCHAR(100),
28
+ bitrate INTEGER,
29
+ metadata JSONB,
30
+ upload_status VARCHAR(50) DEFAULT 'uploading',
31
+ tags TEXT[],
32
+ is_public BOOLEAN DEFAULT false,
33
+ is_premium BOOLEAN DEFAULT false,
34
+ usage_count INTEGER DEFAULT 0,
35
+ last_used_at TIMESTAMP,
36
+ created_at TIMESTAMP DEFAULT NOW(),
37
+ updated_at TIMESTAMP DEFAULT NOW()
38
+ )
39
+ `);
40
+ await queryRunner.query(`CREATE INDEX idx_assets_workspace_id ON assets(workspace_id)`);
41
+ await queryRunner.query(`CREATE INDEX idx_assets_uploaded_by ON assets(uploaded_by)`);
42
+ await queryRunner.query(`CREATE INDEX idx_assets_file_type ON assets(file_type)`);
43
+ await queryRunner.query(`CREATE INDEX idx_assets_upload_status ON assets(upload_status)`);
44
+ await queryRunner.query(`CREATE INDEX idx_assets_tags ON assets USING GIN(tags)`);
45
+ await queryRunner.query(`CREATE INDEX idx_assets_created_at ON assets(created_at DESC)`);
46
+ await queryRunner.query(`
47
+ CREATE TABLE effects (
48
+ id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
49
+ category_id UUID,
50
+ name VARCHAR(255) NOT NULL,
51
+ description TEXT,
52
+ effect_type VARCHAR(50) NOT NULL,
53
+ parameters_schema JSONB,
54
+ thumbnail_url TEXT,
55
+ preview_url TEXT,
56
+ is_premium BOOLEAN DEFAULT false,
57
+ is_active BOOLEAN DEFAULT true,
58
+ display_order INTEGER DEFAULT 0,
59
+ created_at TIMESTAMP DEFAULT NOW(),
60
+ updated_at TIMESTAMP DEFAULT NOW()
61
+ )
62
+ `);
63
+ await queryRunner.query(`CREATE INDEX idx_effects_effect_type ON effects(effect_type)`);
64
+ await queryRunner.query(`CREATE INDEX idx_effects_is_premium ON effects(is_premium)`);
65
+ await queryRunner.query(`CREATE INDEX idx_effects_is_active ON effects(is_active)`);
66
+ await queryRunner.query(`CREATE INDEX idx_effects_display_order ON effects(display_order)`);
67
+ await queryRunner.query(`
68
+ CREATE TABLE user_profiles (
69
+ id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
70
+ user_id UUID UNIQUE NOT NULL REFERENCES users(id) ON DELETE CASCADE,
71
+ first_name VARCHAR(100),
72
+ last_name VARCHAR(100),
73
+ display_name VARCHAR(200),
74
+ bio TEXT,
75
+ avatar_url TEXT,
76
+ phone_number VARCHAR(50),
77
+ website TEXT,
78
+ company VARCHAR(200),
79
+ address TEXT,
80
+ city VARCHAR(100),
81
+ state VARCHAR(100),
82
+ country VARCHAR(100),
83
+ postal_code VARCHAR(20),
84
+ storage_used_bytes BIGINT DEFAULT 0,
85
+ storage_limit_bytes BIGINT DEFAULT 5368709120,
86
+ notification_preferences JSONB DEFAULT '{"email": true, "push": true, "marketing": false, "projectUpdates": true, "storageWarnings": true}'::jsonb,
87
+ export_preferences JSONB DEFAULT '{"defaultFormat": "mp4", "defaultQuality": "1080p", "defaultFrameRate": 30, "watermark": false}'::jsonb,
88
+ workspace_preferences JSONB DEFAULT '{"theme": "light", "language": "en", "timezone": "UTC", "autoSave": true, "gridSnap": true}'::jsonb,
89
+ linkedin_url TEXT,
90
+ twitter_url TEXT,
91
+ youtube_url TEXT,
92
+ language VARCHAR(10) DEFAULT 'en',
93
+ timezone VARCHAR(100) DEFAULT 'UTC',
94
+ marketing_opt_in BOOLEAN DEFAULT false,
95
+ created_at TIMESTAMP DEFAULT NOW(),
96
+ updated_at TIMESTAMP DEFAULT NOW()
97
+ )
98
+ `);
99
+ await queryRunner.query(`CREATE INDEX idx_user_profiles_user_id ON user_profiles(user_id)`);
100
+ await queryRunner.query(`CREATE INDEX idx_user_profiles_country ON user_profiles(country)`);
101
+ await queryRunner.query(`
102
+ CREATE TABLE user_onboarding_responses (
103
+ id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
104
+ user_id UUID UNIQUE NOT NULL REFERENCES users(id) ON DELETE CASCADE,
105
+ responses JSONB NOT NULL,
106
+ user_role VARCHAR(100),
107
+ use_case VARCHAR(100),
108
+ experience_level VARCHAR(50),
109
+ team_size VARCHAR(50),
110
+ completed BOOLEAN DEFAULT false,
111
+ completed_at TIMESTAMP,
112
+ created_at TIMESTAMP DEFAULT NOW(),
113
+ updated_at TIMESTAMP DEFAULT NOW()
114
+ )
115
+ `);
116
+ await queryRunner.query(`CREATE INDEX idx_user_onboarding_user_id ON user_onboarding_responses(user_id)`);
117
+ await queryRunner.query(`CREATE INDEX idx_user_onboarding_role ON user_onboarding_responses(user_role)`);
118
+ await queryRunner.query(`CREATE INDEX idx_user_onboarding_use_case ON user_onboarding_responses(use_case)`);
119
+ await queryRunner.query(`CREATE INDEX idx_user_onboarding_completed ON user_onboarding_responses(completed)`);
120
+ await queryRunner.query(`
121
+ CREATE TABLE stripe_webhook_events (
122
+ id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
123
+ stripe_event_id VARCHAR(255) UNIQUE NOT NULL,
124
+ event_type VARCHAR(100) NOT NULL,
125
+ event_data JSONB NOT NULL,
126
+ processed BOOLEAN DEFAULT false,
127
+ processed_at TIMESTAMP,
128
+ processing_error TEXT,
129
+ retry_count INTEGER DEFAULT 0,
130
+ customer_id VARCHAR(255),
131
+ subscription_id VARCHAR(255),
132
+ invoice_id VARCHAR(255),
133
+ payment_intent_id VARCHAR(255),
134
+ created_at TIMESTAMP DEFAULT NOW()
135
+ )
136
+ `);
137
+ await queryRunner.query(`CREATE INDEX idx_stripe_webhooks_stripe_event_id ON stripe_webhook_events(stripe_event_id)`);
138
+ await queryRunner.query(`CREATE INDEX idx_stripe_webhooks_event_type ON stripe_webhook_events(event_type)`);
139
+ await queryRunner.query(`CREATE INDEX idx_stripe_webhooks_processed ON stripe_webhook_events(processed)`);
140
+ await queryRunner.query(`CREATE INDEX idx_stripe_webhooks_customer_id ON stripe_webhook_events(customer_id)`);
141
+ await queryRunner.query(`CREATE INDEX idx_stripe_webhooks_created_at ON stripe_webhook_events(created_at DESC)`);
142
+ await queryRunner.query(`
143
+ CREATE TABLE plans (
144
+ id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
145
+ name VARCHAR(255) NOT NULL,
146
+ description TEXT,
147
+ plan_key VARCHAR(100) UNIQUE,
148
+ price DECIMAL(10, 2) NOT NULL,
149
+ interval VARCHAR(50) NOT NULL,
150
+ currency VARCHAR(10) DEFAULT 'USD',
151
+ stripe_product_id VARCHAR(255),
152
+ stripe_price_id VARCHAR(255),
153
+ ai_credits_per_day INTEGER DEFAULT 0,
154
+ features JSONB,
155
+ is_active BOOLEAN DEFAULT true,
156
+ created_at TIMESTAMP DEFAULT NOW(),
157
+ updated_at TIMESTAMP DEFAULT NOW()
158
+ )
159
+ `);
160
+ await queryRunner.query(`CREATE INDEX idx_plans_plan_key ON plans(plan_key)`);
161
+ await queryRunner.query(`CREATE INDEX idx_plans_is_active ON plans(is_active)`);
162
+ await queryRunner.query(`CREATE INDEX idx_plans_stripe_product_id ON plans(stripe_product_id)`);
163
+ await queryRunner.query(`
164
+ CREATE TABLE auth_sessions (
165
+ id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
166
+ user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
167
+ session_token VARCHAR(500) UNIQUE NOT NULL,
168
+ refresh_token VARCHAR(500),
169
+ device_type VARCHAR(50),
170
+ device_name VARCHAR(200),
171
+ ip_address INET,
172
+ user_agent TEXT,
173
+ location JSONB,
174
+ is_active BOOLEAN DEFAULT true,
175
+ expires_at TIMESTAMP NOT NULL,
176
+ last_activity_at TIMESTAMP DEFAULT NOW(),
177
+ created_at TIMESTAMP DEFAULT NOW()
178
+ )
179
+ `);
180
+ await queryRunner.query(`CREATE INDEX idx_auth_sessions_user_id ON auth_sessions(user_id)`);
181
+ await queryRunner.query(`CREATE INDEX idx_auth_sessions_session_token ON auth_sessions(session_token)`);
182
+ await queryRunner.query(`CREATE INDEX idx_auth_sessions_is_active ON auth_sessions(is_active) WHERE is_active = true`);
183
+ await queryRunner.query(`CREATE INDEX idx_auth_sessions_expires_at ON auth_sessions(expires_at)`);
184
+ await queryRunner.query(`
185
+ CREATE TRIGGER update_assets_updated_at BEFORE UPDATE ON assets
186
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column()
187
+ `);
188
+ await queryRunner.query(`
189
+ CREATE TRIGGER update_effects_updated_at BEFORE UPDATE ON effects
190
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column()
191
+ `);
192
+ await queryRunner.query(`
193
+ CREATE TRIGGER update_user_profiles_updated_at BEFORE UPDATE ON user_profiles
194
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column()
195
+ `);
196
+ await queryRunner.query(`
197
+ CREATE TRIGGER update_user_onboarding_responses_updated_at BEFORE UPDATE ON user_onboarding_responses
198
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column()
199
+ `);
200
+ await queryRunner.query(`
201
+ CREATE TRIGGER update_plans_updated_at BEFORE UPDATE ON plans
202
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column()
203
+ `);
204
+ await queryRunner.query(`COMMENT ON TABLE assets IS 'Media file metadata and properties - actual files stored in S3'`);
205
+ await queryRunner.query(`COMMENT ON TABLE effects IS 'Effect library catalog with parameters and previews'`);
206
+ await queryRunner.query(`COMMENT ON TABLE user_profiles IS 'Extended user information, preferences, and settings'`);
207
+ await queryRunner.query(`COMMENT ON TABLE user_onboarding_responses IS 'User onboarding survey responses for analytics'`);
208
+ await queryRunner.query(`COMMENT ON TABLE stripe_webhook_events IS 'Stripe webhook event audit log for debugging and replay'`);
209
+ await queryRunner.query(`COMMENT ON TABLE plans IS 'Alternative plan configurations (may overlap with subscription_plans)'`);
210
+ await queryRunner.query(`COMMENT ON TABLE auth_sessions IS 'User authentication sessions and refresh tokens (consider Redis for production)'`);
211
+ await queryRunner.query(`COMMENT ON COLUMN assets.file_url IS 'S3 URL or CDN URL for the asset file'`);
212
+ await queryRunner.query(`COMMENT ON COLUMN assets.metadata IS 'JSONB containing color space, EXIF, audio channels, etc.'`);
213
+ await queryRunner.query(`COMMENT ON COLUMN assets.tags IS 'Array of tags for organization and search'`);
214
+ await queryRunner.query(`COMMENT ON COLUMN effects.parameters_schema IS 'JSON schema defining configurable parameters for this effect'`);
215
+ await queryRunner.query(`COMMENT ON COLUMN user_profiles.storage_used_bytes IS 'Current storage usage in bytes'`);
216
+ await queryRunner.query(`COMMENT ON COLUMN user_profiles.storage_limit_bytes IS 'Storage limit based on subscription plan'`);
217
+ await queryRunner.query(`COMMENT ON COLUMN user_profiles.notification_preferences IS 'Email, push, and marketing notification settings'`);
218
+ await queryRunner.query(`COMMENT ON COLUMN user_profiles.export_preferences IS 'Default export format, quality, and watermark settings'`);
219
+ await queryRunner.query(`COMMENT ON COLUMN user_profiles.workspace_preferences IS 'Theme, language, timezone, and editor settings'`);
220
+ await queryRunner.query(`COMMENT ON COLUMN user_onboarding_responses.responses IS 'Complete JSONB of all onboarding survey answers'`);
221
+ await queryRunner.query(`COMMENT ON COLUMN stripe_webhook_events.event_data IS 'Complete Stripe webhook event payload'`);
222
+ await queryRunner.query(`COMMENT ON COLUMN stripe_webhook_events.retry_count IS 'Number of processing retry attempts'`);
223
+ await queryRunner.query(`COMMENT ON COLUMN auth_sessions.session_token IS 'JWT or session token for authentication'`);
224
+ await queryRunner.query(`COMMENT ON COLUMN auth_sessions.refresh_token IS 'Long-lived refresh token for obtaining new access tokens'`);
225
+ }
226
+ async down(queryRunner) {
227
+ await queryRunner.query(`DROP TRIGGER IF EXISTS update_assets_updated_at ON assets`);
228
+ await queryRunner.query(`DROP TRIGGER IF EXISTS update_effects_updated_at ON effects`);
229
+ await queryRunner.query(`DROP TRIGGER IF EXISTS update_user_profiles_updated_at ON user_profiles`);
230
+ await queryRunner.query(`DROP TRIGGER IF EXISTS update_user_onboarding_responses_updated_at ON user_onboarding_responses`);
231
+ await queryRunner.query(`DROP TRIGGER IF EXISTS update_plans_updated_at ON plans`);
232
+ await queryRunner.query(`DROP TABLE IF EXISTS auth_sessions`);
233
+ await queryRunner.query(`DROP TABLE IF EXISTS plans`);
234
+ await queryRunner.query(`DROP TABLE IF EXISTS stripe_webhook_events`);
235
+ await queryRunner.query(`DROP TABLE IF EXISTS user_onboarding_responses`);
236
+ await queryRunner.query(`DROP TABLE IF EXISTS user_profiles`);
237
+ await queryRunner.query(`DROP TABLE IF EXISTS effects`);
238
+ await queryRunner.query(`DROP TABLE IF EXISTS assets`);
239
+ }
240
+ }
241
+ exports.MediaConfigReferenceTables1713000000004 = MediaConfigReferenceTables1713000000004;
@@ -0,0 +1,6 @@
1
+ import { MigrationInterface, QueryRunner } from 'typeorm';
2
+ export declare class VideoMediaTables1713000000005 implements MigrationInterface {
3
+ name: string;
4
+ up(queryRunner: QueryRunner): Promise<void>;
5
+ down(queryRunner: QueryRunner): Promise<void>;
6
+ }
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.VideoMediaTables1713000000005 = void 0;
4
+ class VideoMediaTables1713000000005 {
5
+ constructor() {
6
+ this.name = 'VideoMediaTables1713000000005';
7
+ }
8
+ async up(queryRunner) {
9
+ await queryRunner.query(`
10
+ -- Video Transcodes Table (replaces videotranscoding-dev DynamoDB table)
11
+ CREATE TABLE IF NOT EXISTS video_transcodes (
12
+ id VARCHAR(255) PRIMARY KEY,
13
+ project_id VARCHAR(255),
14
+ s3_key TEXT,
15
+ status VARCHAR(50) DEFAULT 'NEW',
16
+ data JSONB,
17
+ queue_status VARCHAR(50),
18
+ created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
19
+ updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
20
+ )
21
+ `);
22
+ await queryRunner.query(`
23
+ -- Video Renders Table (replaces remotionvideo-dev DynamoDB table)
24
+ CREATE TABLE IF NOT EXISTS video_renders (
25
+ id VARCHAR(255) PRIMARY KEY,
26
+ user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
27
+ project_id VARCHAR(255),
28
+ title VARCHAR(255),
29
+ s3_url TEXT,
30
+ s3_image_url TEXT,
31
+ status VARCHAR(50) DEFAULT 'ACTIVE',
32
+ data JSONB,
33
+ created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
34
+ updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
35
+ )
36
+ `);
37
+ await queryRunner.query(`
38
+ -- Create enum types for status fields
39
+ DO $$ BEGIN
40
+ CREATE TYPE video_transcode_status AS ENUM ('NEW', 'PROCESSING', 'SUCCESS', 'ERROR');
41
+ EXCEPTION
42
+ WHEN duplicate_object THEN null;
43
+ END $$
44
+ `);
45
+ await queryRunner.query(`
46
+ DO $$ BEGIN
47
+ CREATE TYPE video_render_status AS ENUM ('ACTIVE', 'PROCESSING', 'COMPLETED', 'ERROR', 'DELETED');
48
+ EXCEPTION
49
+ WHEN duplicate_object THEN null;
50
+ END $$
51
+ `);
52
+ await queryRunner.query(`CREATE INDEX IF NOT EXISTS idx_video_transcodes_project_id ON video_transcodes(project_id)`);
53
+ await queryRunner.query(`CREATE INDEX IF NOT EXISTS idx_video_transcodes_status ON video_transcodes(status)`);
54
+ await queryRunner.query(`CREATE INDEX IF NOT EXISTS idx_video_transcodes_created_at ON video_transcodes(created_at DESC)`);
55
+ await queryRunner.query(`CREATE INDEX IF NOT EXISTS idx_video_renders_user_id ON video_renders(user_id)`);
56
+ await queryRunner.query(`CREATE INDEX IF NOT EXISTS idx_video_renders_project_id ON video_renders(project_id)`);
57
+ await queryRunner.query(`CREATE INDEX IF NOT EXISTS idx_video_renders_status ON video_renders(status)`);
58
+ await queryRunner.query(`CREATE INDEX IF NOT EXISTS idx_video_renders_created_at ON video_renders(created_at DESC)`);
59
+ await queryRunner.query(`
60
+ CREATE OR REPLACE FUNCTION update_updated_at_column()
61
+ RETURNS TRIGGER AS $$
62
+ BEGIN
63
+ NEW.updated_at = NOW();
64
+ RETURN NEW;
65
+ END;
66
+ $$ language 'plpgsql'
67
+ `);
68
+ await queryRunner.query(`
69
+ DROP TRIGGER IF EXISTS update_video_transcodes_updated_at ON video_transcodes
70
+ `);
71
+ await queryRunner.query(`
72
+ CREATE TRIGGER update_video_transcodes_updated_at
73
+ BEFORE UPDATE ON video_transcodes
74
+ FOR EACH ROW
75
+ EXECUTE FUNCTION update_updated_at_column()
76
+ `);
77
+ await queryRunner.query(`
78
+ DROP TRIGGER IF EXISTS update_video_renders_updated_at ON video_renders
79
+ `);
80
+ await queryRunner.query(`
81
+ CREATE TRIGGER update_video_renders_updated_at
82
+ BEFORE UPDATE ON video_renders
83
+ FOR EACH ROW
84
+ EXECUTE FUNCTION update_updated_at_column()
85
+ `);
86
+ await queryRunner.query(`COMMENT ON TABLE video_transcodes IS 'Video transcoding jobs - replaces videotranscoding-dev DynamoDB table'`);
87
+ await queryRunner.query(`COMMENT ON TABLE video_renders IS 'Video render records - replaces remotionvideo-dev DynamoDB table'`);
88
+ }
89
+ async down(queryRunner) {
90
+ await queryRunner.query(`DROP TRIGGER IF EXISTS update_video_transcodes_updated_at ON video_transcodes`);
91
+ await queryRunner.query(`DROP TRIGGER IF EXISTS update_video_renders_updated_at ON video_renders`);
92
+ await queryRunner.query(`DROP TABLE IF EXISTS video_renders`);
93
+ await queryRunner.query(`DROP TABLE IF EXISTS video_transcodes`);
94
+ await queryRunner.query(`DROP TYPE IF EXISTS video_render_status`);
95
+ await queryRunner.query(`DROP TYPE IF EXISTS video_transcode_status`);
96
+ }
97
+ }
98
+ exports.VideoMediaTables1713000000005 = VideoMediaTables1713000000005;
@@ -0,0 +1,6 @@
1
+ import { MigrationInterface, QueryRunner } from 'typeorm';
2
+ export declare class AddUserReferralColumns1713000000006 implements MigrationInterface {
3
+ name: string;
4
+ up(queryRunner: QueryRunner): Promise<void>;
5
+ down(queryRunner: QueryRunner): Promise<void>;
6
+ }
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AddUserReferralColumns1713000000006 = void 0;
4
+ class AddUserReferralColumns1713000000006 {
5
+ constructor() {
6
+ this.name = 'AddUserReferralColumns1713000000006';
7
+ }
8
+ async up(queryRunner) {
9
+ await queryRunner.query(`
10
+ ALTER TABLE users
11
+ ADD COLUMN IF NOT EXISTS referral_code VARCHAR(50)
12
+ `);
13
+ await queryRunner.query(`
14
+ ALTER TABLE users
15
+ ADD COLUMN IF NOT EXISTS referred_by UUID
16
+ `);
17
+ await queryRunner.query(`
18
+ ALTER TABLE users
19
+ ADD COLUMN IF NOT EXISTS referral_count INTEGER DEFAULT 0
20
+ `);
21
+ await queryRunner.query(`
22
+ CREATE INDEX IF NOT EXISTS idx_users_referral_code ON users(referral_code)
23
+ `);
24
+ await queryRunner.query(`
25
+ CREATE INDEX IF NOT EXISTS idx_users_referred_by ON users(referred_by)
26
+ `);
27
+ await queryRunner.query(`
28
+ COMMENT ON COLUMN users.referral_code IS 'Unique referral code for user to share'
29
+ `);
30
+ await queryRunner.query(`
31
+ COMMENT ON COLUMN users.referred_by IS 'UUID of the user who referred this user'
32
+ `);
33
+ await queryRunner.query(`
34
+ COMMENT ON COLUMN users.referral_count IS 'Number of users this user has referred'
35
+ `);
36
+ }
37
+ async down(queryRunner) {
38
+ await queryRunner.query(`
39
+ DROP INDEX IF EXISTS idx_users_referred_by
40
+ `);
41
+ await queryRunner.query(`
42
+ DROP INDEX IF EXISTS idx_users_referral_code
43
+ `);
44
+ await queryRunner.query(`
45
+ ALTER TABLE users DROP COLUMN IF EXISTS referral_code
46
+ `);
47
+ await queryRunner.query(`
48
+ ALTER TABLE users DROP COLUMN IF EXISTS referred_by
49
+ `);
50
+ await queryRunner.query(`
51
+ ALTER TABLE users DROP COLUMN IF EXISTS referral_count
52
+ `);
53
+ }
54
+ }
55
+ exports.AddUserReferralColumns1713000000006 = AddUserReferralColumns1713000000006;
@@ -0,0 +1,6 @@
1
+ import { MigrationInterface, QueryRunner } from 'typeorm';
2
+ export declare class AddUserProfileColumns1713000000007 implements MigrationInterface {
3
+ name: string;
4
+ up(queryRunner: QueryRunner): Promise<void>;
5
+ down(queryRunner: QueryRunner): Promise<void>;
6
+ }
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AddUserProfileColumns1713000000007 = void 0;
4
+ class AddUserProfileColumns1713000000007 {
5
+ constructor() {
6
+ this.name = 'AddUserProfileColumns1713000000007';
7
+ }
8
+ async up(queryRunner) {
9
+ await queryRunner.query(`
10
+ ALTER TABLE user_profiles
11
+ ADD COLUMN IF NOT EXISTS job_title VARCHAR(100)
12
+ `);
13
+ await queryRunner.query(`
14
+ ALTER TABLE user_profiles
15
+ ADD COLUMN IF NOT EXISTS phone VARCHAR(50)
16
+ `);
17
+ await queryRunner.query(`
18
+ ALTER TABLE user_profiles
19
+ ADD COLUMN IF NOT EXISTS location VARCHAR(100)
20
+ `);
21
+ await queryRunner.query(`
22
+ ALTER TABLE user_profiles
23
+ ADD COLUMN IF NOT EXISTS storage_used BIGINT DEFAULT 0
24
+ `);
25
+ await queryRunner.query(`
26
+ ALTER TABLE user_profiles
27
+ ADD COLUMN IF NOT EXISTS storage_limit BIGINT DEFAULT 5368709120
28
+ `);
29
+ await queryRunner.query(`
30
+ ALTER TABLE user_profiles
31
+ ADD COLUMN IF NOT EXISTS preferences JSONB
32
+ `);
33
+ await queryRunner.query(`
34
+ COMMENT ON COLUMN user_profiles.job_title IS 'User job title'
35
+ `);
36
+ await queryRunner.query(`
37
+ COMMENT ON COLUMN user_profiles.phone IS 'User phone (legacy field)'
38
+ `);
39
+ await queryRunner.query(`
40
+ COMMENT ON COLUMN user_profiles.location IS 'User location string'
41
+ `);
42
+ await queryRunner.query(`
43
+ COMMENT ON COLUMN user_profiles.storage_used IS 'Storage used in bytes (legacy alias)'
44
+ `);
45
+ await queryRunner.query(`
46
+ COMMENT ON COLUMN user_profiles.storage_limit IS 'Storage limit in bytes (legacy alias)'
47
+ `);
48
+ await queryRunner.query(`
49
+ COMMENT ON COLUMN user_profiles.preferences IS 'General user preferences JSON'
50
+ `);
51
+ }
52
+ async down(queryRunner) {
53
+ await queryRunner.query(`
54
+ ALTER TABLE user_profiles DROP COLUMN IF EXISTS job_title
55
+ `);
56
+ await queryRunner.query(`
57
+ ALTER TABLE user_profiles DROP COLUMN IF EXISTS phone
58
+ `);
59
+ await queryRunner.query(`
60
+ ALTER TABLE user_profiles DROP COLUMN IF EXISTS location
61
+ `);
62
+ await queryRunner.query(`
63
+ ALTER TABLE user_profiles DROP COLUMN IF EXISTS storage_used
64
+ `);
65
+ await queryRunner.query(`
66
+ ALTER TABLE user_profiles DROP COLUMN IF EXISTS storage_limit
67
+ `);
68
+ await queryRunner.query(`
69
+ ALTER TABLE user_profiles DROP COLUMN IF EXISTS preferences
70
+ `);
71
+ }
72
+ }
73
+ exports.AddUserProfileColumns1713000000007 = AddUserProfileColumns1713000000007;
@@ -0,0 +1,6 @@
1
+ import { MigrationInterface, QueryRunner } from 'typeorm';
2
+ export declare class AddBillingInfoColumn1713000000008 implements MigrationInterface {
3
+ name: string;
4
+ up(queryRunner: QueryRunner): Promise<void>;
5
+ down(queryRunner: QueryRunner): Promise<void>;
6
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AddBillingInfoColumn1713000000008 = void 0;
4
+ class AddBillingInfoColumn1713000000008 {
5
+ constructor() {
6
+ this.name = 'AddBillingInfoColumn1713000000008';
7
+ }
8
+ async up(queryRunner) {
9
+ await queryRunner.query(`
10
+ ALTER TABLE user_profiles
11
+ ADD COLUMN IF NOT EXISTS billing_info JSONB
12
+ `);
13
+ await queryRunner.query(`
14
+ COMMENT ON COLUMN user_profiles.billing_info IS 'Billing information JSON (companyName, abn, addressLine1, addressLine2, city, state, postalCode, country)'
15
+ `);
16
+ }
17
+ async down(queryRunner) {
18
+ await queryRunner.query(`
19
+ ALTER TABLE user_profiles DROP COLUMN IF EXISTS billing_info
20
+ `);
21
+ }
22
+ }
23
+ exports.AddBillingInfoColumn1713000000008 = AddBillingInfoColumn1713000000008;
@@ -0,0 +1,6 @@
1
+ import { MigrationInterface, QueryRunner } from 'typeorm';
2
+ export declare class AddWorkspaceStorageColumns1713000000009 implements MigrationInterface {
3
+ name: string;
4
+ up(queryRunner: QueryRunner): Promise<void>;
5
+ down(queryRunner: QueryRunner): Promise<void>;
6
+ }
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AddWorkspaceStorageColumns1713000000009 = void 0;
4
+ class AddWorkspaceStorageColumns1713000000009 {
5
+ constructor() {
6
+ this.name = 'AddWorkspaceStorageColumns1713000000009';
7
+ }
8
+ async up(queryRunner) {
9
+ await queryRunner.query(`
10
+ ALTER TABLE workspaces
11
+ ADD COLUMN IF NOT EXISTS storage_used_bytes BIGINT DEFAULT 0
12
+ `);
13
+ await queryRunner.query(`
14
+ ALTER TABLE workspaces
15
+ ADD COLUMN IF NOT EXISTS storage_limit_bytes BIGINT DEFAULT 10737418240
16
+ `);
17
+ await queryRunner.query(`
18
+ ALTER TABLE workspaces
19
+ ADD COLUMN IF NOT EXISTS storage_last_calculated_at TIMESTAMP
20
+ `);
21
+ await queryRunner.query(`
22
+ CREATE INDEX IF NOT EXISTS idx_workspaces_storage_used_bytes ON workspaces(storage_used_bytes)
23
+ `);
24
+ await queryRunner.query(`
25
+ COMMENT ON COLUMN workspaces.storage_used_bytes IS 'Current storage usage in bytes for this workspace, calculated daily'
26
+ `);
27
+ await queryRunner.query(`
28
+ COMMENT ON COLUMN workspaces.storage_limit_bytes IS 'Maximum storage allowed in bytes for this workspace (default 10GB)'
29
+ `);
30
+ await queryRunner.query(`
31
+ COMMENT ON COLUMN workspaces.storage_last_calculated_at IS 'Timestamp of last storage calculation for this workspace'
32
+ `);
33
+ }
34
+ async down(queryRunner) {
35
+ await queryRunner.query(`
36
+ DROP INDEX IF EXISTS idx_workspaces_storage_used_bytes
37
+ `);
38
+ await queryRunner.query(`
39
+ ALTER TABLE workspaces DROP COLUMN IF EXISTS storage_used_bytes
40
+ `);
41
+ await queryRunner.query(`
42
+ ALTER TABLE workspaces DROP COLUMN IF EXISTS storage_limit_bytes
43
+ `);
44
+ await queryRunner.query(`
45
+ ALTER TABLE workspaces DROP COLUMN IF EXISTS storage_last_calculated_at
46
+ `);
47
+ }
48
+ }
49
+ exports.AddWorkspaceStorageColumns1713000000009 = AddWorkspaceStorageColumns1713000000009;
@@ -0,0 +1,6 @@
1
+ import { MigrationInterface, QueryRunner } from 'typeorm';
2
+ export declare class AddUniqueIdToAssets1713000000010 implements MigrationInterface {
3
+ name: string;
4
+ up(queryRunner: QueryRunner): Promise<void>;
5
+ down(queryRunner: QueryRunner): Promise<void>;
6
+ }
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AddUniqueIdToAssets1713000000010 = void 0;
4
+ class AddUniqueIdToAssets1713000000010 {
5
+ constructor() {
6
+ this.name = 'AddUniqueIdToAssets1713000000010';
7
+ }
8
+ async up(queryRunner) {
9
+ await queryRunner.query(`
10
+ ALTER TABLE assets
11
+ ADD COLUMN unique_id VARCHAR(255)
12
+ `);
13
+ await queryRunner.query(`
14
+ CREATE INDEX idx_assets_unique_id ON assets(unique_id)
15
+ `);
16
+ await queryRunner.query(`
17
+ COMMENT ON COLUMN assets.unique_id IS 'Unique identifier for asset processing correlation'
18
+ `);
19
+ }
20
+ async down(queryRunner) {
21
+ await queryRunner.query(`
22
+ DROP INDEX IF EXISTS idx_assets_unique_id
23
+ `);
24
+ await queryRunner.query(`
25
+ ALTER TABLE assets DROP COLUMN IF EXISTS unique_id
26
+ `);
27
+ }
28
+ }
29
+ exports.AddUniqueIdToAssets1713000000010 = AddUniqueIdToAssets1713000000010;
@@ -1,5 +1,5 @@
1
1
  import { MigrationInterface, QueryRunner } from 'typeorm';
2
- export declare class AddDescriptionToBrandKits1713000000003 implements MigrationInterface {
2
+ export declare class CreateReferralEventsTable1713000000011 implements MigrationInterface {
3
3
  name: string;
4
4
  up(queryRunner: QueryRunner): Promise<void>;
5
5
  down(queryRunner: QueryRunner): Promise<void>;