clhq-postgres-module 1.1.0-alpha.173 → 1.1.0-alpha.175

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/{1713000000004-CreateKlingGenerationTables.d.ts → 1713000000018-CreateVideoProcessingTables.d.ts} +1 -1
  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/{1713000000004-CreateKlingGenerationTables.js → 1713000000050-CreateKlingGenerationTables.js} +7 -5
  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,3 @@
1
+ import { DataSource } from 'typeorm';
2
+ declare const _default: DataSource;
3
+ export default _default;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const typeorm_1 = require("typeorm");
4
+ const path_1 = require("path");
5
+ const url = process.env.LOCAL_DATABASE_URL ||
6
+ 'postgres://clhq:clhq_local@localhost:5433/clhq_local';
7
+ exports.default = new typeorm_1.DataSource({
8
+ type: 'postgres',
9
+ url,
10
+ synchronize: false,
11
+ logging: ['error', 'warn', 'migration'],
12
+ entities: [(0, path_1.join)(__dirname, '/../entities/*.entity{.ts,.js}')],
13
+ migrations: [(0, path_1.join)(__dirname, '/../migrations/*{.ts,.js}')],
14
+ ssl: false,
15
+ });
@@ -0,0 +1,6 @@
1
+ import { MigrationInterface, QueryRunner } from 'typeorm';
2
+ export declare class InitialSchema1713000000001 implements MigrationInterface {
3
+ name: string;
4
+ up(queryRunner: QueryRunner): Promise<void>;
5
+ down(queryRunner: QueryRunner): Promise<void>;
6
+ }
@@ -0,0 +1,196 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InitialSchema1713000000001 = void 0;
4
+ class InitialSchema1713000000001 {
5
+ constructor() {
6
+ this.name = 'InitialSchema1713000000001';
7
+ }
8
+ async up(queryRunner) {
9
+ await queryRunner.query(`
10
+ CREATE EXTENSION IF NOT EXISTS "uuid-ossp"
11
+ `);
12
+ await queryRunner.query(`
13
+ CREATE TABLE workspaces (
14
+ id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
15
+ name VARCHAR(255) NOT NULL,
16
+ description TEXT,
17
+ owner_id UUID NOT NULL,
18
+ is_shared BOOLEAN DEFAULT false,
19
+ created_at TIMESTAMP DEFAULT NOW(),
20
+ updated_at TIMESTAMP DEFAULT NOW()
21
+ )
22
+ `);
23
+ await queryRunner.query(`
24
+ CREATE INDEX idx_workspaces_owner_id ON workspaces(owner_id)
25
+ `);
26
+ await queryRunner.query(`
27
+ CREATE TABLE users (
28
+ id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
29
+ email VARCHAR(255) UNIQUE NOT NULL,
30
+ username VARCHAR(255),
31
+ auth0_user_id VARCHAR(255) UNIQUE NOT NULL,
32
+ password_hash VARCHAR(255) NOT NULL,
33
+ email_verified BOOLEAN DEFAULT false,
34
+ status VARCHAR(50) DEFAULT 'active',
35
+ role VARCHAR(50) DEFAULT 'user',
36
+ is_active BOOLEAN DEFAULT true,
37
+ is_email_verified BOOLEAN DEFAULT false,
38
+ verification_token VARCHAR(255),
39
+ stripe_customer_id VARCHAR(255),
40
+ workspace_id UUID REFERENCES workspaces(id),
41
+ last_login_at TIMESTAMP,
42
+ email_verified_at TIMESTAMP,
43
+ deleted_at TIMESTAMP,
44
+ scheduled_deletion_at TIMESTAMP,
45
+ created_at TIMESTAMP DEFAULT NOW(),
46
+ updated_at TIMESTAMP DEFAULT NOW()
47
+ )
48
+ `);
49
+ await queryRunner.query(`
50
+ CREATE INDEX idx_users_email ON users(email)
51
+ `);
52
+ await queryRunner.query(`
53
+ CREATE INDEX idx_users_auth0_user_id ON users(auth0_user_id)
54
+ `);
55
+ await queryRunner.query(`
56
+ CREATE INDEX idx_users_workspace_id ON users(workspace_id)
57
+ `);
58
+ await queryRunner.query(`
59
+ ALTER TABLE workspaces
60
+ ADD CONSTRAINT fk_workspaces_owner
61
+ FOREIGN KEY (owner_id) REFERENCES users(id)
62
+ `);
63
+ await queryRunner.query(`
64
+ CREATE TABLE editor_projects (
65
+ id VARCHAR(255) PRIMARY KEY,
66
+ title VARCHAR(255) NOT NULL,
67
+ description TEXT,
68
+ workspace_id UUID REFERENCES workspaces(id),
69
+ owner_id UUID REFERENCES users(id),
70
+ timeline_s3_key TEXT,
71
+ timeline_compressed BOOLEAN DEFAULT true,
72
+ duration_ms INTEGER DEFAULT 0,
73
+ fps INTEGER DEFAULT 30,
74
+ resolution_width INTEGER DEFAULT 1920,
75
+ resolution_height INTEGER DEFAULT 1080,
76
+ background_color VARCHAR(50) DEFAULT '#000000',
77
+ aspect_ratio JSONB,
78
+ status VARCHAR(50) DEFAULT 'draft',
79
+ visibility VARCHAR(50) DEFAULT 'private',
80
+ is_template BOOLEAN DEFAULT false,
81
+ is_favorite BOOLEAN DEFAULT false,
82
+ template_category VARCHAR(100),
83
+ is_premium_template BOOLEAN DEFAULT false,
84
+ template_usage_count INTEGER DEFAULT 0,
85
+ collaborator_ids JSONB,
86
+ tags JSONB,
87
+ thumbnail_url TEXT,
88
+ settings JSONB,
89
+ metadata JSONB,
90
+ last_opened_at TIMESTAMP,
91
+ last_edited_by UUID,
92
+ created_at TIMESTAMP DEFAULT NOW(),
93
+ updated_at TIMESTAMP DEFAULT NOW()
94
+ )
95
+ `);
96
+ await queryRunner.query(`
97
+ CREATE INDEX idx_editor_projects_workspace_id ON editor_projects(workspace_id)
98
+ `);
99
+ await queryRunner.query(`
100
+ CREATE INDEX idx_editor_projects_owner_id ON editor_projects(owner_id)
101
+ `);
102
+ await queryRunner.query(`
103
+ CREATE INDEX idx_editor_projects_status ON editor_projects(status)
104
+ `);
105
+ await queryRunner.query(`
106
+ CREATE INDEX idx_editor_projects_last_opened_at ON editor_projects(last_opened_at)
107
+ `);
108
+ await queryRunner.query(`
109
+ CREATE TABLE user_subscriptions (
110
+ id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
111
+ user_id UUID NOT NULL REFERENCES users(id),
112
+ plan_id VARCHAR(100) NOT NULL,
113
+ status VARCHAR(50) DEFAULT 'active',
114
+ billing_cycle VARCHAR(50) DEFAULT 'monthly',
115
+ amount_paid DECIMAL(10, 2) NOT NULL,
116
+ currency VARCHAR(10) DEFAULT 'USD',
117
+ started_at TIMESTAMP NOT NULL,
118
+ current_period_start TIMESTAMP NOT NULL,
119
+ current_period_end TIMESTAMP NOT NULL,
120
+ cancelled_at TIMESTAMP,
121
+ expires_at TIMESTAMP,
122
+ trial_ends_at TIMESTAMP,
123
+ stripe_subscription_id VARCHAR(255),
124
+ stripe_customer_id VARCHAR(255),
125
+ payment_method_id VARCHAR(255),
126
+ cancel_reason VARCHAR(50),
127
+ cancel_feedback TEXT,
128
+ cancelled_by UUID,
129
+ auto_renew BOOLEAN DEFAULT true,
130
+ created_at TIMESTAMP DEFAULT NOW(),
131
+ updated_at TIMESTAMP DEFAULT NOW()
132
+ )
133
+ `);
134
+ await queryRunner.query(`
135
+ CREATE INDEX idx_user_subscriptions_user_id ON user_subscriptions(user_id)
136
+ `);
137
+ await queryRunner.query(`
138
+ CREATE INDEX idx_user_subscriptions_status ON user_subscriptions(status)
139
+ `);
140
+ await queryRunner.query(`
141
+ CREATE OR REPLACE FUNCTION update_updated_at_column()
142
+ RETURNS TRIGGER AS $$
143
+ BEGIN
144
+ NEW.updated_at = NOW();
145
+ RETURN NEW;
146
+ END;
147
+ $$ language 'plpgsql'
148
+ `);
149
+ await queryRunner.query(`
150
+ CREATE TRIGGER update_users_updated_at BEFORE UPDATE ON users
151
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column()
152
+ `);
153
+ await queryRunner.query(`
154
+ CREATE TRIGGER update_workspaces_updated_at BEFORE UPDATE ON workspaces
155
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column()
156
+ `);
157
+ await queryRunner.query(`
158
+ CREATE TRIGGER update_editor_projects_updated_at BEFORE UPDATE ON editor_projects
159
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column()
160
+ `);
161
+ await queryRunner.query(`
162
+ CREATE TRIGGER update_user_subscriptions_updated_at BEFORE UPDATE ON user_subscriptions
163
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column()
164
+ `);
165
+ await queryRunner.query(`
166
+ COMMENT ON TABLE users IS 'User accounts and authentication'
167
+ `);
168
+ await queryRunner.query(`
169
+ COMMENT ON TABLE workspaces IS 'Workspace containers for projects'
170
+ `);
171
+ await queryRunner.query(`
172
+ COMMENT ON TABLE editor_projects IS 'Video editor project metadata - Timeline stored in S3'
173
+ `);
174
+ await queryRunner.query(`
175
+ COMMENT ON TABLE user_subscriptions IS 'User subscription and billing information'
176
+ `);
177
+ await queryRunner.query(`
178
+ COMMENT ON COLUMN editor_projects.timeline_s3_key IS 'S3 key for compressed timeline JSON'
179
+ `);
180
+ await queryRunner.query(`
181
+ COMMENT ON COLUMN editor_projects.timeline_compressed IS 'Whether timeline is gzip compressed'
182
+ `);
183
+ }
184
+ async down(queryRunner) {
185
+ await queryRunner.query(`DROP TRIGGER IF EXISTS update_user_subscriptions_updated_at ON user_subscriptions`);
186
+ await queryRunner.query(`DROP TRIGGER IF EXISTS update_editor_projects_updated_at ON editor_projects`);
187
+ await queryRunner.query(`DROP TRIGGER IF EXISTS update_workspaces_updated_at ON workspaces`);
188
+ await queryRunner.query(`DROP TRIGGER IF EXISTS update_users_updated_at ON users`);
189
+ await queryRunner.query(`DROP FUNCTION IF EXISTS update_updated_at_column`);
190
+ await queryRunner.query(`DROP TABLE IF EXISTS user_subscriptions`);
191
+ await queryRunner.query(`DROP TABLE IF EXISTS editor_projects`);
192
+ await queryRunner.query(`DROP TABLE IF EXISTS users`);
193
+ await queryRunner.query(`DROP TABLE IF EXISTS workspaces`);
194
+ }
195
+ }
196
+ exports.InitialSchema1713000000001 = InitialSchema1713000000001;
@@ -0,0 +1,6 @@
1
+ import { MigrationInterface, QueryRunner } from 'typeorm';
2
+ export declare class CoreBusinessTables1713000000002 implements MigrationInterface {
3
+ name: string;
4
+ up(queryRunner: QueryRunner): Promise<void>;
5
+ down(queryRunner: QueryRunner): Promise<void>;
6
+ }
@@ -0,0 +1,198 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CoreBusinessTables1713000000002 = void 0;
4
+ class CoreBusinessTables1713000000002 {
5
+ constructor() {
6
+ this.name = 'CoreBusinessTables1713000000002';
7
+ }
8
+ async up(queryRunner) {
9
+ await queryRunner.query(`
10
+ CREATE TABLE workspace_members (
11
+ id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
12
+ workspace_id UUID NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE,
13
+ user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
14
+ role VARCHAR(50) DEFAULT 'member',
15
+ permissions JSONB DEFAULT '[]'::jsonb,
16
+ status VARCHAR(50) DEFAULT 'active',
17
+ invited_by UUID REFERENCES users(id),
18
+ joined_at TIMESTAMP DEFAULT NOW(),
19
+ invited_at TIMESTAMP,
20
+ last_active_at TIMESTAMP,
21
+ created_at TIMESTAMP DEFAULT NOW(),
22
+ updated_at TIMESTAMP DEFAULT NOW(),
23
+ UNIQUE(workspace_id, user_id)
24
+ )
25
+ `);
26
+ await queryRunner.query(`
27
+ CREATE INDEX idx_workspace_members_workspace_id ON workspace_members(workspace_id)
28
+ `);
29
+ await queryRunner.query(`
30
+ CREATE INDEX idx_workspace_members_user_id ON workspace_members(user_id)
31
+ `);
32
+ await queryRunner.query(`
33
+ CREATE INDEX idx_workspace_members_role ON workspace_members(role)
34
+ `);
35
+ await queryRunner.query(`
36
+ CREATE TABLE subscription_plans (
37
+ id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
38
+ plan_key VARCHAR(50) UNIQUE NOT NULL,
39
+ name VARCHAR(255) NOT NULL,
40
+ description TEXT,
41
+ price_monthly DECIMAL(10, 2) NOT NULL DEFAULT 0.00,
42
+ price_yearly DECIMAL(10, 2) NOT NULL DEFAULT 0.00,
43
+ currency VARCHAR(10) DEFAULT 'USD',
44
+ storage_limit_gb INTEGER DEFAULT 1,
45
+ project_limit INTEGER DEFAULT 3,
46
+ export_limit_monthly INTEGER DEFAULT 5,
47
+ max_video_length_minutes INTEGER DEFAULT 10,
48
+ max_resolution VARCHAR(20) DEFAULT '720p',
49
+ max_fps INTEGER DEFAULT 30,
50
+ has_premium_templates BOOLEAN DEFAULT false,
51
+ has_premium_effects BOOLEAN DEFAULT false,
52
+ has_ai_features BOOLEAN DEFAULT false,
53
+ has_collaboration BOOLEAN DEFAULT false,
54
+ has_advanced_export BOOLEAN DEFAULT false,
55
+ has_white_label BOOLEAN DEFAULT false,
56
+ has_api_access BOOLEAN DEFAULT false,
57
+ has_priority_support BOOLEAN DEFAULT false,
58
+ has_custom_branding BOOLEAN DEFAULT false,
59
+ max_team_members INTEGER DEFAULT 1,
60
+ max_workspaces INTEGER DEFAULT 1,
61
+ max_render_queue INTEGER DEFAULT 1,
62
+ render_priority INTEGER DEFAULT 0,
63
+ is_active BOOLEAN DEFAULT true,
64
+ is_featured BOOLEAN DEFAULT false,
65
+ display_order INTEGER DEFAULT 0,
66
+ trial_days INTEGER DEFAULT 0,
67
+ stripe_product_id VARCHAR(255),
68
+ stripe_price_id_monthly VARCHAR(255),
69
+ stripe_price_id_yearly VARCHAR(255),
70
+ created_at TIMESTAMP DEFAULT NOW(),
71
+ updated_at TIMESTAMP DEFAULT NOW()
72
+ )
73
+ `);
74
+ await queryRunner.query(`
75
+ CREATE INDEX idx_subscription_plans_plan_key ON subscription_plans(plan_key)
76
+ `);
77
+ await queryRunner.query(`
78
+ CREATE INDEX idx_subscription_plans_is_active ON subscription_plans(is_active)
79
+ `);
80
+ await queryRunner.query(`
81
+ CREATE TABLE payment_transactions (
82
+ id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
83
+ user_id UUID NOT NULL REFERENCES users(id),
84
+ subscription_id UUID REFERENCES user_subscriptions(id),
85
+ transaction_type VARCHAR(50) NOT NULL,
86
+ amount DECIMAL(10, 2) NOT NULL,
87
+ currency VARCHAR(10) DEFAULT 'USD',
88
+ status VARCHAR(50) NOT NULL,
89
+ stripe_payment_intent_id VARCHAR(255),
90
+ stripe_invoice_id VARCHAR(255),
91
+ payment_method_type VARCHAR(50),
92
+ billing_email VARCHAR(255),
93
+ billing_name VARCHAR(255),
94
+ billing_address JSONB,
95
+ failure_reason TEXT,
96
+ failure_code VARCHAR(100),
97
+ processed_at TIMESTAMP,
98
+ created_at TIMESTAMP DEFAULT NOW(),
99
+ invoice_url TEXT,
100
+ invoice_number VARCHAR(100)
101
+ )
102
+ `);
103
+ await queryRunner.query(`
104
+ CREATE INDEX idx_payment_transactions_user_id ON payment_transactions(user_id)
105
+ `);
106
+ await queryRunner.query(`
107
+ CREATE INDEX idx_payment_transactions_subscription_id ON payment_transactions(subscription_id)
108
+ `);
109
+ await queryRunner.query(`
110
+ CREATE INDEX idx_payment_transactions_status ON payment_transactions(status)
111
+ `);
112
+ await queryRunner.query(`
113
+ CREATE INDEX idx_payment_transactions_created_at ON payment_transactions(created_at DESC)
114
+ `);
115
+ await queryRunner.query(`
116
+ CREATE INDEX idx_payment_transactions_stripe_payment_intent ON payment_transactions(stripe_payment_intent_id)
117
+ `);
118
+ await queryRunner.query(`
119
+ CREATE TABLE comments (
120
+ id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
121
+ project_id VARCHAR(255) NOT NULL REFERENCES editor_projects(id) ON DELETE CASCADE,
122
+ user_id UUID NOT NULL REFERENCES users(id),
123
+ parent_id UUID REFERENCES comments(id) ON DELETE CASCADE,
124
+ content TEXT NOT NULL,
125
+ timestamp_ms INTEGER,
126
+ position_x DECIMAL(10, 2),
127
+ position_y DECIMAL(10, 2),
128
+ status VARCHAR(50) DEFAULT 'open',
129
+ resolved_by UUID REFERENCES users(id),
130
+ resolved_at TIMESTAMP,
131
+ created_at TIMESTAMP DEFAULT NOW(),
132
+ updated_at TIMESTAMP DEFAULT NOW(),
133
+ deleted_at TIMESTAMP
134
+ )
135
+ `);
136
+ await queryRunner.query(`
137
+ CREATE INDEX idx_comments_project_id ON comments(project_id)
138
+ `);
139
+ await queryRunner.query(`
140
+ CREATE INDEX idx_comments_user_id ON comments(user_id)
141
+ `);
142
+ await queryRunner.query(`
143
+ CREATE INDEX idx_comments_parent_id ON comments(parent_id)
144
+ `);
145
+ await queryRunner.query(`
146
+ CREATE INDEX idx_comments_status ON comments(status)
147
+ `);
148
+ await queryRunner.query(`
149
+ CREATE INDEX idx_comments_created_at ON comments(created_at DESC)
150
+ `);
151
+ await queryRunner.query(`
152
+ CREATE TRIGGER update_workspace_members_updated_at BEFORE UPDATE ON workspace_members
153
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column()
154
+ `);
155
+ await queryRunner.query(`
156
+ CREATE TRIGGER update_subscription_plans_updated_at BEFORE UPDATE ON subscription_plans
157
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column()
158
+ `);
159
+ await queryRunner.query(`
160
+ CREATE TRIGGER update_comments_updated_at BEFORE UPDATE ON comments
161
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column()
162
+ `);
163
+ await queryRunner.query(`
164
+ COMMENT ON TABLE workspace_members IS 'User membership in workspaces for collaboration'
165
+ `);
166
+ await queryRunner.query(`
167
+ COMMENT ON TABLE subscription_plans IS 'Product catalog defining subscription tiers and features'
168
+ `);
169
+ await queryRunner.query(`
170
+ COMMENT ON TABLE payment_transactions IS 'Financial transaction history and payment records'
171
+ `);
172
+ await queryRunner.query(`
173
+ COMMENT ON TABLE comments IS 'Project comments and collaboration feedback'
174
+ `);
175
+ await queryRunner.query(`
176
+ COMMENT ON COLUMN comments.timestamp_ms IS 'Video timestamp where comment was made'
177
+ `);
178
+ await queryRunner.query(`
179
+ COMMENT ON COLUMN comments.position_x IS 'X coordinate on canvas for positioned comments'
180
+ `);
181
+ await queryRunner.query(`
182
+ COMMENT ON COLUMN comments.position_y IS 'Y coordinate on canvas for positioned comments'
183
+ `);
184
+ await queryRunner.query(`
185
+ COMMENT ON COLUMN payment_transactions.stripe_payment_intent_id IS 'Stripe payment intent ID for reconciliation'
186
+ `);
187
+ }
188
+ async down(queryRunner) {
189
+ await queryRunner.query(`DROP TRIGGER IF EXISTS update_comments_updated_at ON comments`);
190
+ await queryRunner.query(`DROP TRIGGER IF EXISTS update_subscription_plans_updated_at ON subscription_plans`);
191
+ await queryRunner.query(`DROP TRIGGER IF EXISTS update_workspace_members_updated_at ON workspace_members`);
192
+ await queryRunner.query(`DROP TABLE IF EXISTS comments`);
193
+ await queryRunner.query(`DROP TABLE IF EXISTS payment_transactions`);
194
+ await queryRunner.query(`DROP TABLE IF EXISTS subscription_plans`);
195
+ await queryRunner.query(`DROP TABLE IF EXISTS workspace_members`);
196
+ }
197
+ }
198
+ exports.CoreBusinessTables1713000000002 = CoreBusinessTables1713000000002;
@@ -0,0 +1,6 @@
1
+ import { MigrationInterface, QueryRunner } from 'typeorm';
2
+ export declare class RemainingCoreTables1713000000003 implements MigrationInterface {
3
+ name: string;
4
+ up(queryRunner: QueryRunner): Promise<void>;
5
+ down(queryRunner: QueryRunner): Promise<void>;
6
+ }
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RemainingCoreTables1713000000003 = void 0;
4
+ class RemainingCoreTables1713000000003 {
5
+ constructor() {
6
+ this.name = 'RemainingCoreTables1713000000003';
7
+ }
8
+ async up(queryRunner) {
9
+ await queryRunner.query(`
10
+ CREATE TABLE credit_transactions (
11
+ id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
12
+ user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
13
+ amount DECIMAL(10,2) NOT NULL,
14
+ type VARCHAR(50) NOT NULL CHECK (type IN ('purchase', 'usage', 'refund', 'bonus')),
15
+ description TEXT,
16
+ stripe_payment_intent_id VARCHAR(255),
17
+ metadata JSONB DEFAULT '{}',
18
+ created_at TIMESTAMP DEFAULT NOW(),
19
+ updated_at TIMESTAMP DEFAULT NOW()
20
+ )
21
+ `);
22
+ await queryRunner.query(`
23
+ CREATE INDEX idx_credit_transactions_user_id ON credit_transactions(user_id)
24
+ `);
25
+ await queryRunner.query(`
26
+ CREATE INDEX idx_credit_transactions_type ON credit_transactions(type)
27
+ `);
28
+ await queryRunner.query(`
29
+ CREATE INDEX idx_credit_transactions_created_at ON credit_transactions(created_at)
30
+ `);
31
+ await queryRunner.query(`
32
+ CREATE TABLE subscription_usage (
33
+ id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
34
+ subscription_id UUID NOT NULL REFERENCES user_subscriptions(id) ON DELETE CASCADE,
35
+ usage_type VARCHAR(100) NOT NULL,
36
+ usage_count INTEGER DEFAULT 0,
37
+ usage_limit INTEGER,
38
+ period_start TIMESTAMP NOT NULL,
39
+ period_end TIMESTAMP NOT NULL,
40
+ metadata JSONB DEFAULT '{}',
41
+ created_at TIMESTAMP DEFAULT NOW(),
42
+ updated_at TIMESTAMP DEFAULT NOW()
43
+ )
44
+ `);
45
+ await queryRunner.query(`
46
+ CREATE INDEX idx_subscription_usage_subscription_id ON subscription_usage(subscription_id)
47
+ `);
48
+ await queryRunner.query(`
49
+ CREATE INDEX idx_subscription_usage_period ON subscription_usage(period_start, period_end)
50
+ `);
51
+ await queryRunner.query(`
52
+ CREATE INDEX idx_subscription_usage_type ON subscription_usage(usage_type)
53
+ `);
54
+ await queryRunner.query(`
55
+ CREATE TABLE ai_usage (
56
+ id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
57
+ user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
58
+ project_id VARCHAR(255) REFERENCES editor_projects(id) ON DELETE SET NULL,
59
+ feature_type VARCHAR(100) NOT NULL,
60
+ tokens_used INTEGER DEFAULT 0,
61
+ cost_cents INTEGER DEFAULT 0,
62
+ model VARCHAR(100),
63
+ metadata JSONB DEFAULT '{}',
64
+ created_at TIMESTAMP DEFAULT NOW()
65
+ )
66
+ `);
67
+ await queryRunner.query(`
68
+ CREATE INDEX idx_ai_usage_user_id ON ai_usage(user_id)
69
+ `);
70
+ await queryRunner.query(`
71
+ CREATE INDEX idx_ai_usage_project_id ON ai_usage(project_id)
72
+ `);
73
+ await queryRunner.query(`
74
+ CREATE INDEX idx_ai_usage_feature_type ON ai_usage(feature_type)
75
+ `);
76
+ await queryRunner.query(`
77
+ CREATE INDEX idx_ai_usage_created_at ON ai_usage(created_at)
78
+ `);
79
+ await queryRunner.query(`
80
+ CREATE TABLE invites (
81
+ id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
82
+ workspace_id UUID REFERENCES workspaces(id) ON DELETE CASCADE,
83
+ project_id VARCHAR(255) REFERENCES editor_projects(id) ON DELETE CASCADE,
84
+ email VARCHAR(255) NOT NULL,
85
+ role VARCHAR(50) NOT NULL,
86
+ status VARCHAR(50) DEFAULT 'pending',
87
+ invited_by UUID REFERENCES users(id) ON DELETE SET NULL,
88
+ token VARCHAR(255) UNIQUE NOT NULL,
89
+ expires_at TIMESTAMP NOT NULL,
90
+ accepted_at TIMESTAMP,
91
+ created_at TIMESTAMP DEFAULT NOW(),
92
+ updated_at TIMESTAMP DEFAULT NOW()
93
+ )
94
+ `);
95
+ await queryRunner.query(`
96
+ CREATE INDEX idx_invites_workspace_id ON invites(workspace_id)
97
+ `);
98
+ await queryRunner.query(`
99
+ CREATE INDEX idx_invites_project_id ON invites(project_id)
100
+ `);
101
+ await queryRunner.query(`
102
+ CREATE INDEX idx_invites_email ON invites(email)
103
+ `);
104
+ await queryRunner.query(`
105
+ CREATE INDEX idx_invites_token ON invites(token)
106
+ `);
107
+ await queryRunner.query(`
108
+ CREATE INDEX idx_invites_status ON invites(status)
109
+ `);
110
+ await queryRunner.query(`
111
+ CREATE TABLE reward_rules (
112
+ id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
113
+ rule_name VARCHAR(100) NOT NULL UNIQUE,
114
+ description TEXT,
115
+ reward_type VARCHAR(50) NOT NULL,
116
+ reward_value INTEGER NOT NULL,
117
+ trigger_event VARCHAR(100) NOT NULL,
118
+ conditions JSONB DEFAULT '{}',
119
+ is_active BOOLEAN DEFAULT true,
120
+ max_uses_per_user INTEGER,
121
+ created_at TIMESTAMP DEFAULT NOW(),
122
+ updated_at TIMESTAMP DEFAULT NOW()
123
+ )
124
+ `);
125
+ await queryRunner.query(`
126
+ CREATE INDEX idx_reward_rules_trigger_event ON reward_rules(trigger_event)
127
+ `);
128
+ await queryRunner.query(`
129
+ CREATE INDEX idx_reward_rules_is_active ON reward_rules(is_active)
130
+ `);
131
+ await queryRunner.query(`
132
+ CREATE TRIGGER update_credit_transactions_updated_at BEFORE UPDATE ON credit_transactions
133
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column()
134
+ `);
135
+ await queryRunner.query(`
136
+ CREATE TRIGGER update_subscription_usage_updated_at BEFORE UPDATE ON subscription_usage
137
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column()
138
+ `);
139
+ await queryRunner.query(`
140
+ CREATE TRIGGER update_invites_updated_at BEFORE UPDATE ON invites
141
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column()
142
+ `);
143
+ await queryRunner.query(`
144
+ CREATE TRIGGER update_reward_rules_updated_at BEFORE UPDATE ON reward_rules
145
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column()
146
+ `);
147
+ }
148
+ async down(queryRunner) {
149
+ await queryRunner.query(`DROP TRIGGER IF EXISTS update_reward_rules_updated_at ON reward_rules`);
150
+ await queryRunner.query(`DROP TRIGGER IF EXISTS update_invites_updated_at ON invites`);
151
+ await queryRunner.query(`DROP TRIGGER IF EXISTS update_subscription_usage_updated_at ON subscription_usage`);
152
+ await queryRunner.query(`DROP TRIGGER IF EXISTS update_credit_transactions_updated_at ON credit_transactions`);
153
+ await queryRunner.query(`DROP TABLE IF EXISTS reward_rules`);
154
+ await queryRunner.query(`DROP TABLE IF EXISTS invites`);
155
+ await queryRunner.query(`DROP TABLE IF EXISTS ai_usage`);
156
+ await queryRunner.query(`DROP TABLE IF EXISTS subscription_usage`);
157
+ await queryRunner.query(`DROP TABLE IF EXISTS credit_transactions`);
158
+ }
159
+ }
160
+ exports.RemainingCoreTables1713000000003 = RemainingCoreTables1713000000003;
@@ -0,0 +1,6 @@
1
+ import { MigrationInterface, QueryRunner } from 'typeorm';
2
+ export declare class MediaConfigReferenceTables1713000000004 implements MigrationInterface {
3
+ name: string;
4
+ up(queryRunner: QueryRunner): Promise<void>;
5
+ down(queryRunner: QueryRunner): Promise<void>;
6
+ }