Sửa lỗi load danh sách người dùng trong quản lí

This commit is contained in:
2026-06-13 18:35:15 +07:00
parent 7b42058d77
commit 7fc80a49d0
7 changed files with 50 additions and 15 deletions
+2 -2
View File
@@ -7,10 +7,10 @@ export declare class JwtStrategy extends JwtStrategy_base {
private prisma; private prisma;
constructor(prisma: PrismaService); constructor(prisma: PrismaService);
validate(payload: any): Promise<{ validate(payload: any): Promise<{
id: number;
email: string; email: string;
passwordHash: string; id: number;
name: string | null; name: string | null;
passwordHash: string;
avatar: string | null; avatar: string | null;
createdAt: Date; createdAt: Date;
isAdmin: boolean; isAdmin: boolean;
+16 -5
View File
@@ -16,6 +16,9 @@ import { PrismaService } from './prisma.service.js';
import 'dotenv/config'; import 'dotenv/config';
import * as bcrypt from 'bcrypt'; import * as bcrypt from 'bcrypt';
import { AdminGuard } from './admin.guard.js'; import { AdminGuard } from './admin.guard.js';
import { JwtModule, JwtService } from '@nestjs/jwt';
import { JwtAuthGuard } from './jwt-auth.guard.js';
import { JwtStrategy } from './jwt.strategy.js';
let AppController = class AppController { let AppController = class AppController {
getHello() { getHello() {
return 'Travel Planning API is running!'; return 'Travel Planning API is running!';
@@ -31,8 +34,9 @@ AppController = __decorate([
Controller() Controller()
], AppController); ], AppController);
let AuthController = class AuthController { let AuthController = class AuthController {
constructor(prisma) { constructor(prisma, jwtService) {
this.prisma = prisma; this.prisma = prisma;
this.jwtService = jwtService;
} }
async getStatus() { async getStatus() {
const userCount = await this.prisma.user.count(); const userCount = await this.prisma.user.count();
@@ -48,8 +52,9 @@ let AuthController = class AuthController {
if (user.isBlocked) { if (user.isBlocked) {
throw new UnauthorizedException('Tài khoản của bạn đã bị khóa. Vui lòng liên hệ quản trị viên.'); throw new UnauthorizedException('Tài khoản của bạn đã bị khóa. Vui lòng liên hệ quản trị viên.');
} }
const payload = { email: user.email, sub: user.id };
return { return {
access_token: 'simulated-jwt-token', access_token: this.jwtService.sign(payload),
user: { user: {
id: user.id, id: user.id,
email: user.email, email: user.email,
@@ -94,7 +99,7 @@ __decorate([
], AuthController.prototype, "signup", null); ], AuthController.prototype, "signup", null);
AuthController = __decorate([ AuthController = __decorate([
Controller('v1/auth'), Controller('v1/auth'),
__metadata("design:paramtypes", [PrismaService]) __metadata("design:paramtypes", [PrismaService, JwtService])
], AuthController); ], AuthController);
let TourController = class TourController { let TourController = class TourController {
constructor(prisma) { constructor(prisma) {
@@ -221,15 +226,21 @@ __decorate([
], UserController.prototype, "toggleBlock", null); ], UserController.prototype, "toggleBlock", null);
UserController = __decorate([ UserController = __decorate([
Controller('v1/users'), Controller('v1/users'),
UseGuards(AdminGuard), UseGuards(JwtAuthGuard, AdminGuard),
__metadata("design:paramtypes", [PrismaService]) __metadata("design:paramtypes", [PrismaService])
], UserController); ], UserController);
let AppModule = class AppModule { let AppModule = class AppModule {
}; };
AppModule = __decorate([ AppModule = __decorate([
Module({ Module({
imports: [
JwtModule.register({
secret: process.env.JWT_SECRET || 'super-secret',
signOptions: { expiresIn: '1d' },
}),
],
controllers: [AppController, AuthController, TourController, UserController], controllers: [AppController, AuthController, TourController, UserController],
providers: [PrismaService], providers: [PrismaService, JwtStrategy],
exports: [PrismaService] exports: [PrismaService]
}) })
], AppModule); ], AppModule);
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+15 -4
View File
@@ -4,6 +4,9 @@ import { PrismaService } from './prisma.service.js';
import 'dotenv/config'; import 'dotenv/config';
import * as bcrypt from 'bcrypt'; import * as bcrypt from 'bcrypt';
import { AdminGuard } from './admin.guard.js'; import { AdminGuard } from './admin.guard.js';
import { JwtModule, JwtService } from '@nestjs/jwt';
import { JwtAuthGuard } from './jwt-auth.guard.js';
import { JwtStrategy } from './jwt.strategy.js';
@Controller() @Controller()
class AppController { class AppController {
@@ -15,7 +18,7 @@ class AppController {
@Controller('v1/auth') @Controller('v1/auth')
class AuthController { class AuthController {
constructor(private prisma: PrismaService) {} constructor(private prisma: PrismaService, private jwtService: JwtService) {}
@Get('status') @Get('status')
async getStatus() { async getStatus() {
@@ -38,8 +41,10 @@ class AuthController {
throw new UnauthorizedException('Tài khoản của bạn đã bị khóa. Vui lòng liên hệ quản trị viên.'); throw new UnauthorizedException('Tài khoản của bạn đã bị khóa. Vui lòng liên hệ quản trị viên.');
} }
const payload = { email: user.email, sub: user.id };
return { return {
access_token: 'simulated-jwt-token', access_token: this.jwtService.sign(payload),
user: { user: {
id: user.id, id: user.id,
email: user.email, email: user.email,
@@ -115,7 +120,7 @@ class TourController {
} }
@Controller('v1/users') @Controller('v1/users')
@UseGuards(AdminGuard) @UseGuards(JwtAuthGuard, AdminGuard)
class UserController { class UserController {
constructor(private prisma: PrismaService) {} constructor(private prisma: PrismaService) {}
@@ -164,8 +169,14 @@ class UserController {
} }
@Module({ @Module({
imports: [
JwtModule.register({
secret: process.env.JWT_SECRET || 'super-secret',
signOptions: { expiresIn: '1d' },
}),
],
controllers: [AppController, AuthController, TourController, UserController], controllers: [AppController, AuthController, TourController, UserController],
providers: [PrismaService], providers: [PrismaService, JwtStrategy],
exports: [PrismaService] exports: [PrismaService]
}) })
class AppModule {} class AppModule {}
+14 -2
View File
@@ -10,6 +10,7 @@
"dependencies": { "dependencies": {
"@nestjs/common": "^11.1.26", "@nestjs/common": "^11.1.26",
"@nestjs/core": "^11.1.26", "@nestjs/core": "^11.1.26",
"@nestjs/jwt": "^11.0.2",
"@nestjs/passport": "^11.0.5", "@nestjs/passport": "^11.0.5",
"@nestjs/platform-express": "^11.1.26", "@nestjs/platform-express": "^11.1.26",
"@prisma/adapter-pg": "^7.8.0", "@prisma/adapter-pg": "^7.8.0",
@@ -1157,6 +1158,19 @@
} }
} }
}, },
"node_modules/@nestjs/jwt": {
"version": "11.0.2",
"resolved": "https://registry.npmjs.org/@nestjs/jwt/-/jwt-11.0.2.tgz",
"integrity": "sha512-rK8aE/3/Ma45gAWfCksAXUNbOoSOUudU0Kn3rT39htPF7wsYXtKfjALKeKKJbFrIWbLjsbqfXX5bIJNvgBugGA==",
"license": "MIT",
"dependencies": {
"@types/jsonwebtoken": "9.0.10",
"jsonwebtoken": "9.0.3"
},
"peerDependencies": {
"@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0"
}
},
"node_modules/@nestjs/passport": { "node_modules/@nestjs/passport": {
"version": "11.0.5", "version": "11.0.5",
"resolved": "https://registry.npmjs.org/@nestjs/passport/-/passport-11.0.5.tgz", "resolved": "https://registry.npmjs.org/@nestjs/passport/-/passport-11.0.5.tgz",
@@ -2311,7 +2325,6 @@
"version": "9.0.10", "version": "9.0.10",
"resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz", "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz",
"integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==", "integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==",
"dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@types/ms": "*", "@types/ms": "*",
@@ -2332,7 +2345,6 @@
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
"integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
"dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
+1
View File
@@ -15,6 +15,7 @@
"dependencies": { "dependencies": {
"@nestjs/common": "^11.1.26", "@nestjs/common": "^11.1.26",
"@nestjs/core": "^11.1.26", "@nestjs/core": "^11.1.26",
"@nestjs/jwt": "^11.0.2",
"@nestjs/passport": "^11.0.5", "@nestjs/passport": "^11.0.5",
"@nestjs/platform-express": "^11.1.26", "@nestjs/platform-express": "^11.1.26",
"@prisma/adapter-pg": "^7.8.0", "@prisma/adapter-pg": "^7.8.0",