Files
Dramlog-Prod/src/services/profile-actions.ts
robin af54d8061c fix: Use username field instead of display_name in profile
- 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)
2025-12-26 21:35:41 +01:00

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' };
}
}