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,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CreateReferralEventsTable1713000000011 = void 0;
4
+ class CreateReferralEventsTable1713000000011 {
5
+ constructor() {
6
+ this.name = 'CreateReferralEventsTable1713000000011';
7
+ }
8
+ async up(queryRunner) {
9
+ await queryRunner.query(`
10
+ CREATE TABLE IF NOT EXISTS referral_events (
11
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
12
+ referrer_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
13
+ referred_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
14
+ referral_code VARCHAR(50) NOT NULL,
15
+ status VARCHAR(20) NOT NULL DEFAULT 'signup',
16
+ conversion_type VARCHAR(50),
17
+ conversion_value DECIMAL(10, 2) DEFAULT 0,
18
+ referrer_reward_amount DECIMAL(10, 2) DEFAULT 0,
19
+ referred_reward_amount DECIMAL(10, 2) DEFAULT 0,
20
+ reward_status VARCHAR(20) DEFAULT 'pending',
21
+ reward_processed_at TIMESTAMP,
22
+ attribution_source VARCHAR(100),
23
+ utm_source VARCHAR(100),
24
+ utm_medium VARCHAR(100),
25
+ utm_campaign VARCHAR(100),
26
+ metadata JSONB DEFAULT '{}',
27
+ ip_address INET,
28
+ user_agent TEXT,
29
+ signup_at TIMESTAMP NOT NULL DEFAULT NOW(),
30
+ converted_at TIMESTAMP,
31
+ created_at TIMESTAMP NOT NULL DEFAULT NOW(),
32
+ updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
33
+ CONSTRAINT unique_referral_pair UNIQUE (referrer_id, referred_id),
34
+ CONSTRAINT valid_status CHECK (status IN ('signup', 'email_verified', 'first_project', 'converted', 'churned')),
35
+ CONSTRAINT valid_reward_status CHECK (reward_status IN ('pending', 'processing', 'completed', 'failed', 'expired'))
36
+ )
37
+ `);
38
+ await queryRunner.query(`
39
+ CREATE INDEX idx_referral_events_referrer ON referral_events(referrer_id)
40
+ `);
41
+ await queryRunner.query(`
42
+ CREATE INDEX idx_referral_events_referred ON referral_events(referred_id)
43
+ `);
44
+ await queryRunner.query(`
45
+ CREATE INDEX idx_referral_events_code ON referral_events(referral_code)
46
+ `);
47
+ await queryRunner.query(`
48
+ CREATE INDEX idx_referral_events_status ON referral_events(status)
49
+ `);
50
+ await queryRunner.query(`
51
+ CREATE INDEX idx_referral_events_created ON referral_events(created_at)
52
+ `);
53
+ await queryRunner.query(`
54
+ CREATE INDEX idx_referral_events_conversion ON referral_events(conversion_type) WHERE conversion_type IS NOT NULL
55
+ `);
56
+ await queryRunner.query(`
57
+ COMMENT ON TABLE referral_events IS 'Tracks the complete lifecycle of referral relationships'
58
+ `);
59
+ await queryRunner.query(`
60
+ COMMENT ON COLUMN referral_events.status IS 'Current stage in the referral funnel'
61
+ `);
62
+ await queryRunner.query(`
63
+ COMMENT ON COLUMN referral_events.conversion_type IS 'Type of subscription that triggered conversion'
64
+ `);
65
+ }
66
+ async down(queryRunner) {
67
+ await queryRunner.query(`
68
+ DROP TABLE IF EXISTS referral_events
69
+ `);
70
+ }
71
+ }
72
+ exports.CreateReferralEventsTable1713000000011 = CreateReferralEventsTable1713000000011;
@@ -0,0 +1,6 @@
1
+ import { MigrationInterface, QueryRunner } from 'typeorm';
2
+ export declare class ExtendCreditTransactions1713000000012 implements MigrationInterface {
3
+ name: string;
4
+ up(queryRunner: QueryRunner): Promise<void>;
5
+ down(queryRunner: QueryRunner): Promise<void>;
6
+ }
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ExtendCreditTransactions1713000000012 = void 0;
4
+ class ExtendCreditTransactions1713000000012 {
5
+ constructor() {
6
+ this.name = 'ExtendCreditTransactions1713000000012';
7
+ }
8
+ async up(queryRunner) {
9
+ await queryRunner.query(`
10
+ ALTER TABLE credit_transactions
11
+ ADD COLUMN IF NOT EXISTS source VARCHAR(50)
12
+ `);
13
+ await queryRunner.query(`
14
+ ALTER TABLE credit_transactions
15
+ ADD COLUMN IF NOT EXISTS reference_id UUID
16
+ `);
17
+ await queryRunner.query(`
18
+ ALTER TABLE credit_transactions
19
+ ADD COLUMN IF NOT EXISTS expires_at TIMESTAMP
20
+ `);
21
+ await queryRunner.query(`
22
+ ALTER TABLE credit_transactions
23
+ DROP CONSTRAINT IF EXISTS credit_transactions_type_check
24
+ `);
25
+ await queryRunner.query(`
26
+ ALTER TABLE credit_transactions
27
+ ADD CONSTRAINT credit_transactions_type_check
28
+ CHECK (type IN ('purchase', 'usage', 'refund', 'bonus', 'referral_reward', 'signup_bonus', 'promo', 'compensation', 'expired'))
29
+ `);
30
+ await queryRunner.query(`
31
+ CREATE INDEX IF NOT EXISTS idx_credit_transactions_expires ON credit_transactions(expires_at) WHERE expires_at IS NOT NULL
32
+ `);
33
+ await queryRunner.query(`
34
+ CREATE INDEX IF NOT EXISTS idx_credit_transactions_source ON credit_transactions(source) WHERE source IS NOT NULL
35
+ `);
36
+ await queryRunner.query(`
37
+ CREATE INDEX IF NOT EXISTS idx_credit_transactions_reference ON credit_transactions(reference_id) WHERE reference_id IS NOT NULL
38
+ `);
39
+ await queryRunner.query(`
40
+ COMMENT ON COLUMN credit_transactions.source IS 'Origin of credit: referral, promo_code, admin_grant, purchase'
41
+ `);
42
+ await queryRunner.query(`
43
+ COMMENT ON COLUMN credit_transactions.reference_id IS 'Links to referral_events.id or promo campaign id'
44
+ `);
45
+ await queryRunner.query(`
46
+ COMMENT ON COLUMN credit_transactions.expires_at IS 'When promotional credits expire'
47
+ `);
48
+ }
49
+ async down(queryRunner) {
50
+ await queryRunner.query(`
51
+ DROP INDEX IF EXISTS idx_credit_transactions_expires
52
+ `);
53
+ await queryRunner.query(`
54
+ DROP INDEX IF EXISTS idx_credit_transactions_source
55
+ `);
56
+ await queryRunner.query(`
57
+ DROP INDEX IF EXISTS idx_credit_transactions_reference
58
+ `);
59
+ await queryRunner.query(`
60
+ ALTER TABLE credit_transactions DROP COLUMN IF EXISTS source
61
+ `);
62
+ await queryRunner.query(`
63
+ ALTER TABLE credit_transactions DROP COLUMN IF EXISTS reference_id
64
+ `);
65
+ await queryRunner.query(`
66
+ ALTER TABLE credit_transactions DROP COLUMN IF EXISTS expires_at
67
+ `);
68
+ }
69
+ }
70
+ exports.ExtendCreditTransactions1713000000012 = ExtendCreditTransactions1713000000012;
@@ -0,0 +1,6 @@
1
+ import { MigrationInterface, QueryRunner } from 'typeorm';
2
+ export declare class AiVideoMakerTables1713000000013 implements MigrationInterface {
3
+ name: string;
4
+ up(queryRunner: QueryRunner): Promise<void>;
5
+ down(queryRunner: QueryRunner): Promise<void>;
6
+ }
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AiVideoMakerTables1713000000013 = void 0;
4
+ class AiVideoMakerTables1713000000013 {
5
+ constructor() {
6
+ this.name = 'AiVideoMakerTables1713000000013';
7
+ }
8
+ async up(queryRunner) {
9
+ await queryRunner.query(`
10
+ CREATE TABLE IF NOT EXISTS ai_video_jobs (
11
+ id VARCHAR PRIMARY KEY,
12
+ user_id VARCHAR NOT NULL,
13
+ project_id VARCHAR,
14
+ project_title VARCHAR,
15
+ prompt TEXT NOT NULL,
16
+ agent_id VARCHAR NOT NULL,
17
+ duration INTEGER NOT NULL,
18
+ aspect_ratio VARCHAR NOT NULL DEFAULT '16:9',
19
+ language VARCHAR NOT NULL DEFAULT 'en',
20
+ style VARCHAR NOT NULL DEFAULT 'cinematic',
21
+ voice_enabled BOOLEAN NOT NULL DEFAULT FALSE,
22
+ voice_id VARCHAR,
23
+ status VARCHAR NOT NULL DEFAULT 'pending',
24
+ progress INTEGER NOT NULL DEFAULT 0,
25
+ total_duration_seconds INTEGER NOT NULL DEFAULT 0,
26
+ total_scenes INTEGER NOT NULL DEFAULT 0,
27
+ script TEXT,
28
+ voice_audio_url TEXT,
29
+ canvas_project_id VARCHAR,
30
+ error_message TEXT,
31
+ created_at TIMESTAMPTZ DEFAULT NOW(),
32
+ updated_at TIMESTAMPTZ DEFAULT NOW()
33
+ )
34
+ `);
35
+ await queryRunner.query(`
36
+ CREATE TABLE IF NOT EXISTS ai_video_scene_tasks (
37
+ id VARCHAR PRIMARY KEY,
38
+ job_id VARCHAR NOT NULL REFERENCES ai_video_jobs(id) ON DELETE CASCADE,
39
+ scene_order INTEGER NOT NULL,
40
+ scene_title VARCHAR,
41
+ description TEXT,
42
+ narration TEXT,
43
+ duration_seconds INTEGER,
44
+ style VARCHAR,
45
+ stock_search_query TEXT,
46
+ stock_video_url TEXT,
47
+ stock_video_confidence DECIMAL(3,2),
48
+ kling_task_id VARCHAR,
49
+ output_url TEXT,
50
+ s3_url TEXT,
51
+ kling_submit_request JSONB,
52
+ kling_submit_response JSONB,
53
+ kling_poll_log JSONB DEFAULT '[]',
54
+ status VARCHAR NOT NULL DEFAULT 'pending',
55
+ progress INTEGER NOT NULL DEFAULT 0,
56
+ error_message TEXT,
57
+ created_at TIMESTAMPTZ DEFAULT NOW(),
58
+ updated_at TIMESTAMPTZ DEFAULT NOW()
59
+ )
60
+ `);
61
+ await queryRunner.query(`
62
+ CREATE INDEX IF NOT EXISTS idx_ai_video_jobs_user_id ON ai_video_jobs(user_id)
63
+ `);
64
+ await queryRunner.query(`
65
+ CREATE INDEX IF NOT EXISTS idx_ai_video_jobs_status ON ai_video_jobs(status)
66
+ `);
67
+ await queryRunner.query(`
68
+ CREATE INDEX IF NOT EXISTS idx_ai_video_jobs_created_at ON ai_video_jobs(created_at)
69
+ `);
70
+ await queryRunner.query(`
71
+ CREATE INDEX IF NOT EXISTS idx_ai_video_scene_tasks_job_id ON ai_video_scene_tasks(job_id)
72
+ `);
73
+ await queryRunner.query(`
74
+ CREATE INDEX IF NOT EXISTS idx_ai_video_scene_tasks_status ON ai_video_scene_tasks(status)
75
+ `);
76
+ await queryRunner.query(`
77
+ CREATE INDEX IF NOT EXISTS idx_ai_video_scene_tasks_scene_order ON ai_video_scene_tasks(job_id, scene_order)
78
+ `);
79
+ await queryRunner.query(`
80
+ COMMENT ON TABLE ai_video_jobs IS 'Tracks AI Video Maker generation jobs with multi-stage pipeline progress'
81
+ `);
82
+ await queryRunner.query(`
83
+ COMMENT ON TABLE ai_video_scene_tasks IS 'Individual scene tasks within AI Video Maker jobs, including stock search and Kling generation'
84
+ `);
85
+ await queryRunner.query(`
86
+ COMMENT ON COLUMN ai_video_jobs.prompt IS 'User-provided prompt for video generation'
87
+ `);
88
+ await queryRunner.query(`
89
+ COMMENT ON COLUMN ai_video_jobs.agent_id IS 'Agent persona influencing script tone and generation preferences'
90
+ `);
91
+ await queryRunner.query(`
92
+ COMMENT ON COLUMN ai_video_jobs.voice_audio_url IS 'S3 URL to generated voiceover audio file'
93
+ `);
94
+ await queryRunner.query(`
95
+ COMMENT ON COLUMN ai_video_jobs.canvas_project_id IS 'ID of created canvas project for editing'
96
+ `);
97
+ await queryRunner.query(`
98
+ COMMENT ON COLUMN ai_video_scene_tasks.stock_search_query IS 'Query used for Pexels/Unsplash stock video search'
99
+ `);
100
+ await queryRunner.query(`
101
+ COMMENT ON COLUMN ai_video_scene_tasks.stock_video_confidence IS 'Confidence score of stock video match (0.00-1.00)'
102
+ `);
103
+ await queryRunner.query(`
104
+ COMMENT ON COLUMN ai_video_scene_tasks.kling_task_id IS 'Kling AI task ID for video generation'
105
+ `);
106
+ await queryRunner.query(`
107
+ COMMENT ON COLUMN ai_video_scene_tasks.output_url IS 'Direct URL from Kling API'
108
+ `);
109
+ await queryRunner.query(`
110
+ COMMENT ON COLUMN ai_video_scene_tasks.s3_url IS 'Permanent S3 copy URL'
111
+ `);
112
+ }
113
+ async down(queryRunner) {
114
+ await queryRunner.query(`
115
+ DROP TABLE IF EXISTS ai_video_scene_tasks
116
+ `);
117
+ await queryRunner.query(`
118
+ DROP TABLE IF EXISTS ai_video_jobs
119
+ `);
120
+ }
121
+ }
122
+ exports.AiVideoMakerTables1713000000013 = AiVideoMakerTables1713000000013;
@@ -0,0 +1,6 @@
1
+ import { MigrationInterface, QueryRunner } from 'typeorm';
2
+ export declare class SeedReferralRewardRules1713000000014 implements MigrationInterface {
3
+ name: string;
4
+ up(queryRunner: QueryRunner): Promise<void>;
5
+ down(queryRunner: QueryRunner): Promise<void>;
6
+ }
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SeedReferralRewardRules1713000000014 = void 0;
4
+ class SeedReferralRewardRules1713000000014 {
5
+ constructor() {
6
+ this.name = 'SeedReferralRewardRules1713000000014';
7
+ }
8
+ async up(queryRunner) {
9
+ await queryRunner.query(`
10
+ INSERT INTO reward_rules (id, rule_name, description, reward_type, reward_value, trigger_event, conditions, is_active, max_uses_per_user, created_at, updated_at)
11
+ VALUES
12
+ (
13
+ gen_random_uuid(),
14
+ 'referral_signup_bonus',
15
+ 'Bonus credits when a referred user signs up',
16
+ 'credits',
17
+ 5.00,
18
+ 'referral_signup',
19
+ '{"require_email_verified": false}'::jsonb,
20
+ true,
21
+ NULL,
22
+ NOW(),
23
+ NOW()
24
+ ),
25
+ (
26
+ gen_random_uuid(),
27
+ 'referral_conversion_basic',
28
+ 'Credits when referred user subscribes to Basic plan',
29
+ 'credits',
30
+ 10.00,
31
+ 'referral_conversion',
32
+ '{"subscription_plan": "basic", "minimum_tenure_days": 0}'::jsonb,
33
+ true,
34
+ NULL,
35
+ NOW(),
36
+ NOW()
37
+ ),
38
+ (
39
+ gen_random_uuid(),
40
+ 'referral_conversion_pro',
41
+ 'Credits when referred user subscribes to Pro plan',
42
+ 'credits',
43
+ 25.00,
44
+ 'referral_conversion',
45
+ '{"subscription_plan": "pro", "minimum_tenure_days": 0}'::jsonb,
46
+ true,
47
+ NULL,
48
+ NOW(),
49
+ NOW()
50
+ ),
51
+ (
52
+ gen_random_uuid(),
53
+ 'referral_conversion_business',
54
+ 'Credits when referred user subscribes to Business plan',
55
+ 'credits',
56
+ 50.00,
57
+ 'referral_conversion',
58
+ '{"subscription_plan": "business", "minimum_tenure_days": 0}'::jsonb,
59
+ true,
60
+ NULL,
61
+ NOW(),
62
+ NOW()
63
+ ),
64
+ (
65
+ gen_random_uuid(),
66
+ 'new_user_referral_bonus',
67
+ 'Welcome bonus for users who sign up with a referral code',
68
+ 'credits',
69
+ 5.00,
70
+ 'signup_with_referral',
71
+ '{"require_referral_code": true}'::jsonb,
72
+ true,
73
+ 1,
74
+ NOW(),
75
+ NOW()
76
+ ),
77
+ (
78
+ gen_random_uuid(),
79
+ 'referral_milestone_5',
80
+ 'Bonus for reaching 5 successful referrals',
81
+ 'credits',
82
+ 25.00,
83
+ 'referral_milestone',
84
+ '{"milestone_count": 5}'::jsonb,
85
+ true,
86
+ 1,
87
+ NOW(),
88
+ NOW()
89
+ ),
90
+ (
91
+ gen_random_uuid(),
92
+ 'referral_milestone_10',
93
+ 'Bonus for reaching 10 successful referrals',
94
+ 'credits',
95
+ 75.00,
96
+ 'referral_milestone',
97
+ '{"milestone_count": 10}'::jsonb,
98
+ true,
99
+ 1,
100
+ NOW(),
101
+ NOW()
102
+ ),
103
+ (
104
+ gen_random_uuid(),
105
+ 'referral_milestone_25',
106
+ 'Bonus for reaching 25 successful referrals - Unlock Ambassador status',
107
+ 'feature_unlock',
108
+ 0,
109
+ 'referral_milestone',
110
+ '{"milestone_count": 25, "unlock_feature": "ambassador_status", "bonus_credits": 200}'::jsonb,
111
+ true,
112
+ 1,
113
+ NOW(),
114
+ NOW()
115
+ )
116
+ ON CONFLICT (rule_name) DO NOTHING
117
+ `);
118
+ }
119
+ async down(queryRunner) {
120
+ await queryRunner.query(`
121
+ DELETE FROM reward_rules
122
+ WHERE rule_name IN (
123
+ 'referral_signup_bonus',
124
+ 'referral_conversion_basic',
125
+ 'referral_conversion_pro',
126
+ 'referral_conversion_business',
127
+ 'new_user_referral_bonus',
128
+ 'referral_milestone_5',
129
+ 'referral_milestone_10',
130
+ 'referral_milestone_25'
131
+ )
132
+ `);
133
+ }
134
+ }
135
+ exports.SeedReferralRewardRules1713000000014 = SeedReferralRewardRules1713000000014;
@@ -1,5 +1,5 @@
1
1
  import { MigrationInterface, QueryRunner } from 'typeorm';
