generated from corrad-software/corrad-af-2024
217 lines
8.2 KiB
JavaScript
217 lines
8.2 KiB
JavaScript
import { PrismaClient } from "@prisma/client";
|
|
|
|
const prisma = new PrismaClient();
|
|
|
|
export default defineEventHandler(async (event) => {
|
|
const method = getMethod(event);
|
|
|
|
try {
|
|
if (method === "GET") {
|
|
// Get site settings
|
|
let settings = await prisma.site_settings.findFirst({
|
|
orderBy: { settingID: "desc" },
|
|
});
|
|
|
|
// If no settings exist, create default ones
|
|
if (!settings) {
|
|
settings = await prisma.site_settings.create({
|
|
data: {
|
|
siteName: "corradAF",
|
|
siteDescription: "corradAF Base Project",
|
|
themeMode: "biasa",
|
|
showSiteNameInHeader: true,
|
|
seoRobots: "index, follow",
|
|
seoTwitterCard: "summary_large_image",
|
|
settingCreatedDate: new Date(),
|
|
settingModifiedDate: new Date(),
|
|
},
|
|
});
|
|
}
|
|
|
|
// Transform data to match new structure
|
|
const transformedSettings = {
|
|
siteName: settings.siteName || "corradAF",
|
|
siteNameFontSize: settings.siteNameFontSize || 18,
|
|
siteDescription: settings.siteDescription || "corradAF Base Project",
|
|
siteLogo: settings.siteLogo || "",
|
|
siteLoadingLogo: settings.siteLoadingLogo || "",
|
|
siteFavicon: settings.siteFavicon || "",
|
|
siteLoginLogo: settings.siteLoginLogo || "",
|
|
showSiteNameInHeader: settings.showSiteNameInHeader !== false,
|
|
customCSS: settings.customCSS || "",
|
|
selectedTheme: settings.themeMode || "biasa", // Use themeMode as selectedTheme
|
|
customThemeFile: settings.customThemeFile || "",
|
|
currentFont: settings.currentFont || "",
|
|
fontSource: settings.fontSource || "",
|
|
// SEO fields
|
|
seoTitle: settings.seoTitle || "",
|
|
seoDescription: settings.seoDescription || "",
|
|
seoKeywords: settings.seoKeywords || "",
|
|
seoAuthor: settings.seoAuthor || "",
|
|
seoOgImage: settings.seoOgImage || "",
|
|
seoTwitterCard: settings.seoTwitterCard || "summary_large_image",
|
|
seoCanonicalUrl: settings.seoCanonicalUrl || "",
|
|
seoRobots: settings.seoRobots || "index, follow",
|
|
seoGoogleAnalytics: settings.seoGoogleAnalytics || "",
|
|
seoGoogleTagManager: settings.seoGoogleTagManager || "",
|
|
seoFacebookPixel: settings.seoFacebookPixel || ""
|
|
};
|
|
|
|
return {
|
|
statusCode: 200,
|
|
message: "Success",
|
|
data: transformedSettings,
|
|
};
|
|
}
|
|
|
|
if (method === "POST") {
|
|
let body;
|
|
try {
|
|
body = await readBody(event);
|
|
} catch (bodyError) {
|
|
console.error("Error reading request body:", bodyError);
|
|
return {
|
|
statusCode: 400,
|
|
message: "Invalid request body",
|
|
error: bodyError.message,
|
|
};
|
|
}
|
|
|
|
// Validate required fields
|
|
if (!body || typeof body !== 'object') {
|
|
return {
|
|
statusCode: 400,
|
|
message: "Request body must be a valid JSON object",
|
|
};
|
|
}
|
|
|
|
// Check if settings exist
|
|
const existingSettings = await prisma.site_settings.findFirst();
|
|
|
|
// Prepare data for database (use themeMode instead of selectedTheme)
|
|
// Filter out undefined values to avoid database errors
|
|
const dbData = {};
|
|
|
|
// Only add fields that are not undefined
|
|
if (body.siteName !== undefined) dbData.siteName = body.siteName;
|
|
if (body.siteNameFontSize !== undefined) dbData.siteNameFontSize = body.siteNameFontSize;
|
|
if (body.siteDescription !== undefined) dbData.siteDescription = body.siteDescription;
|
|
if (body.siteLogo !== undefined) dbData.siteLogo = body.siteLogo;
|
|
if (body.siteLoadingLogo !== undefined) dbData.siteLoadingLogo = body.siteLoadingLogo;
|
|
if (body.siteFavicon !== undefined) dbData.siteFavicon = body.siteFavicon;
|
|
if (body.siteLoginLogo !== undefined) dbData.siteLoginLogo = body.siteLoginLogo;
|
|
if (body.showSiteNameInHeader !== undefined) dbData.showSiteNameInHeader = body.showSiteNameInHeader;
|
|
if (body.customCSS !== undefined) dbData.customCSS = body.customCSS;
|
|
if (body.selectedTheme !== undefined) dbData.themeMode = body.selectedTheme;
|
|
if (body.customThemeFile !== undefined) dbData.customThemeFile = body.customThemeFile;
|
|
if (body.currentFont !== undefined) dbData.currentFont = body.currentFont;
|
|
if (body.fontSource !== undefined) dbData.fontSource = body.fontSource;
|
|
if (body.seoTitle !== undefined) dbData.seoTitle = body.seoTitle;
|
|
if (body.seoDescription !== undefined) dbData.seoDescription = body.seoDescription;
|
|
if (body.seoKeywords !== undefined) dbData.seoKeywords = body.seoKeywords;
|
|
if (body.seoAuthor !== undefined) dbData.seoAuthor = body.seoAuthor;
|
|
if (body.seoOgImage !== undefined) dbData.seoOgImage = body.seoOgImage;
|
|
if (body.seoTwitterCard !== undefined) dbData.seoTwitterCard = body.seoTwitterCard;
|
|
if (body.seoCanonicalUrl !== undefined) dbData.seoCanonicalUrl = body.seoCanonicalUrl;
|
|
if (body.seoRobots !== undefined) dbData.seoRobots = body.seoRobots;
|
|
if (body.seoGoogleAnalytics !== undefined) dbData.seoGoogleAnalytics = body.seoGoogleAnalytics;
|
|
if (body.seoGoogleTagManager !== undefined) dbData.seoGoogleTagManager = body.seoGoogleTagManager;
|
|
if (body.seoFacebookPixel !== undefined) dbData.seoFacebookPixel = body.seoFacebookPixel;
|
|
|
|
dbData.settingModifiedDate = new Date();
|
|
|
|
let settings;
|
|
if (existingSettings) {
|
|
// Update existing settings
|
|
settings = await prisma.site_settings.update({
|
|
where: { settingID: existingSettings.settingID },
|
|
data: dbData,
|
|
});
|
|
} else {
|
|
// Create new settings
|
|
settings = await prisma.site_settings.create({
|
|
data: {
|
|
...dbData,
|
|
settingCreatedDate: new Date(),
|
|
},
|
|
});
|
|
}
|
|
|
|
// Transform response to match new structure
|
|
const transformedSettings = {
|
|
siteName: settings.siteName || "corradAF",
|
|
siteNameFontSize: settings.siteNameFontSize || 18,
|
|
siteDescription: settings.siteDescription || "corradAF Base Project",
|
|
siteLogo: settings.siteLogo || "",
|
|
siteLoadingLogo: settings.siteLoadingLogo || "",
|
|
siteFavicon: settings.siteFavicon || "",
|
|
siteLoginLogo: settings.siteLoginLogo || "",
|
|
showSiteNameInHeader: settings.showSiteNameInHeader !== false,
|
|
customCSS: settings.customCSS || "",
|
|
selectedTheme: settings.themeMode || "biasa", // Use themeMode as selectedTheme
|
|
customThemeFile: settings.customThemeFile || "",
|
|
currentFont: settings.currentFont || "",
|
|
fontSource: settings.fontSource || "",
|
|
// SEO fields
|
|
seoTitle: settings.seoTitle || "",
|
|
seoDescription: settings.seoDescription || "",
|
|
seoKeywords: settings.seoKeywords || "",
|
|
seoAuthor: settings.seoAuthor || "",
|
|
seoOgImage: settings.seoOgImage || "",
|
|
seoTwitterCard: settings.seoTwitterCard || "summary_large_image",
|
|
seoCanonicalUrl: settings.seoCanonicalUrl || "",
|
|
seoRobots: settings.seoRobots || "index, follow",
|
|
seoGoogleAnalytics: settings.seoGoogleAnalytics || "",
|
|
seoGoogleTagManager: settings.seoGoogleTagManager || "",
|
|
seoFacebookPixel: settings.seoFacebookPixel || ""
|
|
};
|
|
|
|
return {
|
|
statusCode: 200,
|
|
message: "Settings updated successfully",
|
|
data: transformedSettings,
|
|
};
|
|
}
|
|
|
|
return {
|
|
statusCode: 405,
|
|
message: "Method not allowed",
|
|
};
|
|
} catch (error) {
|
|
console.error("Site settings API error:", error);
|
|
|
|
// Provide more specific error messages
|
|
if (error.code === 'P2002') {
|
|
return {
|
|
statusCode: 400,
|
|
message: "Duplicate entry error",
|
|
error: error.message,
|
|
};
|
|
}
|
|
|
|
if (error.code === 'P2025') {
|
|
return {
|
|
statusCode: 404,
|
|
message: "Record not found",
|
|
error: error.message,
|
|
};
|
|
}
|
|
|
|
if (error.code && error.code.startsWith('P')) {
|
|
return {
|
|
statusCode: 400,
|
|
message: "Database error",
|
|
error: error.message,
|
|
code: error.code,
|
|
};
|
|
}
|
|
|
|
return {
|
|
statusCode: 500,
|
|
message: "Internal server error",
|
|
error: error.message,
|
|
};
|
|
} finally {
|
|
await prisma.$disconnect();
|
|
}
|
|
});
|