diff --git a/src/controllers/user.controller.ts b/src/controllers/user.controller.ts index dab0d9b..937927f 100644 --- a/src/controllers/user.controller.ts +++ b/src/controllers/user.controller.ts @@ -118,7 +118,7 @@ export class UserController { const ip = typeof req.headers['x-forwarded-for'] === 'string' ? req.headers['x-forwarded-for'].split(',')[0].trim() : req.ip ?? ''; const userAgent = req.headers['user-agent'] || ''; - const token = await this.userService.create(user.id, ip, userAgent); + const token = await this.userService.create(user.velog_uuid, ip, userAgent); const typedToken = token as Token10; const response = new QRLoginTokenResponseDto( @@ -147,7 +147,7 @@ export class UserController { } const { decryptedAccessToken, decryptedRefreshToken } = - await this.userService.findUserAndTokensByVelogUUID(found.user.toString()); + await this.userService.findUserAndTokensByVelogUUID(String(found.user)); res.clearCookie('access_token', this.cookieOption()); res.clearCookie('refresh_token', this.cookieOption()); diff --git a/src/services/__test__/qr.service.test.ts b/src/services/__test__/qr.service.test.ts index 9315fac..d5d3fdd 100644 --- a/src/services/__test__/qr.service.test.ts +++ b/src/services/__test__/qr.service.test.ts @@ -33,23 +33,44 @@ describe('UserService 의 QRService', () => { }); describe('create', () => { + const velogUUID = 'uuid-1234'; + const ip = '127.0.0.1'; + const userAgent = 'Chrome'; + + const mockUser = { + id: 1, + velog_uuid: velogUUID, + access_token: 'token', + refresh_token: 'token', + group_id: 1, + email: 'test@example.com', + is_active: true, + created_at: new Date(), + updated_at: new Date(), + }; + it('QR 토큰을 생성하고 반환해야 한다', async () => { - const userId = 1; - const ip = '127.0.0.1'; - const userAgent = 'Chrome'; - - const token = await service.create(userId, ip, userAgent); - + repo.findByUserVelogUUID.mockResolvedValueOnce(mockUser); + + const token = await service.create(velogUUID, ip, userAgent); + expect(typeof token).toBe('string'); expect(token.length).toBe(10); expect(/^[A-Za-z0-9\-_.~!]{10}$/.test(token)).toBe(true); - expect(repo.createQRLoginToken).toHaveBeenCalledWith(token, userId, ip, userAgent); + expect(repo.createQRLoginToken).toHaveBeenCalledWith(token, mockUser.id, ip, userAgent); + }); + + it('유저 조회 실패 시 예외 발생', async () => { + repo.findByUserVelogUUID.mockResolvedValueOnce(null as unknown as typeof mockUser); + + await expect(service.create(velogUUID, ip, userAgent)).rejects.toThrow('QR 토큰 생성 실패: 유저 없음'); }); it('QR 토큰 생성 중 오류 발생 시 예외 발생', async () => { + repo.findByUserVelogUUID.mockResolvedValueOnce(mockUser); repo.createQRLoginToken.mockRejectedValueOnce(new DBError('생성 실패')); - await expect(service.create(1, 'ip', 'agent')).rejects.toThrow('생성 실패'); + await expect(service.create(velogUUID, ip, userAgent)).rejects.toThrow('생성 실패'); }); }); diff --git a/src/services/user.service.ts b/src/services/user.service.ts index 13e4073..732a613 100644 --- a/src/services/user.service.ts +++ b/src/services/user.service.ts @@ -136,9 +136,14 @@ export class UserService { return { user, decryptedAccessToken, decryptedRefreshToken }; } - async create(userId: number, ip: string, userAgent: string): Promise { + async create(velogUUID: string, ip: string, userAgent: string): Promise { + const user = await this.userRepo.findByUserVelogUUID(velogUUID); + if (!user) { + throw new NotFoundError('QR 토큰 생성 실패: 유저 없음'); + } + const token = generateRandomToken(10); - await this.userRepo.createQRLoginToken(token, userId, ip, userAgent); + await this.userRepo.createQRLoginToken(token, user.id, ip, userAgent); return token; }