Files
suaveplan/openspec/changes/enterprise-api-plugin-import/proposal.md
2026-05-27 23:29:53 +01:00

2.9 KiB

OpenSpec Change: enterprise-api-plugin-import

  • Change ID: enterprise-api-plugin-import
  • Package: @suaveplan/api-plugin-import
  • Category: api/data
  • Target path: api/data/api-plugin-import
  • Status: PROPOSED
  • Date: 2026-04-24
  • Reference spec: /mnt/s/web/suaveplan/enterprise/api-plugin-import.md

Summary

Deliver @suaveplan/api-plugin-import on the genesis branch from scratch at enterprise quality. Data import plugin: async import job queue supporting CSV, JSONL, and XML (via fast-xml-parser); auto-format detection; row-level validation with per-row error collection; configurable column mapping and transformation; dry-run mode; duplicate detection via @suaveplan/dedup; PII masking via @suaveplan/data-masking; streaming ingestion via Web Streams for large files. Routes under /imports. Per-table SurrealQL. Events: import:job:started, import:job:completed, import:job:failed, import:row:error.


Available workspace deps on genesis

Package Role
@suaveplan/api (workspace:^) definePlugin
@suaveplan/api-shared (workspace:^) Helpers
@suaveplan/api-plugin-auth (workspace:^) requireAuth
@suaveplan/api-plugin-database (workspace:^) SurrealDB
@suaveplan/api-plugin-file-upload (workspace:^) Source file staging
@suaveplan/dedup (workspace:^) Duplicate detection
@suaveplan/data-masking (workspace:^) PII masking
@suaveplan/serialize (workspace:^) Streaming deserialization
@suaveplan/events (workspace:^) Event bus
@suaveplan/error (workspace:^) ImportError hierarchy
@suaveplan/rate-limiter (workspace:^) Rate limits
fast-xml-parser (catalog:data) XML parsing
hono + @hono/zod-openapi + zod Routes
@opentelemetry/api OTel

Public API surface

function createImportPlugin(config?: ImportPluginConfig): PluginDescriptor
// Services: ImportJobService, FormatDetectionService, ValidationService, IngestionService
// Routes: POST /imports, GET /imports/:id, DELETE /imports/:id
interface ImportTargetAdapter { upsert(rows: unknown[]): Promise<ImportBatchResult> }

Error codes

type ImportErrorCode =
  | "IMPORT_JOB_NOT_FOUND"
  | "IMPORT_FORMAT_UNKNOWN"
  | "IMPORT_VALIDATION_FAILED"
  | "IMPORT_TARGET_ERROR"
  | "IMPORT_FILE_TOO_LARGE"

File layout

api/data/api-plugin-import/
  package.json  tsconfig.json  vitest.config.ts
  surql/ (import_job, import_row_error tables)
  src/
    index.ts  events.ts  types/  errors/
    adapters/import-target.port.ts
    services/import-job/  services/format-detection/
    services/validation/  services/ingestion/
    routes/imports/
  tests/integration.test.ts

Impact

Prerequisites: @suaveplan/api, @suaveplan/api-plugin-auth, @suaveplan/api-plugin-database, @suaveplan/api-plugin-file-upload, @suaveplan/dedup, @suaveplan/data-masking, @suaveplan/serialize.