- Updated profile-actions.ts to use username column - Updated ProfileForm.tsx to use username - Updated settings page to pass username - Matches database schema (profiles.username)
151 lines
4.2 KiB
TypeScript
151 lines
4.2 KiB
TypeScript
'use server';
|
|
|
|
import { createClient } from '@/lib/supabase/server';
|
|
import { revalidatePath } from 'next/cache';
|
|
|
|
export interface ProfileUpdateResult {
|
|
success: boolean;
|
|
error?: string;
|
|
}
|
|
|
|
/**
|
|
* Update user profile (display_name, avatar_url)
|
|
*/
|
|
export async function updateProfile(formData: FormData): Promise<ProfileUpdateResult> {
|
|
const supabase = await createClient();
|
|
|
|
try {
|
|
const { data: { user } } = await supabase.auth.getUser();
|
|
if (!user) {
|
|
return { success: false, error: 'Nicht autorisiert' };
|
|
}
|
|
|
|
const username = formData.get('username') as string;
|
|
|
|
const { error } = await supabase
|
|
.from('profiles')
|
|
.upsert({
|
|
id: user.id,
|
|
username: username?.trim() || null,
|
|
updated_at: new Date().toISOString(),
|
|
});
|
|
|
|
if (error) {
|
|
console.error('[updateProfile] Error:', error);
|
|
return { success: false, error: error.message };
|
|
}
|
|
|
|
revalidatePath('/settings');
|
|
return { success: true };
|
|
|
|
} catch (error) {
|
|
console.error('[updateProfile] Error:', error);
|
|
return { success: false, error: 'Profil konnte nicht aktualisiert werden' };
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Change user password
|
|
*/
|
|
export async function changePassword(formData: FormData): Promise<ProfileUpdateResult> {
|
|
const supabase = await createClient();
|
|
|
|
try {
|
|
const { data: { user } } = await supabase.auth.getUser();
|
|
if (!user) {
|
|
return { success: false, error: 'Nicht autorisiert' };
|
|
}
|
|
|
|
const newPassword = formData.get('new_password') as string;
|
|
const confirmPassword = formData.get('confirm_password') as string;
|
|
|
|
if (!newPassword || newPassword.length < 6) {
|
|
return { success: false, error: 'Passwort muss mindestens 6 Zeichen lang sein' };
|
|
}
|
|
|
|
if (newPassword !== confirmPassword) {
|
|
return { success: false, error: 'Passwörter stimmen nicht überein' };
|
|
}
|
|
|
|
const { error } = await supabase.auth.updateUser({
|
|
password: newPassword
|
|
});
|
|
|
|
if (error) {
|
|
console.error('[changePassword] Error:', error);
|
|
return { success: false, error: error.message };
|
|
}
|
|
|
|
return { success: true };
|
|
|
|
} catch (error) {
|
|
console.error('[changePassword] Error:', error);
|
|
return { success: false, error: 'Passwort konnte nicht geändert werden' };
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get user profile data
|
|
*/
|
|
export async function getProfile() {
|
|
const supabase = await createClient();
|
|
|
|
try {
|
|
const { data: { user } } = await supabase.auth.getUser();
|
|
if (!user) {
|
|
return null;
|
|
}
|
|
|
|
const { data: profile } = await supabase
|
|
.from('profiles')
|
|
.select('id, username, avatar_url, updated_at')
|
|
.eq('id', user.id)
|
|
.single();
|
|
|
|
return {
|
|
id: user.id,
|
|
email: user.email,
|
|
username: profile?.username || null,
|
|
avatar_url: profile?.avatar_url || null,
|
|
created_at: user.created_at,
|
|
};
|
|
|
|
} catch (error) {
|
|
console.error('[getProfile] Error:', error);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Delete user account (marks for deletion, doesn't immediately delete)
|
|
*/
|
|
export async function requestAccountDeletion(): Promise<ProfileUpdateResult> {
|
|
const supabase = await createClient();
|
|
|
|
try {
|
|
const { data: { user } } = await supabase.auth.getUser();
|
|
if (!user) {
|
|
return { success: false, error: 'Nicht autorisiert' };
|
|
}
|
|
|
|
// Mark profile for deletion (actual deletion handled separately)
|
|
const { error } = await supabase
|
|
.from('profiles')
|
|
.update({
|
|
deletion_requested_at: new Date().toISOString(),
|
|
})
|
|
.eq('id', user.id);
|
|
|
|
if (error) {
|
|
console.error('[requestAccountDeletion] Error:', error);
|
|
return { success: false, error: error.message };
|
|
}
|
|
|
|
return { success: true };
|
|
|
|
} catch (error) {
|
|
console.error('[requestAccountDeletion] Error:', error);
|
|
return { success: false, error: 'Löschanfrage konnte nicht erstellt werden' };
|
|
}
|
|
}
|