05.Employee Controller
ในการทำ Backend เราจะถือว่าที่ Controller ตรงนี้เป็นจุดสุดท้ายแล้วที่เราจะใช้ Effect จุดๆนี้เราต้องแกะ Effect เอา data ออกมาละ
แล้วเอา data ที่ได้ส่งไปให้ client
โดยเราจะแกะ data ออกมาโดยใช้ Effect.runPromise()
นั่นเอง
เราจะเอา Service มาใช้ที่ Controller ต่อแบบนี้
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 }