Skip to content

Data model

There is no repository-local persistence model. The data model spans two boundaries: an in-repository wire/contract model, and an external, unvendored persistence model.

Connections

The database connection used by the persistence model below is composed at run time; it is not a static connection string. See Configuration: Runtime-resolved database connections for the full resolution call, environment key, and schema argument.

Wire and contract model

Defined in PdfAPI.Core, in this repository. Shared by the API and the PdfAPI.Client package.

Type Kind Purpose
PdfRequest Base request Common request fields, including the TrackingEnabled getter forced on by SendHeatEmailOnFailure (BR-PDFAPI-010)
ConvertRequest Request (extends PdfRequest) Convert operation payload; SkipPdf defaults to true
ExtractPagesRequest Request (extends PdfRequest) Extract operation payload
MergeRequest Request (extends PdfRequest) Merge operation payload
DocumentRange Composition type Pairs a Document with one or more PageRange values
PageRange Composition type Page range with clamping/reversal semantics (BR-PDFAPI-018)
Document Composition type Document bytes plus metadata (e.g. file name)
PdfOptions Options type Merge/convert options, including IsPdfa and output format
PdfResult Result type Status, Message, Document, TrackingId
PdfTrackingInfo Result type Status, FileId, FilePath, TrackingId
PdfTrackingMetadata Metadata type Caller-supplied correlation metadata for tracking
PdfFormat Enum Pdf, PdfA
PdfStatus Enum Maps onto persisted status codes — see Entity mappings below
PdfProcessorType Enum Identifies which processor (ActivePDF/Syncfusion) produced a result
SourceConversionType Enum Identifies the source format class of a conversion

Full member detail is in the Endpoints request/response contract tables per action.

Persistence model

Defined in SAIF.Data.Model.PDF, an external package not present in this repository.

Table and column names must not be guessed. No .Column mapping override, no Table name override, and no .hbm.xml mapping file exists in this repository — the ClassMap<T> mappings ship inside the external SAIF.Data.Model.PDF package. Physical schema detail (table names, column names, key generation, and nullability) is Unknown** from this source and must be resolved from that package, not inferred from entity names.

