- Updated `env.example` to include NextAuth configuration for authentication. - Added `next-auth` dependency to manage user sessions. - Introduced `User` model in Prisma schema with fields for user details and password hashing. - Integrated `AuthProvider` in layout for session management across the app. - Enhanced `Header` component with `AuthButton` for user authentication controls.
104 lines
2.9 KiB
TypeScript
104 lines
2.9 KiB
TypeScript
'use server'
|
|
|
|
import { getServerSession } from 'next-auth/next'
|
|
import { authOptions } from '@/lib/auth'
|
|
import { usersService } from '@/services/users'
|
|
import { revalidatePath } from 'next/cache'
|
|
|
|
export async function updateProfile(formData: {
|
|
name?: string
|
|
firstName?: string
|
|
lastName?: string
|
|
avatar?: string
|
|
}) {
|
|
try {
|
|
const session = await getServerSession(authOptions)
|
|
|
|
if (!session?.user?.id) {
|
|
return { success: false, error: 'Non authentifié' }
|
|
}
|
|
|
|
// Validation
|
|
if (formData.firstName && formData.firstName.length > 50) {
|
|
return { success: false, error: 'Le prénom ne peut pas dépasser 50 caractères' }
|
|
}
|
|
|
|
if (formData.lastName && formData.lastName.length > 50) {
|
|
return { success: false, error: 'Le nom ne peut pas dépasser 50 caractères' }
|
|
}
|
|
|
|
if (formData.name && formData.name.length > 100) {
|
|
return { success: false, error: 'Le nom d\'affichage ne peut pas dépasser 100 caractères' }
|
|
}
|
|
|
|
if (formData.avatar && formData.avatar.length > 500) {
|
|
return { success: false, error: 'L\'URL de l\'avatar ne peut pas dépasser 500 caractères' }
|
|
}
|
|
|
|
// Mettre à jour l'utilisateur
|
|
const updatedUser = await usersService.updateUser(session.user.id, {
|
|
name: formData.name || null,
|
|
firstName: formData.firstName || null,
|
|
lastName: formData.lastName || null,
|
|
avatar: formData.avatar || null,
|
|
})
|
|
|
|
// Revalider la page de profil
|
|
revalidatePath('/profile')
|
|
|
|
return {
|
|
success: true,
|
|
user: {
|
|
id: updatedUser.id,
|
|
email: updatedUser.email,
|
|
name: updatedUser.name,
|
|
firstName: updatedUser.firstName,
|
|
lastName: updatedUser.lastName,
|
|
avatar: updatedUser.avatar,
|
|
role: updatedUser.role,
|
|
createdAt: updatedUser.createdAt.toISOString(),
|
|
lastLoginAt: updatedUser.lastLoginAt?.toISOString() || null,
|
|
}
|
|
}
|
|
|
|
} catch (error) {
|
|
console.error('Profile update error:', error)
|
|
return { success: false, error: 'Erreur lors de la mise à jour du profil' }
|
|
}
|
|
}
|
|
|
|
export async function getProfile() {
|
|
try {
|
|
const session = await getServerSession(authOptions)
|
|
|
|
if (!session?.user?.id) {
|
|
return { success: false, error: 'Non authentifié' }
|
|
}
|
|
|
|
const user = await usersService.getUserById(session.user.id)
|
|
|
|
if (!user) {
|
|
return { success: false, error: 'Utilisateur non trouvé' }
|
|
}
|
|
|
|
return {
|
|
success: true,
|
|
user: {
|
|
id: user.id,
|
|
email: user.email,
|
|
name: user.name,
|
|
firstName: user.firstName,
|
|
lastName: user.lastName,
|
|
avatar: user.avatar,
|
|
role: user.role,
|
|
createdAt: user.createdAt.toISOString(),
|
|
lastLoginAt: user.lastLoginAt?.toISOString() || null,
|
|
}
|
|
}
|
|
|
|
} catch (error) {
|
|
console.error('Profile get error:', error)
|
|
return { success: false, error: 'Erreur lors de la récupération du profil' }
|
|
}
|
|
}
|