diff --git a/src/graphql/post/resolvers/Query/getPosts.ts b/src/graphql/post/resolvers/Query/getPosts.ts index 9718426..2f33568 100644 --- a/src/graphql/post/resolvers/Query/getPosts.ts +++ b/src/graphql/post/resolvers/Query/getPosts.ts @@ -1,4 +1,14 @@ import type { QueryResolvers } from '@/graphql/types'; -export const getPosts: NonNullable = async (_parent, _arg, _ctx) => { - /* Implement Query.getPosts resolver logic here */ + +export const getPosts: NonNullable = (_parent, { input, page }, { services }) => { + const filter = input.userId != null ? { userId: input.userId } : {}; + + const pagination: Pagination | undefined = page + ? { + limit: page.limit ?? undefined, + offset: page.offset ?? undefined, + } + : undefined; + + return services.Post.getPosts(filter, pagination); }; diff --git a/src/modules/post/datasources/query.ts b/src/modules/post/datasources/query.ts index 97b06df..62beff8 100644 --- a/src/modules/post/datasources/query.ts +++ b/src/modules/post/datasources/query.ts @@ -1,3 +1,4 @@ +import type { Repo } from '@/infra/database'; import type { Post } from '@/modules/post/types'; import type { Store } from '@/modules/types'; @@ -15,4 +16,20 @@ export const PostQueries = (store: Store) => ({ where, }); }, + + async getPosts(where: Repo.PostWhereInput | undefined, page?: Pagination): Promise { + return store.pa.post.findMany({ + include: { base: true }, + where, + orderBy: [ + { + base: { + createdAt: 'desc', + }, + }, + ], + skip: page?.offset ?? undefined, + take: page?.limit ?? undefined, + }); + }, }); diff --git a/src/modules/post/service.ts b/src/modules/post/service.ts index 0062166..3a8fc60 100644 --- a/src/modules/post/service.ts +++ b/src/modules/post/service.ts @@ -1,4 +1,5 @@ -import type { CreatePostDTO, Post } from '@/modules/post/types'; +import type { Repo } from '@/infra/database'; +import type { CreatePostDTO, Post, PostFilter } from '@/modules/post/types'; import type { Context } from '@/modules/types'; export const PostService = (ctx: Context) => ({ @@ -29,6 +30,13 @@ export const PostService = (ctx: Context) => ({ return ctx.ds.Post.getPost(input); }, + async getPosts(input: PostFilter, page?: Pagination): Promise { + const where: Repo.PostWhereInput | undefined = + input.userId !== undefined ? { base: { userId: input.userId } } : undefined; + + return ctx.ds.Post.getPosts(where, page); + }, + // getPosts(query: string, limit?: number): Promise { // return this.ds.Posts.getPosts(query, limit); // } diff --git a/src/modules/post/types.ts b/src/modules/post/types.ts index 3a0a7f8..83c1fd0 100644 --- a/src/modules/post/types.ts +++ b/src/modules/post/types.ts @@ -1,5 +1,6 @@ import { Visibility, type Repo } from '@/infra/database'; export type Post = Repo.PostGetPayload<{ include: { base: true } }>; +export type PostFilter = Partial; export type RepoUpdatePost = Tools.AtLeastOne<{ title?: string;