Skip to content

Commit 06c992c

Browse files
select api endpoint
1 parent 7fc7121 commit 06c992c

File tree

2 files changed

+56
-26
lines changed

2 files changed

+56
-26
lines changed

apps/server/src/rest.ts

Lines changed: 36 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,46 @@
11
import { HttpApiBuilder } from "@effect/platform";
22
import { SqlClient, SqlResolver } from "@effect/sql";
33
import { ServerApi, User } from "@local/api";
4-
import { Effect, Layer, Schema } from "effect";
4+
import { Effect, flow, Function, Layer, Schema } from "effect";
55
import { DatabaseLive } from "./database";
66

77
export const RestApiLive = HttpApiBuilder.group(ServerApi, "rest", (handlers) =>
8-
handlers.handle("create-user", ({ payload }) =>
9-
Effect.gen(function* () {
10-
const sql = yield* SqlClient.SqlClient;
8+
handlers
9+
.handle("create-user", ({ payload }) =>
10+
Effect.gen(function* () {
11+
const sql = yield* SqlClient.SqlClient;
1112

12-
const InsertPerson = yield* SqlResolver.ordered("InsertPerson", {
13-
Request: User.pipe(Schema.omit("id", "created_at")),
14-
Result: User,
15-
execute: (requests) =>
16-
sql`
17-
INSERT INTO "user"
18-
${sql.insert(requests)}
19-
RETURNING *
20-
`,
21-
});
13+
const InsertPerson = yield* SqlResolver.ordered("InsertPerson", {
14+
Request: User.pipe(Schema.omit("id", "created_at")),
15+
Result: User,
16+
execute: (requests) =>
17+
sql`INSERT INTO "user" ${sql.insert(requests)} RETURNING *`,
18+
});
2219

23-
return yield* InsertPerson.execute({ name: payload.name });
24-
}).pipe(
25-
Effect.tapError(Effect.logError),
26-
Effect.mapError((error) => error.message)
20+
return yield* InsertPerson.execute({ name: payload.name });
21+
}).pipe(
22+
Effect.tapError(Effect.logError),
23+
Effect.mapError((error) => error.message)
24+
)
25+
)
26+
.handle("get-user", ({ path }) =>
27+
Effect.gen(function* () {
28+
const sql = yield* SqlClient.SqlClient;
29+
30+
const GetById = yield* SqlResolver.findById("GetUserById", {
31+
Id: Schema.Number,
32+
Result: User,
33+
ResultId: (_) => _.id,
34+
execute: (ids) =>
35+
sql`SELECT * FROM "user" WHERE ${sql.in("id", ids)}`,
36+
});
37+
38+
const getById = flow(GetById.execute, Effect.withRequestCaching(true));
39+
40+
return yield* getById(path.id).pipe(Effect.flatMap(Function.identity));
41+
}).pipe(
42+
Effect.tapError(Effect.logError),
43+
Effect.mapError((error) => error.message)
44+
)
2745
)
28-
)
2946
).pipe(Layer.provide(DatabaseLive));

packages/api/src/main.ts

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
import { HttpApi, HttpApiEndpoint, HttpApiGroup } from "@effect/platform";
1+
import {
2+
HttpApi,
3+
HttpApiEndpoint,
4+
HttpApiGroup,
5+
HttpApiSchema,
6+
} from "@effect/platform";
27
import { Schema } from "effect";
38

49
export class User extends Schema.Class<User>("User")({
@@ -7,11 +12,19 @@ export class User extends Schema.Class<User>("User")({
712
created_at: Schema.DateFromSelf,
813
}) {}
914

10-
class RestGroup extends HttpApiGroup.make("rest").add(
11-
HttpApiEndpoint.post("create-user")`/user/create`
12-
.setPayload(Schema.Struct({ name: Schema.String }))
13-
.addError(Schema.String)
14-
.addSuccess(User)
15-
) {}
15+
class RestGroup extends HttpApiGroup.make("rest")
16+
.add(
17+
HttpApiEndpoint.post("create-user")`/user/create`
18+
.setPayload(Schema.Struct({ name: Schema.String }))
19+
.addError(Schema.String)
20+
.addSuccess(User)
21+
)
22+
.add(
23+
HttpApiEndpoint.get(
24+
"get-user"
25+
)`/user/get/${HttpApiSchema.param("id", Schema.NumberFromString)}`
26+
.addError(Schema.String)
27+
.addSuccess(User)
28+
) {}
1629

1730
export class ServerApi extends HttpApi.make("server-api").add(RestGroup) {}

0 commit comments

Comments
 (0)