Files
modstagram-back/services/InstagramMediaSyncCron.js
payacom 3f416a7a60 full
2026-08-31 20:45:41 +03:30

64 lines
2.6 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
const cron = require('node-cron')
const UserModel = require('../models/UserModel')
const InstagramGraphService = require('../services/InstagramGraphService')
const { decryptSecret, encryptSecret } = require('../utils/secretCipher')
const { importInstagramMedia } = require('../utils/instagramMediaImport')
const TOKEN_REFRESH_WINDOW_MS = 7 * 24 * 60 * 60 * 1000 // ۷ روز قبل انقضا رفرش کن
/**
* برای کاربرانی که «همگام‌سازی خودکار» رو فعال کردن، پست‌های جدید اینستاگرامشون رو
* وارد مدستاگرام می‌کنه. هر کاربر جدا try/catch می‌شه تا خطای یک حساب بقیه رو متوقف نکنه.
* این تنها کانسیومر decryptSecret تو کل بک‌اند بود قبل از این فایل — همون الگوی رمزگشایی
* که instagramController.js موقع رمزنگاری استفاده می‌کنه رو برعکس اجرا می‌کنه.
*/
async function runInstagramMediaSync () {
const users = await UserModel.find({
'instagram_sync_prefs.auto_update': true,
instagram_access_token_enc: { $ne: null },
})
for (const user of users) {
try {
let accessToken = decryptSecret(user.instagram_access_token_enc)
const expiresAt = user.instagram_token_expires_at ? new Date(user.instagram_token_expires_at).getTime() : 0
if (expiresAt && expiresAt - Date.now() < TOKEN_REFRESH_WINDOW_MS) {
const refreshed = await InstagramGraphService.refreshLongLivedToken(accessToken)
accessToken = refreshed.accessToken
await UserModel.updateOne(
{ _id: user._id },
{
$set: {
instagram_access_token_enc: encryptSecret(accessToken),
instagram_token_expires_at: refreshed.expiresAt,
},
},
{ strict: false }
)
}
const { items } = await InstagramGraphService.getMedia(accessToken)
for (const item of items) {
await importInstagramMedia(user, item)
}
await UserModel.updateOne(
{ _id: user._id },
{ $set: { instagram_last_synced_at: new Date() } },
{ strict: false }
)
} catch (err) {
console.error(`[InstagramMediaSyncCron] user ${user._id} failed:`, err?.response?.data || err.message)
}
}
}
cron.schedule('0 * * * *', () => {
runInstagramMediaSync().catch((err) => {
console.error('[InstagramMediaSyncCron] run failed:', err.message)
})
}, { scheduled: true, timezone: 'Asia/Tehran' })
module.exports = { runInstagramMediaSync }