Add full project files

This commit is contained in:
root
2026-07-04 19:24:56 +03:30
parent d54f5441a3
commit b245e7b71a
835 changed files with 30149 additions and 0 deletions

View File

@@ -0,0 +1,383 @@
const express = require("express");
const router = express.Router();
const academyController = require("../../../controllers/application/academy/academyControllers");
const multer = require("multer");
const path = require("path");
const fs = require("fs");
// const academyCategoryController = require("../../../controllers/application/academy/academyCategoryController");
// ==========================================
// ⚙️ تنظیمات اولیه و دایرکتوری‌ها
// ==========================================
// اطمینان از وجود دایرکتوری‌ها
const ensureDir = (dir) => {
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir, { recursive: true });
console.log("DEBUG: Created directory:", dir);
}
};
const BASE_DIR = process.cwd();
const courseVideoDir = path.join(BASE_DIR, "storage", "courses", "videos");
const courseImageDir = path.join(BASE_DIR, "storage", "courses", "images");
console.log("DEBUG: BASE_DIR:", BASE_DIR);
console.log("DEBUG: courseVideoDir:", courseVideoDir);
console.log("DEBUG: courseImageDir:", courseImageDir);
ensureDir(courseVideoDir);
ensureDir(courseImageDir);
// ==========================================
// 📁 تنظیمات آپلود فایل با Multer
// ==========================================
// تنظیمات ذخیره‌سازی فایل‌ها
const storage = multer.diskStorage({
destination: (req, file, cb) => {
console.log("DEBUG: Multer destination - fieldname:", file.fieldname);
// استفاده از دایرکتوری موقت برای آپلود اولیه
const tempDir = "/tmp/modstagram-uploads";
if (!fs.existsSync(tempDir)) {
fs.mkdirSync(tempDir, { recursive: true });
}
cb(null, tempDir);
},
filename: (req, file, cb) => {
const uniqueSuffix = Date.now() + "-" + Math.round(Math.random() * 1e9);
const filename = uniqueSuffix + path.extname(file.originalname);
console.log("DEBUG: Generated filename:", filename);
cb(null, filename);
},
});
// تنظیمات Multer با محدودیت حجم 500 مگابایت
const upload = multer({
storage: storage,
limits: {
fileSize: 500 * 1024 * 1024, // 500 MB
},
});
// ==========================================
// 🏢 مسیرهای مربوط به آکادمی
// ==========================================
// دریافت اطلاعات آکادمی کاربر جاری
router.get("/", academyController.findAcademy);
// یافتن آکادمی با شناسه
router.post("/findAcademyById", academyController.findAcademyById);
// تکمیل پروفایل آکادمی
router.post("/academy/profile", academyController.academyProfile);
// ==========================================
// 📚 مسیرهای مدیریت دوره‌ها (Courses)
// ==========================================
// ایجاد دوره جدید
router.post("/academy/creat/course", academyController.creatCourse);
// ویرایش دوره
router.patch("/academy/update/course", academyController.updateCourse);
// حذف دوره (تغییر وضعیت به reject)
router.delete("/academy/delete/course", academyController.deleteCourse);
// دریافت لیست دوره‌های آکادمی جاری
router.get("/academy/get/course", academyController.getCourse);
// دریافت لیست همه دوره‌ها با فیلتر و صفحه‌بندی
router.get("/academy/get/curses", academyController.getCourses);
// دریافت دوره‌های یک آکادمی خاص
router.get("/academy/get/getAcademyCourse/:Id", academyController.getAcademyCourse);
// ==========================================
// 💳 مسیرهای پرداخت و مالی
// ==========================================
// پرداخت برای اشتراک پرو
router.post("/academy/course/payment", academyController.proPayment);
// کال‌بک درگاه پرداخت زرین‌پال (اشتراک پرو)
router.get("/academy/course/pro", academyController.handleCoursePaymentCallback);
// پرداخت برای خرید دوره
router.post("/academy/course/payment-web", academyController.coursePayment);
// کال‌بک درگاه پرداخت زرین‌پال (خرید دوره)
router.get("/academy/course/payment/verify", academyController.CoursePaymentCallback);
// ==========================================
// 🎬 مسیرهای محتوای دوره (ویدیوها و فایل‌ها)
// ==========================================
// دریافت محتوای دوره (ویدیوها)
router.get("/academy/course/content", academyController.getCourseContent);
// حذف ویدیو از دوره
router.delete("/academy/course/content/video", academyController.deleteCourseVideo);
// ==========================================
// 📹 مسیرهای آپلود ویدیو (۳ روش مختلف)
// ==========================================
// روش 1: آپلود معمولی با Multipart (با استفاده از Multer)
router.post(
"/academy/course/creat/video",
(req, res, next) => {
console.log("===== STEP 1: Route hit =====");
console.log("Content-Type:", req.headers["content-type"]);
next();
},
(req, res, next) => {
console.log("===== STEP 2: Before multer =====");
next();
},
(req, res, next) => {
// اجرای manual multer با try-catch
upload.single("video")(req, res, (err) => {
if (err) {
console.log("===== MULTER ERROR =====");
console.log("Error name:", err.name);
console.log("Error message:", err.message);
console.log("Full error:", err);
return res.status(400).json({
success: false,
message: `خطا در آپلود: ${err.message}`,
error: err.toString(),
});
}
console.log("===== STEP 3: Multer completed successfully =====");
next();
});
},
(req, res, next) => {
console.log("===== STEP 4: After multer =====");
console.log("req.file:", req.file);
console.log("req.body:", req.body);
if (!req.file) {
console.log("ERROR: No file in req.file!");
return res.status(400).json({
success: false,
message: "فایلی دریافت نشد",
});
}
next();
},
academyController.creatCourseVideo
);
// روش 2: آپلود با Base64 (برای فایل‌های کوچک)
router.post(
"/academy/course/creat/video-base64",
academyController.creatCourseVideoBase64
);
// روش 3: آپلود تکه‌تکه (Chunk Upload) - مناسب برای فایل‌های بزرگ
// دریافت هر تکه از ویدیو
router.post(
"/academy/course/creat/video-chunk",
academyController.creatCourseVideoChunk
);
// ادغام تکه‌ها بعد از اتمام آپلود
router.post(
"/academy/course/creat/video-chunk/merge",
academyController.mergeVideoChunks
);
// بررسی وضعیت آپلود (برای قابلیت Resume)
router.get("/academy/course/upload-status", academyController.getUploadStatus);
// ==========================================
// ❤️ مسیرهای لایک و تعامل
// ==========================================
// لایک کردن محتوای دوره
router.post("/academy/course/like", academyController.likeCourseContent);
// حذف لایک (دیسلایک)
router.post("/academy/course/dislike", academyController.dontLikeCourseContent);
// بررسی وضعیت لایک کاربر
router.post("/academy/course/is-like", academyController.isLikeCourseContent);
// دریافت تعداد لایک‌های یک دوره
router.get(
"/academy/course/likes-count/:courseId",
academyController.getCourseLikesCount
);
// دریافت لیست دوره‌های لایک شده توسط کاربر
router.get(
"/academy/user/liked-courses",
academyController.getUserLikedCourses
);
// ==========================================
// 💬 مسیرهای کامنت و نظرات
// ==========================================
// دریافت تعداد کل کامنت‌های یک دوره
router.get(
"/course/:courseId/comments/count",
academyController.getTotalCommentsCount
);
// دریافت لیست کامنت‌های یک دوره
router.get("/course/:courseId/comments", academyController.getCourseComments);
// ایجاد کامنت جدید
router.post("/comment/create", academyController.createComment);
// تغییر وضعیت کامنت (تایید/رد)
router.patch(
"/comment/:commentId/status",
academyController.updateCommentStatus
);
// حذف کامنت
router.delete("/comment/:commentId/delete", academyController.deleteComment);
// ==========================================
// 🛒 مسیرهای دوره‌های خریداری شده
// ==========================================
// دریافت دوره‌های خریداری شده توسط کاربر جاری
router.get(
"/course/getUserPurchasedCourses",
academyController.getUserPurchasedCourses
);
// دریافت دوره‌های خریداری شده (با populate - روش بهینه)
router.get(
"/course/getUserPurchasedCoursesWithPopulate",
academyController.getUserPurchasedCoursesWithPopulate
);
// دریافت همه پرداخت‌های آکادمی
router.get(
"/course/getAllAcademyPayments",
academyController.getAllAcademyPayments
);
// بررسی خرید دوره توسط کاربر
router.get(
"/course/checkCoursePurchase/:courseId",
academyController.checkCoursePurchase
);
// ==========================================
// 📊 مسیرهای آمار و گزارشات (STATIC)
// ==========================================
// آمار پرداخت‌ها
router.get("/payments/stats", academyController.getPaymentStats);
// آمار دوره‌ها
router.get("/courses/stats", academyController.getCourseStats);
// آمار دوره‌های خریداری شده
router.get("/purchased/stats", academyController.getPurchasedStats);
// آمار آکادمی‌ها
router.get("/academies/stats", academyController.getAcademyStats);
// ==========================================
// ⚙️ مسیرهای تنظیمات (Settings)
// ==========================================
// دریافت همه تنظیمات
router.get("/settings/all", academyController.getAllSettings);
router.get("/settings", academyController.getAllSettings);
// به‌روزرسانی همه تنظیمات
router.put("/settings/all", academyController.updateAllSettings);
router.put("/settings", academyController.updateAllSettings);
// دریافت و ویرایش قیمت دوره‌ها
router.get("/settings/course-prices", academyController.getCoursePrices);
router.put("/settings/course-price", academyController.updateCoursePrice);
// دریافت و ویرایش مالیات
router.get("/settings/tax", academyController.getTax);
router.put("/settings/tax", academyController.updateTax);
// ==========================================
// 🏷️ مسیرهای دسته‌بندی آکادمی (Categories)
// ==========================================
// دریافت لیست دسته‌بندی‌ها (با فیلتر و صفحه‌بندی)
router.get('/categories', academyController.getAll);
// دریافت درخت دسته‌بندی (ساختار سلسله‌مراتبی)
router.get('/categories/tree', academyController.getTree);
// دریافت دسته‌بندی‌های ویژه (برای نمایش در هوم پیج)
router.get('/categories/featured', academyController.getFeatured);
// دریافت دسته‌بندی با اسلاگ (برای سئو و لینک‌های زیبا)
router.get('/categories/slug/:slug', academyController.getBySlug);
// دریافت یک دسته‌بندی با شناسه
router.get('/categories/:id', academyController.getOne);
// ایجاد دسته‌بندی جدید
router.post('/categories', academyController.create);
// ویرایش دسته‌بندی (هم PUT و هم PATCH پشتیبانی می‌شود)
router.put('/categories/:id', academyController.update);
router.patch('/categories/:id', academyController.update);
// حذف دسته‌بندی (سافت دیلیت - فقط غیرفعال می‌شود)
router.delete('/categories/:id', academyController.remove);
// حذف فیزیکی دسته‌بندی (به همراه query string permanent=true)
router.delete('/categories/:id/permanent', (req, res) => {
req.query.permanent = 'true';
academyController.remove(req, res);
});
// تغییر وضعیت دسته‌بندی (فعال/غیرفعال)
router.patch('/categories/:id/status', academyController.toggleStatus);
// افزایش تعداد دوره‌های دسته‌بندی (هر بار یک دوره جدید اضافه می‌شود)
router.post('/categories/:id/increment-count', academyController.incrementCourseCount);
// ==========================================
// 👑 مسیرهای مدیریتی (پنل ادمین)
// ==========================================
// ------ مدیریت پرداخت‌ها ------
router.get("/payments", academyController.getAllPayments);
router.put("/payments/status", academyController.updatePaymentStatus);
// ------ مدیریت دوره‌ها ------
router.get("/courses", academyController.getAllCourses);
router.get("/courses/:id", academyController.getCourseById);
router.put("/courses/:id", academyController.updateCourse);
router.post("/courses", academyController.createCourse);
router.put("/academy/courses/status", academyController.updateCourseStatus);
router.delete("/courses/:courseId", academyController.admindeleteCourse);
// ------ مدیریت دوره‌های خریداری شده ------
router.get("/purchased", academyController.getAllPurchasedCourses);
// ------ مدیریت آکادمی‌ها ------
router.get("/academies", academyController.getAllAcademies);
router.get("/academies/:id", academyController.getAcademyById);
router.put("/academies/:id", academyController.updateAcademy);
router.post("/academies", academyController.createAcademy);
router.put("/academies/status", academyController.updateAcademyStatus);
router.delete("/academies/:id", academyController.deleteAcademy);
// ==========================================
// 📤 خروجی روت‌ها
// ==========================================
module.exports = router;

