Employee Controller

Employee Controller

episode
ตอนที่ 25 จาก 31
read
อ่าน 2 นาที

ในการทำ Backend เราจะถือว่าที่ Controller ตรงนี้เป็นจุดสุดท้ายแล้วที่เราจะใช้ Effect จุดๆนี้เราต้องแกะ Effect เอา data ออกมาละ แล้วเอา data ที่ได้ส่งไปให้ client
โดยเราจะแกะ data ออกมาโดยใช้ Effect.runPromise() นั่นเอง

เราจะเอา Service มาใช้ที่ Controller ต่อแบบนี้

src/controllers/employees/get.ts
src/controllers/employees/get.ts
app.get("/", getManyDocs, async (c) => {
const parseResponse = Helpers.fromObjectToSchemaEffect(getManyResponseSchema)
const program = EmployeeServiceContext.pipe(
// ^? > Effect.Effect<..., never, EmployeeServiceContext>
Effect.tap(() => Effect.log("start finding many employees")),
Effect.andThen(svc => svc.findMany()),
Effect.andThen(parseResponse),
Effect.andThen(data => c.json(data, 200)),
Effect.tap(() => Effect.log("test")),
Effect.catchTags({
FindManyEmployeeError: () => Effect.succeed(c.json({ message: "find many error" }, 500)),
ParseError: () => Effect.succeed(c.json({ message: "parse error" }, 500)),
}),
Effect.annotateLogs({ key: "annotate" }),
Effect.withLogSpan("test"),
Effect.withSpan("controller /"),
)
const result = await Effect.runPromise(program) // Error: required EmployeeServiceContext
return result
})

code ด้านบนมันจะ Error ยังไม่สามารถรันได้ typescript compiler มันบ่นบอกว่ายังขาด EmployeeServiceContext การที่จะแก้ตรงนี้ได้ เราต้อง provide EmployeeServiceContext ให้กับ program พอ hover ดูที่ program ตัว Effect Requirement จะต้องเป็น never

need to be `never`
▲
│
│
const program: Effect<..., never, EmplolyeeServiceContext>
app.get("/", getManyDocs, async (c) => {
const parseResponse = Helpers.fromObjectToSchemaEffect(getManyResponseSchema)
const mainLive
= pipe(
EmployeeServiceContext.Live,
Layer.provide(EmployeeRepositoryContext.Live),
Layer.provide(PrismaClientContext.Live),
)
const program = EmployeeServiceContext.pipe(
// ^? > Effect.Effect<..., never, never>
Effect.tap(() => Effect.log("start finding many employees")),
Effect.andThen(svc => svc.findMany()),
Effect.andThen(parseResponse),
Effect.andThen(data => c.json(data, 200)),
Effect.tap(() => Effect.log("test")),
Effect.catchTags({
FindManyEmployeeError: () => Effect.succeed(c.json({ message: "find many error" }, 500)),
ParseError: () => Effect.succeed(c.json({ message: "parse error" }, 500)),
}),
Effect.annotateLogs({ key: "annotate" }),
Effect.withLogSpan("test"),
Effect.withSpan("controller /"),
Effect.provide(mainLive),
)
const result = await Effect.runPromise(program)
return result
}