Skip to content
CodeSook
CodeSook

05.Employee Controller


ในการทำ 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
}