curatedreels-deploy 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,201 @@
1
+ /**
2
+ * Deployment Orchestrator
3
+ *
4
+ * Coordinates deployment to all customer infrastructure:
5
+ * - Vercel (Frontend + CMS)
6
+ * - Deno Deploy (Bot)
7
+ * - MongoDB Atlas (Database)
8
+ */
9
+ import ora from 'ora';
10
+ import chalk from 'chalk';
11
+ import { VercelClient } from './clients/vercel.js';
12
+ import { DenoClient } from './clients/deno.js';
13
+ import { setupMongoDB } from './services/mongodb.js';
14
+ import { registerDeployment } from './services/license.js';
15
+ import { getBundlesDir } from './services/bundles.js';
16
+ export class DeploymentOrchestrator {
17
+ credentials;
18
+ licenseKey;
19
+ vercel;
20
+ deno;
21
+ frontendUrl = '';
22
+ cmsUrl = '';
23
+ botUrl = '';
24
+ constructor(credentials, licenseKey) {
25
+ this.credentials = credentials;
26
+ this.licenseKey = licenseKey;
27
+ this.vercel = new VercelClient(credentials.vercelToken, credentials.vercelTeamId);
28
+ this.deno = new DenoClient(credentials.denoToken, credentials.denoOrg);
29
+ }
30
+ /**
31
+ * Main deployment flow
32
+ */
33
+ async deploy() {
34
+ const startTime = Date.now();
35
+ try {
36
+ // Step 1: Setup MongoDB
37
+ await this.deployMongoDB();
38
+ // Step 2: Deploy CMS (needs to be first so frontend can reference its URL)
39
+ await this.deployCMS();
40
+ // Step 3: Deploy Frontend
41
+ await this.deployFrontend();
42
+ // Step 4: Deploy Bot
43
+ await this.deployBot();
44
+ // Step 5: Register deployment with license server
45
+ await this.registerDeployment();
46
+ // Success metrics
47
+ const duration = Math.round((Date.now() - startTime) / 1000);
48
+ console.log(chalk.gray(`\n⏱️ Total deployment time: ${duration}s\n`));
49
+ }
50
+ catch (error) {
51
+ console.error(chalk.red('\n❌ Deployment failed\n'));
52
+ throw error;
53
+ }
54
+ }
55
+ /**
56
+ * Deploy and configure MongoDB
57
+ */
58
+ async deployMongoDB() {
59
+ const spinner = ora('Setting up MongoDB...').start();
60
+ try {
61
+ await setupMongoDB(this.credentials.mongodbUri);
62
+ spinner.succeed('MongoDB configured');
63
+ }
64
+ catch (error) {
65
+ spinner.fail('MongoDB setup failed');
66
+ throw new Error(`MongoDB: ${error instanceof Error ? error.message : String(error)}`);
67
+ }
68
+ }
69
+ /**
70
+ * Deploy CMS to Vercel
71
+ */
72
+ async deployCMS() {
73
+ const spinner = ora('Deploying CMS to Vercel...').start();
74
+ try {
75
+ const projectName = `${this.credentials.projectName}-cms`;
76
+ const bundlePath = `${getBundlesDir()}/cms`;
77
+ // Generate a random secret for Payload CMS
78
+ const payloadSecret = Array.from(crypto.getRandomValues(new Uint8Array(32)))
79
+ .map(b => b.toString(16).padStart(2, '0')).join('');
80
+ const envVars = {
81
+ MONGODB_URI: this.credentials.mongodbUri,
82
+ PAYLOAD_SECRET: payloadSecret,
83
+ TELEGRAM_BOT_TOKEN: this.credentials.telegramBotToken,
84
+ ...(this.credentials.telegramGroupId && {
85
+ TELEGRAM_GROUP: this.credentials.telegramGroupId
86
+ }),
87
+ ...(this.credentials.cloudinaryCloudName && {
88
+ CLOUDINARY_CLOUD_NAME: this.credentials.cloudinaryCloudName,
89
+ CLOUDINARY_API_KEY: this.credentials.cloudinaryApiKey,
90
+ CLOUDINARY_API_SECRET: this.credentials.cloudinaryApiSecret,
91
+ }),
92
+ ...(this.credentials.youtubeApiKey && {
93
+ YOUTUBE_API_KEY: this.credentials.youtubeApiKey
94
+ }),
95
+ NODE_ENV: 'production',
96
+ };
97
+ this.cmsUrl = await this.vercel.deploy({
98
+ projectName,
99
+ bundlePath,
100
+ envVars,
101
+ framework: 'nextjs'
102
+ });
103
+ spinner.succeed(`CMS deployed: ${chalk.cyan(this.cmsUrl)}`);
104
+ }
105
+ catch (error) {
106
+ spinner.fail('CMS deployment failed');
107
+ throw new Error(`Vercel CMS: ${error instanceof Error ? error.message : String(error)}`);
108
+ }
109
+ }
110
+ /**
111
+ * Deploy Frontend to Vercel
112
+ */
113
+ async deployFrontend() {
114
+ const spinner = ora('Deploying Frontend to Vercel...').start();
115
+ try {
116
+ const projectName = `${this.credentials.projectName}-frontend`;
117
+ const bundlePath = `${getBundlesDir()}/frontend`;
118
+ const envVars = {
119
+ NEXT_PUBLIC_PAYLOAD_API_URL: `${this.cmsUrl}/api`,
120
+ };
121
+ this.frontendUrl = await this.vercel.deploy({
122
+ projectName,
123
+ bundlePath,
124
+ envVars,
125
+ framework: 'nextjs'
126
+ });
127
+ // Update CMS with frontend URL
128
+ spinner.text = 'Linking frontend to CMS...';
129
+ await this.vercel.updateEnvironmentVariables(`${this.credentials.projectName}-cms`, { NEXT_PUBLIC_FRONTEND_URL: this.frontendUrl });
130
+ // Add custom domain if specified
131
+ if (this.credentials.customDomain) {
132
+ spinner.text = 'Adding custom domain...';
133
+ await this.vercel.addDomain(projectName, this.credentials.customDomain);
134
+ this.frontendUrl = `https://${this.credentials.customDomain}`;
135
+ }
136
+ spinner.succeed(`Frontend deployed: ${chalk.cyan(this.frontendUrl)}`);
137
+ }
138
+ catch (error) {
139
+ spinner.fail('Frontend deployment failed');
140
+ throw new Error(`Vercel Frontend: ${error instanceof Error ? error.message : String(error)}`);
141
+ }
142
+ }
143
+ /**
144
+ * Deploy Bot to Deno Deploy
145
+ */
146
+ async deployBot() {
147
+ const spinner = ora('Deploying Bot to Deno Deploy...').start();
148
+ try {
149
+ const projectName = `${this.credentials.projectName}-bot`;
150
+ const botDir = `${getBundlesDir()}/bot`;
151
+ const envVars = {
152
+ TELEGRAM_BOT_TOKEN: this.credentials.telegramBotToken,
153
+ MONGODB_URI: this.credentials.mongodbUri,
154
+ PAYLOAD_CMS_URL: this.cmsUrl,
155
+ FRONTEND_URL: this.frontendUrl,
156
+ WEBHOOK_URL: `https://${projectName}.deno.dev/webhook`,
157
+ ...(this.credentials.telegramGroupId && {
158
+ TELEGRAM_GROUP: this.credentials.telegramGroupId
159
+ }),
160
+ ...(this.credentials.cloudinaryCloudName && {
161
+ CLOUDINARY_CLOUD_NAME: this.credentials.cloudinaryCloudName,
162
+ CLOUDINARY_API_KEY: this.credentials.cloudinaryApiKey,
163
+ CLOUDINARY_API_SECRET: this.credentials.cloudinaryApiSecret,
164
+ }),
165
+ ...(this.credentials.youtubeApiKey && {
166
+ YOUTUBE_API_KEY: this.credentials.youtubeApiKey
167
+ }),
168
+ };
169
+ this.botUrl = await this.deno.deploy({
170
+ projectName,
171
+ entrypoint: botDir,
172
+ envVars
173
+ });
174
+ spinner.succeed(`Bot deployed: ${chalk.cyan(this.botUrl)}`);
175
+ }
176
+ catch (error) {
177
+ spinner.fail('Bot deployment failed');
178
+ throw new Error(`Deno Deploy: ${error instanceof Error ? error.message : String(error)}`);
179
+ }
180
+ }
181
+ /**
182
+ * Register deployment with license server
183
+ */
184
+ async registerDeployment() {
185
+ const spinner = ora('Registering deployment...').start();
186
+ try {
187
+ await registerDeployment(this.licenseKey, {
188
+ projectName: this.credentials.projectName,
189
+ frontendUrl: this.frontendUrl,
190
+ cmsUrl: this.cmsUrl,
191
+ botUrl: this.botUrl
192
+ });
193
+ spinner.succeed('Deployment registered');
194
+ }
195
+ catch (error) {
196
+ spinner.warn('Failed to register deployment (non-critical)');
197
+ // Don't fail deployment if registration fails
198
+ }
199
+ }
200
+ }
201
+ //# sourceMappingURL=orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Bundle Download Service
3
+ *
4
+ * Downloads pre-compiled bundles from CDN (authenticated)
5
+ */
6
+ export interface BundleManifest {
7
+ version: string;
8
+ releaseDate: string;
9
+ bundles: {
10
+ frontend: string;
11
+ cms: string;
12
+ bot: string;
13
+ schema: string;
14
+ };
15
+ checksums: {
16
+ frontend: string;
17
+ cms: string;
18
+ bot: string;
19
+ schema: string;
20
+ };
21
+ }
22
+ /**
23
+ * Download deployment bundles from GitHub Releases
24
+ */
25
+ export declare function downloadBundles(licenseKey: string): Promise<void>;
26
+ /**
27
+ * Mock bundle download for development/testing
28
+ */
29
+ export declare function mockDownloadBundles(_licenseKey: string): Promise<void>;
30
+ /**
31
+ * Extract bundle archives
32
+ */
33
+ export declare function extractBundles(): Promise<void>;
34
+ /**
35
+ * Get bundles directory path
36
+ */
37
+ export declare function getBundlesDir(): string;
38
+ /**
39
+ * Clean up downloaded bundles
40
+ */
41
+ export declare function cleanupBundles(): Promise<void>;
42
+ //# sourceMappingURL=bundles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundles.d.ts","sourceRoot":"","sources":["../../src/services/bundles.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAiBH,MAAM,WAAW,cAAc;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,OAAO,EAAE;QACL,QAAQ,EAAE,MAAM,CAAA;QAChB,GAAG,EAAE,MAAM,CAAA;QACX,GAAG,EAAE,MAAM,CAAA;QACX,MAAM,EAAE,MAAM,CAAA;KACjB,CAAA;IACD,SAAS,EAAE;QACP,QAAQ,EAAE,MAAM,CAAA;QAChB,GAAG,EAAE,MAAM,CAAA;QACX,GAAG,EAAE,MAAM,CAAA;QACX,MAAM,EAAE,MAAM,CAAA;KACjB,CAAA;CACJ;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoDvE;AAkDD;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoE5E;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAwBpD;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAOpD"}
@@ -0,0 +1,213 @@
1
+ /**
2
+ * Bundle Download Service
3
+ *
4
+ * Downloads pre-compiled bundles from CDN (authenticated)
5
+ */
6
+ import fetch from 'node-fetch';
7
+ import { createWriteStream } from 'fs';
8
+ import { mkdir } from 'fs/promises';
9
+ import { pipeline } from 'stream/promises';
10
+ import { extract } from 'tar';
11
+ import ora from 'ora';
12
+ import chalk from 'chalk';
13
+ // GitHub Releases configuration
14
+ const GITHUB_OWNER = 'choicexchangedev-cpu';
15
+ const GITHUB_REPO = 'curatedreels-releases';
16
+ const BUNDLES_VERSION = process.env.CURATEKIDS_VERSION || '1.0.6';
17
+ const BUNDLES_DIR = './.curatedreels-bundles';
18
+ const GITHUB_RELEASES_URL = `https://github.com/${GITHUB_OWNER}/${GITHUB_REPO}/releases/download`;
19
+ /**
20
+ * Download deployment bundles from GitHub Releases
21
+ */
22
+ export async function downloadBundles(licenseKey) {
23
+ const spinner = ora('Downloading deployment bundles...').start();
24
+ try {
25
+ // Create bundles directory
26
+ await mkdir(BUNDLES_DIR, { recursive: true });
27
+ // Get manifest from GitHub Release
28
+ spinner.text = 'Fetching bundle manifest...';
29
+ const manifest = await fetchManifestFromGitHub();
30
+ // Download each bundle from GitHub Release
31
+ const version = `v${manifest.version}`;
32
+ spinner.text = 'Downloading frontend bundle...';
33
+ await downloadFromGitHub(version, 'frontend.tar.gz', `${BUNDLES_DIR}/frontend.tar.gz`);
34
+ spinner.text = 'Extracting frontend bundle...';
35
+ await mkdir(`${BUNDLES_DIR}/frontend`, { recursive: true });
36
+ await extract({
37
+ file: `${BUNDLES_DIR}/frontend.tar.gz`,
38
+ cwd: `${BUNDLES_DIR}/frontend`
39
+ });
40
+ spinner.text = 'Downloading CMS bundle...';
41
+ await downloadFromGitHub(version, 'cms.tar.gz', `${BUNDLES_DIR}/cms.tar.gz`);
42
+ spinner.text = 'Extracting CMS bundle...';
43
+ await mkdir(`${BUNDLES_DIR}/cms`, { recursive: true });
44
+ await extract({
45
+ file: `${BUNDLES_DIR}/cms.tar.gz`,
46
+ cwd: `${BUNDLES_DIR}/cms`
47
+ });
48
+ spinner.text = 'Downloading bot bundle...';
49
+ await downloadFromGitHub(version, 'bot.tar.gz', `${BUNDLES_DIR}/bot.tar.gz`);
50
+ spinner.text = 'Extracting bot bundle...';
51
+ await mkdir(`${BUNDLES_DIR}/bot`, { recursive: true });
52
+ await extract({
53
+ file: `${BUNDLES_DIR}/bot.tar.gz`,
54
+ cwd: `${BUNDLES_DIR}/bot`
55
+ });
56
+ spinner.text = 'Downloading database schema...';
57
+ await downloadFromGitHub(version, 'schema.json', `${BUNDLES_DIR}/schema.json`);
58
+ spinner.succeed('Bundles downloaded and extracted');
59
+ }
60
+ catch (error) {
61
+ spinner.fail('Failed to download bundles');
62
+ throw error;
63
+ }
64
+ }
65
+ /**
66
+ * Fetch manifest from GitHub Release
67
+ */
68
+ async function fetchManifestFromGitHub() {
69
+ const url = `${GITHUB_RELEASES_URL}/v${BUNDLES_VERSION}/manifest.json`;
70
+ const response = await fetch(url, {
71
+ headers: {
72
+ 'User-Agent': 'curatedreels-deploy/1.0.0'
73
+ },
74
+ redirect: 'follow'
75
+ });
76
+ if (!response.ok) {
77
+ if (response.status === 404) {
78
+ throw new Error(`Release v${BUNDLES_VERSION} not found. Check https://github.com/${GITHUB_OWNER}/${GITHUB_REPO}/releases`);
79
+ }
80
+ throw new Error(`Failed to fetch manifest: ${response.statusText}`);
81
+ }
82
+ return await response.json();
83
+ }
84
+ /**
85
+ * Download a file from GitHub Release
86
+ */
87
+ async function downloadFromGitHub(version, filename, destPath) {
88
+ const url = `${GITHUB_RELEASES_URL}/${version}/${filename}`;
89
+ const response = await fetch(url, {
90
+ headers: {
91
+ 'User-Agent': 'curatedreels-deploy/1.0.0'
92
+ },
93
+ redirect: 'follow'
94
+ });
95
+ if (!response.ok) {
96
+ throw new Error(`Failed to download ${filename}: ${response.statusText}`);
97
+ }
98
+ if (!response.body) {
99
+ throw new Error('No response body');
100
+ }
101
+ const fileStream = createWriteStream(destPath);
102
+ await pipeline(response.body, fileStream);
103
+ }
104
+ /**
105
+ * Mock bundle download for development/testing
106
+ */
107
+ export async function mockDownloadBundles(_licenseKey) {
108
+ const spinner = ora('Downloading deployment bundles...').start();
109
+ const fs = await import('fs/promises');
110
+ try {
111
+ console.log(chalk.yellow('\n⚠️ Using mock bundle download (development mode)'));
112
+ // Create bundles directory
113
+ await mkdir(BUNDLES_DIR, { recursive: true });
114
+ await mkdir(`${BUNDLES_DIR}/cms`, { recursive: true });
115
+ await mkdir(`${BUNDLES_DIR}/frontend`, { recursive: true });
116
+ // Create mock CMS bundle directory with minimal Next.js structure
117
+ spinner.text = 'Creating mock CMS bundle...';
118
+ await fs.writeFile(`${BUNDLES_DIR}/cms/package.json`, JSON.stringify({
119
+ name: 'mock-cms',
120
+ version: '1.0.0',
121
+ scripts: { build: 'echo mock build', start: 'echo mock start' }
122
+ }, null, 2));
123
+ await fs.writeFile(`${BUNDLES_DIR}/cms/next.config.mjs`, 'export default {}');
124
+ // Create mock frontend bundle directory
125
+ spinner.text = 'Creating mock frontend bundle...';
126
+ await fs.writeFile(`${BUNDLES_DIR}/frontend/package.json`, JSON.stringify({
127
+ name: 'mock-frontend',
128
+ version: '1.0.0',
129
+ scripts: { build: 'echo mock build', start: 'echo mock start' }
130
+ }, null, 2));
131
+ await fs.writeFile(`${BUNDLES_DIR}/frontend/next.config.mjs`, 'export default {}');
132
+ // Create mock bot bundle
133
+ spinner.text = 'Creating mock bot bundle...';
134
+ await fs.writeFile(`${BUNDLES_DIR}/bot.js`, '// Mock bot bundle\nexport default {}');
135
+ // Create mock database schema
136
+ spinner.text = 'Creating mock database schema...';
137
+ const mockSchema = {
138
+ version: '1.0.0',
139
+ collections: [
140
+ {
141
+ name: 'videos',
142
+ indexes: [
143
+ { key: { slug: 1 }, unique: true, name: 'slug_1' },
144
+ { key: { category: 1 }, name: 'category_1' },
145
+ { key: { ageRange: 1 }, name: 'ageRange_1' }
146
+ ]
147
+ },
148
+ {
149
+ name: 'users',
150
+ indexes: [
151
+ { key: { email: 1 }, unique: true, name: 'email_1' }
152
+ ]
153
+ },
154
+ {
155
+ name: 'organizations',
156
+ indexes: [
157
+ { key: { slug: 1 }, unique: true, name: 'slug_1' }
158
+ ]
159
+ }
160
+ ]
161
+ };
162
+ await fs.writeFile(`${BUNDLES_DIR}/schema.json`, JSON.stringify(mockSchema, null, 2));
163
+ spinner.succeed('Mock bundles created (development mode)');
164
+ }
165
+ catch (error) {
166
+ spinner.fail('Failed to create mock bundles');
167
+ throw error;
168
+ }
169
+ }
170
+ /**
171
+ * Extract bundle archives
172
+ */
173
+ export async function extractBundles() {
174
+ const spinner = ora('Extracting bundles...').start();
175
+ try {
176
+ await mkdir(`${BUNDLES_DIR}/frontend`, { recursive: true });
177
+ await mkdir(`${BUNDLES_DIR}/cms`, { recursive: true });
178
+ // Extract frontend
179
+ await extract({
180
+ file: `${BUNDLES_DIR}/frontend.tar.gz`,
181
+ cwd: `${BUNDLES_DIR}/frontend`
182
+ });
183
+ // Extract CMS
184
+ await extract({
185
+ file: `${BUNDLES_DIR}/cms.tar.gz`,
186
+ cwd: `${BUNDLES_DIR}/cms`
187
+ });
188
+ spinner.succeed('Bundles extracted');
189
+ }
190
+ catch (error) {
191
+ spinner.fail('Failed to extract bundles');
192
+ throw error;
193
+ }
194
+ }
195
+ /**
196
+ * Get bundles directory path
197
+ */
198
+ export function getBundlesDir() {
199
+ return BUNDLES_DIR;
200
+ }
201
+ /**
202
+ * Clean up downloaded bundles
203
+ */
204
+ export async function cleanupBundles() {
205
+ const fs = await import('fs/promises');
206
+ try {
207
+ await fs.rm(BUNDLES_DIR, { recursive: true, force: true });
208
+ }
209
+ catch (error) {
210
+ // Ignore errors
211
+ }
212
+ }
213
+ //# sourceMappingURL=bundles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundles.js","sourceRoot":"","sources":["../../src/services/bundles.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * License Verification Service
3
+ *
4
+ * Verifies customer license keys with Lambda Function URLs
5
+ */
6
+ export interface License {
7
+ key: string;
8
+ customerId: string;
9
+ customerEmail: string;
10
+ tier: 'starter' | 'pro' | 'enterprise';
11
+ status: 'active' | 'expired' | 'suspended';
12
+ expiresAt: string;
13
+ maxDeployments: number;
14
+ currentDeployments: number;
15
+ features: string[];
16
+ }
17
+ /**
18
+ * Verify license key with Lambda
19
+ */
20
+ export declare function verifyLicense(licenseKey: string): Promise<boolean>;
21
+ /**
22
+ * Get license details
23
+ */
24
+ export declare function getLicenseDetails(licenseKey: string): Promise<License>;
25
+ /**
26
+ * Register a new deployment
27
+ */
28
+ export declare function registerDeployment(licenseKey: string, deploymentInfo: {
29
+ projectName: string;
30
+ frontendUrl: string;
31
+ cmsUrl: string;
32
+ botUrl: string;
33
+ }): Promise<void>;
34
+ /**
35
+ * For development/testing: Mock license verification
36
+ * Remove this in production
37
+ */
38
+ export declare function mockVerifyLicense(licenseKey: string): Promise<boolean>;
39
+ //# sourceMappingURL=license.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../../src/services/license.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,MAAM,WAAW,OAAO;IACpB,GAAG,EAAE,MAAM,CAAA;IACX,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,IAAI,EAAE,SAAS,GAAG,KAAK,GAAG,YAAY,CAAA;IACtC,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAA;IAC1C,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc,EAAE,MAAM,CAAA;IACtB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAA;CACrB;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA+BxE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA+B5E;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACpC,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACjB,GACF,OAAO,CAAC,IAAI,CAAC,CAef;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQ5E"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * License Verification Service
3
+ *
4
+ * Verifies customer license keys with Lambda Function URLs
5
+ */
6
+ import fetch from 'node-fetch';
7
+ // Lambda Function URLs (us-east-1 region)
8
+ const VERIFY_URL = process.env.VERIFY_LICENSE_URL || 'https://rltcg4cuhqxdap4ha2nvez5gka0dvivf.lambda-url.us-east-1.on.aws';
9
+ const REGISTER_URL = process.env.REGISTER_DEPLOYMENT_URL || 'https://qpc4fnenqobl2s2zw44c4t7mtm0uwttj.lambda-url.us-east-1.on.aws';
10
+ /**
11
+ * Verify license key with Lambda
12
+ */
13
+ export async function verifyLicense(licenseKey) {
14
+ try {
15
+ const response = await fetch(VERIFY_URL, {
16
+ method: 'POST',
17
+ headers: {
18
+ 'Content-Type': 'application/json',
19
+ 'User-Agent': 'curatedreels-deploy/1.0.0'
20
+ },
21
+ body: JSON.stringify({ key: licenseKey })
22
+ });
23
+ if (!response.ok) {
24
+ if (response.status === 401) {
25
+ return false; // Invalid license
26
+ }
27
+ throw new Error(`License verification failed: ${response.statusText}`);
28
+ }
29
+ const result = await response.json();
30
+ if (!result.valid) {
31
+ throw new Error(result.error || 'Invalid license');
32
+ }
33
+ return true;
34
+ }
35
+ catch (error) {
36
+ if (error instanceof Error) {
37
+ throw error;
38
+ }
39
+ throw new Error('Failed to verify license');
40
+ }
41
+ }
42
+ /**
43
+ * Get license details
44
+ */
45
+ export async function getLicenseDetails(licenseKey) {
46
+ const response = await fetch(VERIFY_URL, {
47
+ method: 'POST',
48
+ headers: {
49
+ 'Content-Type': 'application/json',
50
+ 'User-Agent': 'curatedreels-deploy/1.0.0'
51
+ },
52
+ body: JSON.stringify({ key: licenseKey })
53
+ });
54
+ if (!response.ok) {
55
+ throw new Error(`Failed to get license details: ${response.statusText}`);
56
+ }
57
+ const result = await response.json();
58
+ if (!result.valid) {
59
+ throw new Error(result.error || 'Invalid license');
60
+ }
61
+ return {
62
+ key: licenseKey,
63
+ customerId: result.customerId,
64
+ customerEmail: result.email,
65
+ tier: result.tier,
66
+ status: 'active',
67
+ expiresAt: result.expiresAt,
68
+ maxDeployments: result.maxDeployments,
69
+ currentDeployments: result.currentDeployments,
70
+ features: []
71
+ };
72
+ }
73
+ /**
74
+ * Register a new deployment
75
+ */
76
+ export async function registerDeployment(licenseKey, deploymentInfo) {
77
+ const response = await fetch(REGISTER_URL, {
78
+ method: 'POST',
79
+ headers: {
80
+ 'Content-Type': 'application/json',
81
+ 'Authorization': `License ${licenseKey}`,
82
+ 'User-Agent': 'curatedreels-deploy/1.0.0'
83
+ },
84
+ body: JSON.stringify(deploymentInfo)
85
+ });
86
+ if (!response.ok) {
87
+ const error = await response.text();
88
+ throw new Error(`Failed to register deployment: ${error}`);
89
+ }
90
+ }
91
+ /**
92
+ * For development/testing: Mock license verification
93
+ * Remove this in production
94
+ */
95
+ export async function mockVerifyLicense(licenseKey) {
96
+ // Development bypass for testing
97
+ if (process.env.NODE_ENV === 'development') {
98
+ console.warn('⚠️ Using mock license verification (development mode)');
99
+ return licenseKey.startsWith('test_') || licenseKey.startsWith('dev_') || licenseKey.startsWith('ck_');
100
+ }
101
+ return verifyLicense(licenseKey);
102
+ }
103
+ //# sourceMappingURL=license.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"license.js","sourceRoot":"","sources":["../../src/services/license.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * MongoDB Setup Service
3
+ *
4
+ * Configures MongoDB Atlas database for CuratedReels
5
+ * - Creates collections
6
+ * - Sets up indexes
7
+ * - Seeds initial data
8
+ */
9
+ /**
10
+ * Setup MongoDB database
11
+ */
12
+ export declare function setupMongoDB(uri: string): Promise<void>;
13
+ /**
14
+ * Test MongoDB connection
15
+ */
16
+ export declare function testConnection(uri: string): Promise<boolean>;
17
+ /**
18
+ * Get database statistics
19
+ */
20
+ export declare function getDatabaseStats(uri: string): Promise<any>;
21
+ //# sourceMappingURL=mongodb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongodb.d.ts","sourceRoot":"","sources":["../../src/services/mongodb.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAsBH;;GAEG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB7D;AA4FD;;GAEG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAYlE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CA+BhE"}