Skip to content

Commit b657f11

Browse files
committed
Implement proper BlogPostRepo
1 parent 51d5295 commit b657f11

File tree

3 files changed

+42
-27
lines changed

3 files changed

+42
-27
lines changed

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

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { BlogPost } from "@effect-app-boilerplate/models/Blog"
22
import { BlogRsc } from "@effect-app-boilerplate/resources"
33
import { BogusEvent } from "@effect-app-boilerplate/resources/Events"
4-
import { NotFoundError } from "api/errors.js"
54
import { BlogPostRepo, Events, Operations } from "api/services.js"
65

76
const blog = matchFor(BlogRsc)
@@ -32,11 +31,9 @@ const PublishPost = blog.PublishPost(
3231
{ BlogPostRepo, Events, Operations },
3332
(req, { blogPostRepo, events, operations }) =>
3433
Do(($) => {
35-
$(
36-
blogPostRepo
37-
.find(req.id)
38-
.flatMap((_) => _.encaseInEffect(() => new NotFoundError({ type: "BlogPost", id: req.id })))
39-
)
34+
const post = $(blogPostRepo.get(req.id))
35+
36+
console.log("publishing post", post)
4037

4138
const targets = [
4239
"google",

_project/api/_src/api.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import { createServer } from "node:http"
1414
import { MergedConfig } from "./config.js"
1515
import * as MW from "./middleware/index.js"
1616
import { RequestContextMiddleware } from "./middleware/RequestContextMiddleware.js"
17-
import { BlogPostRepoLive, Operations, UserRepo } from "./services.js"
17+
import { BlogPostRepo, Operations, UserRepo } from "./services.js"
1818
import { Events } from "./services/Events.js"
1919

2020
export const devApi = MergedConfig
@@ -87,6 +87,6 @@ export const api = App.provide(
8787
RequestContextContainer.live,
8888
HttpClientNode.client.layer,
8989
UserRepo.Live,
90-
BlogPostRepoLive
90+
BlogPostRepo.Live
9191
)
9292
)
Lines changed: 37 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,43 @@
11
import { BlogPost, BlogPostId } from "@effect-app-boilerplate/models/Blog"
2+
import { RepositoryDefaultImpl } from "@effect-app/infra/services/RepositoryBase"
3+
import { RepoLive } from "api/migrate.js"
24

3-
export interface BlogPostRepo {
4-
all: Effect<never, never, readonly BlogPost[]>
5-
find: (id: BlogPostId) => Effect<never, never, Option<BlogPost>>
6-
save: (post: BlogPost) => Effect<never, never, void>
5+
export interface BlogPostPersistenceModel extends BlogPost.From {
6+
_etag: string | undefined
77
}
8-
export const BlogPostRepo = Tag<BlogPostRepo>()
98

10-
export const BlogPostRepoLive = Layer
11-
.sync(BlogPostRepo, () => {
12-
const items: BlogPost[] = [
13-
new BlogPost({
14-
id: BlogPostId("post-test123"),
15-
title: NonEmptyString255("Test post"),
16-
body: NonEmptyString2k("imma test body")
17-
})
18-
]
9+
export type BlogPostSeed = "sample" | ""
1910

20-
return {
21-
all: Effect.sync(() => [...items]),
22-
find: (id) => Effect.sync(() => items.findFirst((_) => _.id === id)),
23-
save: (post) => Effect.sync(() => items.push(post))
24-
}
11+
/**
12+
* @tsplus type BlogPostRepo
13+
* @tsplus companion BlogPostRepo.Ops
14+
*/
15+
export class BlogPostRepo extends RepositoryDefaultImpl<BlogPostRepo>()<BlogPostPersistenceModel>()(
16+
"BlogPost",
17+
BlogPost
18+
) {}
19+
20+
/**
21+
* @tsplus static BlogPostRepo.Ops Live
22+
*/
23+
export const LiveBlogPostRepo = Effect
24+
.sync(() => {
25+
const seed = "sample"
26+
const makeInitial = Effect.sync(() => {
27+
const items = seed === "sample"
28+
? [
29+
new BlogPost({
30+
id: BlogPostId("post-test123"),
31+
title: NonEmptyString255("Test post"),
32+
body: NonEmptyString2k("imma test body")
33+
})
34+
] as const
35+
: []
36+
return items
37+
})
38+
return BlogPostRepo
39+
.makeWith({ makeInitial }, (_) => new BlogPostRepo(_))
40+
.toLayer(BlogPostRepo)
2541
})
42+
.unwrapLayer
43+
.provide(RepoLive)

0 commit comments

Comments
 (0)