redesign the homepage
Build & Deploy / Build & Push Docker Image (push) Failing after 47s
Build & Deploy / Deploy to VPS (push) Has been skipped
Test / API Unit Tests (push) Failing after 5m4s
Test / Marketplace Unit Tests (push) Failing after 4m55s
Test / Admin Unit Tests (push) Successful in 9m37s
Test / Dashboard Unit Tests (push) Successful in 9m37s
Test / API Integration Tests (push) Successful in 9m54s
Build & Deploy / Build & Push Docker Image (push) Failing after 47s
Build & Deploy / Deploy to VPS (push) Has been skipped
Test / API Unit Tests (push) Failing after 5m4s
Test / Marketplace Unit Tests (push) Failing after 4m55s
Test / Admin Unit Tests (push) Successful in 9m37s
Test / Dashboard Unit Tests (push) Successful in 9m37s
Test / API Integration Tests (push) Successful in 9m54s
This commit is contained in:
@@ -0,0 +1,14 @@
|
||||
import type { LeadDestinationAdapter, LeadDestinationResult } from './types';
|
||||
|
||||
export class BlockedLeadDestinationAdapter implements LeadDestinationAdapter {
|
||||
readonly name = 'blocked';
|
||||
|
||||
async submitLead(): Promise<LeadDestinationResult> {
|
||||
return {
|
||||
ok: false,
|
||||
category: 'configuration',
|
||||
retryable: false,
|
||||
code: 'lead_destination_not_approved',
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
import type { IntegrationEnvironment } from '@/lib/integrations/environment';
|
||||
import { BlockedLeadDestinationAdapter } from './blocked';
|
||||
import { LocalLeadDestinationAdapter } from './local';
|
||||
import type { LeadDestinationAdapter } from './types';
|
||||
|
||||
export function createLeadDestinationAdapter(
|
||||
environment: IntegrationEnvironment,
|
||||
): LeadDestinationAdapter {
|
||||
const approvedLocalRuntime =
|
||||
environment.NODE_ENV !== 'production' || environment.DEMO_LOCAL_TEST_MODE;
|
||||
if (approvedLocalRuntime && environment.DEMO_SUBMISSION_MODE === 'local') {
|
||||
return new LocalLeadDestinationAdapter();
|
||||
}
|
||||
return new BlockedLeadDestinationAdapter();
|
||||
}
|
||||
|
||||
export type { IntegrationContext, LeadDestinationAdapter, LeadDestinationResult } from './types';
|
||||
@@ -0,0 +1,46 @@
|
||||
import type { LeadDestinationAdapter, LeadDestinationResult } from './types';
|
||||
|
||||
function abortError(): Error {
|
||||
return new DOMException('Operation aborted', 'AbortError');
|
||||
}
|
||||
|
||||
export class LocalLeadDestinationAdapter implements LeadDestinationAdapter {
|
||||
readonly name = 'local-discard';
|
||||
|
||||
async submitLead(
|
||||
_lead: Parameters<LeadDestinationAdapter['submitLead']>[0],
|
||||
context: Parameters<LeadDestinationAdapter['submitLead']>[1],
|
||||
): Promise<LeadDestinationResult> {
|
||||
if (context.signal.aborted) throw abortError();
|
||||
|
||||
switch (context.testScenario) {
|
||||
case 'duplicate':
|
||||
return { ok: false, category: 'duplicate', retryable: false, code: 'local_duplicate' };
|
||||
case 'integration-error':
|
||||
return { ok: false, category: 'integration', retryable: true, code: 'local_error' };
|
||||
case 'timeout':
|
||||
await new Promise<void>((resolve, reject) => {
|
||||
const timer = setTimeout(resolve, 30_000);
|
||||
context.signal.addEventListener(
|
||||
'abort',
|
||||
() => {
|
||||
clearTimeout(timer);
|
||||
reject(abortError());
|
||||
},
|
||||
{ once: true },
|
||||
);
|
||||
});
|
||||
break;
|
||||
case 'success':
|
||||
case undefined:
|
||||
break;
|
||||
}
|
||||
|
||||
return {
|
||||
ok: true,
|
||||
externalId: `local_${context.correlationId}`,
|
||||
acceptedAt: new Date().toISOString(),
|
||||
mode: 'local',
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
import type { DemoLead } from '../schema';
|
||||
|
||||
export interface IntegrationContext {
|
||||
correlationId: string;
|
||||
idempotencyKey: string;
|
||||
signal: AbortSignal;
|
||||
environment: 'development' | 'test' | 'production';
|
||||
testScenario?: 'success' | 'duplicate' | 'timeout' | 'integration-error';
|
||||
}
|
||||
|
||||
export type LeadDestinationResult =
|
||||
| { ok: true; externalId: string; acceptedAt: string; mode: 'local' }
|
||||
| {
|
||||
ok: false;
|
||||
category: 'duplicate' | 'integration' | 'timeout' | 'configuration';
|
||||
retryable: boolean;
|
||||
code: string;
|
||||
};
|
||||
|
||||
export interface LeadDestinationAdapter {
|
||||
readonly name: string;
|
||||
submitLead(lead: DemoLead, context: IntegrationContext): Promise<LeadDestinationResult>;
|
||||
}
|
||||
Reference in New Issue
Block a user