This commit is contained in:
payacom
2026-10-01 21:12:05 +03:30
parent 806471241e
commit d4ebc20aa8
41 changed files with 1015 additions and 135 deletions

View File

@@ -5,6 +5,9 @@ const multer = require("multer");
const path = require("path");
const fs = require("fs");
const adminAuth = require("../../../middlewares/adminAuth");
const auth = require("../../../middlewares/auth");
const blockCheck = require("../../../middlewares/blockCheck");
const requireSubUserPermission = require("../../../middlewares/requireSubUserPermission");
// const academyCategoryController = require("../../../controllers/application/academy/academyCategoryController");
// ==========================================
@@ -79,10 +82,10 @@ router.post("/academy/profile", academyController.academyProfile);
// ==========================================
// ایجاد دوره جدید
router.post("/academy/creat/course", academyController.creatCourse);
router.post("/academy/creat/course", [auth, blockCheck, requireSubUserPermission('academy_packages')], academyController.creatCourse);
// ویرایش دوره
router.patch("/academy/update/course", academyController.updateCourse);
router.patch("/academy/update/course", [auth, blockCheck, requireSubUserPermission('academy_packages')], academyController.updateCourse);
// حذف دوره (تغییر وضعیت به reject)
router.delete("/academy/delete/course", academyController.deleteCourse);

View File

