diff --git a/.changeset/real-pumas-tease.md b/.changeset/real-pumas-tease.md new file mode 100644 index 0000000000..35bc95005e --- /dev/null +++ b/.changeset/real-pumas-tease.md @@ -0,0 +1,6 @@ +--- +"@effect/sql-mysql2": patch +"@effect/sql": patch +--- + +fix Model findById data loader diff --git a/packages/sql-mysql2/test/Model.test.ts b/packages/sql-mysql2/test/Model.test.ts index 8816b6f1b0..7328bfa9f1 100644 --- a/packages/sql-mysql2/test/Model.test.ts +++ b/packages/sql-mysql2/test/Model.test.ts @@ -1,7 +1,7 @@ import { Schema } from "@effect/schema" import { Model, SqlClient } from "@effect/sql" import { assert, describe, it } from "@effect/vitest" -import { Effect } from "effect" +import { Effect, Option } from "effect" import { MysqlContainer } from "./utils.js" class User extends Model.Class("User")({ @@ -67,6 +67,31 @@ describe("Model", () => { Effect.catchTag("ContainerError", () => Effect.void) ), { timeout: 60_000 }) + it.scopedLive("findById data loader", () => + Effect.gen(function*() { + const repo = yield* Model.makeDataLoaders(User, { + tableName: "users", + idColumn: "id", + spanPrefix: "UserRepository", + window: 10 + }) + const sql = yield* SqlClient.SqlClient + yield* sql`CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), age INT)` + const alice = yield* repo.insert(User.insert.make({ name: "Alice", age: 30 })) + const john = yield* repo.insert(User.insert.make({ name: "John", age: 30 })) + + const [alice2, john2] = yield* Effect.all([ + repo.findById(alice.id), + repo.findById(john.id) + ], { batching: true }) + + assert.deepStrictEqual(Option.map(alice2, (alice) => alice.name), Option.some("Alice")) + assert.deepStrictEqual(Option.map(john2, (john) => john.name), Option.some("John")) + }).pipe( + Effect.provide(MysqlContainer.ClientLive), + Effect.catchTag("ContainerError", () => Effect.void) + ), { timeout: 60_000 }) + it.effect("update returns result", () => Effect.gen(function*() { const repo = yield* Model.makeRepository(User, { diff --git a/packages/sql/src/Model.ts b/packages/sql/src/Model.ts index 056b63c98b..662d486d3b 100644 --- a/packages/sql/src/Model.ts +++ b/packages/sql/src/Model.ts @@ -848,13 +848,10 @@ select * from ${sql(options.tableName)} where ${sql(idColumn)} = LAST_INSERT_ID( }) ) as any - const findByIdResolver = yield* SqlResolver.grouped(`${options.spanPrefix}/findById`, { - Request: idSchema, - RequestGroupKey(id) { - return id - }, + const findByIdResolver = yield* SqlResolver.findById(`${options.spanPrefix}/findById`, { + Id: idSchema, Result: Model, - ResultGroupKey(request) { + ResultId(request) { return request[idColumn] }, execute: (ids) => sql`select * from ${sql(options.tableName)} where ${sql.in(idColumn, ids)}`