Fix multiple bugs: thumbnail generation, branding settings, categories, theme, feedback icons, upload limit, email errors
Bug fixes included: #52 - Thumbnail Generation: Added proper parsing of settings values and validation of Sharp fit parameter to handle JSON-encoded strings correctly #61 - Branding Settings Not Persisting: Added _parseBoolean helper for reliable boolean parsing, added hide_powered_by option for white-label support #55 - Categories Not Applied: Fixed category update logic to properly handle numeric category IDs, added updated_at timestamp, improved cache invalidation #59/#56 - Gallery Layout & Apply Theme: Set isPreviewMode=true so theme changes immediately propagate to parent state, hidden redundant Apply button #58 - Feedback Icons Show When Disabled: Added feedbackEnabled check to comment and like buttons in MasonryGalleryLayout and GridGalleryLayout #57 - Upload Limit 100MB: Increased body parser limit from 100MB to 500MB to support larger batch uploads #54 - Wrong Error Message: Enhanced email error handling with specific error codes and translation keys for better user feedback
This commit is contained in:
@@ -18,6 +18,29 @@ const DEFAULT_THUMBNAIL_FORMAT = 'jpeg';
|
||||
const getStoragePath = () => process.env.STORAGE_PATH || path.join(__dirname, '../../../storage');
|
||||
const getThumbnailPath = () => path.join(getStoragePath(), 'thumbnails');
|
||||
|
||||
// Helper to parse setting value (handles both JSON-encoded and plain values)
|
||||
function parseSettingValue(value) {
|
||||
if (value === null || value === undefined) {
|
||||
return null;
|
||||
}
|
||||
// Try to parse as JSON first (in case it's a JSON-encoded string like '"cover"')
|
||||
try {
|
||||
return JSON.parse(value);
|
||||
} catch (e) {
|
||||
// If it's not valid JSON, return the raw value
|
||||
return value;
|
||||
}
|
||||
}
|
||||
|
||||
// Validate that fit value is valid for Sharp
|
||||
function validateFitValue(fit) {
|
||||
const validFitValues = ['cover', 'contain', 'fill', 'inside', 'outside'];
|
||||
if (fit && validFitValues.includes(fit)) {
|
||||
return fit;
|
||||
}
|
||||
return DEFAULT_THUMBNAIL_FIT;
|
||||
}
|
||||
|
||||
// Get thumbnail settings from database
|
||||
async function getThumbnailSettings() {
|
||||
try {
|
||||
@@ -30,16 +53,19 @@ async function getThumbnailSettings() {
|
||||
'thumbnail_format'
|
||||
])
|
||||
.select('setting_key', 'setting_value');
|
||||
|
||||
|
||||
const settingsMap = {};
|
||||
settings.forEach(s => {
|
||||
settingsMap[s.setting_key] = s.setting_value;
|
||||
settingsMap[s.setting_key] = parseSettingValue(s.setting_value);
|
||||
});
|
||||
|
||||
|
||||
// Parse and validate fit value
|
||||
const fitValue = validateFitValue(settingsMap.thumbnail_fit);
|
||||
|
||||
return {
|
||||
width: parseInt(settingsMap.thumbnail_width) || DEFAULT_THUMBNAIL_WIDTH,
|
||||
height: parseInt(settingsMap.thumbnail_height) || DEFAULT_THUMBNAIL_HEIGHT,
|
||||
fit: settingsMap.thumbnail_fit || DEFAULT_THUMBNAIL_FIT,
|
||||
fit: fitValue,
|
||||
quality: parseInt(settingsMap.thumbnail_quality) || DEFAULT_THUMBNAIL_QUALITY,
|
||||
format: settingsMap.thumbnail_format || DEFAULT_THUMBNAIL_FORMAT
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user