From 5ed5e2d8fb813175d901a7436ce44526d4ad260d Mon Sep 17 00:00:00 2001 From: niamu01 Date: Wed, 10 Jan 2024 14:43:34 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20:recycle:=20targetLogin=20->=20targ?= =?UTF-8?q?etId=20=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - #406 refactor: :recycle: targetLogin -> targetId 로 변경 - #406 fix: :bug: 변수명 오류 수정 --- app/src/api/cursusUser/cursusUser.service.ts | 31 ------ .../follow/dto/follow.dto.getFollowList.ts | 2 +- app/src/follow/follow.resolver.ts | 11 +- app/src/follow/follow.service.ts | 104 ++++++++---------- app/src/schema.gql | 8 +- 5 files changed, 60 insertions(+), 96 deletions(-) diff --git a/app/src/api/cursusUser/cursusUser.service.ts b/app/src/api/cursusUser/cursusUser.service.ts index 872c9362..bc37ed65 100644 --- a/app/src/api/cursusUser/cursusUser.service.ts +++ b/app/src/api/cursusUser/cursusUser.service.ts @@ -130,37 +130,6 @@ export class CursusUserService { })); } - async findOneUserPreviewAndLean( - queryArgs?: Omit, 'select'>, - ): Promise { - const cursusUsers: { - user: { - id: number; - login: string; - image: { - link?: string; - }; - }; - } | null = await this.findOneAndLean({ - ...queryArgs, - select: { - 'user.id': 1, - 'user.login': 1, - 'user.image.link': 1, - }, - }); - - if (!cursusUsers) { - return null; - } - - return { - id: cursusUsers.user.id, - login: cursusUsers.user.login, - imgUrl: cursusUsers.user.image.link, - }; - } - async userFullProfile( filter?: FilterQuery, ): Promise { diff --git a/app/src/follow/dto/follow.dto.getFollowList.ts b/app/src/follow/dto/follow.dto.getFollowList.ts index b67dd509..b33fb331 100644 --- a/app/src/follow/dto/follow.dto.getFollowList.ts +++ b/app/src/follow/dto/follow.dto.getFollowList.ts @@ -11,7 +11,7 @@ registerEnumType(FollowSortOrder, { name: 'FollowSortOrder' }); @ArgsType() export class FollowListPaginatedArgs extends PaginationIndexArgs { @Field() - target: string; + targetId: number; @Field((_type) => FollowSortOrder, { defaultValue: FollowSortOrder.FOLLOW_AT_DESC, diff --git a/app/src/follow/follow.resolver.ts b/app/src/follow/follow.resolver.ts index aab86aec..eab08ae9 100644 --- a/app/src/follow/follow.resolver.ts +++ b/app/src/follow/follow.resolver.ts @@ -24,10 +24,13 @@ export class FollowResolver { @Mutation((_returns) => FollowSuccess) async followUser( @MyUserId() userId: number, - @Args('target') target: string, + @Args('targetId') targetId: number, ): Promise { try { - const followResult = await this.followService.followUser(userId, target); + const followResult = await this.followService.followUser( + userId, + targetId, + ); await pubSub.publish('followUpdated', { followUpdated: followResult }); @@ -41,12 +44,12 @@ export class FollowResolver { @Mutation((_returns) => FollowSuccess) async unfollowUser( @MyUserId() userId: number, - @Args('target') target: string, + @Args('targetId') targetId: number, ): Promise { try { const followResult = await this.followService.unfollowUser( userId, - target, + targetId, ); await pubSub.publish('followUpdated', { followUpdated: followResult }); diff --git a/app/src/follow/follow.service.ts b/app/src/follow/follow.service.ts index a273e7e4..c177f7bc 100644 --- a/app/src/follow/follow.service.ts +++ b/app/src/follow/follow.service.ts @@ -1,6 +1,7 @@ import { Injectable, NotFoundException } from '@nestjs/common'; import { InjectModel } from '@nestjs/mongoose'; import { FilterQuery, Model, SortOrder } from 'mongoose'; +import { CursusUserCacheService } from 'src/api/cursusUser/cursusUser.cache.service'; import { UserPreview } from 'src/common/models/common.user.model'; import { QueryArgs, @@ -9,7 +10,6 @@ import { findOneAndLean, } from 'src/database/mongoose/database.mongoose.query'; import { PaginationIndexService } from 'src/pagination/index/pagination.index.service'; -import { CursusUserService } from '../api/cursusUser/cursusUser.service'; import { follow } from './db/follow.database.schema'; import { FollowSortOrder, @@ -21,14 +21,12 @@ import type { FollowSuccess, } from './model/follow.model'; -type FollowListCursorField = [number, string]; - @Injectable() export class FollowService { constructor( @InjectModel(follow.name) private readonly followModel: Model, - private readonly cursusUserService: CursusUserService, + private readonly cursusUserCacheService: CursusUserCacheService, private readonly paginationIndexService: PaginationIndexService, ) {} @@ -42,61 +40,41 @@ export class FollowService { return await findAllAndLean(this.followModel, queryArgs); } - async userIdByLogin(login: string): Promise { - const id = await this.cursusUserService.getuserIdByLogin(login); - - if (!id) { - throw new NotFoundException(); - } - - return id; - } - - async followUser(userId: number, target: string): Promise { - const following = await this.cursusUserService.getuserIdByLogin(target); - + async followUser(userId: number, targetId: number): Promise { const alreadyFollow = await this.followModel.findOne( { - userId: userId, - followId: following, + userId, + followId: targetId, }, { _id: 1 }, ); - if (!following || userId === following || alreadyFollow) { + if (userId === targetId || alreadyFollow) { throw new NotFoundException(); } - const result = await this.followModel.create({ - userId: userId, - followId: following, - followAt: new Date(), - }); - return { - userId: result.userId, - followId: result.followId, + userId, + followId: targetId, }; } - async unfollowUser(userId: number, target: string): Promise { - const following = await this.cursusUserService.getuserIdByLogin(target); - - if (!following || userId === following) { + async unfollowUser(userId: number, targetId: number): Promise { + if (!targetId || userId === targetId) { throw new NotFoundException(); } const deletedCount = await this.followModel .deleteOne({ - userId: userId, - followId: following, + userId, + followId: targetId, }) .then((result) => result.deletedCount); if (deletedCount === 1) { return { - userId: userId, - followId: following, + userId, + followId: targetId, }; } @@ -105,12 +83,10 @@ export class FollowService { async followerList( userId: number, - target: string, + targetId: number, sortOrder: FollowSortOrder, filter?: FilterQuery, ): Promise { - const targetId = await this.userIdByLogin(target); - const aggregate = this.followModel.aggregate(); if (filter) { @@ -125,10 +101,19 @@ export class FollowService { const followerUserPreview = await Promise.all( follower.map(async (follower) => { - const userPreview = - await this.cursusUserService.findOneUserPreviewAndLean({ - filter: { 'user.id': follower.userId }, - }); + const userFullProfile = await this.cursusUserCacheService + .getUserFullProfile(follower.userId) + .then((user) => user?.cursusUser.user); + + if (!userFullProfile) { + throw new NotFoundException(); + } + + const userPreview = { + id: userFullProfile.id, + login: userFullProfile.login, + imgUrl: userFullProfile.image.link, + }; if (!userPreview) { throw new NotFoundException(); @@ -143,9 +128,9 @@ export class FollowService { async followerPaginated( userId: number, - { pageNumber, pageSize, target, sortOrder }: FollowListPaginatedArgs, + { pageNumber, pageSize, targetId, sortOrder }: FollowListPaginatedArgs, ): Promise { - const followList = await this.followerList(userId, target, sortOrder); + const followList = await this.followerList(userId, targetId, sortOrder); return this.paginationIndexService.toPaginated(followList, { pageNumber, @@ -155,12 +140,10 @@ export class FollowService { async followingList( userId: number, - target: string, + targetId: number, sortOrder: FollowSortOrder, filter?: FilterQuery, ): Promise { - const targetId = await this.userIdByLogin(target); - const aggregate = this.followModel.aggregate(); if (filter) { @@ -175,10 +158,19 @@ export class FollowService { const followingUserPreview = await Promise.all( following.map(async (following) => { - const userPreview = - await this.cursusUserService.findOneUserPreviewAndLean({ - filter: { 'user.id': following.followId }, - }); + const userFullProfile = await this.cursusUserCacheService + .getUserFullProfile(following.followId) + .then((user) => user?.cursusUser.user); + + if (!userFullProfile) { + throw new NotFoundException(); + } + + const userPreview = { + id: userFullProfile.id, + login: userFullProfile.login, + imgUrl: userFullProfile.image.link, + }; if (!userPreview) { throw new NotFoundException(); @@ -193,9 +185,9 @@ export class FollowService { async followingPaginated( userId: number, - { pageNumber, pageSize, target, sortOrder }: FollowListPaginatedArgs, + { pageNumber, pageSize, targetId, sortOrder }: FollowListPaginatedArgs, ): Promise { - const followList = await this.followingList(userId, target, sortOrder); + const followList = await this.followingList(userId, targetId, sortOrder); return this.paginationIndexService.toPaginated(followList, { pageSize, @@ -217,10 +209,10 @@ export class FollowService { return await this.followModel.countDocuments({ userId, filter }); } - async isFollowing(userId: number, targetId: number): Promise { + async isFollowing(userId: number, followId: number): Promise { return !!(await this.followModel.findOne({ userId, - targetId, + followId, })); } diff --git a/app/src/schema.gql b/app/src/schema.gql index ce930d6f..d8e44afa 100644 --- a/app/src/schema.gql +++ b/app/src/schema.gql @@ -639,8 +639,8 @@ type Query { getSetting: Setting! getExpTable: [ExpTable!]! getIsFollowing(targetId: Int!): Boolean! - getFollowerPaginated(pageSize: Int! = 10, pageNumber: Int! = 1, target: String!, sortOrder: FollowSortOrder! = FOLLOW_AT_DESC): FollowListPaginated! - getFollowingPaginated(pageSize: Int! = 10, pageNumber: Int! = 1, target: String!, sortOrder: FollowSortOrder! = FOLLOW_AT_DESC): FollowListPaginated! + getFollowerPaginated(pageSize: Int! = 10, pageNumber: Int! = 1, targetId: Int!, sortOrder: FollowSortOrder! = FOLLOW_AT_DESC): FollowListPaginated! + getFollowingPaginated(pageSize: Int! = 10, pageNumber: Int! = 1, targetId: Int!, sortOrder: FollowSortOrder! = FOLLOW_AT_DESC): FollowListPaginated! } enum EvalLogSortOrder { @@ -661,8 +661,8 @@ type Mutation { refreshToken(refreshToken: String!): LoginSuccess! logout: Int! deleteAccount: Int! - followUser(target: String!): FollowSuccess! - unfollowUser(target: String!): FollowSuccess! + followUser(targetId: Int!): FollowSuccess! + unfollowUser(targetId: Int!): FollowSuccess! } union LoginResult = LoginSuccess | LoginNotLinked