Peace 2 weeks ago
parent bf8c75f770
commit 766a2ad111
  1. 2
      backend/.env
  2. 14
      backend/dist/auth/auth.controller.d.ts
  3. 27
      backend/dist/auth/auth.controller.js
  4. 2
      backend/dist/auth/auth.controller.js.map
  5. 2
      backend/dist/auth/auth.module.js
  6. 2
      backend/dist/auth/auth.module.js.map
  7. 6
      backend/dist/auth/auth.service.d.ts
  8. 27
      backend/dist/auth/auth.service.js
  9. 2
      backend/dist/auth/auth.service.js.map
  10. 5
      backend/dist/auth/dto/login-response.dto.d.ts
  11. 9
      backend/dist/auth/dto/login-response.dto.js
  12. 1
      backend/dist/auth/dto/login-response.dto.js.map
  13. 7
      backend/dist/common/dto/sucees-response.dto.d.ts
  14. 22
      backend/dist/common/dto/sucees-response.dto.js
  15. 2
      backend/dist/common/dto/sucees-response.dto.js.map
  16. 2
      backend/dist/tsconfig.build.tsbuildinfo
  17. 5
      backend/dist/users/dto/user-info-response.dto.d.ts
  18. 10
      backend/dist/users/dto/user-info-response.dto.js
  19. 1
      backend/dist/users/dto/user-info-response.dto.js.map
  20. 3
      backend/dist/users/users.controller.d.ts
  21. 7
      backend/dist/users/users.controller.js
  22. 2
      backend/dist/users/users.controller.js.map
  23. 3
      backend/dist/users/users.service.d.ts
  24. 19
      backend/dist/users/users.service.js
  25. 2
      backend/dist/users/users.service.js.map
  26. 1013
      backend/package-lock.json
  27. 8
      backend/package.json
  28. 19
      backend/src/auth/auth.controller.ts
  29. 2
      backend/src/auth/auth.module.ts
  30. 34
      backend/src/auth/auth.service.ts
  31. 6
      backend/src/auth/dto/login-response.dto.ts
  32. 5
      backend/src/users/dto/user-info-response.dto.ts
  33. 10
      backend/src/users/users.controller.ts
  34. 24
      backend/src/users/users.service.ts

@ -7,4 +7,4 @@ DB_PASSWORD=init00!!
DB_DATABASE=boilerplate_db DB_DATABASE=boilerplate_db
JWT_SECRET=jwt-secret JWT_SECRET=jwt-secret
JWT_EXPIRES_IN=600s JWT_EXPIRES_IN=1h

@ -1,11 +1,15 @@
import { AuthService } from './auth.service'; import { AuthService } from './auth.service';
import { CreateUserDto } from 'src/users/dto/create-user.dto'; import { CreateUserDto } from 'src/users/dto/create-user.dto';
import { LoginUserDto } from 'src/auth/dto/login-user.dto'; import { LoginUserDto } from 'src/auth/dto/login-user.dto';
import { SuccessResponseDto } from 'src/common/dto/sucees-response.dto';
import { LoginResponseDto } from './dto/login-response.dto';
import { UsersService } from 'src/users/users.service';
import { UserInfoResponseDto } from 'src/users/dto/user-info-response.dto';
export declare class AuthController { export declare class AuthController {
private readonly authService; private readonly authService;
constructor(authService: AuthService); private userService;
signup(dto: CreateUserDto): Promise<import("../users/user.entity").User>; constructor(authService: AuthService, userService: UsersService);
login(dto: LoginUserDto): Promise<{ signup(dto: CreateUserDto): Promise<SuccessResponseDto>;
access_token: string; login(dto: LoginUserDto): Promise<SuccessResponseDto<LoginResponseDto>>;
}>; getMe(req: any): Promise<SuccessResponseDto<UserInfoResponseDto>>;
} }

@ -17,16 +17,27 @@ const common_1 = require("@nestjs/common");
const auth_service_1 = require("./auth.service"); const auth_service_1 = require("./auth.service");
const create_user_dto_1 = require("../users/dto/create-user.dto"); const create_user_dto_1 = require("../users/dto/create-user.dto");
const login_user_dto_1 = require("./dto/login-user.dto"); const login_user_dto_1 = require("./dto/login-user.dto");
const sucees_response_dto_1 = require("../common/dto/sucees-response.dto");
const users_service_1 = require("../users/users.service");
const jwt_auth_guard_1 = require("./jwt-auth.guard");
let AuthController = class AuthController { let AuthController = class AuthController {
authService; authService;
constructor(authService) { userService;
constructor(authService, userService) {
this.authService = authService; this.authService = authService;
this.userService = userService;
} }
async signup(dto) { async signup(dto) {
return await this.authService.signup(dto); const user = await this.authService.signup(dto);
return sucees_response_dto_1.SuccessResponseDto.ok();
} }
async login(dto) { async login(dto) {
return await this.authService.login(dto); const loginUser = await this.authService.login(dto);
return sucees_response_dto_1.SuccessResponseDto.of(loginUser);
}
async getMe(req) {
const userInfo = await this.userService.findUserInfoByIdOrFail(req.user.userId);
return sucees_response_dto_1.SuccessResponseDto.of(userInfo);
} }
}; };
exports.AuthController = AuthController; exports.AuthController = AuthController;
@ -44,8 +55,16 @@ __decorate([
__metadata("design:paramtypes", [login_user_dto_1.LoginUserDto]), __metadata("design:paramtypes", [login_user_dto_1.LoginUserDto]),
__metadata("design:returntype", Promise) __metadata("design:returntype", Promise)
], AuthController.prototype, "login", null); ], AuthController.prototype, "login", null);
__decorate([
(0, common_1.Get)('me'),
(0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard),
__param(0, (0, common_1.Request)()),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", Promise)
], AuthController.prototype, "getMe", null);
exports.AuthController = AuthController = __decorate([ exports.AuthController = AuthController = __decorate([
(0, common_1.Controller)('auth'), (0, common_1.Controller)('auth'),
__metadata("design:paramtypes", [auth_service_1.AuthService]) __metadata("design:paramtypes", [auth_service_1.AuthService, users_service_1.UsersService])
], AuthController); ], AuthController);
//# sourceMappingURL=auth.controller.js.map //# sourceMappingURL=auth.controller.js.map

