diff --git a/api/src/Accounts/GetMe.request.ts b/api/src/Accounts/GetMe.request.ts new file mode 100644 index 000000000..20064a094 --- /dev/null +++ b/api/src/Accounts/GetMe.request.ts @@ -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()("Accounts.GetMe", {}, { success: User, failure: NotFoundError }) {} diff --git a/api/src/Accounts/GetMe.ts b/api/src/Accounts/GetMe.ts index 5550c1e05..48af9c8cc 100644 --- a/api/src/Accounts/GetMe.ts +++ b/api/src/Accounts/GetMe.ts @@ -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()("Accounts.GetMe", {}, { success: User, failure: NotFoundError }) {} - export default handlerFor(GetMe)({ dependencies: [UserRepo.Default], effect: Effect.gen(function*() { diff --git a/api/src/Accounts/IndexUsers.request.ts b/api/src/Accounts/IndexUsers.request.ts new file mode 100644 index 000000000..775745742 --- /dev/null +++ b/api/src/Accounts/IndexUsers.request.ts @@ -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()("Accounts.IndexUsers", { + filterByIds: S.NonEmptyArray(UserId) +}, { + allowAnonymous: true, + allowRoles: ["user"], + success: S.Struct({ + users: S.Array(UserView) + }) +}) {} diff --git a/api/src/Accounts/IndexUsers.ts b/api/src/Accounts/IndexUsers.ts index fa2701302..025c80939 100644 --- a/api/src/Accounts/IndexUsers.ts +++ b/api/src/Accounts/IndexUsers.ts @@ -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()("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], diff --git a/api/src/Accounts/resolvers.ts b/api/src/Accounts/resolvers.ts index 8c5c2ccf1..d1d17771f 100644 --- a/api/src/Accounts/resolvers.ts +++ b/api/src/Accounts/resolvers.ts @@ -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> { readonly _tag: "GetUserViewById" diff --git a/api/src/Blog/CreatePost.request.ts b/api/src/Blog/CreatePost.request.ts new file mode 100644 index 000000000..bbff111e9 --- /dev/null +++ b/api/src/Blog/CreatePost.request.ts @@ -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()("Blog.Create", BlogPost.pick("title", "body"), { + allowRoles: ["user"], + success: S.Struct({ id: BlogPostId }), + failure: S.Union(NotFoundError, InvalidStateError, OptimisticConcurrencyException) +}) {} diff --git a/api/src/Blog/CreatePost.ts b/api/src/Blog/CreatePost.ts index 87b6759c0..2f4a57b7b 100644 --- a/api/src/Blog/CreatePost.ts +++ b/api/src/Blog/CreatePost.ts @@ -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()("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, diff --git a/api/src/Blog/FindPost.request.ts b/api/src/Blog/FindPost.request.ts new file mode 100644 index 000000000..d47a58950 --- /dev/null +++ b/api/src/Blog/FindPost.request.ts @@ -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()("Blog.FindPost", { + id: BlogPostId +}, { + allowAnonymous: true, + allowRoles: ["user"], + success: S.NullOr(BlogPostView) +}) {} diff --git a/api/src/Blog/FindPost.ts b/api/src/Blog/FindPost.ts index afe03e09a..2ff6b4393 100644 --- a/api/src/Blog/FindPost.ts +++ b/api/src/Blog/FindPost.ts @@ -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()("Blog.FindPost", { - id: BlogPostId -}, { - allowAnonymous: true, - allowRoles: ["user"], - success: S.NullOr(BlogPostView) -}) {} export default handlerFor(FindPost)({ dependencies: [ diff --git a/api/src/Blog/ListPosts.request.ts b/api/src/Blog/ListPosts.request.ts new file mode 100644 index 000000000..a587f28cc --- /dev/null +++ b/api/src/Blog/ListPosts.request.ts @@ -0,0 +1,10 @@ +import { S } from "#resources/lib" +import { BlogPostView } from "./views.js" + +export class ListPosts extends S.Req()("Blog.List", {}, { + allowAnonymous: true, + allowRoles: ["user"], + success: S.Struct({ + items: S.Array(BlogPostView) + }) +}) {} diff --git a/api/src/Blog/ListPosts.ts b/api/src/Blog/ListPosts.ts index 354a1c99a..ee66f1a2f 100644 --- a/api/src/Blog/ListPosts.ts +++ b/api/src/Blog/ListPosts.ts @@ -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()("Blog.List", {}, { - allowAnonymous: true, - allowRoles: ["user"], - success: S.Struct({ - items: S.Array(BlogPostView) - }) -}) {} export default handlerFor(ListPosts)({ dependencies: [ diff --git a/api/src/Blog/PublishPost.request.ts b/api/src/Blog/PublishPost.request.ts new file mode 100644 index 000000000..6223b2c29 --- /dev/null +++ b/api/src/Blog/PublishPost.request.ts @@ -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()("Blog.PublishPost", { + id: BlogPostId +}, { allowRoles: ["user"], success: OperationId, failure: S.Union(NotFoundError) }) {} diff --git a/api/src/Blog/PublishPost.ts b/api/src/Blog/PublishPost.ts index 0438e31c0..c08664ed9 100644 --- a/api/src/Blog/PublishPost.ts +++ b/api/src/Blog/PublishPost.ts @@ -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()("Blog.PublishPost", { - id: BlogPostId -}, { allowRoles: ["user"], success: OperationId, failure: S.Union(NotFoundError) }) {} - export default handlerFor(PublishPost)({ dependencies: [ BlogPostRepo.Default, diff --git a/api/src/HelloWorld/GetHelloWorld.request.ts b/api/src/HelloWorld/GetHelloWorld.request.ts new file mode 100644 index 000000000..799a29d5c --- /dev/null +++ b/api/src/HelloWorld/GetHelloWorld.request.ts @@ -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()({ + now: S.Date.withDefault, + echo: S.String, + context: RequestContext, + currentUser: S.NullOr(UserView), + randomUser: UserView +}) {} + +export class GetHelloWorld extends S.Req()("HelloWorld.GetHelloWorld", { + echo: S.String +}, { allowAnonymous: true, allowRoles: ["user"], success: Response }) {} diff --git a/api/src/HelloWorld/GetHelloWorld.ts b/api/src/HelloWorld/GetHelloWorld.ts index 71cc5e330..adba353b3 100644 --- a/api/src/HelloWorld/GetHelloWorld.ts +++ b/api/src/HelloWorld/GetHelloWorld.ts @@ -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()({ - now: S.Date.withDefault, - echo: S.String, - context: RequestContext, - currentUser: S.NullOr(UserView), - randomUser: UserView -}) {} - -export class GetHelloWorld extends S.Req()("HelloWorld.GetHelloWorld", { - echo: S.String -}, { allowAnonymous: true, allowRoles: ["user"], success: Response }) {} +import { GetHelloWorld } from "./GetHelloWorld.request.js" export default handlerFor(GetHelloWorld)({ dependencies: [UserRepo.Default], diff --git a/api/src/Operations/FindOperation.request.ts b/api/src/Operations/FindOperation.request.ts new file mode 100644 index 000000000..ee5e6868c --- /dev/null +++ b/api/src/Operations/FindOperation.request.ts @@ -0,0 +1,6 @@ +import { S } from "#resources/lib" +import { Operation, OperationId } from "effect-app/Operations" + +export class FindOperation extends S.Req()("Operations.FindOperation", { + id: OperationId +}, { allowAnonymous: true, allowRoles: ["user"], success: S.NullOr(Operation) }) {} diff --git a/api/src/Operations/FindOperation.ts b/api/src/Operations/FindOperation.ts index 709d94d24..b431f5444 100644 --- a/api/src/Operations/FindOperation.ts +++ b/api/src/Operations/FindOperation.ts @@ -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()("Operations.FindOperation", { - id: OperationId -}, { allowAnonymous: true, allowRoles: ["user"], success: S.NullOr(Operation) }) {} +import { FindOperation } from "./FindOperation.request.js" export default handlerFor(FindOperation)({ dependencies: [OperationsDefault], diff --git a/api/src/resources/Accounts.ts b/api/src/resources/Accounts.ts index c52d143cf..c97356e38 100644 --- a/api/src/resources/Accounts.ts +++ b/api/src/resources/Accounts.ts @@ -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/} diff --git a/api/src/resources/Blog.ts b/api/src/resources/Blog.ts index d84fb27d3..f88c3e4e2 100644 --- a/api/src/resources/Blog.ts +++ b/api/src/resources/Blog.ts @@ -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/} diff --git a/api/src/resources/HelloWorld.ts b/api/src/resources/HelloWorld.ts index ab6ae8abe..e8ca19092 100644 --- a/api/src/resources/HelloWorld.ts +++ b/api/src/resources/HelloWorld.ts @@ -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 diff --git a/api/src/resources/Operations.ts b/api/src/resources/Operations.ts index 3cef8b0a6..535b79ea3 100644 --- a/api/src/resources/Operations.ts +++ b/api/src/resources/Operations.ts @@ -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 diff --git a/api/src/resources/Users.ts b/api/src/resources/Users.ts index 3cfb99aad..37b3e3a9c 100644 --- a/api/src/resources/Users.ts +++ b/api/src/resources/Users.ts @@ -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