import { Injectable } from '@nestjs/common';
import { randomUUID } from 'node:crypto';
import { DatabaseService } from '../../../infrastructure/database/database.service';
import { AccountingProviderRegistry } from '../providers/accounting-provider.registry';
import {
assertAccountingRecord,
assertAccountingScope,
assertAccountingText,
assertOptionalAccountingText,
} from './accounting-input-validation';
@Injectable()
export class AccountingIntegrationService {
constructor(
private readonly database:DatabaseService,
private readonly providers:AccountingProviderRegistry,
) {}
async createConnection(input:unknown) {
assertAccountingScope(input, 'accounting.integration_input_invalid', { locationRequired: false });
assertAccountingText(input.provider, 100, 'accounting.integration_input_invalid');
assertOptionalAccountingText(input.displayName, 250, 'accounting.integration_input_invalid');
assertOptionalAccountingText(input.credentialReference, 500, 'accounting.integration_input_invalid');
assertOptionalAccountingText(input.userId, 200, 'accounting.integration_input_invalid');
const config = input.config ?? {};
assertAccountingRecord(config, 'accounting.integration_input_invalid');
const provider=this.providers.get(input.provider);
const id=randomUUID();
await this.database.query(
`insert into integration_connections(
id,organization_id,location_id,category,provider,display_name,status,
credential_reference,credentials_json,config_json,sync_direction,created_by_user_id
) values($1,$2,$3,'accounting',$4,$5,'active',$6,'{}'::jsonb,$7::jsonb,'outbound_only',$8)`,
[
id,input.organizationId,input.locationId??null,input.provider,
input.displayName??input.provider,input.credentialReference??null,
JSON.stringify(config),input.userId??null,
],
);
return {id,provider:input.provider,capabilities:provider.capabilities};
}
}
