import 'package:drift/drift.dart'; import 'enums.dart'; import 'sync_columns.dart'; /// The identity/accession — one row per distinct thing in the inventory. /// Only [label] is mandatory (progressive disclosure). class Varieties extends Table with SyncColumns { TextColumn get label => text()(); TextColumn get speciesId => text().nullable()(); // → Species TextColumn get cultivarName => text().nullable()(); TextColumn get category => text().nullable()(); // free text, prefilled from family TextColumn get notes => text().nullable()(); } /// The multiple common names of a Variety (separate table so concurrent adds /// merge as a set). class VarietyVernacularNames extends Table with SyncColumns { TextColumn get varietyId => text()(); TextColumn get name => text()(); TextColumn get language => text().nullable()(); TextColumn get region => text().nullable()(); } /// Bundled, mostly read-only name catalog (Wikidata CC0 + GBIF CC-BY). class Species extends Table with SyncColumns { TextColumn get scientificName => text()(); TextColumn get wikidataQid => text().nullable()(); IntColumn get gbifKey => integer().nullable()(); TextColumn get family => text().nullable()(); BoolColumn get isBundled => boolean().withDefault(const Constant(false))(); } /// Localized common names for the catalog (bundled). class SpeciesCommonNames extends Table with SyncColumns { TextColumn get speciesId => text()(); TextColumn get name => text()(); TextColumn get language => text().nullable()(); } /// A homogeneous batch held for a Variety — its own year and its own unit. /// Quantity (commons_core value type) is flattened into columns here. class Lots extends Table with SyncColumns { TextColumn get varietyId => text()(); IntColumn get harvestYear => integer().nullable()(); TextColumn get quantityKind => text().nullable()(); // QuantityKind.name RealColumn get quantityPrecise => real().nullable()(); TextColumn get quantityLabel => text().nullable()(); TextColumn get storageLocation => text().nullable()(); TextColumn get offerStatus => textEnum().withDefault(const Constant('private'))(); TextColumn get seedbankId => text().nullable()(); } /// Optional germination history for a Lot; percent is derived in code. class GerminationTests extends Table with SyncColumns { TextColumn get lotId => text()(); IntColumn get testedOn => integer().nullable()(); // date, ms since epoch IntColumn get sampleSize => integer().nullable()(); IntColumn get germinatedCount => integer().nullable()(); TextColumn get notes => text().nullable()(); } /// The append-only event log on a Lot — history + provenance DAG. class Movements extends Table with AppendOnlyColumns { TextColumn get lotId => text()(); TextColumn get type => textEnum()(); IntColumn get occurredOn => integer().nullable()(); // date, ms since epoch TextColumn get counterpartyId => text().nullable()(); // → Party TextColumn get quantityKind => text().nullable()(); RealColumn get quantityPrecise => real().nullable()(); TextColumn get quantityLabel => text().nullable()(); TextColumn get parentMovementId => text().nullable()(); // provenance DAG TextColumn get plantareId => text().nullable()(); // reserved (social layer) TextColumn get notes => text().nullable()(); } /// A person or collective you exchange with. class Parties extends Table with SyncColumns { TextColumn get displayName => text()(); TextColumn get publicKey => text().nullable()(); TextColumn get kind => textEnum().withDefault(const Constant('person'))(); TextColumn get note => text().nullable()(); } /// Photos/docs. Polymorphic parent. Photo bytes are stored in-DB (encrypted at /// rest by SQLCipher) via [bytes]; external files use [uri]. Storing bytes here /// keeps the "no plaintext at rest" rule for photos in Block 1; an external /// encrypted file store is a later optimization. class Attachments extends Table with SyncColumns { TextColumn get parentType => textEnum()(); TextColumn get parentId => text()(); TextColumn get kind => textEnum()(); TextColumn get uri => text().nullable()(); BlobColumn get bytes => blob().nullable()(); TextColumn get mimeType => text().nullable()(); } /// Any pasted URL (Wikipedia, forum…). Polymorphic parent. class ExternalLinks extends Table with SyncColumns { TextColumn get parentType => textEnum()(); TextColumn get parentId => text()(); TextColumn get url => text()(); TextColumn get title => text().nullable()(); }