@ -1 +1 @@
{"version":3,"file":"auth.controller.js","sourceRoot":"","sources":["../../src/auth/auth.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAwD;AACxD,iDAA6C;AAC7C,kEAA8D;AAC9D,yDAA2D;AAGpD,IAAM,cAAc,GAApB,MAAM,cAAc;IACM;IAA7B,YAA6B,WAAwB;QAAxB,gBAAW,GAAX,WAAW,CAAa;IAAG,CAAC;IAGnD,AAAN,KAAK,CAAC,MAAM,CAAS,GAAkB;QACnC,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC9C,CAAC;IAGK,AAAN,KAAK,CAAC,KAAK,CAAS,GAAiB;QACjC,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;CACJ,CAAA;AAZY,wCAAc;AAIjB;IADL,IAAA,aAAI,EAAC,QAAQ,CAAC;IACD,WAAA,IAAA,aAAI,GAAE,CAAA;;qCAAM,+BAAa;;4CAEtC;AAGK;IADL,IAAA,aAAI,EAAC,OAAO,CAAC;IACD,WAAA,IAAA,aAAI,GAAE,CAAA;;qCAAM,6BAAY;;2CAEpC;yBAXQ,cAAc;IAD1B,IAAA,mBAAU,EAAC,MAAM,CAAC;qCAE2B,0BAAW;GAD5C,cAAc,CAY1B"} {"version":3,"file":"auth.controller.js","sourceRoot":"","sources":["../../src/auth/auth.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAiF;AACjF,iDAA6C;AAC7C,kEAA8D;AAC9D,yDAA2D;AAC3D,2EAAwE;AAExE,0DAAuD;AACvD,qDAAgD;AAIzC,IAAM,cAAc,GAApB,MAAM,cAAc;IACM;IAAkC;IAA/D,YAA6B,WAAwB,EAAU,WAAyB;QAA3D,gBAAW,GAAX,WAAW,CAAa;QAAU,gBAAW,GAAX,WAAW,CAAc;IAAG,CAAC;IAGtF,AAAN,KAAK,CAAC,MAAM,CAAS,GAAkB;QACnC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChD,OAAO,wCAAkB,CAAC,EAAE,EAAE,CAAC;IACnC,CAAC;IAGK,AAAN,KAAK,CAAC,KAAK,CAAS,GAAiB;QACjC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACpD,OAAO,wCAAkB,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC;IAIK,AAAN,KAAK,CAAC,KAAK,CAAY,GAAG;QACtB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChF,OAAO,wCAAkB,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;IAC3C,CAAC;CACJ,CAAA;AArBY,wCAAc;AAIjB;IADL,IAAA,aAAI,EAAC,QAAQ,CAAC;IACD,WAAA,IAAA,aAAI,GAAE,CAAA;;qCAAM,+BAAa;;4CAGtC;AAGK;IADL,IAAA,aAAI,EAAC,OAAO,CAAC;IACD,WAAA,IAAA,aAAI,GAAE,CAAA;;qCAAM,6BAAY;;2CAGpC;AAIK;IAFL,IAAA,YAAG,EAAC,IAAI,CAAC;IACT,IAAA,kBAAS,EAAC,6BAAY,CAAC;IACX,WAAA,IAAA,gBAAO,GAAE,CAAA;;;;2CAGrB;yBApBQ,cAAc;IAD1B,IAAA,mBAAU,EAAC,MAAM,CAAC;qCAE2B,0BAAW,EAAuB,4BAAY;GAD/E,cAAc,CAqB1B"}

@ -30,7 +30,7 @@ exports.AuthModule = AuthModule = __decorate([
useFactory: async (configService) => ({ useFactory: async (configService) => ({
secret: configService.get('JWT_SECRET'), secret: configService.get('JWT_SECRET'),
signOptions: { signOptions: {
expiresIn: configService.get('JWT_EXPIRES_IN') || '60s', expiresIn: configService.get('JWT_EXPIRES_IN') || '1h',
}, },
}), }),
}) })

