forked from effect-app/boilerplate
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathIndexUsers.ts
More file actions
31 lines (28 loc) · 912 Bytes
/
IndexUsers.ts
File metadata and controls
31 lines (28 loc) · 912 Bytes
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
import { handlerFor } from "#api/lib/handler"
import { Q } from "#api/services"
import { S } from "#resources/lib"
import { Array, Effect, Order } from "effect-app"
import { UserId } from "./models.js"
import { UserRepo } from "./UserRepo.js"
import { UserView } from "./views.js"
export class IndexUsers extends S.Req<IndexUsers>()("Accounts.IndexUsers", {
filterByIds: S.NonEmptyArray(UserId)
}, {
allowAnonymous: true,
allowRoles: ["user"],
success: S.Struct({
users: S.Array(UserView)
})
}) {}
export default handlerFor(IndexUsers)({
dependencies: [UserRepo.Default],
effect: Effect.gen(function*() {
const userRepo = yield* UserRepo
return (req) =>
userRepo
.query(Q.where("id", "in", req.filterByIds))
.pipe(Effect.andThen((users) => ({
users: Array.sort(users, Order.mapInput(Order.string, (_: UserView) => _.displayName))
})))
})
})