feat(seeder): add one-time database seeding endpoint with status tracking
deploy-chabokan / deploy (push) Canceled after 0s

This commit is contained in:
2026-08-19 06:49:53 +03:30
parent 8bdd5af719
commit 284594c782
4 changed files with 96 additions and 2 deletions
+18
View File
@@ -40,3 +40,21 @@ exports.bulkUpdateSearchSettings = catchAsync(async (req, res, next) => {
data: results,
})
})
exports.getSeedStatus = catchAsync(async (req, res, next) => {
const status = await settingService.getSeedStatus()
res.status(200).json({
status: 'success',
data: status,
})
})
exports.seedDatabase = catchAsync(async (req, res, next) => {
const result = await settingService.seedDatabase(req.user?._id)
res.status(200).json({
status: 'success',
data: result,
})
})
+12
View File
@@ -31,4 +31,16 @@ router.put(
settingController.bulkUpdateSearchSettings
)
router.get(
'/seed-status',
perm.requires('admindashboard', 'viewdashboard', 'getallpermissions'),
settingController.getSeedStatus
)
router.post(
'/seed-database',
perm.requires('admindashboard', 'viewdashboard', 'getallpermissions'),
settingController.seedDatabase
)
module.exports = router
+54
View File
@@ -170,6 +170,8 @@ const setSearchMethod = async (pageKey, searchMethod, extraConfig = {}) => {
}
}
const seederRunner = require('../../seeder/seederRunner')
const bulkUpdateSearchSettings = async (settingsArray) => {
if (!Array.isArray(settingsArray)) {
throw new AppError('InvalidDataFormat', 400, { message: 'Expected an array of settings' })
@@ -185,10 +187,62 @@ const bulkUpdateSearchSettings = async (settingsArray) => {
return results
}
const getSeedStatus = async () => {
const record = await Setting.findOne({ key: 'system_database_seeded' }).lean()
if (record && record.extraConfig && record.extraConfig.isSeeded) {
return {
isSeeded: true,
seededAt: record.extraConfig.seededAt || record.updatedAt,
seededBy: record.extraConfig.seededBy || null,
}
}
return {
isSeeded: false,
seededAt: null,
seededBy: null,
}
}
const seedDatabase = async (userId = null) => {
const currentStatus = await getSeedStatus()
if (currentStatus.isSeeded) {
throw new AppError('DatabaseAlreadySeeded', 400, {
message: 'پایگاه داده قبلاً مقداردهی شده است و امکان مقداردهی مجدد وجود ندارد.',
})
}
await seederRunner.run()
const record = await Setting.findOneAndUpdate(
{ key: 'system_database_seeded' },
{
key: 'system_database_seeded',
category: 'system',
pageKey: 'system_seeder',
title: 'مقداردهی اولیه پایگاه داده',
description: 'وضعیت اجرای مقداردهی اولیه داده‌های پایه سیستم',
extraConfig: {
isSeeded: true,
seededAt: new Date(),
seededBy: userId,
},
},
{ upsert: true, new: true, setDefaultsOnInsert: true }
)
return {
isSeeded: true,
seededAt: record.extraConfig.seededAt,
message: 'پایگاه داده با موفقیت مقداردهی اولیه شد.',
}
}
module.exports = {
DEFAULT_SEARCH_PAGES,
getSearchSettings,
getSearchSettingByPage,
setSearchMethod,
bulkUpdateSearchSettings,
getSeedStatus,
seedDatabase,
}