class DatabaseTransactionService extends Context.Tag(
"DatabaseTransactionService",
)<
DatabaseTransactionService,
{
readonly tx: Omit<
PrismaClient<Prisma.PrismaClientOptions, never>,
"$connect" | "$disconnect" | "$on" | "$transaction" | "$use" | "$extends"
>;
}
>() {}
const WithDatabaseTransaction = <T, Err>(
toWrap: Effect.Effect<T, Err, DatabaseTransactionService>,
) => {
return Effect.tryPromise({
try: () =>
db.$transaction(async (tx) => {
const either = await Effect.runPromise(
Effect.either(
toWrap.pipe(
Effect.provide(Layer.succeed(DatabaseTransactionService, { tx })),
),
),
);
return Either.match(either, {
onLeft: (err) => {
throw err;
},
onRight: (val) => val,
});
}),
catch(error: unknown) {
return error as Err;
},
});
};
class DatabaseTransactionService extends Context.Tag(
"DatabaseTransactionService",
)<
DatabaseTransactionService,
{
readonly tx: Omit<
PrismaClient<Prisma.PrismaClientOptions, never>,
"$connect" | "$disconnect" | "$on" | "$transaction" | "$use" | "$extends"
>;
}
>() {}
const WithDatabaseTransaction = <T, Err>(
toWrap: Effect.Effect<T, Err, DatabaseTransactionService>,
) => {
return Effect.tryPromise({
try: () =>
db.$transaction(async (tx) => {
const either = await Effect.runPromise(
Effect.either(
toWrap.pipe(
Effect.provide(Layer.succeed(DatabaseTransactionService, { tx })),
),
),
);
return Either.match(either, {
onLeft: (err) => {
throw err;
},
onRight: (val) => val,
});
}),
catch(error: unknown) {
return error as Err;
},
});
};