View File

@@ -0,0 +1,45 @@
const express = require('express')
const blockCheck = require('../../../middlewares/blockCheck')
const { createAdvertisingValidationRules, createAdvertising, getAdvertisingTypes, getAdvertisingCategory, getSingleAdvertising, getAdvertisingFeatures, getAdvertisings, toggleLike, addComment, getComments, rateAdvertising, getUserAdvertisings, editAdvertising, getUserSingleAdvertising, getUserAdvertisingProfile, updateUserAdvertisingProfile, getAdvertisingsWeb, getSingleAdvertisingWeb, getUserAdvertisingProfileWeb } = require('../../../controllers/application/advertising/advertisingController')
const auth = require('../../../middlewares/auth')
const { initiateAdvertisingPayment, handleAdvertisingPaymentCallback, handleAdvertisingRepublishPaymentCallback, republishAdvertisingPayment, handleSuccessfulAdvertisingPayment, handleFailedAdvertisingPayment, handleFailedAdvertisingRepublishPayment, handleSuccessfulAdvertisingRepublishPayment } = require('../../../controllers/application/payment/paymentController')
const { initiateAdvertisingPaymentWeb, handleAdvertisingPaymentCallbackWeb, republishAdvertisingPaymentWeb, handleAdvertisingRepublishPaymentCallbackWeb } = require('../../../controllers/application/payment/paymentControllerWeb')
const router = express.Router()
router.get('/', [auth], getAdvertisings)
router.get('/web', getAdvertisingsWeb)
router.get('/profile', [auth], getUserAdvertisingProfile)
router.get('/profile-web', getUserAdvertisingProfileWeb)
router.patch('/profile', [auth], [blockCheck], updateUserAdvertisingProfile)
router.get('/user-advertising', [auth], getUserAdvertisings)
router.post('/create', [auth], [blockCheck], createAdvertisingValidationRules(), createAdvertising)
router.get('/types', [auth], getAdvertisingTypes)
router.get('/categories', getAdvertisingCategory)
router.get('/features', [auth], getAdvertisingFeatures)
router.get('/get/:advertisingId', [auth], getSingleAdvertising)
router.get('/get/web/:advertisingId', getSingleAdvertisingWeb)
router.get('/get-detail/:advertisingId', [auth], getUserSingleAdvertising)
router.post('/initiate-payment', [auth], [blockCheck], initiateAdvertisingPayment)
router.post('/initiate-payment-web', [auth], [blockCheck], initiateAdvertisingPaymentWeb)
router.post('/republish-payment', [auth], [blockCheck], republishAdvertisingPayment)
router.post('/republish-payment-web', [auth], [blockCheck], republishAdvertisingPaymentWeb)
router.get('/payment', handleAdvertisingPaymentCallback)
router.get('/payment-web', handleAdvertisingPaymentCallbackWeb)
router.get('/republish-verify-payment', handleAdvertisingRepublishPaymentCallback)
router.get('/republish-verify-payment-web', handleAdvertisingRepublishPaymentCallbackWeb)
router.post('/like', [blockCheck], [auth], toggleLike)
router.post('/comment', [blockCheck], [auth], addComment)
router.get('/comments', getComments)
router.post('/rate', [blockCheck], [auth], rateAdvertising)
router.post('/edit/:id', [blockCheck], [auth], editAdvertising)
// Route for handling successful payment
router.post('/payment-success', handleSuccessfulAdvertisingPayment)
// Route for handling failed payment
router.post('/payment-failed', handleFailedAdvertisingPayment)
// Route for handling successful payment
router.post('/republish-payment-success', handleSuccessfulAdvertisingRepublishPayment)
// Route for handling failed payment
router.post('/republish-payment-failed', handleFailedAdvertisingRepublishPayment)
module.exports = router
module.exports = router

