Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions api/src/Accounts/GetMe.request.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { S } from "#resources/lib"
import { NotFoundError } from "effect-app/client"
import { User } from "./models.js"

export class GetMe extends S.Req<GetMe>()("Accounts.GetMe", {}, { success: User, failure: NotFoundError }) {}
6 changes: 1 addition & 5 deletions api/src/Accounts/GetMe.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@
import { handlerFor } from "#api/lib/handler"
import { S } from "#resources/lib"
import { Effect } from "effect-app"
import { NotFoundError } from "effect-app/client"
import { User } from "./models.js"
import { GetMe } from "./GetMe.request.js"
import { UserRepo } from "./UserRepo.js"

export class GetMe extends S.Req<GetMe>()("Accounts.GetMe", {}, { success: User, failure: NotFoundError }) {}

export default handlerFor(GetMe)({
dependencies: [UserRepo.Default],
effect: Effect.gen(function*() {
Expand Down
13 changes: 13 additions & 0 deletions api/src/Accounts/IndexUsers.request.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { S } from "#resources/lib"
import { UserId } from "./models.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)
})
}) {}
15 changes: 2 additions & 13 deletions api/src/Accounts/IndexUsers.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,9 @@
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 { IndexUsers } from "./IndexUsers.request.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)
})
}) {}
import type { UserView } from "./views.js"

