From 449e4432f658716892cd167244706e41c0fe58ab Mon Sep 17 00:00:00 2001 From: niel98 Date: Sun, 1 Oct 2023 21:10:06 +0100 Subject: [PATCH] fix: fixed get all users and populate option --- .../abstracts/generic-repository.abstract.ts | 37 +++++--- .../mongo/mongo-generic-repository.ts | 89 ++++++++++++++----- src/modules/post/post.controller.ts | 2 +- src/modules/post/post.service.ts | 45 +++++++--- 4 files changed, 127 insertions(+), 46 deletions(-) diff --git a/src/core/abstracts/generic-repository.abstract.ts b/src/core/abstracts/generic-repository.abstract.ts index 8fd2dd4..bbbbe34 100644 --- a/src/core/abstracts/generic-repository.abstract.ts +++ b/src/core/abstracts/generic-repository.abstract.ts @@ -1,18 +1,35 @@ -import { ClientSession, FilterQuery, UpdateQuery } from 'mongoose' +import { ClientSession, FilterQuery, UpdateQuery } from 'mongoose'; export abstract class IGenericRepository { - - abstract find(fields: FilterQuery, options?: { select?: string, isLean?: boolean }) + abstract find( + fields: FilterQuery, + options?: { + select?: string; + isLean?: boolean; + populate?: string | string[]; + }, + ); - abstract findAllWithPagination(query: any, options?: { fields?: FilterQuery, populate?: string | string[] }) + abstract findAllWithPagination( + query: any, + options?: { fields?: FilterQuery; populate?: string | string[] }, + ); - abstract findOne(key: FilterQuery, session?: ClientSession, options?: { select?: string | string[], populate?: string | string[] }) + abstract findOne( + key: FilterQuery, + session?: ClientSession, + options?: { select?: string | string[]; populate?: string | string[] }, + ); - abstract create(payload: T | T[], session?: ClientSession) + abstract create(payload: T | T[], session?: ClientSession); - abstract update(key: FilterQuery, payload: UpdateQuery, session?: ClientSession) + abstract update( + key: FilterQuery, + payload: UpdateQuery, + session?: ClientSession, + ); - abstract delete(key: FilterQuery, session?: ClientSession) + abstract delete(key: FilterQuery, session?: ClientSession); - abstract search(options: Record, populate: string | string[]) -} \ No newline at end of file + abstract search(options: Record, populate: string | string[]); +} diff --git a/src/frameworks/data-services/mongo/mongo-generic-repository.ts b/src/frameworks/data-services/mongo/mongo-generic-repository.ts index ccce262..4892eac 100644 --- a/src/frameworks/data-services/mongo/mongo-generic-repository.ts +++ b/src/frameworks/data-services/mongo/mongo-generic-repository.ts @@ -14,36 +14,63 @@ export class MongoGenericRepository implements IGenericRepository { async create(payload: T | T[], session?: ClientSession) { try { if (Array.isArray(payload)) { - const data = session ? this._repository.insertMany(payload, { session }) : this._repository.insertMany(payload); + const data = session + ? this._repository.insertMany(payload, { session }) + : this._repository.insertMany(payload); return Promise.resolve(data as any); } const instance = new this._repository(payload); - const data = session ? await instance.save({ session }) : await instance.save(); + const data = session + ? await instance.save({ session }) + : await instance.save(); return Promise.resolve(data as any); } catch (e) { return Promise.reject(e); } } - async update(key: FilterQuery, payload: UpdateQuery, session?: ClientSession) { + async update( + key: FilterQuery, + payload: UpdateQuery, + session?: ClientSession, + ) { try { - const result = await this._repository.findOneAndUpdate({ ...key }, { ...payload }, { new: true }).session(session || null); + const result = await this._repository + .findOneAndUpdate({ ...key }, { ...payload }, { new: true }) + .session(session || null); return Promise.resolve(result); } catch (e) { return Promise.reject(e); } } - async find(fields: FilterQuery, options?: { select?: string, isLean?: boolean }) { + async find( + fields: FilterQuery, + options?: { + select?: string; + isLean?: boolean; + populate?: string | string[]; + }, + ) { try { - const data = options?.isLean ? await this._repository.find(fields).populate(this._populateOnFind).select(options?.select).lean() : await this._repository.find(fields).select(options?.select) + const data = options?.isLean + ? await this._repository + .find(fields) + .populate(options?.populate) + .select(options?.select) + .lean() + : await this._repository.find(fields).select(options?.select); return Promise.resolve(data); } catch (e) { return Promise.reject(e); } } - async findOne(key: FilterQuery, session?: ClientSession, options?: { select?: string | string[], populate?: string | string[] }) { + async findOne( + key: FilterQuery, + session?: ClientSession, + options?: { select?: string | string[]; populate?: string | string[] }, + ) { try { const result = await this._repository .findOne(key) @@ -55,7 +82,10 @@ export class MongoGenericRepository implements IGenericRepository { return Promise.reject(e); } } - async findAllWithPagination(query: any, options?: { fields?: FilterQuery, populate?: string | string[] }) { + async findAllWithPagination( + query: any, + options?: { fields?: FilterQuery; populate?: string | string[] }, + ) { try { const perpage = Number(query.perpage) || 10; const page = Number(query.page) || 1; @@ -72,8 +102,16 @@ export class MongoGenericRepository implements IGenericRepository { myDateFrom = convertDate(dateFrom); myDateTo = convertDate(dateTo); - const queryObj: any = { ...query, ...options?.fields } - const excludedFields = ['page', 'perpage', 'dateFrom', 'dateTo', 'search', 'sortBy', 'orderBy']; + const queryObj: any = { ...query, ...options?.fields }; + const excludedFields = [ + 'page', + 'perpage', + 'dateFrom', + 'dateTo', + 'search', + 'sortBy', + 'orderBy', + ]; excludedFields.forEach((el) => delete queryObj[el]); for (const key of Object.keys(queryObj)) { @@ -81,14 +119,14 @@ export class MongoGenericRepository implements IGenericRepository { andArr.push({ [key]: { $gte: myDateFrom, $lt: myDateTo } }); } else { andArr.push({ - [key]: String(queryObj[key]) + [key]: String(queryObj[key]), }); // andArr.push({ [key]: queryObj[key] }) } } // https://stackoverflow.com/questions/35832113/and-expression-must-be-a-nonempty-array const searchQuery = { - $and: andArr + $and: andArr, }; const filterQuery = isEmpty(andArr) ? {} : searchQuery; @@ -110,8 +148,8 @@ export class MongoGenericRepository implements IGenericRepository { currentPage: Number(page), total: total, pageSize: perpage, - lastPage: Math.ceil(total / perpage) - } + lastPage: Math.ceil(total / perpage), + }, }); } catch (e) { return Promise.reject(e); @@ -119,17 +157,22 @@ export class MongoGenericRepository implements IGenericRepository { } async delete(key: FilterQuery, session?: ClientSession) { try { - const result = await this._repository.findOneAndDelete({ ...key }).session(session || null); + const result = await this._repository + .findOneAndDelete({ ...key }) + .session(session || null); return Promise.resolve(result); } catch (e) { return Promise.reject(e); } } - async search(options: { query: Record, populate?: string | string[] }) { + async search(options: { + query: Record; + populate?: string | string[]; + }) { try { - const { q } = options?.query - console.log("search value", q) + const { q } = options?.query; + console.log('search value', q); const perpage = Number(options?.query.perpage) || 10; const page = Number(options?.query.page) || 1; @@ -137,8 +180,8 @@ export class MongoGenericRepository implements IGenericRepository { $text: { $search: q, $language: 'en', - $caseSensitive: false - } + $caseSensitive: false, + }, } as FilterQuery; const total = await this._repository.countDocuments(searchRecord); const data = await this._repository @@ -157,11 +200,11 @@ export class MongoGenericRepository implements IGenericRepository { currentPage: Number(page), total: total, pageSize: perpage, - lastPage: Math.ceil(total / perpage) - } + lastPage: Math.ceil(total / perpage), + }, }); } catch (e) { return Promise.reject(e); } } -} \ No newline at end of file +} diff --git a/src/modules/post/post.controller.ts b/src/modules/post/post.controller.ts index d1adae2..4e6bcc6 100644 --- a/src/modules/post/post.controller.ts +++ b/src/modules/post/post.controller.ts @@ -79,7 +79,7 @@ export class PostController { @Param('userId') userId: string, ) { // const userId = req.user._id; - query = { creator: userId, isDeleted: false }; + query = { creator: userId, isDeleted: false, isAdminDeleted: false }; const payload: IGetUserPosts = { ...query }; const response = await this.service.getUserPosts(payload); diff --git a/src/modules/post/post.service.ts b/src/modules/post/post.service.ts index 78e8619..e8f5f38 100644 --- a/src/modules/post/post.service.ts +++ b/src/modules/post/post.service.ts @@ -47,11 +47,11 @@ export class PostService { if (data.description) key['description'] = data.description; if (data.group) key['group'] = data.group; if (data.isAdminDeleted === false || data.isAdminDeleted) - if (data.allowDuet === false || data.allowDuet) - key['allowDuet'] = data.allowDuet; + key['isAdminDeleted'] = data.isAdminDeleted; + if (data.allowDuet === false || data.allowDuet) + key['allowDuet'] = data.allowDuet; if (data.allowStitch === false || data.allowStitch) key['allowStitch'] = data.allowStitch; - key['isAdminDeleted'] = data.isAdminDeleted; if (data.isDeleted === false || data.isDeleted) key['isDeleted'] = data.isDeleted; if (data.page) key['page'] = data.page; @@ -139,14 +139,21 @@ export class PostService { const { data, pagination } = await this.data.post.findAllWithPagination( filterQuery, + { populate: 'creator' }, ); let returnedData = []; for (let i = 0; i < data.length; i++) { const postId = data[i]._id.toString(); - const likes = await this.data.likes.find({ post: postId }); - const comments = await this.data.comments.find({ post: postId }); + const likes = await this.data.likes.find( + { post: postId }, + { isLean: true, populate: 'user' }, + ); + const comments = await this.data.comments.find( + { post: postId }, + { isLean: true, populate: 'user' }, + ); const newData = { ...data[i]._doc, @@ -177,14 +184,21 @@ export class PostService { const { data, pagination } = await this.data.post.findAllWithPagination( filterQuery, + { populate: 'creator' }, ); let returnedData = []; for (let i = 0; i < data.length; i++) { const postId = data[i]._id.toString(); - const likes = await this.data.likes.find({ post: postId }); - const comments = await this.data.comments.find({ post: postId }); + const likes = await this.data.likes.find( + { post: postId }, + { isLean: true, populate: 'user' }, + ); + const comments = await this.data.comments.find( + { post: postId }, + { isLean: true, populate: 'user' }, + ); const newData = { ...data[i]._doc, @@ -242,10 +256,14 @@ export class PostService { try { const { postId } = payload; - const post = await this.data.post.findOne({ - _id: postId, - isDeleted: false, - }); + const post = await this.data.post.findOne( + { + _id: postId, + isDeleted: false, + }, + null, + { populate: 'creator' }, + ); if (!post) throw new DoesNotExistsException('Post not found'); return { @@ -368,7 +386,10 @@ export class PostService { const post = await this.data.post.findOne({ _id: postId }); if (!post) throw new DoesNotExistsException('Post not found'); - const likes = await this.data.likes.find({ post: postId }); + const likes = await this.data.likes.find( + { post: postId }, + { isLean: true, populate: 'user' }, + ); return { message: 'Likes retrieved successfully',