View File

@@ -0,0 +1,7 @@
const express = require('express')
const router = express.Router()
const citysController = require('../../../controllers/application/citysController')
router.get('/:id', citysController.getCities)
module.exports = router

View File

@@ -0,0 +1,6 @@
const express = require('express')
const { getExpertise } = require('../../../controllers/application/expertise/expertiseController')
const router = express.Router()
router.get('/', getExpertise)
module.exports = router

View File

@@ -0,0 +1,6 @@
const express = require('express')
const { getFinancial } = require('../../../controllers/application/financial/financialController')
const router = express.Router()
router.get('/', getFinancial)
module.exports = router

View File

@@ -0,0 +1,14 @@
const express = require('express')
const router = express.Router()
const { loginValidationRules, loginUser } = require('../../../controllers/application/login/loginController')
const { verifyUser } = require('../../../controllers/application/login/verifyController')
const { changePasswordUser, changePasswordValidationRules, editChangePasswordUser } = require('../../../controllers/application/login/changePasswordController')
const { loginWithUserName } = require('../../../controllers/application/login/loginWithUserName')
router.post('/', loginValidationRules(), loginUser)
router.post('/verify', verifyUser)
router.post('/change_password', changePasswordValidationRules(), changePasswordUser)
router.patch('/change_password', changePasswordValidationRules(), editChangePasswordUser)
router.post('/login_username', loginWithUserName)
module.exports = router

