This commit is contained in:
Jean Jacques Avril 2025-03-02 18:19:11 +00:00
parent 9bf715ee88
commit 2ab89d122d
4 changed files with 143 additions and 1451 deletions

File diff suppressed because it is too large Load Diff

View File

@ -134,6 +134,21 @@ export async function POST(request: NextRequest) {
}); });
} }
case 'deleteAll': {
// Get all members
const members = getMemberCredentials();
// Delete each member
for (const member of members) {
deleteMember(member.memberNumber);
}
return NextResponse.json({
success: true,
message: 'Alle Mitglieder erfolgreich gelöscht'
});
}
default: default:
return NextResponse.json( return NextResponse.json(
{ error: 'Ungültige Aktion' }, { error: 'Ungültige Aktion' },

View File

@ -1,15 +1,13 @@
import { NextRequest, NextResponse } from 'next/server';
import fs from 'fs';
import path from 'path';
import { checkAdminAuth } from '@/lib/auth'; import { checkAdminAuth } from '@/lib/auth';
import { resetMemberVotingStatus } from '@/lib/server-auth'; import { resetMemberVotingStatus } from '@/lib/server-auth';
import fs from 'fs';
import { NextResponse } from 'next/server';
import path from 'path';
export async function POST(request: NextRequest) { export async function POST() {
try { try {
const body = await request.json(); // Check for admin auth using JWT cookie
// Check for admin auth const isAuthenticated = await checkAdminAuth();
const { password } = body;
const isAuthenticated = await checkAdminAuth(password);
if (!isAuthenticated) { if (!isAuthenticated) {
return NextResponse.json( return NextResponse.json(
{ error: 'Unauthorized' }, { error: 'Unauthorized' },

View File

@ -182,6 +182,45 @@ export default function MembersManager() {
} }
}; };
// Delete all members
const handleDeleteAllMembers = async () => {
// Show confirmation dialog
if (!confirm('Sind Sie sicher, dass Sie ALLE Mitglieder löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.')) {
return;
}
setIsLoading(true);
setError(null);
setSuccess(null);
try {
const response = await fetch('/api/members', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
action: 'deleteAll'
}),
});
const data = await response.json();
if (!response.ok) {
throw new Error(data.error || 'Fehler beim Löschen aller Mitglieder');
}
setSuccess('Alle Mitglieder erfolgreich gelöscht');
// Refresh members list
fetchMembers();
} catch (err) {
setError(err instanceof Error ? err.message : 'Ein Fehler ist aufgetreten');
} finally {
setIsLoading(false);
}
};
// Toggle voting status // Toggle voting status
const handleToggleVotingStatus = async (memberNumber: string, currentStatus: boolean) => { const handleToggleVotingStatus = async (memberNumber: string, currentStatus: boolean) => {
setIsLoading(true); setIsLoading(true);
@ -320,6 +359,13 @@ export default function MembersManager() {
> >
{showUploadForm ? 'Abbrechen' : 'CSV importieren'} {showUploadForm ? 'Abbrechen' : 'CSV importieren'}
</button> </button>
<button
onClick={handleDeleteAllMembers}
className="bg-red-600 hover:bg-red-700 text-white px-3 py-1 rounded"
>
Alle Mitglieder löschen
</button>
</div> </div>
{/* Add Member Form */} {/* Add Member Form */}
@ -449,11 +495,10 @@ export default function MembersManager() {
<td className="p-2">{member.memberNumber}</td> <td className="p-2">{member.memberNumber}</td>
<td className="p-2 text-center"> <td className="p-2 text-center">
<span <span
className={`inline-block px-2 py-1 rounded text-xs ${ className={`inline-block px-2 py-1 rounded text-xs ${member.hasVoted
member.hasVoted ? 'bg-green-100 text-green-800'
? 'bg-green-100 text-green-800' : 'bg-yellow-100 text-yellow-800'
: 'bg-yellow-100 text-yellow-800' }`}
}`}
> >
{member.hasVoted ? 'Abgestimmt' : 'Nicht abgestimmt'} {member.hasVoted ? 'Abgestimmt' : 'Nicht abgestimmt'}
</span> </span>
@ -461,12 +506,12 @@ export default function MembersManager() {
<td className="p-2 text-center text-sm text-gray-600"> <td className="p-2 text-center text-sm text-gray-600">
{member.lastLogin {member.lastLogin
? new Date(member.lastLogin).toLocaleString('de-DE', { ? new Date(member.lastLogin).toLocaleString('de-DE', {
day: '2-digit', day: '2-digit',
month: '2-digit', month: '2-digit',
year: 'numeric', year: 'numeric',
hour: '2-digit', hour: '2-digit',
minute: '2-digit' minute: '2-digit'
}) })
: '-'} : '-'}
</td> </td>
<td className="p-2 text-right"> <td className="p-2 text-right">