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