View File

@@ -0,0 +1,6 @@
const express = require('express')
const { getMessages, getUnreadMessages } = require('../../../controllers/application/messages/messageController')
const router = express.Router()
router.get('/', getMessages)
router.get('/unread', getUnreadMessages)
module.exports = router

View File

@@ -0,0 +1,6 @@
const express = require('express')
const { getNotifications, unreadNotifications } = require('../../../controllers/application/notification/notificationController')
const router = express.Router()
router.get('/', getNotifications)
router.get('/unread', unreadNotifications)
module.exports = router

View File

@@ -0,0 +1,18 @@
const express = require('express')
const { getUserOffers, getOfferTypes, handleSuccessfulOfferPayment, handleFailedOfferPayment, updateOfferStatus, createOfferComment } = require('../../../controllers/application/offer/offerController')
const { initiateOfferPaymentWeb, handleOfferPaymentCallback } = require('../../../controllers/application/payment/paymentControllerWeb')
const blockCheck = require('../../../middlewares/blockCheck')
const isRegister = require('../../../middlewares/isRegister')
const auth = require('./../../../middlewares/auth')
const router = express.Router()
router.get('/', getUserOffers)
router.get('/types', [auth], getOfferTypes)
router.post('/update-status', [auth], updateOfferStatus)
router.post('/payment-success', [auth], handleSuccessfulOfferPayment)
router.post('/payment-failed', [auth], handleFailedOfferPayment)
router.post('/comment', [auth], createOfferComment)
router.post('/initiate-payment-web', [auth], [blockCheck], initiateOfferPaymentWeb)
router.get('/payment-web', handleOfferPaymentCallback)
module.exports = router

View File

