import type { Expand, FunctionReference, FunctionReturnType, GenericActionCtx, GenericMutationCtx, GenericQueryCtx, NamedTableInfo, OptionalRestArgs, VectorIndexNames, VectorSearchQuery, } from "convex/server"; import type { GenericId } from "convex/values"; import { Context, Effect } from "effect"; import { type ConfectAuth, ConfectAuthImpl } from "~/src/server/auth"; import type { DataModelFromConfectDataModel, GenericConfectDataModel, TableNamesInConfectDataModel, } from "~/src/server/data-model"; import { type ConfectDatabaseReader, ConfectDatabaseReaderImpl, type ConfectDatabaseWriter, ConfectDatabaseWriterImpl, type DatabaseSchemasFromConfectDataModel, } from "~/src/server/database"; import { type ConfectScheduler, ConfectSchedulerImpl, } from "~/src/server/scheduler"; import { type ConfectStorageReader, ConfectStorageReaderImpl, type ConfectStorageWriter, ConfectStorageWriterImpl, } from "~/src/server/storage"; export type ConfectMutationCtx< ConfectDataModel extends GenericConfectDataModel, > = { ctx: GenericMutationCtx>; db: ConfectDatabaseWriter; auth: ConfectAuth; storage: ConfectStorageWriter; scheduler: ConfectScheduler; }; export const ConfectMutationCtx = < ConfectDataModel extends GenericConfectDataModel, >() => Context.GenericTag>( "@rjdellecese/confect/ConfectMutationCtx", ); export type ConfectQueryCtx = { ctx: GenericQueryCtx>; db: ConfectDatabaseReader; auth: ConfectAuth; storage: ConfectStorageReader; }; export const ConfectQueryCtx = < ConfectDataModel extends GenericConfectDataModel, >() => Context.GenericTag>( "@rjdellecese/confect/ConfectQueryCtx", ); export type ConfectActionCtx = { runQuery>( query: Query, ...args: OptionalRestArgs ): Effect.Effect>; runMutation< Mutation extends FunctionReference<"mutation", "public" | "internal">, >( mutation: Mutation, ...args: OptionalRestArgs ): Effect.Effect>; runAction< Action extends FunctionReference<"action", "public" | "internal">, >( action: Action, ...args: OptionalRestArgs ): Effect.Effect>; ctx: GenericActionCtx>; scheduler: ConfectScheduler; auth: ConfectAuth; storage: ConfectStorageWriter; vectorSearch< TableName extends TableNamesInConfectDataModel, IndexName extends VectorIndexNames< NamedTableInfo< DataModelFromConfectDataModel, TableName > >, >( tableName: TableName, indexName: IndexName, query: Expand< VectorSearchQuery< NamedTableInfo< DataModelFromConfectDataModel, TableName >, IndexName > >, ): Effect.Effect; _score: number }>>; }; export const ConfectActionCtx = < ConfectDataModel extends GenericConfectDataModel, >() => Context.GenericTag>( "@rjdellecese/confect/ConfectActionCtx", ); export const makeConfectQueryCtx = < ConfectDataModel extends GenericConfectDataModel, >( ctx: GenericQueryCtx>, databaseSchemas: DatabaseSchemasFromConfectDataModel, ): ConfectQueryCtx => ({ ctx, db: new ConfectDatabaseReaderImpl(ctx.db, databaseSchemas), auth: new ConfectAuthImpl(ctx.auth), storage: new ConfectStorageReaderImpl(ctx.storage), }); export const makeConfectMutationCtx = < ConfectDataModel extends GenericConfectDataModel, >( ctx: GenericMutationCtx>, databaseSchemas: DatabaseSchemasFromConfectDataModel, ): ConfectMutationCtx => ({ ctx, db: new ConfectDatabaseWriterImpl(ctx.db, databaseSchemas), auth: new ConfectAuthImpl(ctx.auth), storage: new ConfectStorageWriterImpl(ctx.storage), scheduler: new ConfectSchedulerImpl(ctx.scheduler), }); export const makeConfectActionCtx = < ConfectDataModel extends GenericConfectDataModel, >( ctx: GenericActionCtx>, ): ConfectActionCtx => ({ runQuery: >( query: Query, ...queryArgs: OptionalRestArgs ) => Effect.promise(() => ctx.runQuery(query, ...queryArgs)), runMutation: < Mutation extends FunctionReference<"mutation", "public" | "internal">, >( mutation: Mutation, ...mutationArgs: OptionalRestArgs ) => Effect.promise(() => ctx.runMutation(mutation, ...mutationArgs)), runAction: < Action extends FunctionReference<"action", "public" | "internal">, >( action: Action, ...actionArgs: OptionalRestArgs ) => Effect.promise(() => ctx.runAction(action, ...actionArgs)), vectorSearch: < TableName extends TableNamesInConfectDataModel, IndexName extends VectorIndexNames< NamedTableInfo, TableName> >, >( tableName: TableName, indexName: IndexName, query: Expand< VectorSearchQuery< NamedTableInfo< DataModelFromConfectDataModel, TableName >, IndexName > >, ) => Effect.promise(() => ctx.vectorSearch(tableName, indexName, query)), ctx, auth: new ConfectAuthImpl(ctx.auth), storage: new ConfectStorageWriterImpl(ctx.storage), scheduler: new ConfectSchedulerImpl(ctx.scheduler), });