import { Cause, Config, DateTime, Effect } from "effect"; import { DdfHttp } from "./client.js"; import { listDestinations } from "./resources.js"; import type { MemberRecord, MemberSyncOptions, OfficeRecord, OfficeSyncOptions, OpenHouseListingScope, OpenHouseSyncOptions, PropertyRecord, PropertySyncOptions, SyncResult } from "./sync.js"; import { syncMembers, syncOffices, syncOpenHouses, syncProperties } from "./sync.js"; import { DdfDatabase } from "./db/layer.js"; import { runDdfDatabaseMigrations } from "./db/runMigrations.js"; import { makeDdfDatabaseSyncSink } from "./db/sink.js"; import type { DdfDatabaseSyncSink } from "./db/sink.js"; import type { SerializedSyncRecordError } from "./db/sink.js"; import { loadDatabaseWatermark, saveDatabaseWatermark } from "./db/watermarks.js"; declare const DdfDatabaseSyncError_base: new = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => Cause.YieldableError & { readonly _tag: "DdfDatabaseSyncError"; } & Readonly; export declare class DdfDatabaseSyncError extends DdfDatabaseSyncError_base<{ readonly operation: "loadOpenHouseListingScopes" | "recordRun"; readonly cause: unknown; }> { get message(): string; } declare const DdfChosenAorKeysConfigError_base: new = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => Cause.YieldableError & { readonly _tag: "DdfChosenAorKeysConfigError"; } & Readonly; export declare class DdfChosenAorKeysConfigError extends DdfChosenAorKeysConfigError_base<{ readonly value: string; readonly reason: string; }> { get message(): string; } export type ChosenAorKeys = ReadonlyArray; export declare const parseChosenAorKeys: (value: string | null | undefined) => ChosenAorKeys; export declare const chosenAorKeysFromEnv: () => Effect.Effect; export interface SyncDdfDatabaseOnceOptions { readonly runId?: string; readonly runMigrations?: boolean; readonly destinationId?: number; readonly concurrency?: number; readonly destinationQuery?: Parameters[0]; readonly propertyQuery?: PropertySyncOptions["query"]; readonly memberQuery?: MemberSyncOptions["query"]; readonly officeQuery?: OfficeSyncOptions["query"]; readonly openHouseQuery?: OpenHouseSyncOptions["query"]; readonly openHouseDateWindow?: OpenHouseSyncOptions["dateWindow"]; readonly openHouseListingChunkSize?: number; /** * Limits persisted Property/Member/Office rows and OpenHouse listing scopes to these AOR keys. * Property replication is destination-scoped and is not AOR-filtered because replication * identifier rows do not expose ListAORKey. Database watermarks are stored with destination * and AOR scope metadata, so changing either scope starts a fresh processed-stream cursor. * Existing rows outside this scope are not pruned automatically. */ readonly chosenAorKeys?: ChosenAorKeys; readonly dependencies?: Partial; } export interface SyncDdfDatabaseDependencies { readonly syncDestinations: typeof syncDestinations; readonly syncProperties: typeof syncProperties; readonly syncMembers: typeof syncMembers; readonly syncOffices: typeof syncOffices; readonly syncOpenHouses: typeof syncOpenHouses; readonly loadWatermark: typeof loadDatabaseWatermark; readonly saveWatermark: typeof saveDatabaseWatermark; readonly runMigrations: typeof runDdfDatabaseMigrations; readonly makeSink: typeof makeDdfDatabaseSyncSink; readonly loadOpenHouseListingScopes: (chosenAorKeys: ChosenAorKeys) => Effect.Effect, DdfDatabaseSyncError, DdfDatabase>; readonly recordRun: (summary: SyncDdfDatabaseOnceSummary, destinationId?: number) => Effect.Effect; } export interface DdfDatabaseResourceSummary { readonly counts: SyncResult["counts"]; readonly nextWatermark: string | null; readonly errors: ReadonlyArray; } export interface SyncDdfDatabaseOnceSummary { readonly runId: string; readonly status: "success" | "partial_failure"; readonly startedAt: Date; readonly completedAt: Date; readonly destination: DdfDatabaseResourceSummary; readonly property: DdfDatabaseResourceSummary; readonly member: DdfDatabaseResourceSummary; readonly office: DdfDatabaseResourceSummary; readonly openHouse: DdfDatabaseResourceSummary; } export declare const syncDestinations: (sink: Pick, query?: import("./types.js").ODataListQuery<"DestinationId" | "DestinationName" | "DestinationStatus" | "DestinationType" | "DestinationUrl" | "FullNSP" | "MemberFirstName" | "MemberKey" | "MemberLastName" | "ModificationTimestamp" | "OriginalEntryTimestamp"> | undefined) => Effect.Effect, import("./client.js").DdfHttpError, DdfHttp>; export interface DatabaseSyncWatermarks { readonly property: string | null; readonly member: string | null; readonly office: string | null; readonly openHouse: string | null; } export declare const databaseSyncOptionsFromWatermarks: (watermarks: DatabaseSyncWatermarks, options?: Pick) => { property: { mode: "incremental" | "initial"; since: string | undefined; destinationId: number | undefined; concurrency: number | undefined; query: import("./types.js").ReplicationQuery | undefined; includeProperty: ((property: PropertyRecord) => boolean) | undefined; }; member: { mode: "incremental" | "initial"; since: string | undefined; destinationId: number | undefined; concurrency: number | undefined; query: import("./types.js").ReplicationQuery | undefined; includeMember: ((member: MemberRecord) => boolean) | undefined; }; office: { mode: "incremental" | "initial"; since: string | undefined; destinationId: number | undefined; concurrency: number | undefined; query: import("./types.js").ReplicationQuery | undefined; includeOffice: ((office: OfficeRecord) => boolean) | undefined; }; openHouse: { query: import("./types.js").ODataListQuery | undefined; concurrency: number | undefined; listingChunkSize: number | undefined; }; }; export declare const syncDdfDatabaseOnce: (options?: SyncDdfDatabaseOnceOptions | undefined) => Effect.Effect; export {}; //# sourceMappingURL=syncDatabase.d.ts.map