@@ -0,0 +1,204 @@
const express = require('express');
const { createPostValidationRules, createPost, getUserPosts, getUserPostsWeb } = require('../../../controllers/application/posts/postController');
const { toggleLike } = require('../../../controllers/application/posts/likeController');
const blockCheck = require('../../../middlewares/blockCheck');
const auth = require('../../../middlewares/auth');
const isHalfRegister = require('../../../middlewares/isHalfRegister');
const path = require('path');
const fs = require('fs');
const multer = require('multer');
console.log('DEBUG: Starting to load routes/posts.js');
const ensureDir = (dir) => {
console.log('DEBUG: Ensuring directory exists:', dir);
if (!fs.existsSync(dir)) {
console.log('DEBUG: Directory does not exist, creating:', dir);
fs.mkdirSync(dir, { recursive: true });
} else {
console.log('DEBUG: Directory already exists:', dir);
}
};
const imageDir = path.join(__dirname, '../../../storage/posts/images');
const videoDir = path.join(__dirname, '../../../storage/posts/videos');
console.log('DEBUG: imageDir path:', imageDir);
console.log('DEBUG: videoDir path:', videoDir);
ensureDir(imageDir);
ensureDir(videoDir);
console.log('DEBUG: Setting up multer storage');
const storage = multer.diskStorage({
destination: (req, file, cb) => {
const dir = file.mimetype.startsWith('video/') ? videoDir : imageDir;
console.log('DEBUG: multer destination for file', file.originalname, ':', dir);
cb(null, dir);
},
filename: (req, file, cb) => {
const filename = `${Date.now()}-${file.originalname}`;
console.log('DEBUG: Generated filename for', file.originalname, ':', filename);
cb(null, filename);
},
});
console.log('DEBUG: Setting up multer instance with limits and filter');
const upload = multer({
storage,
limits: {
fileSize: 100 * 1024 * 1024, // حداکثر 100MB
files: 10, // حداکثر 10 فایل
fieldSize: 1024 * 1024,
fieldNameSize: 100,
},
fileFilter: (req, file, cb) => {
console.log('DEBUG: Checking file filter for', file.originalname, 'mimetype:', file.mimetype);
if (file.mimetype.startsWith('image/') || file.mimetype.startsWith('video/')) {
console.log('DEBUG: File accepted:', file.originalname);
cb(null, true);
} else {
console.log('DEBUG: File rejected:', file.originalname);
cb(new Error('فقط تصاویر یا ویدئوها مجاز هستند'), false);
}
},
}).array('post_files', 10);
const multerErrorHandler = (err, req, res, next) => {
console.log('DEBUG: Request headers:', JSON.stringify(req.headers, null, 2));
console.log('DEBUG: Request body (raw):', req.body);
console.log('DEBUG: Request files:', req.files || 'No files received');
if (err instanceof multer.MulterError) {
console.error('DEBUG: Multer error:', err.message, err.code, err.field);
return res.status(400).json({
error: true,
message: `خطای آپلود: ${err.message} (${err.code})`,
field: err.field,
});
} else if (err) {
console.error('DEBUG: File filter error:', err.message);
return res.status(400).json({
error: true,
message: err.message,
});
}
console.log('DEBUG: Multer processing completed, files:', req.files || 'No files');
console.log('DEBUG: Request body after multer:', req.body);
next();
};
console.log('DEBUG: Setting up express router');
const router = express.Router();
// روت اصلی با multipart/form-data
router.post(
'/create',
(req, res, next) => {
console.log('DEBUG: reached auth');
console.log('DEBUG: Raw request headers:', JSON.stringify(req.headers, null, 2));
next();
},
auth,
(req, res, next) => {
console.log('DEBUG: reached blockCheck');
next();
},
blockCheck,
(req, res, next) => {
console.log('DEBUG: reached isHalfRegister');
next();
},
isHalfRegister,
(req, res, next) => {
console.log('DEBUG: reached multer');
console.log('DEBUG: Content-Length:', req.headers['content-length']);
console.log('DEBUG: Content-Type:', req.headers['content-type']);
next();
},
upload,
multerErrorHandler,
(req, res, next) => {
console.log('DEBUG: reached validation');
console.log('DEBUG: Parsed files:', req.files || 'No files');
console.log('DEBUG: Parsed body:', req.body);
next();
},
createPostValidationRules(),
(req, res, next) => {
console.log('DEBUG: reached controller');
next();
},
createPost
);
// روت جدید برای Base64
router.post(
'/create-base64',
(req, res, next) => {
console.log('DEBUG: reached auth for base64');
console.log('DEBUG: Raw request headers:', JSON.stringify(req.headers, null, 2));
next();
},
auth,
(req, res, next) => {
console.log('DEBUG: reached blockCheck for base64');
next();
},
blockCheck,
(req, res, next) => {
console.log('DEBUG: reached isHalfRegister for base64');
next();
},
isHalfRegister,
(req, res, next) => {
console.log('DEBUG: Request body (base64):', JSON.stringify(req.body, null, 2));
next();
},
createPostValidationRules(),
async (req, res) => {
try {
const { files, caption } = req.body;
console.log('DEBUG: Received files (base64):', files.length);
console.log('DEBUG: Received caption:', caption);
// تبدیل Base64 به فایل
const savedFiles = await Promise.all(
files.map(async (file, index) => {
const buffer = Buffer.from(file.data.split(',')[1], 'base64');
const dir = file.type.startsWith('video/') ? videoDir : imageDir;
const filename = `${Date.now()}-${index}-${file.name}`;
const filePath = path.join(dir, filename);
console.log('DEBUG: Saving file:', filePath);
await fs.promises.writeFile(filePath, buffer);
return {
path: filePath,
filename,
mimetype: file.type,
};
})
);
// فراخوانی createPost با فرمت مشابه
req.files = savedFiles;
req.body = { caption };
console.log('DEBUG: Prepared files for createPost:', savedFiles);
console.log('DEBUG: Prepared body for createPost:', req.body);
await createPost(req, res);
} catch (err) {
console.error('DEBUG: Base64 processing error:', err.message);
res.status(400).json({
error: true,
message: `خطای پردازش فایل‌ها: ${err.message}`,
});
}
}
);
router.post('/like', [auth, blockCheck], toggleLike);
router.get('/user-posts', [auth], getUserPosts);
router.get('/user-posts/web', getUserPostsWeb);
console.log('DEBUG: Finished loading routes/posts.js');
module.exports = router;

View File

@@ -0,0 +1,8 @@
const express = require('express')
const { getProfile , getUserById} = require('../../../controllers/application/profile/profileController')
const auth = require('../../../middlewares/auth')
const router = express.Router()
router.get('/',[auth], getProfile)
router.get('/:id', getUserById)
module.exports = router

View File

@@ -0,0 +1,44 @@
const express = require('express')
const { createProject, createProjectValidationRules } = require('../../../controllers/application/projects/createProjectController')
const { getProjects, getSingleProjects, getSingleProjectsWeb, getUserProjects, getUserProjectsWeb } = require('../../../controllers/application/projects/getProjectController')
const { getProjectTypes } = require('../../../controllers/application/projects/projectTypesController')
const { initiatePayment, handlePaymentCallback, paymentRequestStepOne, paymentRequestStepTwo, paymentRequestStepAll, paymentRequestStepOneCallback, paymentRequestStepTwoCallback, paymentRequestStepAllCallback, handleSuccessfulPayment, handleFailedPayment } = require('../../../controllers/application/payment/paymentController')
const auth = require('../../../middlewares/auth')
const { requestProjectValidationRules, requestProject, acceptProject, editRequestProject } = require('../../../controllers/application/projects/requestProjectController')
const { editProject, doneProject, cancleProject, editProjectValidationRules, setRateProject, doneProjectWeb } = require('../../../controllers/application/projects/updateProjectController')
const blockCheck = require('../../../middlewares/blockCheck')
const isRegister = require('../../../middlewares/isRegister')
const { initiatePaymentWeb, handlePaymentCallbackWeb, paymentRequestAcceptWeb } = require('../../../controllers/application/payment/paymentControllerWeb')
const router = express.Router()
router.get('/', getProjects)
router.get('/user-projects', [auth], getUserProjects)
router.get('/user-projects/web', getUserProjectsWeb)
router.get('/types', [auth], getProjectTypes)
router.get('/get/:projectId', [auth], getSingleProjects)
router.get('/get/web/:projectId', getSingleProjectsWeb)
router.get('/payment', handlePaymentCallback)
router.get('/payment-web', handlePaymentCallbackWeb)
router.post('/create', [blockCheck], [auth], [isRegister], createProjectValidationRules(), createProject)
router.post('/edit', [blockCheck], [auth], [isRegister], editProjectValidationRules(), editProject)
router.post('/rate', [blockCheck], [auth], [isRegister], setRateProject)
router.post('/initiate-payment', [blockCheck], [isRegister], [auth], initiatePayment)
router.post('/initiate-payment-web', [blockCheck], [isRegister], [auth], initiatePaymentWeb)
router.post('/request', [blockCheck], [isRegister], [auth], requestProjectValidationRules(), requestProject)
router.post('/edit-request', [isRegister], [blockCheck], [auth], requestProjectValidationRules(), editRequestProject)
router.post('/payment-request-step-one', [isRegister], [blockCheck], [auth], paymentRequestStepOne)
router.post('/payment-request-step-one/web', [isRegister], [blockCheck], [auth], paymentRequestAcceptWeb)
router.post('/payment-request-step-two', [isRegister], [blockCheck], [auth], paymentRequestStepTwo)
router.post('/payment-request-all', [isRegister], [blockCheck], [auth], paymentRequestStepAll)
router.get('/payment-request-step-one-callback', paymentRequestStepOneCallback)
router.get('/payment-request-step-two-callback', paymentRequestStepTwoCallback)
router.get('/payment-request-step-all-callback', paymentRequestStepAllCallback)
router.post('/accept', [isRegister], [blockCheck], [auth], acceptProject)
router.post('/done', [isRegister], [auth], doneProject)
router.post('/done/web', [isRegister], [auth], doneProjectWeb)
router.post('/cancle', [isRegister], [blockCheck], [auth], cancleProject)
// Route for handling successful payment
router.post('/payment-success', handleSuccessfulPayment)
// Route for handling failed payment
router.post('/payment-failed', handleFailedPayment)
module.exports = router