Entity Table Database Identity Associations Mapping source
PDFTracking Unknown** Oracle (schema IMG**) Unknown** (C# property Id, long, database-generated) StatusCode → PDFStatusCode; TrackingCode → PDFTrackingCode; ApplicationError → PDFApplicationErrorCode (all many-to-one) External — SAIF.Data.Model.PDF
PDFStatusCode Unknown** Oracle (schema IMG**) Unknown** Referenced by PDFTracking.StatusCode External — SAIF.Data.Model.PDF
PDFTrackingCode Unknown** Oracle (schema IMG**) Unknown** Referenced by PDFTracking.TrackingCode External — SAIF.Data.Model.PDF
PDFApplicationErrorCode Unknown** Oracle (schema IMG**) Unknown** Referenced by PDFTracking.ApplicationError External — SAIF.Data.Model.PDF

No DELETE is performed against any entity anywhere in this project (verified absence). Tracking rows are insert-and-update only; there is no purge/retention path in this codebase.

PDFTracking properties observed in use

The following properties are the only inferable "column" evidence available for this entity.

Property C# type Written / read Value semantics observed
Id long Read (identity, query predicate) Database-generated tracking id returned as PdfResult.TrackingId
FileId string Written on insert; read predicate Guid.NewGuid().ToString() or caller-supplied PdfTrackingMetadata.FileId
FilePrefix string Written on insert Two characters: A(convert)/M(merge) + I(imaged)/E(not imaged)
StatusCode PDFStatusCode (FK) Written on insert and update Lookup for SCHED/PROC/SUCC/ERROR/CANCE/ABORT
ApplicationError PDFApplicationErrorCode (FK) Written on insert; read Lookup by application code ("AUTO" for the convert/merge helpers)
TrackingCode PDFTrackingCode (FK) Written on insert; read CONV or MERGE
CreateDate DateTime Written on insert Client clock (DateTime.Now), not a server-side timestamp
UpdateDate DateTime Written on insert only — never refreshed on update DateTime.Now
CreateUser string Written on insert Hard-coded "SYSTEM"
UpdateUser string Written on insert only Hard-coded "SYSTEM"
SourceSystemId string Written on insert Caller-supplied correlation id
OriginalFileExtension string Written on insert Source document extension
IsPDFA bool Written on insert outputFormat == PdfFormat.PdfA
ProcessStartDate DateTime Written on insert only when statusCode == "PROC" DateTime.Now
ProcessEndDate DateTime Written on update DateTime.Now
OutputFilePath string Written on update (conditional); read on download Composed path under {pdfapi.rootdirectory}\{import\|merge}\out\<filename>
Message string Written on update (conditional) Failure/detail text, truncated to 300 characters client-side (inferred evidence of a VARCHAR2(300)-scale column, not a verified definition)*

Lookup entity properties observed in use

Entity Property Usage
PDFStatusCode Code Query predicate Code.ToUpper() == statusCode
PDFTrackingCode Code Query predicate Code.ToUpper() == "CONV"/"MERGE"
PDFApplicationErrorCode Code Query predicate Code.ToLower() == applicationCode.ToLower()
PDFApplicationErrorCode HeatEmailSubject Read for the incident email subject (BR-PDFAPI-015)

Entity mappings

No ClassMap<T> mappings exist in this repository. The four entities above are declared and mapped entirely inside the external SAIF.Data.Model.PDF package. This repository has no .hbm.xml files, no Table name overrides, and no .Column mapping overrides. Any documentation of physical table or column names must be resolved from that package, not from this analysis.

Stored procedures

No stored procedures or PL/SQL packages are referenced by this service; all database access is through NHibernate mappings and queries.

ORM operations (traced to source; no SQL text exists in this repository)

ID CRUD Operation Entity Enclosing method
SQL-001 Create pdfTrackingRepo.Add(trackingRecord) inside Begin()/Commit() PDFTracking CreateTrackingRecord
SQL-002 Read appErrorRepo.Query().SingleOrDefault(x => x.Code.ToLower() == applicationCode.ToLower()) PDFApplicationErrorCode CreateTrackingRecord
SQL-003 Read pdfCacheStatusCodeRepo.Query().SingleOrDefault(x => x.Code.ToUpper() == statusCode) PDFStatusCode CreateTrackingRecord and UpdateTrackingRecord
SQL-004 Read pdfTrackingCodeRepo.Query().SingleOrDefault(x => x.Code.ToUpper() == ("CONV"\|"MERGE")) PDFTrackingCode CreateTrackingRecord
SQL-005 Read pdfTrackingRepo.Query().SingleOrDefault(x => x.Id == trackingId) inside Begin()/Commit() PDFTracking CheckPdfTrackingStatusById(long)
SQL-006 Read repo.Query().FirstOrDefault(x => x.FileId.ToLower() == fileId.ToLower()) PDFTracking CreateTrackingRecord(ConvertRequest, string) (idempotency probe)
SQL-007 Read pdfTrackingRepo.Query().FirstOrDefault(x => x.Id == trackingId) inside Begin()/Commit() PDFTracking UpdateTrackingRecord
SQL-008 Update Dirty-tracking flush at Commit() — no explicit Update() call; mutates OutputFilePath, StatusCode, ProcessEndDate, Message PDFTracking UpdateTrackingRecord

Additional facts: - SingleOrDefault (SQL-002/003/004/005) throws if the underlying lookup or tracking query returns more than one row. - SQL-006 uses FirstOrDefault, tolerating duplicate FileId rows — no uniqueness is assumed on the file id. - SQL-007/008 form a read-modify-write pair: the entity loaded by SQL-007 is mutated in place, and the UPDATE is emitted only by NHibernate's dirty-check flush at Commit() — correct only under a stateful session strategy. - record.StatusCode.Code (SQL-005 caller) is dereferenced after _uow.Commit(); this is only safe if PDFTracking.StatusCode is mapped eager in the external package — inferred from runtime viability, not verified*.

Note: Statements marked with * were inferred from code structure, naming conventions, or contextual evidence where direct confirmation was not available in source artifacts. Statements marked with ** could not be confirmed; treat as unknown until verified.

Sources

  • PdfAPI\Services\PdfTrackingService.cs
  • PdfAPI\App_Start\IocConfig.cs
  • PdfAPI.Core\Request\PdfRequest.cs
  • PdfAPI.Core\Request\ConvertRequest.cs
  • PdfAPI.Core\Extract\PageRange.cs
  • PdfAPI.Core\PdfResult.cs