This commit is contained in:
2025-08-04 16:18:30 +09:00
parent 3864eaa965
commit 3daefc7b1b
36 changed files with 349 additions and 92 deletions

View File

@@ -3,14 +3,20 @@ import { CreateUserDto } from 'src/users/dto/create-user.dto';
import { LoginUserDto } from 'src/auth/dto/login-user.dto';
import { LoginResponseDto } from './dto/login-response.dto';
import { UsersService } from 'src/users/users.service';
import { UserWithProfileResponseDto } from 'src/users/dto/user-info-response.dto';
import { UserInfoResponseDto } from 'src/users/dto/user-info-response.dto';
import { AuthRequest } from 'src/common/interfaces/auth-request.interface';
import { CreateUserResponse } from 'src/users/dto/create-user-response.dto';
import { CheckAvailabilityResponseDto } from './dto/check-availability-response.dto';
import { CheckNameDto } from './dto/check-name.dto';
import { CheckEmailDto } from './dto/check-email.dto';
export declare class AuthController {
private readonly authService;
private userService;
constructor(authService: AuthService, userService: UsersService);
signup(dto: CreateUserDto): Promise<CreateUserResponse>;
login(dto: LoginUserDto): Promise<LoginResponseDto>;
getMe(req: AuthRequest): Promise<UserWithProfileResponseDto>;
getMe(req: AuthRequest): Promise<UserInfoResponseDto>;
checkName(dto: CheckNameDto): Promise<CheckAvailabilityResponseDto>;
checkEmail(dto: CheckEmailDto): Promise<CheckAvailabilityResponseDto>;
deleteMe(req: AuthRequest): Promise<void>;
}

View File