View File

@@ -0,0 +1,7 @@
const express = require('express')
const router = express.Router()
const provincesController = require('../../../controllers/application/provincesController')
router.get('/', provincesController.getProvinces)
module.exports = router

View File

@@ -0,0 +1,16 @@
const express = require('express')
const router = express.Router()
const { registerValidationRules, registerUser } = require('../../../controllers/application/register/registerController')
const { verifyUser } = require('../../../controllers/application/register/verifyController')
const { setUserName, updateUserName } = require('../../../controllers/application/register/usernameController')
const { setUserFullName, setUserFullNameValidationRules } = require('../../../controllers/application/register/userFullNameController')
const { setUserType } = require('../../../controllers/application/register/userTypeController')
router.post('/', registerValidationRules(), registerUser)
router.post('/verify', verifyUser)
router.post('/username', setUserName)
router.patch('/username', updateUserName)
router.post('/fullname', setUserFullNameValidationRules(), setUserFullName)
router.post('/user_type', setUserType)
module.exports = router

View File

@@ -0,0 +1,6 @@
const express = require('express')
const { getSearch } = require('../../../controllers/application/search-web/searchController')
const router = express.Router()
router.get('/', getSearch)
module.exports = router

View File

@@ -0,0 +1,6 @@
const express = require('express')
const { getSearch } = require('../../../controllers/application/search/searchController')
const router = express.Router()
router.get('/', getSearch)
module.exports = router

View File

@@ -0,0 +1,6 @@
const express = require('express')
const { getSetting } = require('../../../controllers/application/settings/settingsController')
const router = express.Router()
router.get('/:key', getSetting)
module.exports = router

View File

@@ -0,0 +1,9 @@
const express = require('express')
const { getUserTickets, createTicket, addUserMessageToTicket, getTicketMessages } = require('../../../controllers/application/tickets/ticketsController')
const router = express.Router()
router.get('/', getUserTickets)
router.get('/messages', getTicketMessages)
router.post('/create', createTicket)
router.post('/message', addUserMessageToTicket)
module.exports = router

View File

@@ -0,0 +1,22 @@
const express = require('express')
const { getUsers, getSingleUser, blockUser, unblockUser, getComments,createLicense, getAllLicenses,updateLicenseConfirmation, getLicenseByUserId, inviteEmployer, getUserContactInfo, getPostsWeb, getSingleUserWeb, createUserComment } = require('../../../controllers/application/users/getUserController')
const blockCheck = require('../../../middlewares/blockCheck')
const isRegister = require('../../../middlewares/isRegister')
const auth = require('../../../middlewares/auth')
const router = express.Router()
router.get('/', [auth], getUsers)
router.get('/web', getPostsWeb)
router.get('/get', [auth], getSingleUser)
router.get('/get/web', getSingleUserWeb)
router.post('/block', [auth], [isRegister], [blockCheck], blockUser)
router.post('/unblock', [auth], [isRegister], [blockCheck], unblockUser)
router.get('/comments', [auth], getComments)
router.post('/comments', [auth], [isRegister], [blockCheck], createUserComment)
router.get('/invite-employer', [auth], [isRegister], [blockCheck], inviteEmployer)
router.get('/contact-info', [auth], getUserContactInfo)
router.get('/License', getAllLicenses)
router.get('/License/:userId', getLicenseByUserId)
router.post('/License', createLicense)
router.put('/License/:userId', updateLicenseConfirmation)
module.exports = router

View File

