Add full project files
This commit is contained in:
383
routes/application/academy/index.js
Normal file
383
routes/application/academy/index.js
Normal 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;
|
||||
45
routes/application/advertising/index.js
Normal file
45
routes/application/advertising/index.js
Normal 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
|
||||
7
routes/application/city/index.js
Normal file
7
routes/application/city/index.js
Normal 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
|
||||
6
routes/application/expertise/index.js
Normal file
6
routes/application/expertise/index.js
Normal 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
|
||||
6
routes/application/financial/index.js
Normal file
6
routes/application/financial/index.js
Normal 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
|
||||
14
routes/application/login/index.js
Normal file
14
routes/application/login/index.js
Normal 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
|
||||
6
routes/application/messages/index.js
Normal file
6
routes/application/messages/index.js
Normal 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
|
||||
6
routes/application/notification/index.js
Normal file
6
routes/application/notification/index.js
Normal 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
|
||||
18
routes/application/offers/index.js
Normal file
18
routes/application/offers/index.js
Normal 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
|
||||
204
routes/application/posts/index.js
Normal file
204
routes/application/posts/index.js
Normal 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;
|
||||
8
routes/application/profile/index.js
Normal file
8
routes/application/profile/index.js
Normal 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
|
||||
44
routes/application/projects/index.js
Normal file
44
routes/application/projects/index.js
Normal 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
|
||||
7
routes/application/provinces/index.js
Normal file
7
routes/application/provinces/index.js
Normal 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
|
||||
16
routes/application/register/index.js
Normal file
16
routes/application/register/index.js
Normal 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
|
||||
6
routes/application/search-web/index.js
Normal file
6
routes/application/search-web/index.js
Normal 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
|
||||
6
routes/application/search/index.js
Normal file
6
routes/application/search/index.js
Normal 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
|
||||
6
routes/application/settings/index.js
Normal file
6
routes/application/settings/index.js
Normal 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
|
||||
9
routes/application/tickets/index.js
Normal file
9
routes/application/tickets/index.js
Normal 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
|
||||
22
routes/application/users/index.js
Normal file
22
routes/application/users/index.js
Normal 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
|
||||
38
routes/application/verify/index.js
Normal file
38
routes/application/verify/index.js
Normal 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
|
||||
6
routes/application/version/index.js
Normal file
6
routes/application/version/index.js
Normal 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
|
||||
8
routes/application/workroom/index.js
Normal file
8
routes/application/workroom/index.js
Normal 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
|
||||
Reference in New Issue
Block a user