summaryrefslogtreecommitdiffhomepage
path: root/packages/server/src/api/question.ts
blob: f72c37aa19ea76661ebab5b511396c90f2d3af0a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import { Effect, Schema } from "effect"
import { HttpApiBuilder } from "effect/unstable/httpapi"
import { QuestionReply, QuestionRequest, questionApi } from "../definition/question.js"

export interface QuestionOps<R = never> {
  readonly list: () => Effect.Effect<ReadonlyArray<unknown>, never, R>
  readonly reply: (input: {
    requestID: string
    answers: Schema.Schema.Type<typeof QuestionReply>["answers"]
  }) => Effect.Effect<void, never, R>
}

export const makeQuestionHandler = <R>(ops: QuestionOps<R>) =>
  HttpApiBuilder.group(
    questionApi,
    "question",
    Effect.fn("QuestionHttpApi.handlers")(function* (handlers) {
      const decode = Schema.decodeUnknownSync(Schema.Array(QuestionRequest))

      const list = Effect.fn("QuestionHttpApi.list")(function* () {
        return decode(yield* ops.list())
      })

      const reply = Effect.fn("QuestionHttpApi.reply")(function* (ctx: {
        params: { requestID: string }
        payload: Schema.Schema.Type<typeof QuestionReply>
      }) {
        yield* ops.reply({
          requestID: ctx.params.requestID,
          answers: ctx.payload.answers,
        })
        return true
      })

      return handlers.handle("list", list).handle("reply", reply)
    }),
  )