My-Weekly-ToDo-List/src/app/api/user/profile/route.ts

134 lines
4.7 KiB
TypeScript

import { NextRequest, NextResponse } from 'next/server';
import { getServerSession } from 'next-auth';
import { authOptions } from '../../auth/[...nextauth]/route';
import { PrismaClient } from '@prisma/client';
import bcrypt from 'bcryptjs';
const prisma = new PrismaClient();
// Get user profile
export async function GET(request: NextRequest) {
const session = await getServerSession(authOptions);
if (!session?.user?.email) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
const user = await prisma.user.findUnique({
where: { email: session.user.email },
select: {
name: true,
email: true,
timezone: true,
autoRolling: true,
protectEventTimes: true,
language: true,
dateFormat: true,
timeFormat: true,
startHour: true,
endHour: true,
showNextTask: true,
calendarEditMode: true,
focusTimerDuration: true,
showTimeGrid: true,
cellDuration: true,
viewStyle: true,
fontSize: true,
createdAt: true
}
});
if (!user) {
return NextResponse.json({ error: 'User not found' }, { status: 404 });
}
return NextResponse.json({ user });
}
// Update user profile
export async function PATCH(request: NextRequest) {
const session = await getServerSession(authOptions);
if (!session || !session.user?.email) {
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
}
try {
const body = await request.json();
const {
name, timezone, password, autoRolling, protectEventTimes,
language, dateFormat, timeFormat, startHour, endHour,
showNextTask, calendarEditMode, focusTimerDuration,
showTimeGrid, cellDuration, viewStyle, fontSize
} = body;
const updateData: any = {
...(name !== undefined && { name }),
...(timezone !== undefined && { timezone }),
...(autoRolling !== undefined && { autoRolling }),
...(protectEventTimes !== undefined && { protectEventTimes }),
...(language !== undefined && { language }),
...(dateFormat !== undefined && { dateFormat }),
...(timeFormat !== undefined && { timeFormat }),
...(startHour !== undefined && !isNaN(startHour) && { startHour }),
...(endHour !== undefined && !isNaN(endHour) && { endHour }),
...(showNextTask !== undefined && { showNextTask }),
...(calendarEditMode !== undefined && { calendarEditMode }),
...(focusTimerDuration !== undefined && !isNaN(focusTimerDuration) && { focusTimerDuration }),
...(showTimeGrid !== undefined && { showTimeGrid }),
...(cellDuration !== undefined && !isNaN(cellDuration) && { cellDuration }),
...(viewStyle !== undefined && { viewStyle }),
...(fontSize !== undefined && { fontSize }),
};
if (password && password.trim() !== "") {
updateData.passwordHash = await bcrypt.hash(password, 10);
}
const user = await prisma.user.update({
where: { email: session.user.email },
data: updateData,
select: {
id: true,
name: true,
email: true,
timezone: true,
autoRolling: true,
protectEventTimes: true,
language: true,
dateFormat: true,
timeFormat: true,
startHour: true,
endHour: true,
showNextTask: true,
calendarEditMode: true,
focusTimerDuration: true,
showTimeGrid: true,
cellDuration: true,
viewStyle: true,
fontSize: true,
}
});
return NextResponse.json({ success: true, user });
} catch (e) {
console.error('Error updating profile:', e);
return NextResponse.json(
{ error: 'Failed to update profile', details: (e as Error).message },
{ status: 500 }
);
}
}
// Delete account
export async function DELETE(request: NextRequest) {
const session = await getServerSession(authOptions);
if (!session?.user?.email) return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
try {
await prisma.user.delete({
where: { email: session.user.email }
});
return NextResponse.json({ success: true });
} catch (error) {
console.error('Error deleting account:', error);
return NextResponse.json({ error: 'Failed to delete account' }, { status: 500 });
}
}