@@ -1,6 +1,7 @@
const express = require('express')
const auth = require('../../../middlewares/auth')
const blockCheck = require('../../../middlewares/blockCheck')
const authRateLimit = require('../../../middlewares/authRateLimit')
const {
deactivateAccount,
reactivateAccount,
@@ -15,6 +16,10 @@ const {
getArchivedPosts,
getAccountAnalytics
} = require('../../../controllers/application/profile/accountController')
const {
requestMobileOtp,
verifyMobileOtp
} = require('../../../controllers/application/account/registerMobileController')
const {
putMyPublicKey,
getPublicKeyByUserId,
@@ -22,7 +27,7 @@ const {
getDeviceLinkSession,
approveDeviceLink,
pollDeviceLink,
getOrCreateAutoBackupSecret,
verifyPassword,
putKeyBackup,
getKeyBackup,
deleteKeyBackup
@@ -31,6 +36,8 @@ const {
const router = express.Router()
router.get('/status', auth, blockCheck, getAccountStatus)
router.post('/mobile/request', auth, blockCheck, requestMobileOtp)
router.post('/mobile/verify', auth, blockCheck, verifyMobileOtp)
router.get('/visitors', auth, blockCheck, getProfileVisitors)
router.patch('/privacy', auth, blockCheck, updatePrivacySettings)
router.post('/reset-algorithm', auth, blockCheck, resetAlgorithm)
@@ -48,7 +55,7 @@ router.post('/e2ee/device-link', auth, blockCheck, startDeviceLink)
router.get('/e2ee/device-link/:linkId', auth, blockCheck, getDeviceLinkSession)
router.post('/e2ee/device-link/:linkId/approve', auth, blockCheck, approveDeviceLink)
router.get('/e2ee/device-link/:linkId/poll', auth, blockCheck, pollDeviceLink)
router.get('/e2ee/auto-backup-secret', auth, blockCheck, getOrCreateAutoBackupSecret)
router.post('/e2ee/verify-password', auth, blockCheck, authRateLimit, verifyPassword)
router.put('/e2ee/key-backup', auth, blockCheck, putKeyBackup)
router.get('/e2ee/key-backup', auth, blockCheck, getKeyBackup)
router.delete('/e2ee/key-backup', auth, blockCheck, deleteKeyBackup)

View File

@@ -2,6 +2,7 @@ const express = require('express')
const blockCheck = require('../../../middlewares/blockCheck')
const { createAdvertisingValidationRules, createAdvertising, getAdvertisingTypes, getAdvertisingCategory, getSingleAdvertising, getAdvertisingFeatures, getAdvertisings, toggleLike, addComment, getComments, rateAdvertising, getUserAdvertisings, getAdvertisingAnalytics, editAdvertising, getUserSingleAdvertising, getUserAdvertisingProfile, updateUserAdvertisingProfile, getAdvertisingsWeb, getSingleAdvertisingWeb, getUserAdvertisingProfileWeb, recordAdvertisingView, getUserLikedAdvertisings, getUserAdvertisingComments } = require('../../../controllers/application/advertising/advertisingController')
const auth = require('../../../middlewares/auth')
const requireSubUserPermission = require('../../../middlewares/requireSubUserPermission')
const { initiateAdvertisingPayment, handleAdvertisingPaymentCallback, handleAdvertisingRepublishPaymentCallback, republishAdvertisingPayment } = require('../../../controllers/application/payment/paymentController')
const { initiateAdvertisingPaymentWeb, handleAdvertisingPaymentCallbackWeb, republishAdvertisingPaymentWeb, handleAdvertisingRepublishPaymentCallbackWeb } = require('../../../controllers/application/payment/paymentControllerWeb')
const router = express.Router()
@@ -14,7 +15,7 @@ router.get('/user-advertising', [auth], getUserAdvertisings)
router.get('/analytics', [auth], getAdvertisingAnalytics)
router.get('/user-liked', [auth], getUserLikedAdvertisings)
router.get('/user-comments', [auth], getUserAdvertisingComments)
router.post('/create', [auth], [blockCheck], createAdvertisingValidationRules(), createAdvertising)
router.post('/create', [auth], [blockCheck], requireSubUserPermission('billboards'), createAdvertisingValidationRules(), createAdvertising)
router.get('/types', [auth], getAdvertisingTypes)
router.get('/categories', getAdvertisingCategory)
router.get('/features', [auth], getAdvertisingFeatures)
@@ -34,6 +35,6 @@ 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)
router.post('/edit/:id', [blockCheck], [auth], requireSubUserPermission('billboards'), editAdvertising)
module.exports = router

View File

@@ -21,11 +21,12 @@ const {
handleBookingPaymentCallback
} = require('../../../controllers/application/bookings/bookingPaymentController')
const blockCheck = require('../../../middlewares/blockCheck')
const requireSubUserPermission = require('../../../middlewares/requireSubUserPermission')
const router = express.Router()
// --- Booking-config wizard (provider setup) ---
router.post('/draft', [blockCheck], createDraftBookingConfig)
router.post('/draft', [blockCheck], requireSubUserPermission('bookings'), createDraftBookingConfig)
router.get('/mine', [blockCheck], getMyBookingConfigs)
// --- Reservations (buyer booking + provider's received bookings) ---
@@ -42,9 +43,9 @@ router.get('/payment-callback/web', handleBookingPaymentCallback)
// --- Booking-config wizard (continued) ---
router.get('/:id', [blockCheck], getBookingConfigById)
router.patch('/:id/services', [blockCheck], updateBookingConfigServices)
router.patch('/:id/schedule', [blockCheck], updateBookingConfigSchedule)
router.patch('/:id/status', [blockCheck], updateBookingConfigStatus)
router.post('/:id/submit', [blockCheck], submitBookingConfig)
router.patch('/:id/services', [blockCheck], requireSubUserPermission('bookings'), updateBookingConfigServices)
router.patch('/:id/schedule', [blockCheck], requireSubUserPermission('bookings'), updateBookingConfigSchedule)
router.patch('/:id/status', [blockCheck], requireSubUserPermission('bookings'), updateBookingConfigStatus)
router.post('/:id/submit', [blockCheck], requireSubUserPermission('bookings'), submitBookingConfig)
module.exports = router

View File

@@ -11,6 +11,7 @@ const {
getRoomE2eeKeys,
putRoomE2eeKeys
} = require('../../../controllers/application/chatRooms/chatRoomController')
const requireSubUserPermission = require('../../../middlewares/requireSubUserPermission')
const router = express.Router()
@@ -22,7 +23,7 @@ router.post('/:roomId/members', addRoomMembers)
router.get('/:roomId/e2ee-keys', getRoomE2eeKeys)
router.put('/:roomId/e2ee-keys', putRoomE2eeKeys)
router.get('/:roomId/messages', getRoomMessages)
router.post('/:roomId/messages', sendRoomMessage)
router.post('/:roomId/messages', requireSubUserPermission('reply_dm'), sendRoomMessage)
router.post('/:roomId/messages/reaction', reactToRoomMessage)
module.exports = router

View File

@@ -11,14 +11,15 @@ const {
reportOrder,
createReturnRequest
} = require('../../../controllers/application/orders/orderController')
const requireSubUserPermission = require('../../../middlewares/requireSubUserPermission')
const router = express.Router()
router.post('/draft', createOrderDraft)
router.get('/', getOrders)
router.get('/:id', getOrderById)
router.patch('/:id/status', updateOrderStatus)
router.patch('/:id/tracking-code', updateTrackingCode)
router.patch('/:id/status', requireSubUserPermission('order_status'), updateOrderStatus)
router.patch('/:id/tracking-code', requireSubUserPermission('order_status'), updateTrackingCode)
router.patch('/:id/confirm-receipt', confirmReceipt)
router.patch('/:id/cancel', cancelOrder)
router.post('/:id/rate', rateOrder)

View File

@@ -1,5 +1,5 @@
const express = require('express');
const { createPostValidationRules, createPost, updatePost, getUserPosts, getUserPostsWeb, getPostByIdWeb } = require('../../../controllers/application/posts/postController');
const { createPostValidationRules, createPost, updatePost, deletePost, getUserPosts, getUserPostsWeb, getPostByIdWeb } = require('../../../controllers/application/posts/postController');
const { toggleLike } = require('../../../controllers/application/posts/likeController');
const {
toggleBookmark,
@@ -15,6 +15,7 @@ const { reportPost } = require('../../../controllers/application/posts/reportCon
const blockCheck = require('../../../middlewares/blockCheck');
const auth = require('../../../middlewares/auth');
const requirePostExpertise = require('../../../middlewares/requirePostExpertise');
const requireSubUserPermission = require('../../../middlewares/requireSubUserPermission');
const path = require('path');
const fs = require('fs');
const crypto = require('crypto');
@@ -121,6 +122,7 @@ router.post(
next();
},
blockCheck,
requireSubUserPermission('posts_stories'),
(req, res, next) => {
console.log('DEBUG: reached requirePostExpertise');
next();
@@ -153,6 +155,7 @@ router.post(
'/create-base64',
auth,
blockCheck,
requireSubUserPermission('posts_stories'),
requirePostExpertise,
createPostValidationRules(),
async (req, res) => {
@@ -254,6 +257,7 @@ async function handleUpdateBase64(req, res) {
}
}
router.delete('/:postId', auth, blockCheck, deletePost);
router.post('/update-base64', auth, blockCheck, handleUpdateBase64);
// مسیر جایگزین برای سرورهایی که روت قبلی را کش کرده‌اند
router.put('/update-base64', auth, blockCheck, handleUpdateBase64);

View File

@@ -8,6 +8,7 @@ const { requestProjectValidationRules, requestProject, acceptProject, editReques
const { editProject, doneProject, cancleProject, editProjectValidationRules, setRateProject, doneProjectWeb } = require('../../../controllers/application/projects/updateProjectController')
const blockCheck = require('../../../middlewares/blockCheck')
const isBasicRegister = require('../../../middlewares/isBasicRegister')
const requireSubUserPermission = require('../../../middlewares/requireSubUserPermission')
const {
initiatePaymentWeb,
handlePaymentCallbackWeb,
@@ -25,8 +26,8 @@ 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], createProjectValidationRules(), createProject)
router.post('/edit', [blockCheck], [auth], editProjectValidationRules(), editProject)
router.post('/create', [blockCheck], [auth], requireSubUserPermission('projects'), createProjectValidationRules(), createProject)
router.post('/edit', [blockCheck], [auth], requireSubUserPermission('projects'), editProjectValidationRules(), editProject)
router.post('/rate', [blockCheck], [auth], [isBasicRegister], setRateProject)
router.post('/initiate-payment', [blockCheck], [isBasicRegister], [auth], initiatePayment)
router.post('/initiate-payment-web', [blockCheck], [isBasicRegister], [auth], initiatePaymentWeb)
@@ -41,9 +42,9 @@ router.get('/payment-request-step-one-callback/web', paymentRequestAcceptWebCall
router.get('/payment-request-step-two-callback', paymentRequestStepTwoCallback)
router.get('/payment-request-step-all-callback', paymentRequestStepAllCallback)
router.post('/accept', [isBasicRegister], [blockCheck], [auth], acceptProject)
router.post('/done', [isBasicRegister], [auth], doneProject)
router.post('/done/web', [isBasicRegister], [auth], doneProjectWeb)
router.post('/cancle', [isBasicRegister], [blockCheck], [auth], cancleProject)
router.post('/done', [isBasicRegister], [auth], requireSubUserPermission('projects'), doneProject)
router.post('/done/web', [isBasicRegister], [auth], requireSubUserPermission('projects'), doneProjectWeb)
router.post('/cancle', [isBasicRegister], [blockCheck], [auth], requireSubUserPermission('projects'), cancleProject)
router.post('/initiate-completion-payment/web', [isBasicRegister], [blockCheck], [auth], initiateProjectCompletionPaymentWeb)
router.get('/payment-completion-callback/web', handleProjectCompletionPaymentCallbackWeb)

View File

@@ -7,8 +7,10 @@ const { setUserFullName, setUserFullNameValidationRules } = require('../../../co
const { setUserType } = require('../../../controllers/application/register/userTypeController')
const { setRegisterPassword, setRegisterPasswordValidationRules } = require('../../../controllers/application/register/passwordController')
const { getRegisterStatus } = require('../../../controllers/application/register/statusController')
const { completeSocialSignup } = require('../../../controllers/application/register/completeSocialSignupController')
const auth = require('../../../middlewares/auth')
const authRateLimit = require('../../../middlewares/authRateLimit')
const blockCheck = require('../../../middlewares/blockCheck')
router.post('/', authRateLimit, registerValidationRules(), registerUser)
router.post('/verify', authRateLimit, verifyUser)
@@ -18,5 +20,6 @@ router.patch('/username', updateUserName)
router.post('/password', setRegisterPasswordValidationRules(), setRegisterPassword)
router.post('/fullname', setUserFullNameValidationRules(), setUserFullName)
router.post('/user_type', setUserType)
router.post('/complete-social-signup', [blockCheck], completeSocialSignup)
module.exports = router

View File

@@ -1,5 +1,6 @@
const express = require('express')
const blockCheck = require('../../../middlewares/blockCheck')
const requireSubUserPermission = require('../../../middlewares/requireSubUserPermission')
const {
searchCatalog,
createShopProduct,
@@ -24,8 +25,8 @@ router.get('/:id', getShopProductById)
router.get('/:id/comments', getShopProductComments)
// Seller-only
router.post('/', [blockCheck], createShopProduct)
router.patch('/:id', [blockCheck], updateShopProduct)
router.post('/', [blockCheck], requireSubUserPermission('shop_products'), createShopProduct)
router.patch('/:id', [blockCheck], requireSubUserPermission('shop_products'), updateShopProduct)
// Authenticated buyer actions
router.post('/:id/comments', [blockCheck], createShopProductComment)

View File

@@ -25,10 +25,11 @@ const {
toggleFavorite
} = require('../../../controllers/application/shops/favoriteController')
const blockCheck = require('../../../middlewares/blockCheck')
const requireSubUserPermission = require('../../../middlewares/requireSubUserPermission')
const router = express.Router()
router.post('/draft', [blockCheck], createDraftShop)
router.post('/draft', [blockCheck], requireSubUserPermission('create_shop'), createDraftShop)
router.get('/mine', [blockCheck], getMyShops)
router.get('/analytics', [blockCheck], getShopAnalytics)
@@ -42,13 +43,13 @@ router.post('/favorites/toggle', [blockCheck], toggleFavorite)
router.get('/public/:id', getShopPublic)
router.get('/:id', [blockCheck], getShopById)
router.patch('/:id/basic', [blockCheck], updateShopBasic)
router.patch('/:id/logo', [blockCheck], updateShopLogo)
router.patch('/:id/shipping', [blockCheck], updateShopShipping)
router.patch('/:id/location', [blockCheck], updateShopLocation)
router.patch('/:id/contact', [blockCheck], updateShopContact)
router.patch('/:id/basic', [blockCheck], requireSubUserPermission('create_shop'), updateShopBasic)
router.patch('/:id/logo', [blockCheck], requireSubUserPermission('create_shop'), updateShopLogo)
router.patch('/:id/shipping', [blockCheck], requireSubUserPermission('create_shop'), updateShopShipping)
router.patch('/:id/location', [blockCheck], requireSubUserPermission('create_shop'), updateShopLocation)
router.patch('/:id/contact', [blockCheck], requireSubUserPermission('create_shop'), updateShopContact)
router.post('/:id/follow', [blockCheck], toggleShopFollow)
router.post('/:id/submit', [blockCheck], submitShop)
router.post('/:id/submit', [blockCheck], requireSubUserPermission('create_shop'), submitShop)
router.post('/:id/send', [blockCheck], sendShopToUsers)
module.exports = router

View File

@@ -5,6 +5,7 @@ const multer = require('multer')
const auth = require('../../../middlewares/auth')
const blockCheck = require('../../../middlewares/blockCheck')
const isHalfRegister = require('../../../middlewares/isHalfRegister')
const requireSubUserPermission = require('../../../middlewares/requireSubUserPermission')
const {
applyPhotoFilter,
createStoryBase64,
@@ -45,7 +46,7 @@ const storyUpload = multer({
router.get('/feed', getStoriesFeed)
router.post('/apply-filter', auth, blockCheck, isHalfRegister, applyPhotoFilter)
router.post('/create-base64', auth, blockCheck, isHalfRegister, createStoryBase64)
router.post('/create-base64', auth, blockCheck, isHalfRegister, requireSubUserPermission('posts_stories'), createStoryBase64)
// عین /posts/create چندبخشی — برای فایل‌های حجیم (مخصوصاً ویدیو) که تبدیل به base64 توی
// حافظه‌ی JS موبایل باعث خطای OOM می‌شد؛ فایل مستقیم از دیسک استریم می‌شه
router.post(
@@ -53,6 +54,7 @@ router.post(
auth,
blockCheck,
isHalfRegister,
requireSubUserPermission('posts_stories'),
(req, res, next) => {
storyUpload(req, res, (err) => {
if (err) return res.status(400).json({ error: true, message: err.message })

View File

@@ -0,0 +1,32 @@
const express = require('express')
const router = express.Router()
const auth = require('../../../middlewares/auth')
const blockCheck = require('../../../middlewares/blockCheck')
const {
createSubUser,
listSubUsers,
getSubUser,
updateSubUser,
setSubUserActive
} = require('../../../controllers/application/subUsers/subUserController')
// یه کاربرِ زیرمجموعه هیچ‌وقت نباید بتونه خودش زیرمجموعه بسازه/مدیریت کنه —
// فقط صاحبِ اصلیِ اکانت (req.actingSubUser خالیه)
function ownerOnly (req, res, next) {
if (req.actingSubUser) {
return res.status(403).json({
error: true,
message: 'کاربر زیرمجموعه اجازه‌ی مدیریت کاربران زیرمجموعه را ندارد'
})
}
next()
}
router.post('/', [auth, blockCheck, ownerOnly], createSubUser)
router.get('/', [auth, blockCheck, ownerOnly], listSubUsers)
router.get('/:id', [auth, blockCheck, ownerOnly], getSubUser)
router.patch('/:id', [auth, blockCheck, ownerOnly], updateSubUser)
router.patch('/:id/active', [auth, blockCheck, ownerOnly], setSubUserActive)
module.exports = router

View File

@@ -12,6 +12,7 @@ const {
const blockCheck = require('../../../middlewares/blockCheck')
const isRegister = require('../../../middlewares/isRegister')
const auth = require('../../../middlewares/auth')
const requireSubUserPermission = require('../../../middlewares/requireSubUserPermission')
const router = express.Router()
router.get('/follow/stats', auth, getFollowStats)
router.get('/follow/followers', auth, getFollowers)
@@ -31,7 +32,7 @@ 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.post('/comments', [auth], [isRegister], [blockCheck], requireSubUserPermission('reply_comments'), createUserComment)
router.post('/comments/like', [auth], [isRegister], [blockCheck], toggleCommentLike)
router.post('/explore/interaction', [auth], recordExploreInteraction)
router.get('/invite-employer', [auth], [isRegister], [blockCheck], inviteEmployer)

View File

@@ -38,6 +38,7 @@ const accountRouter = require('./application/account')
const giftsRouter = require('./application/gifts')
const chatRoomsRouter = require('./application/chat-rooms')
const suggestionsRouter = require('./application/suggestions')
const subUsersRouter = require('./application/sub-users')
const analyticsRouter = require('./application/analytics')
const geoRouter = require('./application/geo')
@@ -117,6 +118,7 @@ module.exports = (app) => {
app.use('/api/v1/geo', geoRouter)
app.use('/api/v1/academy', academyRoute)
app.use('/api/v1/stories', storiesRouter)
app.use('/api/v1/sub-users', subUsersRouter)
// Panel
// فقط متدهای نوشتاری (POST/PUT/PATCH/DELETE) رو خودکار توی AuditLog ثبت می‌کنه —