@@ -0,0 +1,38 @@
const express = require('express')
const { setProfileImage, updateProfileImage } = require('../../../controllers/application/verify/setProfileImageController')
const { setExpertise, updateExpertise } = require('../../../controllers/application/verify/expertiseController')
const { setGender } = require('../../../controllers/application/verify/genderController')
const { setSizes, updateSizes } = require('../../../controllers/application/verify/sizesController')
const { setColors, updateColors } = require('../../../controllers/application/verify/colorsController')
const { setCooperationType, updateCooperationType } = require('../../../controllers/application/verify/cooperationTypeController')
const { setConversation, updateConversation } = require('../../../controllers/application/verify/conversationController')
const { saveAuth, saveAuthValidationRules, updateShaba } = require('../../../controllers/application/verify/authController')
const { setAddress, updateAddress } = require('../../../controllers/application/verify/addressController')
const { setNationalCardImage } = require('../../../controllers/application/verify/setNationalCardImageController')
const blockCheck = require('../../../middlewares/blockCheck')
const auth = require('../../../middlewares/auth')
const { setServices, updateServices } = require('../../../controllers/application/verify/servicesController')
const router = express.Router()
router.post('/profile_image', setProfileImage)
router.patch('/profile_image', [blockCheck], [auth], updateProfileImage)
router.post('/expertise', setExpertise)
router.patch('/expertise', [blockCheck], [auth], updateExpertise)
router.post('/gender', setGender)
router.post('/sizes', setSizes)
router.patch('/sizes', [blockCheck], [auth], updateSizes)
router.post('/services', setServices)
router.patch('/services', [blockCheck], [auth], updateServices)
router.post('/colors', setColors)
router.patch('/colors', [blockCheck], [auth], updateColors)
router.post('/cooperation_type', setCooperationType)
router.patch('/cooperation_type', [blockCheck], [auth], updateCooperationType)
router.post('/conversation', setConversation)
router.patch('/conversation', [blockCheck], [auth], updateConversation)
router.post('/auth', saveAuthValidationRules(), saveAuth)
router.patch('/shaba', [blockCheck], [auth], updateShaba)
router.post('/address', setAddress)
router.patch('/address', [blockCheck], [auth], updateAddress)
router.post('/national_card_image', setNationalCardImage)
module.exports = router

View File

@@ -0,0 +1,6 @@
const express = require('express')
const { getVersion } = require('../../../controllers/application/version/versionController')
const router = express.Router()
router.get('/', getVersion)
module.exports = router

View File

@@ -0,0 +1,8 @@
const express = require('express')
const { getProjects, getSingleProject, getProjectRequests } = require('../../../controllers/application/workroom/workroomController')
const router = express.Router()
router.get('/', getProjects)
router.get('/get', getSingleProject)
router.get('/get-requests/:projectId', getProjectRequests)
module.exports = router

77
routes/index.js Normal file
View File

@@ -0,0 +1,77 @@
const registerRouter = require('./application/register')
const loginRouter = require('./application/login')
const verifyRouter = require('./application/verify')
const provincesRouter = require('./application/provinces')
const citiesRouter = require('./application/city')
const projectsRouter = require('./application/projects')
const usersRouter = require('./application/users')
const postsRouter = require('./application/posts')
const expertiseRouter = require('./application/expertise')
const profileRouter = require('./application/profile')
const workroomRouter = require('./application/workroom')
const messagesRouter = require('./application/messages')
const searchRouter = require('./application/search')
const searchRouterWeb = require('./application/search-web')
const financialRouter = require('./application/financial')
const notificationRouter = require('./application/notification')
const ticketsRouter = require('./application/tickets')
const advertisingRouter = require('./application/advertising')
const settingsRouter = require('./application/settings')
const versionRouter = require('./application/version')
const offerRouter = require('./application/offers')
const academyRoute = require('./application/academy')
const projectsPanelRouter = require('./panel/projects')
const postsPanelRouter = require('./panel/posts')
const expertisePanelRouter = require('./panel/expertise')
const loginPanelRouter = require('./panel/login')
const usersPanelRouter = require('./panel/users')
const ticketsPanelRouter = require('./panel/tickets')
const financialPanelRouter = require('./panel/financial')
const commentsPanelRouter = require('./panel/comments')
const advertisingPanelRouter = require('./panel/advertising')
const shopsPanelRouter = require('./panel/shops')
const settingsPanelRouter = require('./panel/settings')
const versionPanelRouter = require('./panel/version')
const auth = require('../middlewares/auth')
const adminAuth = require('../middlewares/adminAuth')
module.exports = (app) => {
// App
app.use('/api/v1/register', registerRouter)
app.use('/api/v1/login', loginRouter)
app.use('/api/v1/verify', [auth], verifyRouter)
app.use('/api/v1/provinces', provincesRouter)
app.use('/api/v1/cities', citiesRouter)
app.use('/api/v1/projects', projectsRouter)
app.use('/api/v1/users', usersRouter)
app.use('/api/v1/posts', postsRouter)
app.use('/api/v1/expertise', expertiseRouter)
app.use('/api/v1/profile', profileRouter)
app.use('/api/v1/workroom', [auth], workroomRouter)
app.use('/api/v1/messages', [auth], messagesRouter)
app.use('/api/v1/notifications', [auth], notificationRouter)
app.use('/api/v1/search', [auth], searchRouter)
app.use('/api/v1/search-web', searchRouterWeb)
app.use('/api/v1/financial', [auth], financialRouter)
app.use('/api/v1/tickets', [auth], ticketsRouter)
app.use('/api/v1/offers', offerRouter)
app.use('/api/v1/advertising', advertisingRouter)
app.use('/api/v1/settings', settingsRouter)
app.use('/api/v1/version', versionRouter)
app.use('/api/v1/academy', academyRoute)
// Panel
app.use('/api/v1/panel/login', loginPanelRouter)
app.use('/api/v1/panel/users', usersPanelRouter)
app.use('/api/v1/panel/projects', [adminAuth], projectsPanelRouter)
app.use('/api/v1/panel/posts', [adminAuth], postsPanelRouter)
app.use('/api/v1/panel/expertise', [adminAuth], expertisePanelRouter)
app.use('/api/v1/panel/tickets', [adminAuth], ticketsPanelRouter)
app.use('/api/v1/panel/financial', [adminAuth], financialPanelRouter)
app.use('/api/v1/panel/comments', [adminAuth], commentsPanelRouter)
app.use('/api/v1/panel/advertising', [adminAuth], advertisingPanelRouter)
app.use('/api/v1/panel/shops', [adminAuth], shopsPanelRouter)
app.use('/api/v1/panel/settings', [adminAuth], settingsPanelRouter)
app.use('/api/v1/panel/version', [adminAuth], versionPanelRouter)
}

