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,
|
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
|
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
|
module.exports = router
|
||||||
|
|||||||
@@ -170,6 +170,8 @@ const setSearchMethod = async (pageKey, searchMethod, extraConfig = {}) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const seederRunner = require('../../seeder/seederRunner')
|
||||||
|
|
||||||
const bulkUpdateSearchSettings = async (settingsArray) => {
|
const bulkUpdateSearchSettings = async (settingsArray) => {
|
||||||
if (!Array.isArray(settingsArray)) {
|
if (!Array.isArray(settingsArray)) {
|
||||||
throw new AppError('InvalidDataFormat', 400, { message: 'Expected an array of settings' })
|
throw new AppError('InvalidDataFormat', 400, { message: 'Expected an array of settings' })
|
||||||
@@ -185,10 +187,62 @@ const bulkUpdateSearchSettings = async (settingsArray) => {
|
|||||||
return results
|
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 = {
|
module.exports = {
|
||||||
DEFAULT_SEARCH_PAGES,
|
DEFAULT_SEARCH_PAGES,
|
||||||
getSearchSettings,
|
getSearchSettings,
|
||||||
getSearchSettingByPage,
|
getSearchSettingByPage,
|
||||||
setSearchMethod,
|
setSearchMethod,
|
||||||
bulkUpdateSearchSettings,
|
bulkUpdateSearchSettings,
|
||||||
|
getSeedStatus,
|
||||||
|
seedDatabase,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,16 @@ module.exports.run = async () => {
|
|||||||
await roleSeeder.runSeeder()
|
await roleSeeder.runSeeder()
|
||||||
await featureSeeder.runSeeder()
|
await featureSeeder.runSeeder()
|
||||||
await propertyStatusSeeder.runSeeder()
|
await propertyStatusSeeder.runSeeder()
|
||||||
|
|
||||||
|
try {
|
||||||
await propertyService.indexAllProperties()
|
await propertyService.indexAllProperties()
|
||||||
|
} catch (err) {
|
||||||
|
console.warn('Typesense property indexing warning during seed:', err.message)
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
await transactionService.indexAllTransactions()
|
await transactionService.indexAllTransactions()
|
||||||
|
} catch (err) {
|
||||||
|
console.warn('Typesense transaction indexing warning during seed:', err.message)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user