@@ -24,6 +24,9 @@ const jwt_auth_guard_1 = require("./jwt-auth.guard");
const user_info_response_dto_1 = require("../users/dto/user-info-response.dto");
const swagger_1 = require("@nestjs/swagger");
const create_user_response_dto_1 = require("../users/dto/create-user-response.dto");
const check_availability_response_dto_1 = require("./dto/check-availability-response.dto");
const check_name_dto_1 = require("./dto/check-name.dto");
const check_email_dto_1 = require("./dto/check-email.dto");
let AuthController = class AuthController {
authService;
userService;
@@ -44,13 +47,25 @@ let AuthController = class AuthController {
async getMe(req) {
return await this.userService.findUserWithProfileByIdOrFail(req.user.userId);
}
async checkName(dto) {
const available = await this.authService.isNameAvailable(dto.name);
return { available };
}
async checkEmail(dto) {
const available = await this.authService.isEmailAvailabe(dto.email);
return { available };
}
async deleteMe(req) {
await this.userService.softDelete(req.user.userId);
}
};
exports.AuthController = AuthController;
__decorate([
(0, common_1.Post)('signup'),
(0, common_1.HttpCode)(200),
(0, swagger_1.ApiOperation)({ summary: '회원가입' }),
(0, swagger_1.ApiOkResponse)({ description: '성공', type: create_user_response_dto_1.CreateUserResponse }),
openapi.ApiResponse({ status: 201, type: require("../users/dto/create-user-response.dto").CreateUserResponse }),
openapi.ApiResponse({ status: 200, type: require("../users/dto/create-user-response.dto").CreateUserResponse }),
__param(0, (0, common_1.Body)()),
__metadata("design:type", Function),
__metadata("design:paramtypes", [create_user_dto_1.CreateUserDto]),
@@ -58,9 +73,10 @@ __decorate([
], AuthController.prototype, "signup", null);
__decorate([
(0, common_1.Post)('login'),
(0, common_1.HttpCode)(200),
(0, swagger_1.ApiOperation)({ summary: '로그인' }),
(0, swagger_1.ApiOkResponse)({ description: '성공', type: login_response_dto_1.LoginResponseDto }),
openapi.ApiResponse({ status: 201, type: require("./dto/login-response.dto").LoginResponseDto }),
openapi.ApiResponse({ status: 200, type: require("./dto/login-response.dto").LoginResponseDto }),
__param(0, (0, common_1.Body)()),
__metadata("design:type", Function),
__metadata("design:paramtypes", [login_user_dto_1.LoginUserDto]),
@@ -70,13 +86,50 @@ __decorate([
(0, common_1.Get)('me'),
(0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard),
(0, swagger_1.ApiBearerAuth)(),
(0, swagger_1.ApiOkResponse)({ description: '성공', type: user_info_response_dto_1.UserWithProfileResponseDto }),
openapi.ApiResponse({ status: 200, type: require("../users/dto/user-info-response.dto").UserWithProfileResponseDto }),
(0, swagger_1.ApiOperation)({ summary: '정보 확인' }),
(0, swagger_1.ApiOkResponse)({ description: '성공', type: user_info_response_dto_1.UserInfoResponseDto }),
openapi.ApiResponse({ status: 200, type: require("../users/dto/user-info-response.dto").UserInfoResponseDto }),
__param(0, (0, common_1.Request)()),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", Promise)
], AuthController.prototype, "getMe", null);
__decorate([
(0, common_1.Post)('check-name'),
(0, common_1.HttpCode)(200),
(0, swagger_1.ApiOperation)({ summary: '사용자 이름 중복 확인' }),
(0, swagger_1.ApiOkResponse)({ description: '성공', type: check_availability_response_dto_1.CheckAvailabilityResponseDto }),
openapi.ApiResponse({ status: 200, type: require("./dto/check-availability-response.dto").CheckAvailabilityResponseDto }),
__param(0, (0, common_1.Body)()),
__metadata("design:type", Function),
__metadata("design:paramtypes", [check_name_dto_1.CheckNameDto]),
__metadata("design:returntype", Promise)
], AuthController.prototype, "checkName", null);
__decorate([
(0, common_1.Post)('check-email'),
(0, common_1.HttpCode)(200),
(0, swagger_1.ApiOperation)({ summary: '사용자 이메일 중복 확인' }),
(0, swagger_1.ApiOkResponse)({ description: '성공', type: check_availability_response_dto_1.CheckAvailabilityResponseDto }),
openapi.ApiResponse({ status: 200, type: require("./dto/check-availability-response.dto").CheckAvailabilityResponseDto }),
__param(0, (0, common_1.Body)()),
__metadata("design:type", Function),
__metadata("design:paramtypes", [check_email_dto_1.CheckEmailDto]),
__metadata("design:returntype", Promise)
], AuthController.prototype, "checkEmail", null);
__decorate([
(0, common_1.Delete)('me'),
(0, common_1.HttpCode)(204),
(0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard),
(0, swagger_1.ApiBearerAuth)(),
(0, swagger_1.ApiOperation)({ summary: '회원 탈퇴' }),
(0, swagger_1.ApiNoContentResponse)({ description: '탈퇴 완료' }),
(0, swagger_1.ApiNotFoundResponse)({ description: '존재하지 않는 사용자' }),
openapi.ApiResponse({ status: 204 }),
__param(0, (0, common_1.Request)()),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", Promise)
], AuthController.prototype, "deleteMe", null);
exports.AuthController = AuthController = __decorate([
(0, swagger_1.ApiTags)('인증'),
(0, common_1.Controller)('auth'),

View File

@@ -1 +1 @@
{"version":3,"file":"auth.controller.js","sourceRoot":"","sources":["../../src/auth/auth.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAiF;AACjF,iDAA6C;AAC7C,kEAA8D;AAC9D,yDAA2D;AAC3D,iEAA4D;AAC5D,0DAAuD;AACvD,qDAAgD;AAChD,gFAAkF;AAElF,6CAAsF;AACtF,oFAA4E;AAIrE,IAAM,cAAc,GAApB,MAAM,cAAc;IAEN;IACT;IAFV,YACmB,WAAwB,EACjC,WAAyB;QADhB,gBAAW,GAAX,WAAW,CAAa;QACjC,gBAAW,GAAX,WAAW,CAAc;IAChC,CAAC;IAKE,AAAN,KAAK,CAAC,MAAM,CAAS,GAAkB;QACrC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChD,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC;IACJ,CAAC;IAKK,AAAN,KAAK,CAAC,KAAK,CAAS,GAAiB;QACnC,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3C,CAAC;IAMK,AAAN,KAAK,CAAC,KAAK,CAAY,GAAgB;QACrC,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,6BAA6B,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/E,CAAC;CACF,CAAA;AA/BY,wCAAc;AASnB;IAHL,IAAA,aAAI,EAAC,QAAQ,CAAC;IACd,IAAA,sBAAY,EAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IACjC,IAAA,uBAAa,EAAC,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,6CAAkB,EAAE,CAAC;;IACjD,WAAA,IAAA,aAAI,GAAE,CAAA;;qCAAM,+BAAa;;4CAMtC;AAKK;IAHL,IAAA,aAAI,EAAC,OAAO,CAAC;IACb,IAAA,sBAAY,EAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAChC,IAAA,uBAAa,EAAC,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,qCAAgB,EAAE,CAAC;;IAChD,WAAA,IAAA,aAAI,GAAE,CAAA;;qCAAM,6BAAY;;2CAEpC;AAMK;IAJL,IAAA,YAAG,EAAC,IAAI,CAAC;IACT,IAAA,kBAAS,EAAC,6BAAY,CAAC;IACvB,IAAA,uBAAa,GAAE;IACf,IAAA,uBAAa,EAAC,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,mDAA0B,EAAE,CAAC;;IAC1D,WAAA,IAAA,gBAAO,GAAE,CAAA;;;;2CAErB;yBA9BU,cAAc;IAF1B,IAAA,iBAAO,EAAC,IAAI,CAAC;IACb,IAAA,mBAAU,EAAC,MAAM,CAAC;qCAGe,0BAAW;QACpB,4BAAY;GAHxB,cAAc,CA+B1B"}
{"version":3,"file":"auth.controller.js","sourceRoot":"","sources":["../../src/auth/auth.controller.ts"],"names":[],"mappings":"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"}

View File

@@ -9,4 +9,6 @@ export declare class AuthService {
constructor(userService: UsersService, jwtService: JwtService);
signup(dto: CreateUserDto): Promise<import("../users/user.entity").User>;
login(dto: LoginUserDto): Promise<LoginResponseDto>;
isNameAvailable(name: string): Promise<boolean>;
isEmailAvailabe(email: string): Promise<boolean>;
}

View File

@@ -40,6 +40,14 @@ let AuthService = class AuthService {
},
};
}
async isNameAvailable(name) {
const user = await this.userService.findByName(name);
return !user;
}
async isEmailAvailabe(email) {
const user = await this.userService.findByEmail(email);
return !user;
}
};
exports.AuthService = AuthService;
exports.AuthService = AuthService = __decorate([

View File

@@ -1 +1 @@
{"version":3,"file":"auth.service.js","sourceRoot":"","sources":["../../src/auth/auth.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAAmE;AACnE,qCAAyC;AACzC,0DAAuD;AACvD,mCAAmC;AAM5B,IAAM,WAAW,GAAjB,MAAM,WAAW;IAEZ;IACA;IAFV,YACU,WAAyB,EACzB,UAAsB;QADtB,gBAAW,GAAX,WAAW,CAAc;QACzB,eAAU,GAAV,UAAU,CAAY;IAC7B,CAAC;IAEJ,KAAK,CAAC,MAAM,CAAC,GAAkB;QAC7B,MAAM,MAAM,GAAW,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAiB;QAC3B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC/D,MAAM,IAAI,8BAAqB,CAAC,cAAc,CAAC,CAAC;QAElD,MAAM,OAAO,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;QACtD,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE5C,OAAO;YACL,YAAY,EAAE,KAAK;YACnB,IAAI,EAAE;gBACJ,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB;SACF,CAAC;IACJ,CAAC;CACF,CAAA;AA5BY,kCAAW;sBAAX,WAAW;IADvB,IAAA,mBAAU,GAAE;qCAGY,4BAAY;QACb,gBAAU;GAHrB,WAAW,CA4BvB"}
{"version":3,"file":"auth.service.js","sourceRoot":"","sources":["../../src/auth/auth.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAAmE;AACnE,qCAAyC;AACzC,0DAAuD;AACvD,mCAAmC;AAM5B,IAAM,WAAW,GAAjB,MAAM,WAAW;IAEZ;IACA;IAFV,YACU,WAAyB,EACzB,UAAsB;QADtB,gBAAW,GAAX,WAAW,CAAc;QACzB,eAAU,GAAV,UAAU,CAAY;IAC7B,CAAC;IAEJ,KAAK,CAAC,MAAM,CAAC,GAAkB;QAC7B,MAAM,MAAM,GAAW,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC3D,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAiB;QAC3B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC/D,MAAM,IAAI,8BAAqB,CAAC,cAAc,CAAC,CAAC;QAElD,MAAM,OAAO,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;QACtD,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE5C,OAAO;YACL,YAAY,EAAE,KAAK;YACnB,IAAI,EAAE;gBACJ,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,IAAY;QAChC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC;IACf,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,KAAa;QACjC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC;IACf,CAAC;CACF,CAAA;AAtCY,kCAAW;sBAAX,WAAW;IADvB,IAAA,mBAAU,GAAE;qCAGY,4BAAY;QACb,gBAAU;GAHrB,WAAW,CAsCvB"}