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 { diff --git a/src/domain/repositories/video.repository.ts b/src/domain/repositories/video.repository.ts index e3e9ef7..738818e 100644 --- a/src/domain/repositories/video.repository.ts +++ b/src/domain/repositories/video.repository.ts @@ -28,4 +28,6 @@ export interface VideoRepository { countUserQuestion(userId: number): Promise; 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 2570793..40dc9cb 100644 --- a/src/infrastructure/repositories/video.repository.ts +++ b/src/infrastructure/repositories/video.repository.ts @@ -513,4 +513,26 @@ 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; + } + + 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; + } } diff --git a/src/infrastructure/usecases-proxy/usecases-proxy.module.ts b/src/infrastructure/usecases-proxy/usecases-proxy.module.ts index d66fb96..7eb5ac8 100644 --- a/src/infrastructure/usecases-proxy/usecases-proxy.module.ts +++ b/src/infrastructure/usecases-proxy/usecases-proxy.module.ts @@ -64,6 +64,9 @@ 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'; +import { UserAnswerCountUsecase } from 'src/usecase/user/user-answer-count'; import { AdminDeleteCommentUsecase } from 'src/usecase/admin/admin-delete-comment'; import { AdminDeleteVideoUsecase } from 'src/usecase/admin/admin-delete-video'; @@ -463,6 +466,16 @@ export class UsecasesProxyDynamicModule { new DeleteInquiryUsecase(databaseInquiryRepository, exceptionsService), }, { + inject: [DatabaseVideoRepository], + provide: UserQuestionCountUsecase, + useFactory: (databaseVideoRepository: DatabaseVideoRepository) => new UserQuestionCountUsecase(databaseVideoRepository), + }, + { + inject: [DatabaseVideoRepository], + provide: UserAnswerCountUsecase, + useFactory: (databaseVideoRepository: DatabaseVideoRepository) => new UserAnswerCountUsecase(databaseVideoRepository), + }, + { inject: [ DatabaseVideoRepository, DatabaseReportRepository, @@ -550,6 +563,8 @@ export class UsecasesProxyDynamicModule { CreateInquiryUsecase, QueryInquiryListUsecase, DeleteInquiryUsecase, + UserQuestionCountUsecase, + UserAnswerCountUsecase, AdminDeleteCommentUsecase, AdminDeleteVideoUsecase, ], diff --git a/src/presentation/user/user.controller.ts b/src/presentation/user/user.controller.ts index d082a14..2ea4a8a 100644 --- a/src/presentation/user/user.controller.ts +++ b/src/presentation/user/user.controller.ts @@ -20,11 +20,13 @@ 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'; 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 +47,11 @@ export class UserController { private readonly userCashExchangeUsecase: UserCashExchangeUsecase, @Inject(UserDeleteUsecase) private readonly userDeleteUsecase: UserDeleteUsecase, + @Inject(UserQuestionCountUsecase) + private readonly userQuestionCountUsecase: UserQuestionCountUsecase, + @Inject(UserAnswerCountUsecase) + private readonly userAnswerCountUsecase: UserAnswerCountUsecase, + @Inject(REQUEST) private readonly request: IUserRequest, ) {} @@ -103,6 +110,16 @@ 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); + } + + @Get('/answer/count/:userId') + userAnswerCnt(@Param('userId', ParseIntPipe) userId: number): Promise { + return this.userAnswerCountUsecase.execute(userId); } } 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; + } +} 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; + } +}