dbos-inc / dbos-transact

The TypeScript framework for backends that scale
https://docs.dbos.dev
MIT License
291 stars 20 forks source link

Simplify UserDatabase/UserDatabaseQuery/UserDatabaseTransaction declarations #459

Open devhawk opened 1 month ago

devhawk commented 1 month ago

During review of #448, we considered simplifying several interfaces/types related to UserDatabase.

export interface UserDatabase {
  transaction<R, T extends unknown[]>(transactionFunction: UserDatabaseTransaction<R, T>, config: TransactionConfig, ...args: T): Promise<R>;
  queryFunction<C extends UserDatabaseClient, R, T extends unknown[]>(queryFunction: UserDatabaseQuery<C, R, T>, ...params: T): Promise<R>;
  query<R, T extends unknown[]>(sql: string, ...params: T): Promise<R[]>;
  queryWithClient<R, T extends unknown[] = unknown[]>(client: UserDatabaseClient, sql: string, ...params: T): Promise<R[]>;
  // other members omitted for clarity
}

type UserDatabaseQuery<C extends UserDatabaseClient, R, T extends unknown[]> = (ctxt: C, ...args: T) => Promise<R>;
type UserDatabaseTransaction<R, T extends unknown[]> = (ctxt: UserDatabaseClient, ...args: T) => Promise<R>;

Having a type argument T extending unknown[] doesn't provide much value. I think this type argument could be removed, simplifying the definitions. The new definitions would look something like this:

export interface UserDatabase {
  transaction<R>(transactionFunction: UserDatabaseTransaction<R, T>, config: TransactionConfig, ...args: unknown[]): Promise<R>;
  queryFunction<C extends UserDatabaseClient, R>(queryFunction: UserDatabaseQuery<C, R, T>, ...params: unknown[]): Promise<R>;
  query<R>(sql: string, ...params: unknown[]): Promise<R[]>;
  queryWithClient<R>(client: UserDatabaseClient, sql: string, ...params: unknown[]): Promise<R[]>;
  // other members omitted for clarity
}

type UserDatabaseQuery<C extends UserDatabaseClient, R> = (ctxt: C, ...args: unknown[]) => Promise<R>;
type UserDatabaseTransaction<R> = (ctxt: UserDatabaseClient, ...args: unknown[]) => Promise<R>;
demetris-manikas commented 1 month ago

This should probably be closed or assigned a label for v2 as it will change the signature of the related functions.