@ -1 +1 @@
{"version":3,"file":"auth.module.js","sourceRoot":"","sources":["../../src/auth/auth.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,iDAA6C;AAC7C,uDAAmD;AACnD,wDAAqD;AACrD,qCAAwC;AACxC,2CAA6D;AAC7D,+CAAkD;AAClD,iDAA6C;AAqBtC,IAAM,UAAU,GAAhB,MAAM,UAAU;CAAG,CAAA;AAAb,gCAAU;qBAAV,UAAU;IAnBtB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,0BAAW;YACX,yBAAc;YACd,qBAAY;YACZ,eAAS,CAAC,aAAa,CAAC;gBACtB,OAAO,EAAE,CAAC,qBAAY,CAAC;gBACvB,MAAM,EAAE,CAAC,sBAAa,CAAC;gBACvB,UAAU,EAAE,KAAK,EAAE,aAA4B,EAAE,EAAE,CAAC,CAAC;oBACnD,MAAM,EAAE,aAAa,CAAC,GAAG,CAAS,YAAY,CAAC;oBAC/C,WAAW,EAAE;wBACX,SAAS,EAAE,aAAa,CAAC,GAAG,CAAS,gBAAgB,CAAC,IAAI,KAAK;qBAChE;iBACF,CAAC;aACH,CAAC;SACH;QACD,SAAS,EAAE,CAAC,0BAAW,EAAE,0BAAW,CAAC;QACrC,WAAW,EAAE,CAAC,gCAAc,CAAC;KAC9B,CAAC;GACW,UAAU,CAAG"} {"version":3,"file":"auth.module.js","sourceRoot":"","sources":["../../src/auth/auth.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,iDAA6C;AAC7C,uDAAmD;AACnD,wDAAqD;AACrD,qCAAwC;AACxC,2CAA6D;AAC7D,+CAAkD;AAClD,iDAA6C;AAqBtC,IAAM,UAAU,GAAhB,MAAM,UAAU;CAAG,CAAA;AAAb,gCAAU;qBAAV,UAAU;IAnBtB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,0BAAW;YACX,yBAAc;YACd,qBAAY;YACZ,eAAS,CAAC,aAAa,CAAC;gBACtB,OAAO,EAAE,CAAC,qBAAY,CAAC;gBACvB,MAAM,EAAE,CAAC,sBAAa,CAAC;gBACvB,UAAU,EAAE,KAAK,EAAE,aAA4B,EAAE,EAAE,CAAC,CAAC;oBACnD,MAAM,EAAE,aAAa,CAAC,GAAG,CAAS,YAAY,CAAC;oBAC/C,WAAW,EAAE;wBACX,SAAS,EAAE,aAAa,CAAC,GAAG,CAAS,gBAAgB,CAAC,IAAI,IAAI;qBAC/D;iBACF,CAAC;aACH,CAAC;SACH;QACD,SAAS,EAAE,CAAC,0BAAW,EAAE,0BAAW,CAAC;QACrC,WAAW,EAAE,CAAC,gCAAc,CAAC;KAC9B,CAAC;GACW,UAAU,CAAG"}

@ -2,13 +2,11 @@ import { JwtService } from '@nestjs/jwt';
import { UsersService } from 'src/users/users.service'; import { UsersService } from 'src/users/users.service';
import { LoginUserDto } from 'src/auth/dto/login-user.dto'; import { LoginUserDto } from 'src/auth/dto/login-user.dto';
import { CreateUserDto } from 'src/users/dto/create-user.dto'; import { CreateUserDto } from 'src/users/dto/create-user.dto';
import { LoginResponseDto } from './dto/login-response.dto';
export declare class AuthService { export declare class AuthService {
private userService; private userService;
private jwtService; private jwtService;
constructor(userService: UsersService, jwtService: JwtService); constructor(userService: UsersService, jwtService: JwtService);
validateUser(name: string, password: string): Promise<any>;
login(dto: LoginUserDto): Promise<{
access_token: string;
}>;
signup(dto: CreateUserDto): Promise<import("../users/user.entity").User>; signup(dto: CreateUserDto): Promise<import("../users/user.entity").User>;
login(dto: LoginUserDto): Promise<LoginResponseDto>;
} }

@ -21,27 +21,24 @@ let AuthService = class AuthService {
this.userService = userService; this.userService = userService;
this.jwtService = jwtService; this.jwtService = jwtService;
} }
async validateUser(name, password) { async signup(dto) {
const user = await this.userService.findByName(name); const hashed = await bcrypt.hash(dto.password, 10);
if (user && await bcrypt.compare(password, user.password)) { return this.userService.create({ ...dto, password: hashed });
const { password, ...rest } = user;
return rest;
}
return null;
} }
async login(dto) { async login(dto) {
const user = await this.userService.findByName(dto.name); const user = await this.userService.findByName(dto.name);
if (!user) if (!user || !await bcrypt.compare(dto.password, user.password))
throw new common_1.UnauthorizedException('Login failed');
const passwordCheck = await bcrypt.compare(dto.password, user.password);
if (!passwordCheck)
throw new common_1.UnauthorizedException('Login failed'); throw new common_1.UnauthorizedException('Login failed');
const payload = { username: user.name, sub: user.id }; const payload = { username: user.name, sub: user.id };
return { access_token: this.jwtService.sign(payload) }; const token = this.jwtService.sign(payload);
return {
access_token: token,
user: {
id: user.id,
name: user.name,
email: user.email,
} }
async signup(dto) { };
const hashed = await bcrypt.hash(dto.password, 10);
return this.userService.create({ ...dto, password: hashed });
} }
}; };
exports.AuthService = AuthService; exports.AuthService = AuthService;

