reels
This commit is contained in:
@@ -197,7 +197,7 @@ const academyProfile = async (req, res, next) => {
|
||||
})
|
||||
}
|
||||
|
||||
const { profile_image } = req.files
|
||||
const profile_image = req.file
|
||||
const { name, sheba, bio, tag } = req.body
|
||||
|
||||
if (!profile_image) {
|
||||
@@ -227,7 +227,7 @@ const academyProfile = async (req, res, next) => {
|
||||
}
|
||||
|
||||
const uniqueFileName = `${name}-${Date.now()}${path.extname(
|
||||
profile_image.name
|
||||
profile_image.originalname
|
||||
)}`
|
||||
const filePath = path.join(uploadDir, uniqueFileName)
|
||||
|
||||
@@ -329,7 +329,7 @@ const creatCourse = async (req, res, next) => {
|
||||
const isFreePackage = is_free === 'true' || is_free === true
|
||||
const contactInfo = parseCourseContactInfo(req.body)
|
||||
|
||||
const { course_image } = req.files
|
||||
const course_image = req.file
|
||||
|
||||
if (!course_image) {
|
||||
return res.status(422).json({
|
||||
@@ -344,7 +344,7 @@ const creatCourse = async (req, res, next) => {
|
||||
}
|
||||
|
||||
const uniqueFileName = `${cuorse_name}-${Date.now()}${path.extname(
|
||||
course_image.name
|
||||
course_image.originalname
|
||||
)}`
|
||||
const filePath = path.join(uploadDir, uniqueFileName)
|
||||
|
||||
@@ -422,7 +422,7 @@ const updateCourse = async (req, res, next) => {
|
||||
}
|
||||
|
||||
// ========== آپلود عکس جدید (اختیاری) ==========
|
||||
const { course_image } = req.files || {}
|
||||
const course_image = req.file
|
||||
|
||||
if (course_image) {
|
||||
// فقط اگه عکس جدید آپلود شده بود، آپلود کن
|
||||
@@ -433,7 +433,7 @@ const updateCourse = async (req, res, next) => {
|
||||
|
||||
// استفاده از id به جای نام دوره برای نام فایل
|
||||
const safeFileName = `course-${courseId}-${Date.now()}${path.extname(
|
||||
course_image.name
|
||||
course_image.originalname
|
||||
)}`
|
||||
const filePath = path.join(uploadDir, safeFileName)
|
||||
|
||||
|
||||
@@ -60,12 +60,13 @@ const createAdvertisingValidationRules = () => {
|
||||
check('city').notEmpty().withMessage('شهر نمیتواند خالی باشد')
|
||||
]
|
||||
}
|
||||
// تابع کمکی برای ذخیره تصاویر
|
||||
// تابع کمکی برای ذخیره تصاویر — file یه آبجکتِ multerه (originalname/path)، نه
|
||||
// express-fileupload (name/path)
|
||||
const saveFile = async (file, folder, userName) => {
|
||||
const uploadDir = path.join(__dirname, '../../../../storage', folder)
|
||||
if (!fs.existsSync(uploadDir)) fs.mkdirSync(uploadDir, { recursive: true })
|
||||
|
||||
const uniqueFileName = `${userName}-${Date.now()}${Math.random().toString().slice(2, 11)}${path.extname(file.name)}`
|
||||
const uniqueFileName = `${userName}-${Date.now()}${Math.random().toString().slice(2, 11)}${path.extname(file.originalname)}`
|
||||
const filePath = path.join(uploadDir, uniqueFileName)
|
||||
await fs.move(file.path, filePath)
|
||||
return `/${folder}/${uniqueFileName}`
|
||||
@@ -129,15 +130,16 @@ const createAdvertising = async (req, res, next) => {
|
||||
return res.status(422).json({ error: true, message: 'فرمت خدمات اشتباه است' })
|
||||
}
|
||||
|
||||
// multer (routes/application/advertising/index.js) با .any() همهی فایلها رو
|
||||
// بهصورتِ آرایه میده (چون serviceImages[id] اسمِ فیلدش بهازای هر خدمت پویاست)
|
||||
const uploadedFiles = Array.isArray(req.files) ? req.files : []
|
||||
|
||||
const servicesWithImages = []
|
||||
for (const service of parsedServices) {
|
||||
const serviceImages = []
|
||||
const serviceId = service.id
|
||||
const serviceFiles = req.files?.serviceImages?.[serviceId]
|
||||
const imageFiles = Array.isArray(serviceFiles) ? serviceFiles : serviceFiles ? [serviceFiles] : []
|
||||
|
||||
for (const file of imageFiles) {
|
||||
const imageUrl = await saveFile(file, 'services', user.user_name)
|
||||
const serviceFile = uploadedFiles.find((f) => f.fieldname === `serviceImages[${service.id}]`)
|
||||
if (serviceFile) {
|
||||
const imageUrl = await saveFile(serviceFile, 'services', user.user_name)
|
||||
serviceImages.push(imageUrl)
|
||||
service.image = imageUrl
|
||||
}
|
||||
@@ -145,7 +147,7 @@ const createAdvertising = async (req, res, next) => {
|
||||
}
|
||||
|
||||
// ✅ مدیریت تصاویر تبلیغ
|
||||
const imageFiles = Array.isArray(req.files?.images) ? req.files.images : req.files?.images ? [req.files.images] : []
|
||||
const imageFiles = uploadedFiles.filter((f) => f.fieldname === 'images')
|
||||
const images = []
|
||||
for (const file of imageFiles) {
|
||||
const imageUrl = await saveFile(file, 'advertising', user.user_name)
|
||||
@@ -1337,6 +1339,10 @@ const editAdvertising = async (req, res, next) => {
|
||||
const provinceFind = await ProvinceModel.findOne({ id: province }, { _id: 0 })
|
||||
const cityFind = await CityModel.findOne({ id: city })
|
||||
|
||||
// multer (routes/application/advertising/index.js) با .any() همهی فایلها رو
|
||||
// بهصورتِ آرایه میده (چون serviceImages[id] اسمِ فیلدش بهازای هر خدمت پویاست)
|
||||
const uploadedFiles = Array.isArray(req.files) ? req.files : []
|
||||
|
||||
// مدیریت تصاویر برای خدمات
|
||||
const servicesWithImages = []
|
||||
const parsedServices = JSON.parse(services)
|
||||
@@ -1345,24 +1351,12 @@ const editAdvertising = async (req, res, next) => {
|
||||
if (typeof service.image === 'string' && service.image.startsWith('/services/')) {
|
||||
servicesWithImages.push(service)
|
||||
} else {
|
||||
const serviceImages = []
|
||||
const serviceId = service.id
|
||||
if (req.files && req.files.serviceImages && req.files.serviceImages[serviceId]) {
|
||||
const imageFiles = Array.isArray(req.files.serviceImages[serviceId]) ? req.files.serviceImages[serviceId] : [req.files.serviceImages[serviceId]]
|
||||
const uploadDir = path.join(__dirname, '../../../../storage/services')
|
||||
if (!fs.existsSync(uploadDir)) {
|
||||
fs.mkdirSync(uploadDir, { recursive: true })
|
||||
}
|
||||
for (const imageFile of imageFiles) {
|
||||
const uniqueFileName = `${user.user_name}-${Date.now()}${Math.random().toString().slice(2, 11)}${path.extname(imageFile.name)}`
|
||||
const filePath = path.join(uploadDir, uniqueFileName)
|
||||
await fs.move(imageFile.path, filePath)
|
||||
const imageUrl = `/services/${uniqueFileName}`
|
||||
serviceImages.push(imageUrl)
|
||||
service.image = imageUrl
|
||||
}
|
||||
const serviceFile = uploadedFiles.find((f) => f.fieldname === `serviceImages[${service.id}]`)
|
||||
if (serviceFile) {
|
||||
const imageUrl = await saveFile(serviceFile, 'services', user.user_name)
|
||||
service.image = imageUrl
|
||||
}
|
||||
servicesWithImages.push({ ...service, image: serviceImages[0] })
|
||||
servicesWithImages.push(service)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1379,22 +1373,10 @@ const editAdvertising = async (req, res, next) => {
|
||||
}
|
||||
|
||||
// اضافه کردن تصاویر جدید
|
||||
if (req.files && req.files.images) {
|
||||
const imageFiles = Array.isArray(req.files.images) ? req.files.images : [req.files.images]
|
||||
const uploadDir = path.join(__dirname, '../../../../storage/advertising')
|
||||
if (!fs.existsSync(uploadDir)) {
|
||||
fs.mkdirSync(uploadDir, { recursive: true })
|
||||
}
|
||||
for (const imageFile of imageFiles) {
|
||||
// بررسی فرمت تصویر
|
||||
if (imageFile && typeof imageFile === 'object' && imageFile.path) {
|
||||
const uniqueFileName = `${user.user_name}-${Date.now()}${Math.random().toString().slice(2, 11)}${path.extname(imageFile.name)}`
|
||||
const filePath = path.join(uploadDir, uniqueFileName)
|
||||
await fs.move(imageFile.path, filePath)
|
||||
const imageUrl = `/advertising/${uniqueFileName}`
|
||||
images.push(imageUrl)
|
||||
}
|
||||
}
|
||||
const imageFiles = uploadedFiles.filter((f) => f.fieldname === 'images')
|
||||
for (const file of imageFiles) {
|
||||
const imageUrl = await saveFile(file, 'advertising', user.user_name)
|
||||
images.push(imageUrl)
|
||||
}
|
||||
const parsedFeatures = JSON.parse(features)
|
||||
|
||||
@@ -1421,8 +1403,8 @@ const editAdvertising = async (req, res, next) => {
|
||||
await advertising.save()
|
||||
|
||||
if (contactInfo && contactInfo.saveInfoForNextAds) {
|
||||
user.contactInfo = contactInfo
|
||||
await user.save()
|
||||
// updateOne اتمیک بهجای user.save() — همون دلیلِ فیکسِ setProfileImageController.js
|
||||
await UserModel.updateOne({ _id: user._id }, { contactInfo })
|
||||
}
|
||||
res.status(200).json({
|
||||
message: 'ویترین با موفقیت ویرایش شد',
|
||||
@@ -1646,7 +1628,7 @@ const updateUserAdvertisingProfile = async (req, res, next) => {
|
||||
})
|
||||
}
|
||||
|
||||
const { profile_image } = req.files
|
||||
const profile_image = req.file
|
||||
const {
|
||||
// profile_image,
|
||||
vitrine_name,
|
||||
@@ -1670,7 +1652,7 @@ const updateUserAdvertisingProfile = async (req, res, next) => {
|
||||
if (!fs.existsSync(uploadDir)) {
|
||||
fs.mkdirSync(uploadDir, { recursive: true })
|
||||
}
|
||||
const uniqueFileName = `${advertisingProfile?.vitrine_name}-${Date.now()}${path.extname(profile_image.name)}`
|
||||
const uniqueFileName = `${advertisingProfile?.vitrine_name}-${Date.now()}${path.extname(profile_image.originalname)}`
|
||||
const filePath = path.join(uploadDir, uniqueFileName)
|
||||
await fs.move(profile_image.path, filePath)
|
||||
updateFields.profile_image = `/profiles/${uniqueFileName}`
|
||||
|
||||
@@ -42,10 +42,10 @@ function productError (res, status, message) {
|
||||
async function saveFile (file, folder, prefix) {
|
||||
const uploadDir = path.join(__dirname, '../../../storage', folder)
|
||||
fs.ensureDirSync(uploadDir)
|
||||
const uniqueFileName = `${prefix}-${Date.now()}${Math.random().toString().slice(2, 9)}${path.extname(file.name)}`
|
||||
const uniqueFileName = `${prefix}-${Date.now()}${Math.random().toString().slice(2, 9)}${path.extname(file.originalname)}`
|
||||
const filePath = path.join(uploadDir, uniqueFileName)
|
||||
await fs.move(file.path, filePath, { overwrite: true })
|
||||
if ((file.mimetype || file.type || '').startsWith('image/')) {
|
||||
if ((file.mimetype || '').startsWith('image/')) {
|
||||
await optimizeImageFile(filePath)
|
||||
}
|
||||
return `/${folder}/${uniqueFileName}`
|
||||
@@ -132,11 +132,7 @@ const createShopProduct = async (req, res, next) => {
|
||||
})
|
||||
}
|
||||
|
||||
const imageFiles = Array.isArray(req.files?.images)
|
||||
? req.files.images
|
||||
: req.files?.images
|
||||
? [req.files.images]
|
||||
: []
|
||||
const imageFiles = Array.isArray(req.files) ? req.files : []
|
||||
|
||||
const images = []
|
||||
for (const file of imageFiles) {
|
||||
@@ -232,11 +228,7 @@ const updateShopProduct = async (req, res, next) => {
|
||||
keptImages = Array.isArray(existing) ? existing : []
|
||||
}
|
||||
|
||||
const imageFiles = Array.isArray(req.files?.images)
|
||||
? req.files.images
|
||||
: req.files?.images
|
||||
? [req.files.images]
|
||||
: []
|
||||
const imageFiles = Array.isArray(req.files) ? req.files : []
|
||||
const newImages = []
|
||||
for (const file of imageFiles) {
|
||||
const url = await saveFile(file, 'shop-products', shop._id)
|
||||
|
||||
@@ -22,14 +22,13 @@ async function findOwnedSubUser (ownerId, subUserId) {
|
||||
return subUser
|
||||
}
|
||||
|
||||
async function saveAvatarIfProvided (user, files) {
|
||||
const profile_image = files?.profile_image
|
||||
async function saveAvatarIfProvided (user, profile_image) {
|
||||
if (!profile_image) return
|
||||
const uploadDir = path.join(__dirname, '../../../storage/profiles')
|
||||
if (!fs.existsSync(uploadDir)) {
|
||||
fs.mkdirSync(uploadDir, { recursive: true })
|
||||
}
|
||||
const uniqueFileName = `${user.user_name}-${Date.now()}${path.extname(profile_image.name)}`
|
||||
const uniqueFileName = `${user.user_name}-${Date.now()}${path.extname(profile_image.originalname)}`
|
||||
const filePath = path.join(uploadDir, uniqueFileName)
|
||||
await fs.move(profile_image.path, filePath)
|
||||
await optimizeImageFile(filePath, { maxDimension: AVATAR_MAX_DIMENSION })
|
||||
@@ -78,7 +77,7 @@ const createSubUser = async (req, res, next) => {
|
||||
sub_user_permissions: sanitizeSubUserPermissions(permissions)
|
||||
})
|
||||
|
||||
await saveAvatarIfProvided(subUser, req.files)
|
||||
await saveAvatarIfProvided(subUser, req.file)
|
||||
await subUser.save()
|
||||
|
||||
return res.json({
|
||||
@@ -167,7 +166,7 @@ const updateSubUser = async (req, res, next) => {
|
||||
subUser.sub_user_permissions = sanitizeSubUserPermissions(permissions)
|
||||
}
|
||||
|
||||
await saveAvatarIfProvided(subUser, req.files)
|
||||
await saveAvatarIfProvided(subUser, req.file)
|
||||
await subUser.save()
|
||||
|
||||
return res.json({
|
||||
|
||||
@@ -74,7 +74,7 @@ const addUserMessageToTicket = async (req, res) => {
|
||||
|
||||
const { ticketId } = req.query
|
||||
const { text } = req.body
|
||||
const { file } = req.files
|
||||
const file = req.file
|
||||
let fileUrl = null
|
||||
if (file) {
|
||||
// اگر فایل ارسال شده است، آن را ذخیره کنید
|
||||
@@ -83,8 +83,8 @@ const addUserMessageToTicket = async (req, res) => {
|
||||
fs.mkdirSync(uploadDir, { recursive: true })
|
||||
}
|
||||
|
||||
// اسمِ فایل هیچوقت مستقیم از ورودیِ کاربر (file.name) گرفته نمیشه — فقط پسوندش
|
||||
const uniqueFileName = `${Date.now()}-${crypto.randomUUID()}${path.extname(file.name || '')}`
|
||||
// اسمِ فایل هیچوقت مستقیم از ورودیِ کاربر (file.originalname) گرفته نمیشه — فقط پسوندش
|
||||
const uniqueFileName = `${Date.now()}-${crypto.randomUUID()}${path.extname(file.originalname || '')}`
|
||||
const filePath = path.join(uploadDir, uniqueFileName)
|
||||
await fs.move(file.path, filePath)
|
||||
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
/* eslint-disable camelcase */
|
||||
const UserModel = require('../../../models/UserModel')
|
||||
const jwt = require('jsonwebtoken')
|
||||
const fs = require('fs-extra')
|
||||
const path = require('path')
|
||||
|
||||
const setServices = async (req, res, next) => {
|
||||
try {
|
||||
@@ -10,13 +8,6 @@ const setServices = async (req, res, next) => {
|
||||
if (!token) return res.status(401).send('Access Denied')
|
||||
|
||||
const decodedToken = jwt.verify(token, process.env.APP_SECRET)
|
||||
const user = await UserModel.findById(decodedToken.id)
|
||||
if (!user) {
|
||||
return res.status(422).json({
|
||||
error: true,
|
||||
message: 'شما دسترسی به این بخش ندارید'
|
||||
})
|
||||
}
|
||||
const { services } = req.body
|
||||
if (!services) {
|
||||
return res.status(422).json({
|
||||
@@ -25,38 +16,37 @@ const setServices = async (req, res, next) => {
|
||||
})
|
||||
}
|
||||
|
||||
// مدیریت تصاویر برای خدمات
|
||||
const servicesWithImages = []
|
||||
// مدیریت تصاویر برای خدمات — multer (routes/application/verify/index.js، با
|
||||
// .any() چون اسمِ فیلد به ازای هر خدمت پویاست: serviceImages[id]) فایلها رو
|
||||
// بهصورتِ آرایه میده، با fieldname مشخص میکنیم مالِ کدوم خدمته
|
||||
const parsedServices = JSON.parse(services) // پارس کردن رشته JSON به آرایه جاوا اسکریپت
|
||||
if (parsedServices && parsedServices.length > 0) {
|
||||
for (const service of parsedServices) {
|
||||
const serviceImages = []
|
||||
const serviceId = service.id
|
||||
if (req.files && req.files.serviceImages && req.files.serviceImages[serviceId]) {
|
||||
const imageFiles = Array.isArray(req.files.serviceImages[serviceId]) ? req.files.serviceImages[serviceId] : [req.files.serviceImages[serviceId]]
|
||||
const uploadDir = path.join(__dirname, '../../../../storage/services')
|
||||
if (!fs.existsSync(uploadDir)) {
|
||||
fs.mkdirSync(uploadDir, { recursive: true })
|
||||
}
|
||||
for (const imageFile of imageFiles) {
|
||||
const uniqueFileName = `${user.user_name}-${Date.now()}${Math.random().toString().slice(2, 11)}${path.extname(imageFile.name)}`
|
||||
const filePath = path.join(uploadDir, uniqueFileName)
|
||||
// await fs.promises.rename(imageFile.path, filePath)
|
||||
await fs.move(imageFile.path, filePath)
|
||||
const imageUrl = `/services/${uniqueFileName}`
|
||||
serviceImages.push(imageUrl)
|
||||
// بهروزرسانی مسیر تصویر در آبجکت service
|
||||
service.image = imageUrl
|
||||
}
|
||||
} else {
|
||||
console.log('sss')
|
||||
}
|
||||
servicesWithImages.push({ ...service, images: serviceImages })
|
||||
const uploadedFiles = Array.isArray(req.files) ? req.files : []
|
||||
const servicesWithImages = (parsedServices || []).map((service) => {
|
||||
const uploaded = uploadedFiles.find(
|
||||
(f) => f.fieldname === `serviceImages[${service.id}]`
|
||||
)
|
||||
if (uploaded) {
|
||||
const imageUrl = `/services/${uploaded.filename}`
|
||||
return { ...service, image: imageUrl, images: [imageUrl] }
|
||||
}
|
||||
}
|
||||
// بدون عکسِ تازه — هر مسیرِ عکسِ قبلی که خودِ کلاینت توی همین آیتم فرستاده
|
||||
// (حالتِ ویرایش، نگاه کن به EditServicesScreen.tsx/web) دستنخورده میمونه
|
||||
return { ...service, images: service.image ? [service.image] : [] }
|
||||
})
|
||||
|
||||
user.services = servicesWithImages
|
||||
await user.save()
|
||||
// updateOne اتمیک بهجای findById+user.save() — یه enum نامعتبرِ قدیمی روی یه
|
||||
// فیلدِ کاملاً بیربطِ همین کاربر با save() کلِ سند رو re-validate میکرد و همین
|
||||
// آپدیتِ بیربط رو میشکست (نگاه کن به همین فیکس توی setProfileImageController.js)
|
||||
const result = await UserModel.updateOne(
|
||||
{ _id: decodedToken.id },
|
||||
{ services: servicesWithImages }
|
||||
)
|
||||
if (result.matchedCount === 0) {
|
||||
return res.status(422).json({
|
||||
error: true,
|
||||
message: 'شما دسترسی به این بخش ندارید'
|
||||
})
|
||||
}
|
||||
|
||||
return res.json({
|
||||
message: 'خدمات با موفقیت ثبت شد'
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
/* eslint-disable camelcase */
|
||||
const fs = require('fs-extra')
|
||||
const path = require('path')
|
||||
const UserModel = require('../../../models/UserModel')
|
||||
const jwt = require('jsonwebtoken')
|
||||
|
||||
@@ -8,16 +6,8 @@ const setNationalCardImage = async (req, res, next) => {
|
||||
try {
|
||||
const token = req.header('Authorization').split(' ')[1]
|
||||
if (!token) return res.status(401).send('Access Denied')
|
||||
const { national_card_image } = req.files
|
||||
// جستجوی کاربر با شماره موبایل ارسالی
|
||||
const national_card_image = req.file
|
||||
const decodedToken = jwt.verify(token, process.env.APP_SECRET)
|
||||
const user = await UserModel.findById(decodedToken.id)
|
||||
if (!user) {
|
||||
return res.status(404).json({
|
||||
error: true,
|
||||
message: 'کاربری با این شماره موبایل یافت نشد'
|
||||
})
|
||||
}
|
||||
// بررسی آیا فایل آپلود شده است
|
||||
if (!national_card_image) {
|
||||
return res.status(400).json({
|
||||
@@ -26,25 +16,27 @@ const setNationalCardImage = async (req, res, next) => {
|
||||
})
|
||||
}
|
||||
|
||||
// ذخیره فایل عکس پروفایل
|
||||
const uploadDir = path.join(__dirname, '../../../../storage/carts')
|
||||
if (!fs.existsSync(uploadDir)) {
|
||||
fs.mkdirSync(uploadDir, { recursive: true })
|
||||
// multer (routes/application/verify/index.js) فایل رو مستقیم با اسمِ یکتا توی
|
||||
// storage/carts ذخیره کرده — نیازی به move جداگانه نیست
|
||||
const imagePath = `/carts/${national_card_image.filename}`
|
||||
|
||||
// updateOne اتمیک بهجای findById+user.save() — یه enum نامعتبرِ قدیمی روی یه
|
||||
// فیلدِ بیربطِ همین کاربر با save() کلِ سند رو re-validate و همین آپدیت رو
|
||||
// میشکست (نگاه کن به همین فیکس توی setProfileImageController.js)
|
||||
const result = await UserModel.updateOne(
|
||||
{ _id: decodedToken.id },
|
||||
{ national_card_image: imagePath, is_Register: true, is_verified: 'pending' }
|
||||
)
|
||||
if (result.matchedCount === 0) {
|
||||
return res.status(404).json({
|
||||
error: true,
|
||||
message: 'کاربری با این شماره موبایل یافت نشد'
|
||||
})
|
||||
}
|
||||
|
||||
const uniqueFileName = `${user.user_name}-${Date.now()}${path.extname(national_card_image.name)}`
|
||||
const filePath = path.join(uploadDir, uniqueFileName)
|
||||
await fs.move(national_card_image.path, filePath)
|
||||
|
||||
// ذخیره مسیر فایل در دیتابیس
|
||||
user.national_card_image = `/carts/${uniqueFileName}`
|
||||
user.is_Register = true
|
||||
user.is_verified = 'pending'
|
||||
await user.save()
|
||||
|
||||
return res.json({
|
||||
message: 'عکس کارت ملی با موفقیت ذخیره شد',
|
||||
national_card_image: user.national_card_image
|
||||
national_card_image: imagePath
|
||||
})
|
||||
} catch (error) {
|
||||
next(error)
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
/* eslint-disable camelcase */
|
||||
const fs = require('fs-extra')
|
||||
const path = require('path')
|
||||
const UserModel = require('../../../models/UserModel')
|
||||
const jwt = require('jsonwebtoken')
|
||||
const { optimizeImageFile } = require('../../../utils/imageOptimize')
|
||||
@@ -13,15 +11,8 @@ const setProfileImage = async (req, res, next) => {
|
||||
try {
|
||||
const token = req.header('Authorization').split(' ')[1]
|
||||
if (!token) return res.status(401).send('Access Denied')
|
||||
const { profile_image } = req.files
|
||||
const profile_image = req.file
|
||||
const decodedToken = jwt.verify(token, process.env.APP_SECRET)
|
||||
const user = await UserModel.findById(decodedToken.id)
|
||||
if (!user) {
|
||||
return res.status(404).json({
|
||||
error: true,
|
||||
message: 'کاربری با این شماره موبایل یافت نشد'
|
||||
})
|
||||
}
|
||||
// بررسی آیا فایل آپلود شده است
|
||||
if (!profile_image) {
|
||||
return res.status(400).json({
|
||||
@@ -30,23 +21,28 @@ const setProfileImage = async (req, res, next) => {
|
||||
})
|
||||
}
|
||||
|
||||
// ذخیره فایل عکس پروفایل
|
||||
const uploadDir = path.join(__dirname, '../../../storage/profiles')
|
||||
if (!fs.existsSync(uploadDir)) {
|
||||
fs.mkdirSync(uploadDir, { recursive: true })
|
||||
}
|
||||
const uniqueFileName = `${user.user_name}-${Date.now()}${path.extname(profile_image.name)}`
|
||||
const filePath = path.join(uploadDir, uniqueFileName)
|
||||
// multer (routes/application/verify/index.js) فایل رو مستقیم با اسمِ یکتا توی
|
||||
// storage/profiles ذخیره کرده — نیازی به move جداگانه نیست
|
||||
await optimizeImageFile(profile_image.path, { maxDimension: AVATAR_MAX_DIMENSION })
|
||||
const imagePath = `/profiles/${profile_image.filename}`
|
||||
|
||||
await fs.move(profile_image.path, filePath)
|
||||
await optimizeImageFile(filePath, { maxDimension: AVATAR_MAX_DIMENSION })
|
||||
// ذخیره مسیر فایل در دیتابیس
|
||||
user.profile_image = `/profiles/${uniqueFileName}`
|
||||
await user.save()
|
||||
// updateOne اتمیک بهجای findById+user.save() — یه enum نامعتبرِ قدیمی روی یه
|
||||
// فیلدِ کاملاً بیربطِ همین کاربر (مثلاً personal_style، از دادههای قدیمی) با
|
||||
// save() کلِ سند رو re-validate میکرد و همین آپدیتِ بیربط رو میشکست
|
||||
const result = await UserModel.updateOne(
|
||||
{ _id: decodedToken.id },
|
||||
{ profile_image: imagePath }
|
||||
)
|
||||
if (result.matchedCount === 0) {
|
||||
return res.status(404).json({
|
||||
error: true,
|
||||
message: 'کاربری با این شماره موبایل یافت نشد'
|
||||
})
|
||||
}
|
||||
|
||||
return res.json({
|
||||
message: 'عکس پروفایل با موفقیت ذخیره شد',
|
||||
profile_image: user.profile_image
|
||||
profile_image: imagePath
|
||||
})
|
||||
} catch (error) {
|
||||
next(error)
|
||||
@@ -59,7 +55,7 @@ const updateProfileImage = async (req, res, next) => {
|
||||
if (!token) return res.status(401).send('Access Denied')
|
||||
const decodedToken = jwt.verify(token, process.env.APP_SECRET)
|
||||
const userId = decodedToken.id
|
||||
const { profile_image } = req.files
|
||||
const profile_image = req.file
|
||||
|
||||
if (!profile_image) {
|
||||
return res.status(422).json({
|
||||
@@ -68,33 +64,23 @@ const updateProfileImage = async (req, res, next) => {
|
||||
})
|
||||
}
|
||||
|
||||
const user = await UserModel.findById(userId)
|
||||
// multer (routes/application/verify/index.js) فایل رو مستقیم با اسمِ یکتا توی
|
||||
// storage/profiles ذخیره کرده — نیازی به move جداگانه نیست
|
||||
await optimizeImageFile(profile_image.path, { maxDimension: AVATAR_MAX_DIMENSION })
|
||||
const imagePath = `/profiles/${profile_image.filename}`
|
||||
|
||||
if (!user) {
|
||||
// updateOne اتمیک بهجای findById+user.save() — همون دلیلِ setProfileImage بالا
|
||||
const result = await UserModel.updateOne({ _id: userId }, { profile_image: imagePath })
|
||||
if (result.matchedCount === 0) {
|
||||
return res.status(404).json({
|
||||
error: true,
|
||||
message: 'کاربری با این شماره موبایل یافت نشد'
|
||||
})
|
||||
}
|
||||
|
||||
const uploadDir = path.join(__dirname, '../../../storage/profiles')
|
||||
|
||||
if (!fs.existsSync(uploadDir)) {
|
||||
fs.mkdirSync(uploadDir, { recursive: true })
|
||||
}
|
||||
|
||||
const uniqueFileName = `${user.user_name}-${Date.now()}${path.extname(profile_image.name)}`
|
||||
const filePath = path.join(uploadDir, uniqueFileName)
|
||||
|
||||
await fs.move(profile_image.path, filePath)
|
||||
await optimizeImageFile(filePath, { maxDimension: AVATAR_MAX_DIMENSION })
|
||||
|
||||
user.profile_image = `/profiles/${uniqueFileName}`
|
||||
await user.save()
|
||||
|
||||
return res.json({
|
||||
message: 'عکس پروفایل با موفقیت بهروزرسانی شد',
|
||||
profile_image: user.profile_image
|
||||
profile_image: imagePath
|
||||
})
|
||||
} catch (error) {
|
||||
next(error)
|
||||
|
||||
Reference in New Issue
Block a user