From a49117bcbc2a53dad484174d01cb3080b41e6867 Mon Sep 17 00:00:00 2001 From: Seung jun Date: Mon, 11 Jul 2022 11:32:57 +0900 Subject: [PATCH 1/9] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20(#178)=20Get=20/u?= =?UTF-8?q?ser/question/count/:userId?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/presentation/user/user.controller.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/presentation/user/user.controller.ts b/src/presentation/user/user.controller.ts index d082a14..01650b1 100644 --- a/src/presentation/user/user.controller.ts +++ b/src/presentation/user/user.controller.ts @@ -25,6 +25,7 @@ import { UserBlockUsecase } from 'src/usecase/user/user-block'; import { UserCashExchangeUsecase } from 'src/usecase/user/user-cash-exchange'; import { UserDeleteUsecase } from 'src/usecase/user/user-delete'; import { UserInfoUsecase } from 'src/usecase/user/user-info'; +import { UserQuestionCountUsecase } from 'src/usecase/user/user-question-count'; import { UserQuestionListUsecase } from 'src/usecase/user/user-question-video'; import { UserCashExchangeDto } from './user.dto'; @@ -45,6 +46,8 @@ export class UserController { private readonly userCashExchangeUsecase: UserCashExchangeUsecase, @Inject(UserDeleteUsecase) private readonly userDeleteUsecase: UserDeleteUsecase, + @Inject(UserQuestionCountUsecase) + private readonly userQuestionCountUsecase: UserQuestionCountUsecase, @Inject(REQUEST) private readonly request: IUserRequest, ) {} @@ -103,6 +106,11 @@ export class UserController { @Delete('/') @HttpCode(HttpStatus.NO_CONTENT) deleteUser() { - return this.userDeleteUsecase.execute(3); + return this.userDeleteUsecase.execute(this.request.user.sub); + } + + @Get('/question/count/:userId') + userQuestionCnt(@Param('userId', ParseIntPipe) userId: number): Promise { + return this.userQuestionCountUsecase.execute(userId); } } From 0f99a0bcbf2165ff08c62ea15ba5c5646baff1b4 Mon Sep 17 00:00:00 2001 From: Seung jun Date: Mon, 11 Jul 2022 11:33:20 +0900 Subject: [PATCH 2/9] =?UTF-8?q?:bookmark=5Ftabs:=20::=20(#178)=20UserQuest?= =?UTF-8?q?ionCountUsecase=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/usecase/user/user-question-count.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/usecase/user/user-question-count.ts diff --git a/src/usecase/user/user-question-count.ts b/src/usecase/user/user-question-count.ts new file mode 100644 index 0000000..a6a0aff --- /dev/null +++ b/src/usecase/user/user-question-count.ts @@ -0,0 +1,11 @@ +import { VideoRepository } from 'src/domain/repositories/video.repository'; + +export class UserQuestionCountUsecase { + constructor(private readonly videoRepository: VideoRepository) {} + + async execute(userId: number): Promise { + const userQuestionCnt = await this.videoRepository.userQuestionCount(userId); + + return userQuestionCnt; + } +} From bc73c4978c97c4094954ce44247a1b6f49187b5e Mon Sep 17 00:00:00 2001 From: Seung jun Date: Mon, 11 Jul 2022 11:33:28 +0900 Subject: [PATCH 3/9] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20(#178)=20UserQues?= =?UTF-8?q?tionCountUsecase=20=EB=93=B1=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../usecases-proxy/usecases-proxy.module.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/infrastructure/usecases-proxy/usecases-proxy.module.ts b/src/infrastructure/usecases-proxy/usecases-proxy.module.ts index 4a35c0d..b9e6e29 100644 --- a/src/infrastructure/usecases-proxy/usecases-proxy.module.ts +++ b/src/infrastructure/usecases-proxy/usecases-proxy.module.ts @@ -64,6 +64,8 @@ import { CreateInquiryUsecase } from 'src/usecase/inquiry/create-inquiry'; import { DeleteInquiryUsecase } from 'src/usecase/inquiry/delete-inquiry'; import { QueryInquiryListUsecase } from 'src/usecase/inquiry/query-inquiry-list'; import { DatabaseInquiryCategoryRepository } from '../repositories/inquiry-category.repository'; +import { GetCountUserQuestionPresenter } from 'src/presentation/question/get-count-user-question.presenter'; +import { UserQuestionCountUsecase } from 'src/usecase/user/user-question-count'; @Module({ imports: [LoggerModule, RepositoriesModule, ExceptionsModule, ElasticsearchModule, RedisCacheModule, ExpoModule], @@ -460,6 +462,11 @@ export class UsecasesProxyDynamicModule { useFactory: (databaseInquiryRepository: DatabaseInquiryRepository, exceptionsService: ExceptionsService) => new DeleteInquiryUsecase(databaseInquiryRepository, exceptionsService), }, + { + inject: [DatabaseVideoRepository], + provide: UserQuestionCountUsecase, + useFactory: (databaseVideoRepository: DatabaseVideoRepository) => new UserQuestionCountUsecase(databaseVideoRepository), + }, ], exports: [ CreateQuestionUsecase, @@ -500,6 +507,7 @@ export class UsecasesProxyDynamicModule { CreateInquiryUsecase, QueryInquiryListUsecase, DeleteInquiryUsecase, + UserQuestionCountUsecase, ], }; } From 15d75f687d6e3d451ee96f0dec6c4f6433a706f0 Mon Sep 17 00:00:00 2001 From: Seung jun Date: Mon, 11 Jul 2022 11:33:58 +0900 Subject: [PATCH 4/9] =?UTF-8?q?:coffin:=20::=20(#178)=20import=20UserTypeO?= =?UTF-8?q?rmEntity=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/domain/repositories/user.repository.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/domain/repositories/user.repository.ts b/src/domain/repositories/user.repository.ts index 02e6ee3..8104d06 100644 --- a/src/domain/repositories/user.repository.ts +++ b/src/domain/repositories/user.repository.ts @@ -1,4 +1,3 @@ -import { UserTypeOrmEntity } from 'src/infrastructure/entities/user.entity'; import { User } from '../model/user'; export interface UserRepository { From 1e2d3ee7d1420939051b2ace9d0ccc0dfbfff135 Mon Sep 17 00:00:00 2001 From: Seung jun Date: Mon, 11 Jul 2022 11:34:18 +0900 Subject: [PATCH 5/9] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20(#178)=20userQues?= =?UTF-8?q?tionCount=20=ED=95=A8=EC=88=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/domain/repositories/video.repository.ts | 1 + src/infrastructure/repositories/video.repository.ts | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/src/domain/repositories/video.repository.ts b/src/domain/repositories/video.repository.ts index e3e9ef7..869aa23 100644 --- a/src/domain/repositories/video.repository.ts +++ b/src/domain/repositories/video.repository.ts @@ -28,4 +28,5 @@ export interface VideoRepository { countUserQuestion(userId: number): Promise; countAnswerVideo(userId: number): Promise; videoViews(videoId: number): Promise; + userQuestionCount(userId: number): Promise; } diff --git a/src/infrastructure/repositories/video.repository.ts b/src/infrastructure/repositories/video.repository.ts index 2570793..eb1080c 100644 --- a/src/infrastructure/repositories/video.repository.ts +++ b/src/infrastructure/repositories/video.repository.ts @@ -513,4 +513,15 @@ export class DatabaseVideoRepository implements VideoRepository { .where('id = :id', { id: videoId }) .execute(); } + + async userQuestionCount(userId: number): Promise { + const userQuestionCnt: number = await this.videoEntityRepository + .createQueryBuilder('video') + .select('video.id', 'videoId') + .where('video.user_id = :user_id', { user_id: userId }) + .andWhere('video.question IS NULL') + .getCount(); + + return userQuestionCnt; + } } From 114bbfd0ce06f6b5524e2c121183b3d85caf4938 Mon Sep 17 00:00:00 2001 From: Seung jun Date: Mon, 11 Jul 2022 11:40:09 +0900 Subject: [PATCH 6/9] =?UTF-8?q?:bookmark=5Ftabs:=20::=20(#178)=20UserAnswe?= =?UTF-8?q?rCountUsecase=20=ED=8C=8C=EC=9D=BC=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/usecase/user/user-answer-count.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/usecase/user/user-answer-count.ts diff --git a/src/usecase/user/user-answer-count.ts b/src/usecase/user/user-answer-count.ts new file mode 100644 index 0000000..9166a22 --- /dev/null +++ b/src/usecase/user/user-answer-count.ts @@ -0,0 +1,11 @@ +import { VideoRepository } from 'src/domain/repositories/video.repository'; + +export class UserAnswerCountUsecase { + constructor(private readonly videoRepository: VideoRepository) {} + + async execute(userId: number): Promise { + const userAnswerCnt = await this.videoRepository.userAnswerCount(userId); + + return userAnswerCnt; + } +} From a99c2647b99503b0eaa18c89261c392a28af5880 Mon Sep 17 00:00:00 2001 From: Seung jun Date: Mon, 11 Jul 2022 11:40:22 +0900 Subject: [PATCH 7/9] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20(#178)=20UserAnsw?= =?UTF-8?q?erCountUsecase=20=EB=93=B1=EB=A1=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/infrastructure/usecases-proxy/usecases-proxy.module.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/infrastructure/usecases-proxy/usecases-proxy.module.ts b/src/infrastructure/usecases-proxy/usecases-proxy.module.ts index b9e6e29..1a88347 100644 --- a/src/infrastructure/usecases-proxy/usecases-proxy.module.ts +++ b/src/infrastructure/usecases-proxy/usecases-proxy.module.ts @@ -66,6 +66,7 @@ import { QueryInquiryListUsecase } from 'src/usecase/inquiry/query-inquiry-list' import { DatabaseInquiryCategoryRepository } from '../repositories/inquiry-category.repository'; import { GetCountUserQuestionPresenter } from 'src/presentation/question/get-count-user-question.presenter'; import { UserQuestionCountUsecase } from 'src/usecase/user/user-question-count'; +import { UserAnswerCountUsecase } from 'src/usecase/user/user-answer-count'; @Module({ imports: [LoggerModule, RepositoriesModule, ExceptionsModule, ElasticsearchModule, RedisCacheModule, ExpoModule], @@ -467,6 +468,11 @@ export class UsecasesProxyDynamicModule { provide: UserQuestionCountUsecase, useFactory: (databaseVideoRepository: DatabaseVideoRepository) => new UserQuestionCountUsecase(databaseVideoRepository), }, + { + inject: [DatabaseVideoRepository], + provide: UserAnswerCountUsecase, + useFactory: (databaseVideoRepository: DatabaseVideoRepository) => new UserAnswerCountUsecase(databaseVideoRepository), + }, ], exports: [ CreateQuestionUsecase, @@ -508,6 +514,7 @@ export class UsecasesProxyDynamicModule { QueryInquiryListUsecase, DeleteInquiryUsecase, UserQuestionCountUsecase, + UserAnswerCountUsecase, ], }; } From 10959dc0e27f291f3b65dde93efcddca8418a464 Mon Sep 17 00:00:00 2001 From: Seung jun Date: Mon, 11 Jul 2022 11:40:43 +0900 Subject: [PATCH 8/9] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20(#178)=20Get=20/u?= =?UTF-8?q?ser/anwer/count/user:id=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/presentation/user/user.controller.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/presentation/user/user.controller.ts b/src/presentation/user/user.controller.ts index 01650b1..2ea4a8a 100644 --- a/src/presentation/user/user.controller.ts +++ b/src/presentation/user/user.controller.ts @@ -20,6 +20,7 @@ import { IUserRequest } from 'src/domain/interfaces/request.interface'; import { User } from 'src/domain/model/user'; import { Video } from 'src/domain/model/video'; import { UpdateExpoTokenUsecase } from 'src/usecase/user/upsert-expo-token'; +import { UserAnswerCountUsecase } from 'src/usecase/user/user-answer-count'; import { UserAnswerListUsecase } from 'src/usecase/user/user-answer-video'; import { UserBlockUsecase } from 'src/usecase/user/user-block'; import { UserCashExchangeUsecase } from 'src/usecase/user/user-cash-exchange'; @@ -48,6 +49,9 @@ export class UserController { private readonly userDeleteUsecase: UserDeleteUsecase, @Inject(UserQuestionCountUsecase) private readonly userQuestionCountUsecase: UserQuestionCountUsecase, + @Inject(UserAnswerCountUsecase) + private readonly userAnswerCountUsecase: UserAnswerCountUsecase, + @Inject(REQUEST) private readonly request: IUserRequest, ) {} @@ -113,4 +117,9 @@ export class UserController { userQuestionCnt(@Param('userId', ParseIntPipe) userId: number): Promise { return this.userQuestionCountUsecase.execute(userId); } + + @Get('/answer/count/:userId') + userAnswerCnt(@Param('userId', ParseIntPipe) userId: number): Promise { + return this.userAnswerCountUsecase.execute(userId); + } } From da230aa0c2e302525438c0aedea37730ebd4324f Mon Sep 17 00:00:00 2001 From: Seung jun Date: Mon, 11 Jul 2022 11:41:01 +0900 Subject: [PATCH 9/9] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20::=20(#178)=20userAnsw?= =?UTF-8?q?erCount=20=ED=95=A8=EC=88=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/domain/repositories/video.repository.ts | 1 + src/infrastructure/repositories/video.repository.ts | 11 +++++++++++ 2 files changed, 12 insertions(+) diff --git a/src/domain/repositories/video.repository.ts b/src/domain/repositories/video.repository.ts index 869aa23..738818e 100644 --- a/src/domain/repositories/video.repository.ts +++ b/src/domain/repositories/video.repository.ts @@ -29,4 +29,5 @@ export interface VideoRepository { countAnswerVideo(userId: number): Promise; videoViews(videoId: number): Promise; userQuestionCount(userId: number): Promise; + userAnswerCount(userId: number): Promise; } diff --git a/src/infrastructure/repositories/video.repository.ts b/src/infrastructure/repositories/video.repository.ts index eb1080c..40dc9cb 100644 --- a/src/infrastructure/repositories/video.repository.ts +++ b/src/infrastructure/repositories/video.repository.ts @@ -524,4 +524,15 @@ export class DatabaseVideoRepository implements VideoRepository { return userQuestionCnt; } + + async userAnswerCount(userId: number): Promise { + const userAnswerCnt: number = await this.videoEntityRepository + .createQueryBuilder('video') + .select('video.id', 'videoId') + .where('video.user_id = :user_id', { user_id: userId }) + .andWhere('video.question IS NOT NULL') + .getCount(); + + return userAnswerCnt; + } }