1import * as Schema from "effect/Schema";
2import * as HttpApi from "effect/http-api/HttpApi";
3import * as HttpApiEndpoint from "effect/http-api/HttpApiEndpoint";
4import * as HttpApiGroup from "effect/http-api/HttpApiGroup";
5
6export class Task extends Schema.Class<Task>("Task")({
7 id: Schema.String,
8 title: Schema.String,
9 completed: Schema.Boolean,
10}) {}
11
12export const decodeTask = Schema.decodeUnknownEffect(Task);
13
14export const encodeTask = Schema.encodeUnknownSync(Task);
15
16export class TaskNotFound extends Schema.TaggedError<TaskNotFound>()(
17 "TaskNotFound",
18 { id: Schema.String },
19 { httpApiStatus: 404 },
20) {}
21
22const TaskParams = Schema.Struct({
23 id: Schema.String,
24});
25
26export const getTask = HttpApiEndpoint.get("getTask", "/:id", {
27 params: TaskParams,
28 success: Task,
29 error: TaskNotFound,
30});
31
32export const createTask = HttpApiEndpoint.post("createTask", "/", {
33 success: Task,
34 payload: Schema.Struct({
35 title: Schema.String,
36 }),
37});
38
39const getTaskDO = HttpApiEndpoint.get("getTaskDO", "/do/:id", {
40 params: TaskParams,
41 success: Task,
42 error: TaskNotFound,
43});
44
45const createTaskDO = HttpApiEndpoint.post("createTaskDO", "/do", {
46 success: Task,
47 payload: Schema.Struct({
48 title: Schema.String,
49 }),
50});
51
52export class TasksGroup extends HttpApiGroup.make("Tasks")
53 .add(getTask)
54 .add(createTask)
55 .add(getTaskDO)
56 .add(createTaskDO) {}
57
58export class TaskApi extends HttpApi.make("TaskApi").add(TasksGroup) {}