Skip to content

Commit d8fcfc2

Browse files
committed
Extract BlogPost items from a global, into a BlogPostRepository service.
1 parent a28f40f commit d8fcfc2

File tree

4 files changed

+28
-9
lines changed

4 files changed

+28
-9
lines changed

_project/api/_src/Usecases/Blog.Controllers.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
1+
import { BlogPostRepo } from "@/services.js"
12
import { BlogPost } from "@effect-app-boilerplate/models/Blog"
23
import { BlogRsc } from "@effect-app-boilerplate/resources"
34

4-
const items: BlogPost[] = []
5+
const { controllers, matchWithServices } = matchFor(BlogRsc)
56

6-
const { controllers, matchWith } = matchFor(BlogRsc)
7-
8-
const GetPosts = matchWith("GetPosts")(
9-
() => Effect({ items })
7+
const GetPosts = matchWithServices("GetPosts")(
8+
{ BlogPostRepo },
9+
(_, { BlogPostRepo }) => BlogPostRepo.all.map(items => ({ items }))
1010
)
1111

12-
const CreatePost = matchWith("CreatePost")(
13-
req =>
12+
const CreatePost = matchWithServices("CreatePost")(
13+
{ BlogPostRepo },
14+
(req, { BlogPostRepo }) =>
1415
Effect(new BlogPost({ ...req }))
15-
.tap(post => Effect(items.push(post)))
16+
.tap(BlogPostRepo.save)
1617
.map(_ => _.id)
1718
)
1819

_project/api/_src/api.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { writeOpenapiDocs } from "@effect-app/infra/api/writeDocs"
33
import type { ApiMainConfig } from "./config.js"
44
import * as MW from "./middleware/index.js"
55
import * as R from "./routes.js"
6-
import { Operations, StoreMaker, UserRepo } from "./services.js"
6+
import { BlogPostRepoLive, Operations, StoreMaker, UserRepo } from "./services.js"
77
import { Events } from "./services/Events.js"
88

99
const routes = Effect.struct(R)
@@ -28,6 +28,7 @@ export function api(cfg: ApiMainConfig) {
2828
> logServerStart
2929

3030
const services = Events.Live
31+
> BlogPostRepoLive
3132
> StoreMaker.Live(Config(cfg.storage))
3233
> UserRepo.Live(
3334
cfg.fakeUsers === "sample" ? "sample" : ""

_project/api/_src/services.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// codegen:start {preset: barrel, include: services/*.ts }
2+
export * from "./services/BlogPostRepo.js"
23
export * from "./services/CurrentUser.js"
34
export * from "./services/DBContext.js"
45
export * from "./services/Events.js"
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import type { BlogPost } from "@effect-ts-app/boilerplate-types/Blog"
2+
3+
export interface BlogPostRepo {
4+
all: Effect<never, never, readonly BlogPost[]>
5+
save: (post: BlogPost) => Effect<never, never, void>
6+
}
7+
export const BlogPostRepo = Tag<BlogPostRepo>()
8+
9+
export const BlogPostRepoLive = Layer(BlogPostRepo, () => {
10+
const items: BlogPost[] = []
11+
12+
return {
13+
all: Effect([...items]),
14+
save: post => Effect(items.push(post))
15+
}
16+
})

0 commit comments

Comments
 (0)