export default handlerFor(IndexUsers)({
dependencies: [UserRepo.Default],
Expand Down
2 changes: 1 addition & 1 deletion api/src/Accounts/resolvers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { Effect, Exit, Request, RequestResolver } from "effect"
import { Array, Option, pipe, S } from "effect-app"
import { ApiClientFactory, NotFoundError } from "effect-app/client"
import { type Schema } from "effect-app/Schema"
import { IndexUsers } from "./IndexUsers.js"
import { IndexUsers } from "./IndexUsers.request.js"

interface GetUserViewById extends Request.Request<UserView, NotFoundError<"User">> {
readonly _tag: "GetUserViewById"
Expand Down
9 changes: 9 additions & 0 deletions api/src/Blog/CreatePost.request.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { S } from "#resources/lib"
import { InvalidStateError, NotFoundError, OptimisticConcurrencyException } from "effect-app/client"
import { BlogPost, BlogPostId } from "./models.js"

export class CreatePost extends S.Req<CreatePost>()("Blog.Create", BlogPost.pick("title", "body"), {
allowRoles: ["user"],
success: S.Struct({ id: BlogPostId }),
failure: S.Union(NotFoundError, InvalidStateError, OptimisticConcurrencyException)
}) {}
11 changes: 2 additions & 9 deletions api/src/Blog/CreatePost.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,10 @@
import { UserRepo } from "#Accounts/UserRepo"
import { handlerFor } from "#api/lib/handler"
import { S } from "#resources/lib"
import { Effect } from "effect-app"
import { InvalidStateError, NotFoundError, OptimisticConcurrencyException } from "effect-app/client"
import { BlogPost, BlogPostId } from "./models.js"
import { CreatePost } from "./CreatePost.request.js"
import { BlogPost } from "./models.js"
import { BlogPostRepo } from "./Repo.js"

export class CreatePost extends S.Req<CreatePost>()("Blog.Create", BlogPost.pick("title", "body"), {
allowRoles: ["user"],
success: S.Struct({ id: BlogPostId }),
failure: S.Union(NotFoundError, InvalidStateError, OptimisticConcurrencyException)
}) {}

export default handlerFor(CreatePost)({
dependencies: [
BlogPostRepo.Default,
Expand Down
11 changes: 11 additions & 0 deletions api/src/Blog/FindPost.request.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { S } from "#resources/lib"
import { BlogPostId } from "./models.js"
import { BlogPostView } from "./views.js"

export class FindPost extends S.Req<FindPost>()("Blog.FindPost", {
id: BlogPostId
}, {
allowAnonymous: true,
allowRoles: ["user"],
success: S.NullOr(BlogPostView)
}) {}
12 changes: 1 addition & 11 deletions api/src/Blog/FindPost.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,8 @@
import { handlerFor } from "#api/lib/handler"
import { S } from "#resources/lib"
import { Effect } from "effect"
import { Option } from "effect-app"
import { BlogPostId } from "./models.js"
import { FindPost } from "./FindPost.request.js"
import { BlogPostRepo } from "./Repo.js"
import { BlogPostView } from "./views.js"

export class FindPost extends S.Req<FindPost>()("Blog.FindPost", {
id: BlogPostId
}, {
allowAnonymous: true,
allowRoles: ["user"],
success: S.NullOr(BlogPostView)
}) {}

export default handlerFor(FindPost)({
dependencies: [
Expand Down
10 changes: 10 additions & 0 deletions api/src/Blog/ListPosts.request.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { S } from "#resources/lib"
import { BlogPostView } from "./views.js"

export class ListPosts extends S.Req<ListPosts>()("Blog.List", {}, {
allowAnonymous: true,
allowRoles: ["user"],
success: S.Struct({
items: S.Array(BlogPostView)
})
}) {}
11 changes: 1 addition & 10 deletions api/src/Blog/ListPosts.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,7 @@
import { handlerFor } from "#api/lib/handler"
import { S } from "#resources/lib"
import { Effect } from "effect-app"
import { ListPosts } from "./ListPosts.request.js"
import { BlogPostRepo } from "./Repo.js"
import { BlogPostView } from "./views.js"

export class ListPosts extends S.Req<ListPosts>()("Blog.List", {}, {
allowAnonymous: true,
allowRoles: ["user"],
success: S.Struct({
items: S.Array(BlogPostView)
})
}) {}

export default handlerFor(ListPosts)({
dependencies: [
Expand Down
8 changes: 8 additions & 0 deletions api/src/Blog/PublishPost.request.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { S } from "#resources/lib"
import { NotFoundError } from "effect-app/client"
import { OperationId } from "effect-app/Operations"
import { BlogPostId } from "./models.js"

export class PublishPost extends S.Req<PublishPost>()("Blog.PublishPost", {
id: BlogPostId
}, { allowRoles: ["user"], success: OperationId, failure: S.Union(NotFoundError) }) {}
9 changes: 1 addition & 8 deletions api/src/Blog/PublishPost.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,11 @@ import { handlerFor } from "#api/lib/handler"
import { OperationsDefault } from "#api/lib/layers"
import { Events, Operations } from "#api/services"
import { BogusEvent } from "#resources/Events"
import { S } from "#resources/lib"
import { Duration, Effect, Schedule } from "effect-app"
import { NotFoundError } from "effect-app/client"
import { OperationId } from "effect-app/Operations"
import { NonEmptyString2k, NonNegativeInt } from "effect-app/Schema"
import { BlogPostId } from "./models.js"
import { PublishPost } from "./PublishPost.request.js"
import { BlogPostRepo } from "./Repo.js"

export class PublishPost extends S.Req<PublishPost>()("Blog.PublishPost", {
id: BlogPostId
}, { allowRoles: ["user"], success: OperationId, failure: S.Union(NotFoundError) }) {}

export default handlerFor(PublishPost)({
dependencies: [
BlogPostRepo.Default,
Expand Down
15 changes: 15 additions & 0 deletions api/src/HelloWorld/GetHelloWorld.request.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { UserView } from "#Accounts/views"
import { S } from "#resources/lib"
import { RequestContext } from "@effect-app/infra/RequestContext"

class Response extends S.Class<Response>()({
now: S.Date.withDefault,
echo: S.String,
context: RequestContext,
currentUser: S.NullOr(UserView),
randomUser: UserView
}) {}

export class GetHelloWorld extends S.Req<GetHelloWorld>()("HelloWorld.GetHelloWorld", {
echo: S.String
}, { allowAnonymous: true, allowRoles: ["user"], success: Response }) {}
15 changes: 1 addition & 14 deletions api/src/HelloWorld/GetHelloWorld.ts
Original file line number Diff line number Diff line change
@@ -1,24 +1,11 @@
import { UserView } from "#Accounts/views"
import { handlerFor } from "#api/lib/handler"
import { S } from "#resources/lib"
import { getRequestContext } from "@effect-app/infra/api/setupRequest"
import { RequestContext } from "@effect-app/infra/RequestContext"
import { generate } from "@effect-app/infra/test"
import { Effect } from "effect-app"
import { User } from "../Accounts/models.js"
import { UserRepo } from "../Accounts/UserRepo.js"

class Response extends S.Class<Response>()({
now: S.Date.withDefault,
echo: S.String,
context: RequestContext,
currentUser: S.NullOr(UserView),
randomUser: UserView
}) {}

export class GetHelloWorld extends S.Req<GetHelloWorld>()("HelloWorld.GetHelloWorld", {
echo: S.String
}, { allowAnonymous: true, allowRoles: ["user"], success: Response }) {}
import { GetHelloWorld } from "./GetHelloWorld.request.js"

export default handlerFor(GetHelloWorld)({
dependencies: [UserRepo.Default],
Expand Down
6 changes: 6 additions & 0 deletions api/src/Operations/FindOperation.request.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { S } from "#resources/lib"
import { Operation, OperationId } from "effect-app/Operations"

export class FindOperation extends S.Req<FindOperation>()("Operations.FindOperation", {
id: OperationId
}, { allowAnonymous: true, allowRoles: ["user"], success: S.NullOr(Operation) }) {}
7 changes: 1 addition & 6 deletions api/src/Operations/FindOperation.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,8 @@
import { handlerFor } from "#api/lib/handler"
import { OperationsDefault } from "#api/lib/layers"
import { Operations } from "#api/services"
import { S } from "#resources/lib"
import { Effect } from "effect-app"
import { Operation, OperationId } from "effect-app/Operations"

export class FindOperation extends S.Req<FindOperation>()("Operations.FindOperation", {
id: OperationId
}, { allowAnonymous: true, allowRoles: ["user"], success: S.NullOr(Operation) }) {}
import { FindOperation } from "./FindOperation.request.js"

export default handlerFor(FindOperation)({
dependencies: [OperationsDefault],
Expand Down
2 changes: 1 addition & 1 deletion api/src/resources/Accounts.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
//// codegen:start {preset: barrel, include: ../Blog/*.ts, export: { as: 'PascalCase' }}
export { GetMe } from "../Accounts/GetMe.js"
export { GetMe } from "../Accounts/GetMe.request.js"
//// codegen:end

// codegen:start {preset: meta, sourcePrefix: src/resources/}
Expand Down
8 changes: 4 additions & 4 deletions api/src/resources/Blog.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
//// codegen:start {preset: barrel, include: ../Blog/*.ts, export: { as: 'PascalCase' }}
export { CreatePost } from "../Blog/CreatePost.js"
export { FindPost } from "../Blog/FindPost.js"
export { ListPosts } from "../Blog/ListPosts.js"
export { PublishPost } from "../Blog/PublishPost.js"
export { CreatePost } from "../Blog/CreatePost.request.js"
export { FindPost } from "../Blog/FindPost.request.js"
export { ListPosts } from "../Blog/ListPosts.request.js"
export { PublishPost } from "../Blog/PublishPost.request.js"
//// codegen:end

// codegen:start {preset: meta, sourcePrefix: src/resources/}
Expand Down
2 changes: 1 addition & 1 deletion api/src/resources/HelloWorld.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
export { GetHelloWorld } from "../HelloWorld/GetHelloWorld.js"
export { GetHelloWorld } from "../HelloWorld/GetHelloWorld.request.js"

// codegen:start {preset: meta, sourcePrefix: src/resources/}
export const meta = { moduleName: "HelloWorld" } as const
Expand Down
4 changes: 2 additions & 2 deletions api/src/resources/Operations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@ import { Duration, Effect } from "effect-app"
import { NotFoundError } from "effect-app/client"
import type { Operation, OperationId } from "effect-app/Operations"
import { OperationFailure } from "effect-app/Operations"
import { FindOperation } from "../Operations/FindOperation.js"
import { FindOperation } from "../Operations/FindOperation.request.js"
import { clientFor } from "./lib.js"
import * as S from "./lib/schema.js"

export { FindOperation } from "../Operations/FindOperation.js"
export { FindOperation } from "../Operations/FindOperation.request.js"

// codegen:start {preset: meta, sourcePrefix: src/resources/}
export const meta = { moduleName: "Operations" } as const
Expand Down
2 changes: 1 addition & 1 deletion api/src/resources/Users.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
export { IndexUsers } from "../Accounts/IndexUsers.js"
export { IndexUsers } from "../Accounts/IndexUsers.request.js"

// codegen:start {preset: meta, sourcePrefix: src/resources/}
export const meta = { moduleName: "Users" } as const
Expand Down