diff --git a/apps/backend/apps/client/src/group/group.service.ts b/apps/backend/apps/client/src/group/group.service.ts index 5479e8c2f2..16f600a879 100644 --- a/apps/backend/apps/client/src/group/group.service.ts +++ b/apps/backend/apps/client/src/group/group.service.ts @@ -13,8 +13,15 @@ import { QnACategory } from '@prisma/client' import { Cache } from 'cache-manager' -import { invitationCodeKey, joinGroupCacheKey } from '@libs/cache' -import { JOIN_GROUP_REQUEST_EXPIRE_TIME } from '@libs/constants' +import { + invitationCodeKey, + joinGroupCacheKey, + studentRetryKey +} from '@libs/cache' +import { + JOIN_GROUP_REQUEST_EXPIRE_TIME, + STUDENT_RETRY_EXPIRE_TIME +} from '@libs/constants' import { ConflictFoundException, EntityNotExistException, @@ -504,6 +511,30 @@ export class GroupService { }) } + async getUserRetryCount(userId: number, courseId: number) { + const count = await this.cacheManager.get( + studentRetryKey(userId, courseId) + ) + return count || 0 + } + + async canUserRetry(userId: number, courseId: number) { + const count = await this.getUserRetryCount(userId, courseId) + + if (count >= 3) { + return false + } + return true + } + + async updateRetryCount(userId: number, courseId: number, count: number) { + await this.cacheManager.set( + studentRetryKey(userId, courseId), + count, + STUDENT_RETRY_EXPIRE_TIME + ) + } + /** * 사용자-그룹 관계(UserGroup)를 생성하여 실제 가입 처리를 수행합니다. * diff --git a/apps/backend/libs/cache/src/keys.ts b/apps/backend/libs/cache/src/keys.ts index 32285f329f..43263137d8 100644 --- a/apps/backend/libs/cache/src/keys.ts +++ b/apps/backend/libs/cache/src/keys.ts @@ -9,6 +9,9 @@ export const joinGroupCacheKey = (groupId: number) => `group:${groupId}` export const invitationCodeKey = (code: string) => `invite:${code}` export const invitationGroupKey = (groupId: number) => `invite:to:${groupId}` +export const studentRetryKey = (courseId: number, userId: number) => + `course-retry:${userId}:${courseId}` + /* TEST API용 Key */ export const testKey = (testSubmissionId: number, testcaseId: number) => `test:id:${testSubmissionId}:testcase:${testcaseId}` diff --git a/apps/backend/libs/constants/src/time.constants.ts b/apps/backend/libs/constants/src/time.constants.ts index 7788ba4672..072540f4a0 100644 --- a/apps/backend/libs/constants/src/time.constants.ts +++ b/apps/backend/libs/constants/src/time.constants.ts @@ -23,6 +23,7 @@ export const PUBLICIZING_REQUEST_EXPIRE_TIME = 7 * SECONDS_PER_DAY * 1000 export const JOIN_GROUP_REQUEST_EXPIRE_TIME = 7 * SECONDS_PER_DAY * 1000 export const INVIATION_EXPIRE_TIME = 14 * SECONDS_PER_DAY * 1000 export const TEST_SUBMISSION_EXPIRE_TIME = 10 * SECONDS_PER_MINUTE * 1000 +export const STUDENT_RETRY_EXPIRE_TIME = 15 * SECONDS_PER_MINUTE * 1000 export const PUBLICIZING_REQUEST_KEY = 'publicize'