@@ -14,6 +14,7 @@ import {
1414 Root ,
1515 UseMiddleware ,
1616} from 'type-graphql' ;
17+ import { getConnection } from 'typeorm' ;
1718import { CLOUDINARY_ROOT_PATH , __prod__ } from '../constants' ;
1819import { Comment } from '../entities/Comment' ;
1920import { Like } from '../entities/Like' ;
@@ -85,36 +86,55 @@ export class PostResolver {
8586 @Query ( ( ) => PaginatedPost )
8687 @UseMiddleware ( isAuth )
8788 async getPosts (
89+ @Ctx ( ) { res } : MyContext ,
90+ @Arg ( 'limit' , ( ) => Int ) limit : number ,
91+ @Arg ( 'offset' , ( ) => Int , { nullable : true } ) offset ?: number
92+ ) : Promise < PaginatedPost > {
93+ const params = [ res . locals . username , limit + 1 ] ;
94+ if ( offset ) params . push ( offset ) ;
95+ // Get posts from followed peoples only
96+ const posts : Post [ ] = await getConnection ( ) . query (
97+ `
98+ SELECT
99+ "p"."id",
100+ "p"."createdAt",
101+ "p"."updatedAt",
102+ "p"."caption",
103+ "p"."imgURL",
104+ "p"."username"
105+ FROM "posts" "p"
106+ LEFT JOIN "follows" "f"
107+ ON "f"."followingUsername" = "p"."username"
108+ WHERE "f"."username" = $1
109+ ORDER BY "p"."createdAt" DESC
110+ LIMIT $2 ${ offset ? 'OFFSET $3' : '' } ;
111+ ` ,
112+ params
113+ ) ;
114+ return {
115+ posts : posts . slice ( 0 , limit ) ,
116+ hasMore : posts . length === limit + 1 ,
117+ } ;
118+ }
119+
120+ @Query ( ( ) => PaginatedPost )
121+ @UseMiddleware ( isAuth )
122+ async getExplorePosts (
88123 @Arg ( 'limit' , ( ) => Int ) limit : number ,
89124 @Arg ( 'offset' , ( ) => Int , { nullable : true } ) offset ?: number
90125 ) : Promise < PaginatedPost > {
91- // TODO: Pagination
92126 const posts = await Post . find ( {
93127 order : { createdAt : 'DESC' } ,
94128 skip : offset ? offset : 0 ,
95129 take : limit + 1 ,
96130 } ) ;
131+
97132 return {
98133 posts : posts . slice ( 0 , limit ) ,
99134 hasMore : posts . length === limit + 1 ,
100135 } ;
101136 }
102137
103- // @Query (() => [Post])
104- // @UseMiddleware (isAuth)
105- // async getFeedPosts(@Ctx() { res }: MyContext) {
106- // const followings = await Follow.find({
107- // where: { username: res.locals.username },
108- // select: ['following'],
109- // relations: ['following.posts'],
110- // });
111- // const feedPosts: Post[] = [];
112- // followings.forEach((f) => {
113- // feedPosts.push(...f.following.posts);
114- // });
115- // return feedPosts;
116- // }
117-
118138 @Query ( ( ) => Post , { nullable : true } )
119139 @UseMiddleware ( isAuth )
120140 getSinglePost ( @Arg ( 'postId' ) postId : string ) {
@@ -196,3 +216,5 @@ export class PostResolver {
196216 * curl 'http://localhost:5000/graphql' -H 'Accept-Encoding: gzip, deflate, br' -H 'Content-Type: application/json' -H 'Accept: application/json' -H 'Connection: keep-alive' -H 'DNT: 1' -H 'Origin: http://localhost:5000' --data-binary '{"query":"mutation AddPost($file: Upload!){\n addPost(file)\n}"}' --compressed
197217 *
198218 */
219+
220+ // SELECT "p"."id", "p"."createdAt", "p"."updatedAt", "p"."caption", "p"."imgURL", "p"."username" FROM "posts" "p" LEFT JOIN "follows" "f" ON "f"."followingUsername" = "p"."username" WHERE "f"."username" = 'bob' ORDER BY "p"."createdAt" DESC LIMIT 6 OFFSET 10;
0 commit comments