first commit

This commit is contained in:
2026-05-26 16:00:09 +03:30
commit 83fd5c1a86
81 changed files with 6867 additions and 0 deletions

View File

@@ -0,0 +1,47 @@
import { Request, Response, NextFunction } from "express";
import jwt from "jsonwebtoken";
import { User } from "../../models/User";
import { Role } from "../../models/Role";
import { Permission } from "../../models/Permission";
/**
* Middleware: استخراج اطلاعات کاربر از توکن JWT
* توکن باید در Header ارسال شود: Authorization: Bearer <token>
*/
export async function requireAuth(
req: Request,
res: Response,
next: NextFunction
) {
const authHeader = req.headers.authorization;
if (!authHeader || !authHeader.startsWith("Bearer ")) {
return res.status(401).json({ message: "توکن احراز هویت ارسال نشده است." });
}
const token = authHeader.split(" ")[1];
try {
// بررسی صحت و امضای JWT
const decoded: any = jwt.verify(token, process.env.JWT_SECRET!);
// پیدا کردن یوزر و نقش‌ها از دیتابیس
const user = await User.findByPk(decoded.userId, {
include: [
{
model: Role,
include: [Permission],
},
],
});
if (!user) {
return res.status(404).json({ message: "کاربر یافت نشد." });
}
// تزریق یوزر در request برای استفاده‌های بعدی
(req as any).user = user;
next();
} catch (err) {
return res.status(401).json({ message: "توکن نامعتبر یا منقضی است." });
}
}

View File

@@ -0,0 +1,24 @@
import { NextFunction } from "express";
import { ServerResponse } from "../types";
export function requirePermission(...permissions: string[]) {
return (req: Request, res: ServerResponse, next: NextFunction) => {
const user = (req as any).user;
if (!user)
return res
.status(401)
.json({ status: 401, data: {}, message: "احراز هویت انجام نشده است." });
const userPermissions =
user.Role?.Permissions?.map((p: any) => p.name) || [];
const hasPerm = permissions.every((p) => userPermissions.includes(p));
if (!hasPerm) {
return res
.status(403)
.json({ status: 403, data: {}, message: "دسترسی شما کافی نیست." });
}
next();
};
}

View File

@@ -0,0 +1,25 @@
import { NextFunction } from "express";
import { ServerResponse } from "../types";
export function requireRole(...roles: string[]) {
return (req: Request, res: ServerResponse, next: NextFunction) => {
const user = (req as any).user;
if (!user)
return res
.status(401)
.json({ status: 401, data: {}, message: "احراز هویت انجام نشده است." });
const userRole = user.Role?.name;
if (!userRole || !roles.includes(userRole)) {
return res
.status(403)
.json({
status: 403,
data: {},
message: "شما دسترسی لازم برای این عملیات را ندارید.",
});
}
next();
};
}