View File

@@ -0,0 +1,22 @@
const express = require('express')
const { getAdvertisings, getSingleAdvertising, acceptAdvertising, rejectAdvertising, getAdvertisingCategories, getAdvertisingCategoryById,createAdvertisingCategory , deleteAdvertisingCategory } = require('../../../controllers/panel/advertising/advertisingController')
const { getAdvertisingComments, getAdvertisingCommentDetail, acceptAdvertisingComment } = require('../../../controllers/panel/comments/advertisingCommentController')
const router = express.Router()
router.get('/', getAdvertisings)
router.get('/detail', getSingleAdvertising)
router.post('/accept', acceptAdvertising)
router.post('/reject', rejectAdvertising)
router.get('/comments', getAdvertisingComments)
router.get('/comments/detail', getAdvertisingCommentDetail)
router.post('/comments/accept', acceptAdvertisingComment)
router.post('/advertising-categories', createAdvertisingCategory)
router.delete('/advertising-categories/:id', deleteAdvertisingCategory)
// لیست دسته‌بندی‌ها (پشتیبانی از query params)
router.get('/advertising-categories', getAdvertisingCategories);
// گرفتن یک دسته‌بندی با id
router.get('/advertising-categories/:id', getAdvertisingCategoryById);
module.exports = router

View File

@@ -0,0 +1,8 @@
const express = require('express')
const { acceptComment, getComments, getCommentDetail } = require('../../../controllers/panel/comments/commentController')
const router = express.Router()
router.get('/', getComments)
router.get('/detail', getCommentDetail)
router.post('/accept', acceptComment)
module.exports = router

View File

@@ -0,0 +1,9 @@
const express = require('express')
const { createExpertise, createSubExpertise, getExpertise, editExpertise } = require('../../../controllers/panel/expertise/expertiseController')
const router = express.Router()
router.get('/', getExpertise)
router.post('/create', createExpertise)
router.post('/create/sub', createSubExpertise)
router.put('/update/:id', editExpertise)
module.exports = router

View File

@@ -0,0 +1,7 @@
const express = require('express')
const { getFinancial, getFinancialDetail } = require('../../../controllers/panel/financial/financialController')
const router = express.Router()
router.get('/', getFinancial)
router.get('/detail', getFinancialDetail)
module.exports = router

View File

@@ -0,0 +1,8 @@
const express = require('express')
const router = express.Router()
const { adminLogin, changePassword } = require('../../../controllers/panel/login/loginController')
const adminAuth = require('../../../middlewares/adminAuth')
router.post('/', adminLogin)
router.post('/change-password', [adminAuth], changePassword)
module.exports = router

View File

@@ -0,0 +1,8 @@
const express = require('express')
const { acceptPost, getPosts, getPostDetail } = require('../../../controllers/panel/posts/postController')
const router = express.Router()
router.get('/', getPosts)
router.get('/detail', getPostDetail)
router.post('/accept', acceptPost)
module.exports = router

View File

@@ -0,0 +1,11 @@
const express = require('express')
const { createProjectTypes, getProjectTypes } = require('../../../controllers/panel/projects/projectTypesController')
const { getProjects, getProjectDetails, acceptProject, rejectProject } = require('../../../controllers/panel/projects/projectController')
const router = express.Router()
router.get('/', getProjects)
router.get('/detail', getProjectDetails)
router.post('/accept', acceptProject)
router.post('/reject', rejectProject)
router.get('/types', getProjectTypes)
router.post('/types/create', createProjectTypes)
module.exports = router

View File

@@ -0,0 +1,7 @@
const express = require('express')
const { getSetting, updateSetting } = require('../../../controllers/panel/settings/settingsController')
const router = express.Router()
router.get('/:key', getSetting)
router.put('/:key', updateSetting)
module.exports = router

View File

@@ -0,0 +1,8 @@
const express = require('express')
const { getShops, getShopDetail, updateShop } = require('../../../controllers/panel/shops/shopsController')
const router = express.Router()
router.get('/', getShops)
router.get('/detail', getShopDetail)
router.put('/update', updateShop)
module.exports = router

View File

@@ -0,0 +1,9 @@
const express = require('express')
const { addAdminMessageToTicket, getAllTickets, getTicketMessages, closeTicket } = require('../../../controllers/panel/tickets/ticketsController')
const router = express.Router()
router.get('/', getAllTickets)
router.get('/messages', getTicketMessages)
router.post('/message', addAdminMessageToTicket)
router.post('/close', closeTicket)
module.exports = router

View File

@@ -0,0 +1,12 @@
const express = require('express')
const { getUsers, getUserDetail,changePass, updateUser, verifyUser, rejectUser, updateUserStatus } = require('../../../controllers/panel/users/usersController')
const router = express.Router()
router.get('/', getUsers)
router.post('/change-password', changePass)
router.get('/detail', getUserDetail)
router.put('/update', updateUser)
router.post('/verify', verifyUser)
router.post('/reject', rejectUser)
router.post('/update-status', updateUserStatus);
module.exports = router

View File

@@ -0,0 +1,7 @@
const express = require('express')
const { getVersion, upsertVersion } = require('../../../controllers/panel/version/versionController')
const router = express.Router()
router.get('/', getVersion)
router.post('/', upsertVersion)
module.exports = router