2
- export declare class CreateSocialConnectionTables1713000000001 implements MigrationInterface {
2
+ export declare class CreateCreditAllocationsTable1713000000015 implements MigrationInterface {
3
3
  name: string;
4
4
  up(queryRunner: QueryRunner): Promise<void>;
5
5
  down(queryRunner: QueryRunner): Promise<void>;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CreateCreditAllocationsTable1713000000015 = void 0;
4
+ class CreateCreditAllocationsTable1713000000015 {
5
+ constructor() {
6
+ this.name = 'CreateCreditAllocationsTable1713000000015';
7
+ }
8
+ async up(queryRunner) {
9
+ await queryRunner.query(`
10
+ CREATE TABLE IF NOT EXISTS credit_allocations (
11
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
12
+ user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
13
+ plan_id VARCHAR(50) NOT NULL,
14
+ credits_allocated INTEGER NOT NULL,
15
+ credits_remaining INTEGER NOT NULL,
16
+ ai_credits_allocated INTEGER DEFAULT 0,
17
+ ai_credits_remaining INTEGER DEFAULT 0,
18
+ period_start TIMESTAMP NOT NULL,
19
+ period_end TIMESTAMP NOT NULL,
20
+ rollover_credits INTEGER DEFAULT 0,
21
+ status VARCHAR(20) DEFAULT 'active',
22
+ created_at TIMESTAMP NOT NULL DEFAULT NOW(),
23
+ updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
24
+ CONSTRAINT unique_user_period UNIQUE (user_id, period_start)
25
+ )
26
+ `);
27
+ await queryRunner.query(`
28
+ CREATE INDEX idx_credit_allocations_user ON credit_allocations(user_id)
29
+ `);
30
+ await queryRunner.query(`
31
+ CREATE INDEX idx_credit_allocations_period ON credit_allocations(period_start, period_end)
32
+ `);
33
+ await queryRunner.query(`
34
+ CREATE INDEX idx_credit_allocations_status ON credit_allocations(status)
35
+ `);
36
+ await queryRunner.query(`
37
+ COMMENT ON TABLE credit_allocations IS 'Monthly credit allocations per user subscription'
38
+ `);
39
+ await queryRunner.query(`
40
+ COMMENT ON COLUMN credit_allocations.credits_remaining IS 'Real-time remaining credits for the period'
41
+ `);
42
+ }
43
+ async down(queryRunner) {
44
+ await queryRunner.query(`
45
+ DROP TABLE IF EXISTS credit_allocations
46
+ `);
47
+ }
48
+ }
49
+ exports.CreateCreditAllocationsTable1713000000015 = CreateCreditAllocationsTable1713000000015;
@@ -0,0 +1,6 @@
1
+ import { MigrationInterface, QueryRunner } from 'typeorm';
2
+ export declare class CreateCreditConsumptionLogTable1713000000016 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.CreateCreditConsumptionLogTable1713000000016 = void 0;
4
+ class CreateCreditConsumptionLogTable1713000000016 {
5
+ constructor() {
6
+ this.name = 'CreateCreditConsumptionLogTable1713000000016';
7
+ }
8
+ async up(queryRunner) {
9
+ await queryRunner.query(`
10
+ CREATE TABLE IF NOT EXISTS credit_consumption_log (
11
+ id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
12
+ user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
13
+ allocation_id UUID REFERENCES credit_allocations(id),
14
+ transaction_id UUID REFERENCES credit_transactions(id),
15
+ operation_type VARCHAR(50) NOT NULL,
16
+ operation_id VARCHAR(100),
17
+ base_credits DECIMAL(10, 2) NOT NULL,
18
+ modifier_credits DECIMAL(10, 2) DEFAULT 0,
19
+ total_credits DECIMAL(10, 2) NOT NULL,
20
+ operation_params JSONB DEFAULT '{}',
21
+ status VARCHAR(20) DEFAULT 'pending',
22
+ started_at TIMESTAMP DEFAULT NOW(),
23
+ completed_at TIMESTAMP,
24
+ result_url TEXT,
25
+ error_message TEXT,
26
+ created_at TIMESTAMP NOT NULL DEFAULT NOW(),
27
+ updated_at TIMESTAMP NOT NULL DEFAULT NOW()
28
+ )
29
+ `);
30
+ await queryRunner.query(`
31
+ CREATE INDEX idx_consumption_log_user ON credit_consumption_log(user_id)
32
+ `);
33
+ await queryRunner.query(`
34
+ CREATE INDEX idx_consumption_log_operation ON credit_consumption_log(operation_type)
35
+ `);
36
+ await queryRunner.query(`
37
+ CREATE INDEX idx_consumption_log_status ON credit_consumption_log(status)
38
+ `);
39
+ await queryRunner.query(`
40
+ CREATE INDEX idx_consumption_log_created ON credit_consumption_log(created_at)
41
+ `);
42
+ await queryRunner.query(`
43
+ COMMENT ON TABLE credit_consumption_log IS 'Detailed log of all credit-consuming operations'
44
+ `);
45
+ await queryRunner.query(`
46
+ COMMENT ON COLUMN credit_consumption_log.operation_type IS 'Type of operation that consumed credits'
47
+ `);
48
+ }
49
+ async down(queryRunner) {
50
+ await queryRunner.query(`
51
+ DROP TABLE IF EXISTS credit_consumption_log
52
+ `);
53
+ }
54
+ }
55
+ exports.CreateCreditConsumptionLogTable1713000000016 = CreateCreditConsumptionLogTable1713000000016;
@@ -0,0 +1,6 @@
1
+ import { MigrationInterface, QueryRunner } from 'typeorm';
2
+ export declare class UpdateSubscriptionPlansCreditFields1713000000017 implements MigrationInterface {
3
+ name: string;
4
+ up(queryRunner: QueryRunner): Promise<void>;
5
+ down(queryRunner: QueryRunner): Promise<void>;
6
+ }
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UpdateSubscriptionPlansCreditFields1713000000017 = void 0;
4
+ class UpdateSubscriptionPlansCreditFields1713000000017 {
5
+ constructor() {
6
+ this.name = 'UpdateSubscriptionPlansCreditFields1713000000017';
7
+ }
8
+ async up(queryRunner) {
9
+ await queryRunner.query(`
10
+ ALTER TABLE subscription_plans
11
+ ADD COLUMN IF NOT EXISTS monthly_credits INTEGER DEFAULT 0
12
+ `);
13
+ await queryRunner.query(`
14
+ ALTER TABLE subscription_plans
15
+ ADD COLUMN IF NOT EXISTS ai_credits_monthly INTEGER DEFAULT 0
16
+ `);
17
+ await queryRunner.query(`
18
+ ALTER TABLE subscription_plans
19
+ ADD COLUMN IF NOT EXISTS rollover_enabled BOOLEAN DEFAULT false
20
+ `);
21
+ await queryRunner.query(`
22
+ ALTER TABLE subscription_plans
23
+ ADD COLUMN IF NOT EXISTS max_rollover_credits INTEGER DEFAULT 0
24
+ `);
25
+ await queryRunner.query(`
26
+ ALTER TABLE subscription_plans
27
+ ADD COLUMN IF NOT EXISTS signup_bonus_credits INTEGER DEFAULT 0
28
+ `);
29
+ await queryRunner.query(`
30
+ ALTER TABLE subscription_plans
31
+ ADD COLUMN IF NOT EXISTS referral_bonus_credits INTEGER DEFAULT 0
32
+ `);
33
+ await queryRunner.query(`
34
+ UPDATE subscription_plans SET
35
+ monthly_credits = 10,
36
+ ai_credits_monthly = 0,
37
+ rollover_enabled = false,
38
+ signup_bonus_credits = 5,
39
+ referral_bonus_credits = 5
40
+ WHERE plan_key = 'free'
41
+ `);
42
+ await queryRunner.query(`
43
+ UPDATE subscription_plans SET
44
+ monthly_credits = 100,
45
+ ai_credits_monthly = 10,
46
+ rollover_enabled = true,
47
+ max_rollover_credits = 50,
48
+ signup_bonus_credits = 10,
49
+ referral_bonus_credits = 10
50
+ WHERE plan_key = 'basic'
51
+ `);
52
+ await queryRunner.query(`
53
+ UPDATE subscription_plans SET
54
+ monthly_credits = 500,
55
+ ai_credits_monthly = 100,
56
+ rollover_enabled = true,
57
+ max_rollover_credits = 250,
58
+ signup_bonus_credits = 25,
59
+ referral_bonus_credits = 25
60
+ WHERE plan_key = 'pro'
61
+ `);
62
+ await queryRunner.query(`
63
+ UPDATE subscription_plans SET
64
+ monthly_credits = 2000,
65
+ ai_credits_monthly = 500,
66
+ rollover_enabled = true,
67
+ max_rollover_credits = 1000,
68
+ signup_bonus_credits = 100,
69
+ referral_bonus_credits = 50
70
+ WHERE plan_key = 'business'
71
+ `);
72
+ await queryRunner.query(`
73
+ UPDATE subscription_plans SET
74
+ monthly_credits = -1,
75
+ ai_credits_monthly = -1,
76
+ rollover_enabled = false,
77
+ signup_bonus_credits = 0,
78
+ referral_bonus_credits = 0
79
+ WHERE plan_key = 'enterprise'
80
+ `);
81
+ await queryRunner.query(`
82
+ COMMENT ON COLUMN subscription_plans.monthly_credits IS 'Monthly credit allocation for the plan'
83
+ `);
84
+ await queryRunner.query(`
85
+ COMMENT ON COLUMN subscription_plans.ai_credits_monthly IS 'Monthly AI credit allocation'
86
+ `);
87
+ await queryRunner.query(`
88
+ COMMENT ON COLUMN subscription_plans.rollover_enabled IS 'Whether unused credits can roll over to next month'
89
+ `);
90
+ await queryRunner.query(`
91
+ COMMENT ON COLUMN subscription_plans.max_rollover_credits IS 'Maximum credits that can be rolled over'
92
+ `);
93
+ await queryRunner.query(`
94
+ COMMENT ON COLUMN subscription_plans.signup_bonus_credits IS 'Bonus credits awarded on signup'
95
+ `);
96
+ await queryRunner.query(`
97
+ COMMENT ON COLUMN subscription_plans.referral_bonus_credits IS 'Bonus credits awarded for referrals'
98
+ `);
99
+ }
100
+ async down(queryRunner) {
101
+ await queryRunner.query(`
102
+ ALTER TABLE subscription_plans DROP COLUMN IF EXISTS monthly_credits
103
+ `);
104
+ await queryRunner.query(`
105
+ ALTER TABLE subscription_plans DROP COLUMN IF EXISTS ai_credits_monthly
106
+ `);
107
+ await queryRunner.query(`
108
+ ALTER TABLE subscription_plans DROP COLUMN IF EXISTS rollover_enabled
109
+ `);
110
+ await queryRunner.query(`
111
+ ALTER TABLE subscription_plans DROP COLUMN IF EXISTS max_rollover_credits
112
+ `);
113
+ await queryRunner.query(`
114
+ ALTER TABLE subscription_plans DROP COLUMN IF EXISTS signup_bonus_credits
115
+ `);
116
+ await queryRunner.query(`
117
+ ALTER TABLE subscription_plans DROP COLUMN IF EXISTS referral_bonus_credits
118
+ `);
119
+ }
120
+ }
121
+ exports.UpdateSubscriptionPlansCreditFields1713000000017 = UpdateSubscriptionPlansCreditFields1713000000017;
@@ -1,5 +1,5 @@
1
1
  import { MigrationInterface, QueryRunner } from 'typeorm';
2
- export declare class CreateKlingGenerationTables1713000000004 implements MigrationInterface {
2
+ export declare class CreateVideoProcessingTables1713000000018 implements MigrationInterface {
3
3
  name: string;
4
4
  up(queryRunner: QueryRunner): Promise<void>;
5
5
  down(queryRunner: QueryRunner): Promise<void>;