Update notification text handling in API and dashboard to support separate application and server notification texts.

This commit is contained in:
headlessdev 2025-04-21 13:22:40 +02:00
parent 49eeab4848
commit 21dd61c597
3 changed files with 48 additions and 22 deletions

View File

@ -7,7 +7,7 @@ export async function POST(request: NextRequest) {
// Check if there are any settings entries
const existingSettings = await prisma.settings.findFirst();
if (!existingSettings) {
return NextResponse.json({ "notification_text": "" });
return NextResponse.json({ "notification_text_application": "", "notification_text_server": "" });
}
// If settings entry exists, fetch it
@ -15,10 +15,10 @@ export async function POST(request: NextRequest) {
where: { id: existingSettings.id },
});
if (!settings) {
return NextResponse.json({ "notification_text": "" });
return NextResponse.json({ "notification_text_application": "", "notification_text_server": "" });
}
// Return the settings entry
return NextResponse.json({ "notification_text": settings.notification_text });
return NextResponse.json({ "notification_text_application": settings.notification_text_application, "notification_text_server": settings.notification_text_server });
} catch (error: any) {
return NextResponse.json({ error: error.message }, { status: 500 });
}

View File

@ -2,13 +2,14 @@ import { NextResponse, NextRequest } from "next/server";
import { prisma } from "@/lib/prisma";
interface AddRequest {
text: string;
text_application: string;
text_server: string;
}
export async function POST(request: NextRequest) {
try {
const body: AddRequest = await request.json();
const { text } = body;
const { text_application, text_server } = body;
// Check if there is already a settings entry
const existingSettings = await prisma.settings.findFirst();
@ -16,14 +17,15 @@ export async function POST(request: NextRequest) {
// Update the existing settings entry
const updatedSettings = await prisma.settings.update({
where: { id: existingSettings.id },
data: { notification_text: text },
data: { notification_text_application: text_application, notification_text_server: text_server },
});
return NextResponse.json({ message: "Success", updatedSettings });
}
// If no settings entry exists, create a new one
const settings = await prisma.settings.create({
data: {
notification_text: text,
notification_text_application: text_application,
notification_text_server: text_server,
}
});

View File

@ -39,7 +39,8 @@ interface NotificationsResponse {
notifications: any[]
}
interface NotificationResponse {
notification_text?: string
notification_text_application?: string
notification_text_server?: string
}
export default function Settings() {
@ -76,7 +77,8 @@ export default function Settings() {
const [notifications, setNotifications] = useState<any[]>([])
const [notificationText, setNotificationText] = useState<string>("")
const [notificationTextApplication, setNotificationTextApplication] = useState<string>("")
const [notificationTextServer, setNotificationTextServer] = useState<string>("")
const changeEmail = async () => {
setEmailErrorVisible(false)
@ -215,10 +217,15 @@ export default function Settings() {
try {
const response = await axios.post<NotificationResponse>("/api/settings/get_notification_text", {})
if (response.status === 200) {
if (response.data.notification_text) {
setNotificationText(response.data.notification_text)
if (response.data.notification_text_application) {
setNotificationTextApplication(response.data.notification_text_application)
} else {
setNotificationText("The application !name (!url) is now !status.")
setNotificationTextApplication("The application !name (!url) is now !status.")
}
if (response.data.notification_text_server) {
setNotificationTextServer(response.data.notification_text_server)
} else {
setNotificationTextServer("The server !name is now !status.")
}
}
} catch (error: any) {
@ -229,7 +236,8 @@ export default function Settings() {
const editNotificationText = async () => {
try {
const response = await axios.post("/api/settings/notification_text", {
text: notificationText,
text_application: notificationTextApplication,
text_server: notificationTextServer,
})
} catch (error: any) {
alert(error.response.data.error)
@ -613,12 +621,22 @@ export default function Settings() {
<AlertDialogDescription>
<div className="space-y-4">
<div className="space-y-1.5">
<Label htmlFor="text">Notification Text</Label>
<Label htmlFor="text_application">Notification Text for Applications</Label>
<Textarea
id="text"
id="text_application"
placeholder="Type here..."
value={notificationText}
onChange={(e) => setNotificationText(e.target.value)}
value={notificationTextApplication}
onChange={(e) => setNotificationTextApplication(e.target.value)}
rows={4}
/>
</div>
<div className="space-y-1.5">
<Label htmlFor="text_server">Notification Text for Servers</Label>
<Textarea
id="text_server"
placeholder="Type here..."
value={notificationTextServer}
onChange={(e) => setNotificationTextServer(e.target.value)}
rows={4}
/>
</div>
@ -627,13 +645,19 @@ export default function Settings() {
You can use the following placeholders in the text:
<ul className="list-disc list-inside space-y-1 pt-2">
<li>
<strong>!name</strong> - Application name
<b>Server related:</b>
<ul className="list-disc list-inside ml-4 space-y-1 pt-1 text-muted-foreground">
<li>!name - The name of the server</li>
<li>!status - The current status of the server (online/offline)</li>
</ul>
</li>
<li>
<strong>!url</strong> - Application URL
</li>
<li>
<strong>!status</strong> - Application status (online/offline)
<b>Application related:</b>
<ul className="list-disc list-inside ml-4 space-y-1 pt-1 text-muted-foreground">
<li>!name - The name of the application</li>
<li>!url - The URL where the application is hosted</li>
<li>!status - The current status of the application (online/offline)</li>
</ul>
</li>
</ul>
</div>