feat(seeder): add one-time database seeding endpoint with status tracking
deploy-chabokan / deploy (push) Canceled after 0s
deploy-chabokan / deploy (push) Canceled after 0s
This commit is contained in:
@@ -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,
|
||||
})
|
||||
})
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user