@ -1 +1 @@
{"version":3,"file":"auth.service.js","sourceRoot":"","sources":["../../src/auth/auth.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAAsH;AACtH,qCAAyC;AACzC,0DAAuD;AACvD,iCAAgC;AAKzB,IAAM,WAAW,GAAjB,MAAM,WAAW;IACA;IAAmC;IAAvD,YAAoB,WAAyB,EAAU,UAAsB;QAAzD,gBAAW,GAAX,WAAW,CAAc;QAAU,eAAU,GAAV,UAAU,CAAY;IAAG,CAAC;IAEjF,KAAK,CAAC,YAAY,CAAC,IAAY,EAAE,QAAgB;QAC7C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACrD,IAAI,IAAI,IAAI,MAAM,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxD,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;YAEnC,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAiB;QACzB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrD,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,8BAAqB,CAAC,cAAc,CAAC,CAAC;QAE3D,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxE,IAAI,CAAC,aAAa;YAAE,MAAM,IAAI,8BAAqB,CAAC,cAAc,CAAC,CAAC;QAEpE,MAAM,OAAO,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;QACtD,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAkB;QAC3B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IACrE,CAAC;CACJ,CAAA;AA7BY,kCAAW;sBAAX,WAAW;IADvB,IAAA,mBAAU,GAAE;qCAEwB,4BAAY,EAAsB,gBAAU;GADpE,WAAW,CA6BvB"} {"version":3,"file":"auth.service.js","sourceRoot":"","sources":["../../src/auth/auth.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAAsH;AACtH,qCAAyC;AACzC,0DAAuD;AACvD,iCAAgC;AAMzB,IAAM,WAAW,GAAjB,MAAM,WAAW;IACA;IAAmC;IAAvD,YAAoB,WAAyB,EAAU,UAAsB;QAAzD,gBAAW,GAAX,WAAW,CAAc;QAAU,eAAU,GAAV,UAAU,CAAY;IAAG,CAAC;IAEjF,KAAK,CAAC,MAAM,CAAC,GAAkB;QAC3B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAiB;QACzB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrD,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC;YAAE,MAAM,IAAI,8BAAqB,CAAC,cAAc,CAAC,CAAC;QAEjH,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;YACH,YAAY,EAAE,KAAK;YACnB,IAAI,EAAE;gBACF,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,KAAK,EAAE,IAAI,CAAC,KAAK;aACpB;SACJ,CAAC;IACV,CAAC;CACJ,CAAA;AAxBY,kCAAW;sBAAX,WAAW;IADvB,IAAA,mBAAU,GAAE;qCAEwB,4BAAY,EAAsB,gBAAU;GADpE,WAAW,CAwBvB"}

@ -0,0 +1,5 @@
import { UserInfoResponseDto } from "src/users/dto/user-info-response.dto";
export declare class LoginResponseDto {
access_token: string;
user: UserInfoResponseDto;
}

@ -0,0 +1,9 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.LoginResponseDto = void 0;
class LoginResponseDto {
access_token;
user;
}
exports.LoginResponseDto = LoginResponseDto;
//# sourceMappingURL=login-response.dto.js.map

@ -0,0 +1 @@
{"version":3,"file":"login-response.dto.js","sourceRoot":"","sources":["../../../src/auth/dto/login-response.dto.ts"],"names":[],"mappings":";;;AAEA,MAAa,gBAAgB;IACzB,YAAY,CAAS;IACrB,IAAI,CAAsB;CAC7B;AAHD,4CAGC"}

@ -0,0 +1,7 @@
export declare class SuccessResponseDto<T = any> {
success: boolean;
message?: string;
data?: T;
static of<T>(data: T, message?: string): SuccessResponseDto<T>;
static ok(message?: string): SuccessResponseDto<null>;
}

@ -1 +1,23 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.SuccessResponseDto = void 0;
class SuccessResponseDto {
success;
message;
data;
static of(data, message) {
return {
success: true,
data,
message,
};
}
static ok(message) {
return {
success: true,
message,
};
}
}
exports.SuccessResponseDto = SuccessResponseDto;
//# sourceMappingURL=sucees-response.dto.js.map //# sourceMappingURL=sucees-response.dto.js.map

@ -1 +1 @@
{"version":3,"file":"sucees-response.dto.js","sourceRoot":"","sources":["../../../src/common/dto/sucees-response.dto.ts"],"names":[],"mappings":""} {"version":3,"file":"sucees-response.dto.js","sourceRoot":"","sources":["../../../src/common/dto/sucees-response.dto.ts"],"names":[],"mappings":";;;AAAA,MAAa,kBAAkB;IAC3B,OAAO,CAAU;IACjB,OAAO,CAAU;IACjB,IAAI,CAAK;IAET,MAAM,CAAC,EAAE,CAAI,IAAO,EAAE,OAAgB;QAClC,OAAO;YACH,OAAO,EAAE,IAAI;YACb,IAAI;YACJ,OAAO;SACV,CAAC;IACN,CAAC;IAED,MAAM,CAAC,EAAE,CAAC,OAAgB;QACtB,OAAO;YACH,OAAO,EAAE,IAAI;YACb,OAAO;SACV,CAAC;IACN,CAAC;CACJ;AAnBD,gDAmBC"}

File diff suppressed because one or more lines are too long

@ -0,0 +1,5 @@
export declare class UserInfoResponseDto {
id: number;
name: string;
email?: string;
}

@ -0,0 +1,10 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.UserInfoResponseDto = void 0;
class UserInfoResponseDto {
id;
name;
email;
}
exports.UserInfoResponseDto = UserInfoResponseDto;
//# sourceMappingURL=user-info-response.dto.js.map

@ -0,0 +1 @@
{"version":3,"file":"user-info-response.dto.js","sourceRoot":"","sources":["../../../src/users/dto/user-info-response.dto.ts"],"names":[],"mappings":";;;AAAA,MAAa,mBAAmB;IAC5B,EAAE,CAAS;IACX,IAAI,CAAS;IACb,KAAK,CAAU;CAClB;AAJD,kDAIC"}

@ -1,7 +1,8 @@
import { UsersService } from './users.service'; import { UsersService } from './users.service';
import { ChangePasswordDto } from './dto/change-password.dto'; import { ChangePasswordDto } from './dto/change-password.dto';
import { SuccessResponseDto } from 'src/common/dto/sucees-response.dto';
export declare class UsersController { export declare class UsersController {
private readonly userService; private readonly userService;
constructor(userService: UsersService); constructor(userService: UsersService);
changePassword(req: any, dto: ChangePasswordDto): Promise<void>; changePassword(req: any, dto: ChangePasswordDto): Promise<SuccessResponseDto>;
} }

@ -16,18 +16,21 @@ exports.UsersController = void 0;
const common_1 = require("@nestjs/common"); const common_1 = require("@nestjs/common");
const users_service_1 = require("./users.service"); const users_service_1 = require("./users.service");
const change_password_dto_1 = require("./dto/change-password.dto"); const change_password_dto_1 = require("./dto/change-password.dto");
const jwt_auth_guard_1 = require("../auth/jwt-auth.guard");
const sucees_response_dto_1 = require("../common/dto/sucees-response.dto");
let UsersController = class UsersController { let UsersController = class UsersController {
userService; userService;
constructor(userService) { constructor(userService) {
this.userService = userService; this.userService = userService;
} }
async changePassword(req, dto) { async changePassword(req, dto) {
console.log("dd"); await this.userService.changePassword(req.user.userId, dto);
return await this.userService.changePassword(2, dto); return sucees_response_dto_1.SuccessResponseDto.ok();
} }
}; };
exports.UsersController = UsersController; exports.UsersController = UsersController;
__decorate([ __decorate([
(0, common_1.UseGuards)(jwt_auth_guard_1.JwtAuthGuard),
(0, common_1.Patch)('password'), (0, common_1.Patch)('password'),
__param(0, (0, common_1.Request)()), __param(0, (0, common_1.Request)()),
__param(1, (0, common_1.Body)()), __param(1, (0, common_1.Body)()),

@ -1 +1 @@
{"version":3,"file":"users.controller.js","sourceRoot":"","sources":["../../src/users/users.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAkE;AAClE,mDAA+C;AAC/C,mEAA8D;AAGvD,IAAM,eAAe,GAArB,MAAM,eAAe;IACK;IAA7B,YAA6B,WAAyB;QAAzB,gBAAW,GAAX,WAAW,CAAc;IAAG,CAAC;IAGpD,AAAN,KAAK,CAAC,cAAc,CAAY,GAAG,EAAU,GAAsB;QAC/D,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACzD,CAAC;CACJ,CAAA;AARY,0CAAe;AAIlB;IADL,IAAA,cAAK,EAAC,UAAU,CAAC;IACI,WAAA,IAAA,gBAAO,GAAE,CAAA;IAAO,WAAA,IAAA,aAAI,GAAE,CAAA;;6CAAM,uCAAiB;;qDAGlE;0BAPQ,eAAe;IAD3B,IAAA,mBAAU,EAAC,OAAO,CAAC;qCAE0B,4BAAY;GAD7C,eAAe,CAQ3B"} {"version":3,"file":"users.controller.js","sourceRoot":"","sources":["../../src/users/users.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA6E;AAC7E,mDAA+C;AAC/C,mEAA8D;AAC9D,2DAAuD;AACvD,2EAAwE;AAGjE,IAAM,eAAe,GAArB,MAAM,eAAe;IACK;IAA7B,YAA6B,WAAyB;QAAzB,gBAAW,GAAX,WAAW,CAAc;IAAG,CAAC;IAIpD,AAAN,KAAK,CAAC,cAAc,CAAY,GAAG,EAAU,GAAsB;QAC/D,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC5D,OAAO,wCAAkB,CAAC,EAAE,EAAE,CAAC;IACnC,CAAC;CACJ,CAAA;AATY,0CAAe;AAKlB;IAFL,IAAA,kBAAS,EAAC,6BAAY,CAAC;IACvB,IAAA,cAAK,EAAC,UAAU,CAAC;IACI,WAAA,IAAA,gBAAO,GAAE,CAAA;IAAO,WAAA,IAAA,aAAI,GAAE,CAAA;;6CAAM,uCAAiB;;qDAGlE;0BARQ,eAAe;IAD3B,IAAA,mBAAU,EAAC,OAAO,CAAC;qCAE0B,4BAAY;GAD7C,eAAe,CAS3B"}

@ -2,11 +2,14 @@ import { User } from './user.entity';
import { Repository } from 'typeorm'; import { Repository } from 'typeorm';
import { CreateUserDto } from './dto/create-user.dto'; import { CreateUserDto } from './dto/create-user.dto';
import { ChangePasswordDto } from './dto/change-password.dto'; import { ChangePasswordDto } from './dto/change-password.dto';
import { UserInfoResponseDto } from './dto/user-info-response.dto';
export declare class UsersService { export declare class UsersService {
private repo; private repo;
constructor(repo: Repository<User>); constructor(repo: Repository<User>);
findById(id: number): Promise<User | null>;
findByName(name: string): Promise<User | null>; findByName(name: string): Promise<User | null>;
findByEmail(email: string): Promise<User | null>; findByEmail(email: string): Promise<User | null>;
create(dto: CreateUserDto): Promise<User>; create(dto: CreateUserDto): Promise<User>;
changePassword(userId: number, dto: ChangePasswordDto): Promise<void>; changePassword(userId: number, dto: ChangePasswordDto): Promise<void>;
findUserInfoByIdOrFail(id: number): Promise<UserInfoResponseDto>;
} }

@ -23,11 +23,14 @@ let UsersService = class UsersService {
constructor(repo) { constructor(repo) {
this.repo = repo; this.repo = repo;
} }
async findById(id) {
return await this.repo.findOne({ where: { id } });
}
async findByName(name) { async findByName(name) {
return this.repo.findOne({ where: { name } }); return await this.repo.findOne({ where: { name } });
} }
async findByEmail(email) { async findByEmail(email) {
return this.repo.findOne({ where: { email } }); return await this.repo.findOne({ where: { email } });
} }
async create(dto) { async create(dto) {
const existing = await this.findByName(dto.name); const existing = await this.findByName(dto.name);
@ -42,11 +45,21 @@ let UsersService = class UsersService {
throw new common_1.NotFoundException("User not found"); throw new common_1.NotFoundException("User not found");
const passwordValid = await bcrypt.compare(dto.currentPassword, user.password); const passwordValid = await bcrypt.compare(dto.currentPassword, user.password);
if (!passwordValid) if (!passwordValid)
throw new common_1.BadRequestException("Not matched password"); throw new common_1.UnauthorizedException("Not matched password");
const hashed = await bcrypt.hash(dto.newPassword, 10); const hashed = await bcrypt.hash(dto.newPassword, 10);
user.password = hashed; user.password = hashed;
await this.repo.save(user); await this.repo.save(user);
} }
async findUserInfoByIdOrFail(id) {
const user = await this.findById(id);
if (!user)
throw new common_1.NotFoundException("User not found");
return {
id: user.id,
name: user.name,
email: user.email,
};
}
}; };
exports.UsersService = UsersService; exports.UsersService = UsersService;
exports.UsersService = UsersService = __decorate([ exports.UsersService = UsersService = __decorate([

@ -1 +1 @@
{"version":3,"file":"users.service.js","sourceRoot":"","sources":["../../src/users/users.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAoF;AACpF,6CAAmD;AACnD,+CAAqC;AACrC,qCAAqC;AAGrC,iCAAgC;AAGzB,IAAM,YAAY,GAAlB,MAAM,YAAY;IACuB;IAA5C,YAA4C,IAAsB;QAAtB,SAAI,GAAJ,IAAI,CAAkB;IAAG,CAAC;IAEtE,KAAK,CAAC,UAAU,CAAC,IAAY;QACzB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAC,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAa;QAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAC,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAkB;QAC3B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,QAAQ;YAAE,MAAM,IAAI,4BAAmB,CAAC,sBAAsB,CAAC,CAAC;QAEpE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAc,EAAE,GAAsB;QACvD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,0BAAiB,CAAC,gBAAgB,CAAC,CAAC;QAEzD,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/E,IAAI,CAAC,aAAa;YAAE,MAAM,IAAI,4BAAmB,CAAC,sBAAsB,CAAC,CAAC;QAE1E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC;QAEvB,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;CACJ,CAAA;AA/BY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,mBAAU,GAAE;IAEI,WAAA,IAAA,0BAAgB,EAAC,kBAAI,CAAC,CAAA;qCAAe,oBAAU;GADnD,YAAY,CA+BxB"} {"version":3,"file":"users.service.js","sourceRoot":"","sources":["../../src/users/users.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA2G;AAC3G,6CAAmD;AACnD,+CAAqC;AACrC,qCAAqC;AAGrC,iCAAgC;AAIzB,IAAM,YAAY,GAAlB,MAAM,YAAY;IACuB;IAA5C,YAA4C,IAAsB;QAAtB,SAAI,GAAJ,IAAI,CAAkB;IAAG,CAAC;IAEtE,KAAK,CAAC,QAAQ,CAAC,EAAU;QACrB,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAC,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAAY;QACzB,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAC,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAa;QAC3B,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAC,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAkB;QAC3B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,QAAQ;YAAE,MAAM,IAAI,4BAAmB,CAAC,sBAAsB,CAAC,CAAC;QAEpE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAc,EAAE,GAAsB;QACvD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,0BAAiB,CAAC,gBAAgB,CAAC,CAAC;QAEzD,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/E,IAAI,CAAC,aAAa;YAAE,MAAM,IAAI,8BAAqB,CAAC,sBAAsB,CAAC,CAAC;QAE5E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC;QAEvB,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,sBAAsB,CAAC,EAAU;QACnC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACrC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,0BAAiB,CAAC,gBAAgB,CAAC,CAAC;QAEzD,OAAO;YACH,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;SACpB,CAAC;IACN,CAAC;CACJ,CAAA;AA9CY,oCAAY;uBAAZ,YAAY;IADxB,IAAA,mBAAU,GAAE;IAEI,WAAA,IAAA,0BAAgB,EAAC,kBAAI,CAAC,CAAA;qCAAe,oBAAU;GADnD,YAAY,CA8CxB"}

File diff suppressed because it is too large Load Diff

@ -22,11 +22,11 @@
"dependencies": { "dependencies": {
"@nestjs/common": "^11.0.1", "@nestjs/common": "^11.0.1",
"@nestjs/config": "^4.0.2", "@nestjs/config": "^4.0.2",
"@nestjs/core": "^11.0.1", "@nestjs/core": "^8.4.7",
"@nestjs/jwt": "^11.0.0", "@nestjs/jwt": "^11.0.0",
"@nestjs/passport": "^11.0.5", "@nestjs/passport": "^11.0.5",
"@nestjs/platform-express": "^11.0.1", "@nestjs/platform-express": "^8.2.3",
"@nestjs/typeorm": "^11.0.0", "@nestjs/typeorm": "^10.0.2",
"bcrypt": "^6.0.0", "bcrypt": "^6.0.0",
"class-transformer": "^0.5.1", "class-transformer": "^0.5.1",
"class-validator": "^0.14.2", "class-validator": "^0.14.2",
@ -42,7 +42,7 @@
"@eslint/js": "^9.18.0", "@eslint/js": "^9.18.0",
"@nestjs/cli": "^11.0.0", "@nestjs/cli": "^11.0.0",
"@nestjs/schematics": "^11.0.0", "@nestjs/schematics": "^11.0.0",
"@nestjs/testing": "^11.0.1", "@nestjs/testing": "^8.4.7",
"@swc/cli": "^0.6.0", "@swc/cli": "^0.6.0",
"@swc/core": "^1.10.7", "@swc/core": "^1.10.7",
"@types/bcrypt": "^5.0.2", "@types/bcrypt": "^5.0.2",

@ -1,22 +1,33 @@
import { Body, Controller, Post } from '@nestjs/common'; import { Body, Controller, Get, Post, Request, UseGuards } from '@nestjs/common';
import { AuthService } from './auth.service'; import { AuthService } from './auth.service';
import { CreateUserDto } from 'src/users/dto/create-user.dto'; import { CreateUserDto } from 'src/users/dto/create-user.dto';
import { LoginUserDto } from 'src/auth/dto/login-user.dto'; import { LoginUserDto } from 'src/auth/dto/login-user.dto';
import { SuccessResponseDto } from 'src/common/dto/sucees-response.dto'; import { SuccessResponseDto } from 'src/common/dto/sucees-response.dto';
import { LoginResponseDto } from './dto/login-response.dto';
import { UsersService } from 'src/users/users.service';
import { JwtAuthGuard } from './jwt-auth.guard';
import { UserInfoResponseDto } from 'src/users/dto/user-info-response.dto';
@Controller('auth') @Controller('auth')
export class AuthController { export class AuthController {
constructor(private readonly authService: AuthService) {} constructor(private readonly authService: AuthService, private userService: UsersService) {}
@Post('signup') @Post('signup')
async signup(@Body() dto: CreateUserDto): Promise<SuccessResponseDto> { async signup(@Body() dto: CreateUserDto): Promise<SuccessResponseDto> {
const user = await this.authService.signup(dto); const user = await this.authService.signup(dto);
return SuccessResponseDto.of(user); return SuccessResponseDto.ok();
} }
@Post('login') @Post('login')
async login(@Body() dto: LoginUserDto): Promise<SuccessResponseDto> { async login(@Body() dto: LoginUserDto): Promise<SuccessResponseDto<LoginResponseDto>> {
const loginUser = await this.authService.login(dto); const loginUser = await this.authService.login(dto);
return SuccessResponseDto.of(loginUser); return SuccessResponseDto.of(loginUser);
} }
@Get('me')
@UseGuards(JwtAuthGuard)
async getMe(@Request() req): Promise<SuccessResponseDto<UserInfoResponseDto>> {
const userInfo = await this.userService.findUserInfoByIdOrFail(req.user.userId);
return SuccessResponseDto.of(userInfo);
}
} }

@ -18,7 +18,7 @@ import { JwtStrategy } from './jwt.stratedy';
useFactory: async (configService: ConfigService) => ({ useFactory: async (configService: ConfigService) => ({
secret: configService.get<string>('JWT_SECRET'), secret: configService.get<string>('JWT_SECRET'),
signOptions: { signOptions: {
expiresIn: configService.get<string>('JWT_EXPIRES_IN') || '60s', expiresIn: configService.get<string>('JWT_EXPIRES_IN') || '1h',
}, },
}), }),
}) })

@ -4,35 +4,31 @@ import { UsersService } from 'src/users/users.service';
import * as bcrypt from 'bcrypt' import * as bcrypt from 'bcrypt'
import { LoginUserDto } from 'src/auth/dto/login-user.dto'; import { LoginUserDto } from 'src/auth/dto/login-user.dto';
import { CreateUserDto } from 'src/users/dto/create-user.dto'; import { CreateUserDto } from 'src/users/dto/create-user.dto';
import { LoginResponseDto } from './dto/login-response.dto';
@Injectable() @Injectable()
export class AuthService { export class AuthService {
constructor(private userService: UsersService, private jwtService: JwtService) {} constructor(private userService: UsersService, private jwtService: JwtService) {}
async validateUser(name: string, password: string): Promise<any> { async signup(dto: CreateUserDto) {
const user = await this.userService.findByName(name); const hashed = await bcrypt.hash(dto.password, 10);
if (user && await bcrypt.compare(password, user.password)) { return this.userService.create({ ...dto, password: hashed });
const { password, ...rest } = user;
return rest;
}
return null;
} }
async login(dto: LoginUserDto) { async login(dto: LoginUserDto): Promise<LoginResponseDto> {
const user = await this.userService.findByName(dto.name); const user = await this.userService.findByName(dto.name);
if (!user) throw new UnauthorizedException('Login failed'); if (!user || !await bcrypt.compare(dto.password, user.password)) throw new UnauthorizedException('Login failed');
const passwordCheck = await bcrypt.compare(dto.password, user.password);
if (!passwordCheck) throw new UnauthorizedException('Login failed');
const payload = { username: user.name, sub: user.id }; const payload = { username: user.name, sub: user.id };
return { access_token: this.jwtService.sign(payload) }; const token = this.jwtService.sign(payload);
return {
access_token: token,
user: {
id: user.id,
name: user.name,
email: user.email,
} }
};
async signup(dto: CreateUserDto) {
const hashed = await bcrypt.hash(dto.password, 10);
return this.userService.create({ ...dto, password: hashed });
} }
} }

@ -0,0 +1,6 @@
import { UserInfoResponseDto } from "src/users/dto/user-info-response.dto";
export class LoginResponseDto {
access_token: string;
user: UserInfoResponseDto;
}

@ -0,0 +1,5 @@
export class UserInfoResponseDto {
id: number;
name: string;
email?: string;
}

@ -1,15 +1,17 @@
import { Body, Controller, Patch, Request } from '@nestjs/common'; import { Body, Controller, Patch, Request, UseGuards } from '@nestjs/common';
import { UsersService } from './users.service'; import { UsersService } from './users.service';
import { ChangePasswordDto } from './dto/change-password.dto'; import { ChangePasswordDto } from './dto/change-password.dto';
import { JwtAuthGuard } from 'src/auth/jwt-auth.guard';
import { SuccessResponseDto } from 'src/common/dto/sucees-response.dto';
@Controller('users') @Controller('users')
export class UsersController { export class UsersController {
constructor(private readonly userService: UsersService) {} constructor(private readonly userService: UsersService) {}
@UseGuards(JwtAuthGuard)
@Patch('password') @Patch('password')
async changePassword(@Request() req, @Body() dto: ChangePasswordDto) { async changePassword(@Request() req, @Body() dto: ChangePasswordDto): Promise<SuccessResponseDto> {
console.log("dd");
await this.userService.changePassword(req.user.userId, dto); await this.userService.changePassword(req.user.userId, dto);
return return SuccessResponseDto.ok();
} }
} }

@ -1,21 +1,26 @@
import { BadRequestException, Injectable, NotFoundException } from '@nestjs/common'; import { BadRequestException, Injectable, NotFoundException, UnauthorizedException } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm'; import { InjectRepository } from '@nestjs/typeorm';
import { User } from './user.entity'; import { User } from './user.entity';
import { Repository } from 'typeorm'; import { Repository } from 'typeorm';
import { CreateUserDto } from './dto/create-user.dto'; import { CreateUserDto } from './dto/create-user.dto';
import { ChangePasswordDto } from './dto/change-password.dto'; import { ChangePasswordDto } from './dto/change-password.dto';
import * as bcrypt from "bcrypt" import * as bcrypt from "bcrypt"
import { UserInfoResponseDto } from './dto/user-info-response.dto';
@Injectable() @Injectable()
export class UsersService { export class UsersService {
constructor(@InjectRepository(User) private repo: Repository<User>) {} constructor(@InjectRepository(User) private repo: Repository<User>) {}
async findById(id: number): Promise<User | null> {
return await this.repo.findOne({ where: { id }});
}
async findByName(name: string): Promise<User | null> { async findByName(name: string): Promise<User | null> {
return this.repo.findOne({ where: { name }}); return await this.repo.findOne({ where: { name }});
} }
async findByEmail(email: string): Promise<User | null> { async findByEmail(email: string): Promise<User | null> {
return this.repo.findOne({ where: { email }}); return await this.repo.findOne({ where: { email }});
} }
async create(dto: CreateUserDto): Promise<User> { async create(dto: CreateUserDto): Promise<User> {
@ -31,11 +36,22 @@ export class UsersService {
if (!user) throw new NotFoundException("User not found"); if (!user) throw new NotFoundException("User not found");
const passwordValid = await bcrypt.compare(dto.currentPassword, user.password); const passwordValid = await bcrypt.compare(dto.currentPassword, user.password);
if (!passwordValid) throw new BadRequestException("Not matched password"); if (!passwordValid) throw new UnauthorizedException("Not matched password");
const hashed = await bcrypt.hash(dto.newPassword, 10); const hashed = await bcrypt.hash(dto.newPassword, 10);
user.password = hashed; user.password = hashed;
await this.repo.save(user); await this.repo.save(user);
} }
async findUserInfoByIdOrFail(id: number): Promise<UserInfoResponseDto> {
const user = await this.findById(id);
if (!user) throw new NotFoundException("User not found");
return {
id: user.id,
name: user.name,
email: user.email,
};
}
} }

Loading…
Cancel
Save