longcelot-sheet-db
Version:
Google Sheets-backed staging database adapter for Node.js with schema-first design
75 lines • 3.37 kB
TypeScript
import { SheetClient } from './sheetClient';
import { CRUDOperations } from './crud';
import type { DatabaseAdapter } from './types';
import { TableSchema, UserContext, SchemaMismatchBehaviour, ActorPermission, DriveFolderConfig, TokenStore, StorageAdapter, UploadOptions, CreateUserSheetOptions, SheetStyleConfig, SheetReadCacheConfig } from '../schema/types';
export interface SheetAdapterConfig {
adminSheetId: string;
credentials: {
clientId: string;
clientSecret: string;
redirectUri: string;
};
tokens: unknown;
onSchemaMismatch?: SchemaMismatchBehaviour;
permissions?: Record<string, ActorPermission>;
/** Place sheets in this Drive folder hierarchy. */
driveFolder?: DriveFolderConfig;
/** When set, all Drive file operations target this Shared Drive. */
sharedDriveId?: string;
/** Per-actor token store. Adapter calls get(userId) in createUserSheet when actorTokens not passed directly. */
tokenStore?: TokenStore;
/** File upload provider. Pass new DriveStorageAdapter() for built-in Drive upload. */
storage?: StorageAdapter;
/** Header fill color, frozen rows/columns. Auto-resize and boolean/enum dropdowns are always applied. */
sheetStyle?: SheetStyleConfig;
/** In-memory read cache for values.get() calls — smooths out Sheets API read-quota (429) errors. Enabled by default with a 2s TTL. */
cache?: SheetReadCacheConfig;
}
export declare class SheetAdapter implements DatabaseAdapter {
private client;
private credentials;
private adminSheetId;
private schemas;
private context?;
private onSchemaMismatch?;
private permissions?;
private driveFolder?;
private sharedDriveId?;
private tokenStore?;
private storage?;
private sheetStyle;
private cacheConfig?;
/** Cached Drive folder IDs: role -> folderId */
private _folderCache;
/** Pending schema version check promise set by withContext() */
private _pendingSchemaCheck?;
constructor(config: SheetAdapterConfig);
registerSchema(schema: TableSchema): void;
registerSchemas(schemas: TableSchema[]): void;
withContext(context: UserContext): SheetAdapter;
asActor(targetActor: string, targetSheetId: string): SheetAdapter;
table(tableName: string): CRUDOperations;
createUserSheet(userId: string, role: string, email: string, options?: CreateUserSheetOptions): Promise<string>;
upload(file: Buffer, options: UploadOptions): Promise<string>;
deleteFile(url: string): Promise<void>;
syncSchema(schema: TableSchema): Promise<void>;
upsertSchemaVersion(actorSheetId: string, tableName: string, schemaHash: string, columnCount: number): Promise<void>;
getSchemaVersion(actorSheetId: string, tableName: string): Promise<{
schema_hash: string;
synced_at: string;
column_count: number;
} | null>;
private _applySheetFormatting;
private _svCrud;
private _ensureSchemaVersionsSheet;
private _doSchemaVersionCheck;
private resolveFolderForRole;
private createFKResolver;
private detectCircularRefs;
private resolveSpreadsheetId;
private hasPermission;
private sheetExists;
getClient(): SheetClient;
}
export declare function createSheetAdapter(config: SheetAdapterConfig): SheetAdapter;
//# sourceMappingURL=sheetAdapter.d.ts.map