| 10-ausschreibungs-radar-foundation-d-e-ingestion |
01 |
database |
| prisma |
| postgres |
| tender-radar |
| ingestion |
| adm-zip |
| fast-xml-parser |
| csv-parse |
| multi-tenant |
|
| phase |
provides |
| 09 (module-registry / dkv patterns) |
Prisma schema conventions, handwritten-migration workflow, tenant-extension (forTenant) reference |
|
|
| Global (tenant-agnostic) Tender table with OCDS-oriented nullable deadline/value fields (SCHEMA-01) |
| Singleton TenderSourcePollConfig model (sourceType @unique) as INGEST-06 foundation |
| fast-xml-parser, adm-zip, csv-parse installed in @tessera/api |
| Applied migration + regenerated Prisma client types for Tender / TenderSourcePollConfig |
|
| 10-02 module registration |
| 10-03 adapter/normalizer |
| 10-04 ingestion/scheduler |
| 10-05 controller/DTOs |
| phase 11 saved searches |
|
| added |
patterns |
| fast-xml-parser@5 |
| adm-zip@0.6 |
| csv-parse@7 |
|
| Global RLS-exempt reference table (no tenantId, no forTenant()) for platform-wide data (D-03) |
| Singleton-per-source config via fixed-slug @unique column (mirrors DkvModuleConfig.tenantId @unique) |
| Handwritten timestamped migration with IF NOT EXISTS guards (repo convention) |
|
|
| created |
modified |
| apps/api/prisma/migrations/20260721120000_add_tender_radar/migration.sql |
|
| apps/api/prisma/schema.prisma |
| apps/api/package.json |
|
|
| Tender carries NO tenantId column and is NOT wrapped by forTenant()/RLS — platform-global data (D-03) |
| deadlineAt / estimatedValue are nullable by mandate (RESEARCH Pattern 4), not optional hardening |
| TenderSourcePollConfig.lastIngestedDay is a day-cursor (DateTime?), not a poll timestamp (RESEARCH Pattern 1) |
| sourceType @unique makes the singleton-per-source intent explicit and enforceable at the DB level |
|
| Global reference table: no tenantId, no @@index([tenantId]), plain PrismaService client (no RLS wrap) |
| Singleton config row keyed by fixed slug via @unique |
|
|
| id |
description |
requirement |
verification |
human_judgment |
| D1 |
Global Tender table exists with OCDS-oriented nullable deadline/value fields and no tenantId (SCHEMA-01, D-03) |
SCHEMA-01 |
| kind |
ref |
status |
| automated_ui |
grep -c 'model Tender' schema.prisma >=1; awk Tender-block | grep -c tenantId == 0 |
pass |
|
| kind |
ref |
status |
| integration |
prisma migrate status -> 'Database schema is up to date!'; prisma.tender.count() == 0 |
pass |
|
|
false |
|
| id |
description |
verification |
human_judgment |
| D2 |
Singleton TenderSourcePollConfig model (sourceType @unique) present and live (INGEST-06 foundation) |
| kind |
ref |
status |
| integration |
prisma.tenderSourcePollConfig.count() == 0 without error; grep -c 'model TenderSourcePollConfig' == 1 |
pass |
|
|
false |
|
| id |
description |
verification |
human_judgment |
| D3 |
fast-xml-parser, adm-zip, csv-parse installed and resolvable in @tessera/api |
| kind |
ref |
status |
| integration |
node -e require('adm-zip');require('fast-xml-parser');require('csv-parse/sync') -> packages OK |
pass |
|
|
false |
|
|
~15min (aktive Ausführung, exkl. Checkpoint-Wartezeit) |
2026-07-21 |
complete |