mirror of
https://github.com/Oak-and-Sprout/sprout-track.git
synced 2026-05-08 08:00:42 -05:00
working updates for family and settings
This commit is contained in:
@@ -4,10 +4,11 @@ import { ApiResponse } from '../../types';
|
||||
|
||||
export async function GET(req: NextRequest) {
|
||||
try {
|
||||
// Count active caretakers
|
||||
// Count active caretakers (excluding system caretaker)
|
||||
const caretakerCount = await prisma.caretaker.count({
|
||||
where: {
|
||||
deletedAt: null,
|
||||
id: { not: 'system' }, // Exclude system caretaker
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -17,6 +17,17 @@ async function postHandler(req: NextRequest, authContext: AuthResult) {
|
||||
|
||||
const body: CaretakerCreate = await req.json();
|
||||
|
||||
// Prevent creating system caretaker through API
|
||||
if (body.loginId === '00' || body.type === 'System Administrator') {
|
||||
return NextResponse.json<ApiResponse<CaretakerResponse>>(
|
||||
{
|
||||
success: false,
|
||||
error: 'System caretaker cannot be created through this API.',
|
||||
},
|
||||
{ status: 403 }
|
||||
);
|
||||
}
|
||||
|
||||
const existingCaretaker = await prisma.caretaker.findFirst({
|
||||
where: {
|
||||
loginId: body.loginId,
|
||||
@@ -79,8 +90,30 @@ async function putHandler(req: NextRequest, authContext: AuthResult) {
|
||||
const body: CaretakerUpdate = await req.json();
|
||||
const { id, ...updateData } = body;
|
||||
|
||||
// Check if this is the system caretaker
|
||||
const isSystemCaretaker = await prisma.caretaker.findFirst({
|
||||
where: {
|
||||
id,
|
||||
loginId: '00',
|
||||
familyId: userFamilyId
|
||||
}
|
||||
});
|
||||
|
||||
if (isSystemCaretaker) {
|
||||
return NextResponse.json<ApiResponse<CaretakerResponse>>(
|
||||
{
|
||||
success: false,
|
||||
error: 'System caretaker cannot be modified.',
|
||||
},
|
||||
{ status: 403 }
|
||||
);
|
||||
}
|
||||
|
||||
const existingCaretaker = await prisma.caretaker.findFirst({
|
||||
where: { id, familyId: userFamilyId },
|
||||
where: {
|
||||
id,
|
||||
familyId: userFamilyId,
|
||||
},
|
||||
});
|
||||
|
||||
if (!existingCaretaker) {
|
||||
@@ -163,6 +196,25 @@ async function deleteHandler(req: NextRequest, authContext: AuthResult) {
|
||||
return NextResponse.json<ApiResponse<null>>({ success: false, error: 'Caretaker ID is required' }, { status: 400 });
|
||||
}
|
||||
|
||||
// Check if this is the system caretaker
|
||||
const isSystemCaretaker = await prisma.caretaker.findFirst({
|
||||
where: {
|
||||
id,
|
||||
loginId: '00',
|
||||
familyId: userFamilyId
|
||||
}
|
||||
});
|
||||
|
||||
if (isSystemCaretaker) {
|
||||
return NextResponse.json<ApiResponse<null>>(
|
||||
{
|
||||
success: false,
|
||||
error: 'System caretaker cannot be deleted.',
|
||||
},
|
||||
{ status: 403 }
|
||||
);
|
||||
}
|
||||
|
||||
const existingCaretaker = await prisma.caretaker.findFirst({
|
||||
where: { id, familyId: userFamilyId },
|
||||
});
|
||||
@@ -224,6 +276,7 @@ async function getHandler(req: NextRequest, authContext: AuthResult) {
|
||||
where: {
|
||||
deletedAt: null,
|
||||
familyId: userFamilyId,
|
||||
loginId: { not: '00' }, // Exclude system caretaker from lists
|
||||
},
|
||||
orderBy: {
|
||||
name: 'asc',
|
||||
|
||||
@@ -88,6 +88,31 @@ async function handlePut(req: NextRequest, authContext: AuthResult) {
|
||||
data,
|
||||
});
|
||||
|
||||
// If securityPin was updated, also update system caretaker's pin
|
||||
if (body.securityPin !== undefined) {
|
||||
try {
|
||||
const systemCaretaker = await prisma.caretaker.findFirst({
|
||||
where: {
|
||||
loginId: '00',
|
||||
familyId: familyId
|
||||
}
|
||||
});
|
||||
|
||||
if (systemCaretaker) {
|
||||
await prisma.caretaker.update({
|
||||
where: { id: systemCaretaker.id },
|
||||
data: { securityPin: body.securityPin }
|
||||
});
|
||||
console.log('Updated system caretaker security pin to match settings.');
|
||||
} else {
|
||||
console.log('System caretaker not found, skipping pin sync.');
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error updating system caretaker pin (non-fatal):', error);
|
||||
// Don't fail the entire request if system caretaker update fails
|
||||
}
|
||||
}
|
||||
|
||||
return NextResponse.json<ApiResponse<Settings>>({
|
||||
success: true,
|
||||
data: settings,
|
||||
|
||||
+89
-26
@@ -181,18 +181,72 @@ async function updateDatabase() {
|
||||
|
||||
const familyMemberData = [];
|
||||
|
||||
// Add system user to family with admin role
|
||||
familyMemberData.push({
|
||||
familyId: familyId,
|
||||
caretakerId: 'system',
|
||||
role: 'admin',
|
||||
joinedAt: new Date()
|
||||
// Create or update system caretaker
|
||||
let systemCaretaker = await prisma.caretaker.findFirst({
|
||||
where: {
|
||||
loginId: '00',
|
||||
familyId: familyId
|
||||
}
|
||||
});
|
||||
|
||||
// Get all existing caretakers
|
||||
if (!systemCaretaker) {
|
||||
console.log('Creating system caretaker...');
|
||||
|
||||
// Get security pin from settings table
|
||||
let securityPin = '111222'; // Default fallback from schema
|
||||
try {
|
||||
const settings = await prisma.settings.findFirst();
|
||||
if (settings && settings.securityPin) {
|
||||
securityPin = settings.securityPin;
|
||||
console.log('Using security pin from settings table.');
|
||||
} else {
|
||||
console.log('No settings found or no security pin set, using default: 111222');
|
||||
}
|
||||
} catch (error) {
|
||||
console.log('Error reading security pin from settings, using default 111222:', error.message);
|
||||
}
|
||||
|
||||
systemCaretaker = await prisma.caretaker.create({
|
||||
data: {
|
||||
id: randomUUID(),
|
||||
loginId: '00',
|
||||
name: 'system',
|
||||
type: 'System Administrator',
|
||||
role: 'ADMIN',
|
||||
securityPin: securityPin,
|
||||
familyId: familyId
|
||||
}
|
||||
});
|
||||
console.log('System caretaker created successfully.');
|
||||
} else {
|
||||
console.log('System caretaker already exists in this family.');
|
||||
}
|
||||
|
||||
// Check if system user is already a family member
|
||||
const existingSystemMember = await prisma.familyMember.findFirst({
|
||||
where: {
|
||||
familyId: familyId,
|
||||
caretakerId: systemCaretaker.id
|
||||
}
|
||||
});
|
||||
|
||||
if (!existingSystemMember) {
|
||||
// Add system user to family with admin role
|
||||
familyMemberData.push({
|
||||
familyId: familyId,
|
||||
caretakerId: systemCaretaker.id,
|
||||
role: 'admin',
|
||||
joinedAt: new Date()
|
||||
});
|
||||
} else {
|
||||
console.log('System caretaker is already a family member.');
|
||||
}
|
||||
|
||||
// Get all existing caretakers (excluding system caretaker)
|
||||
const caretakers = await prisma.caretaker.findMany({
|
||||
where: {
|
||||
deletedAt: null
|
||||
deletedAt: null,
|
||||
loginId: { not: '00' } // Exclude system caretaker to prevent duplicates
|
||||
},
|
||||
orderBy: {
|
||||
createdAt: 'asc'
|
||||
@@ -202,26 +256,35 @@ async function updateDatabase() {
|
||||
if (caretakers.length > 0) {
|
||||
console.log(`Found ${caretakers.length} caretakers to link to family.`);
|
||||
|
||||
// Create FamilyMember records for each caretaker
|
||||
const caretakerData = caretakers.map((caretaker) => {
|
||||
// Determine role based on caretaker's existing role
|
||||
let familyRole = 'member'; // default
|
||||
// Create FamilyMember records for each caretaker (only if they don't already exist)
|
||||
for (const caretaker of caretakers) {
|
||||
const existingMember = await prisma.familyMember.findFirst({
|
||||
where: {
|
||||
familyId: familyId,
|
||||
caretakerId: caretaker.id
|
||||
}
|
||||
});
|
||||
|
||||
// Use the caretaker's existing role (ADMIN -> admin, USER -> member)
|
||||
if (caretaker.role === 'ADMIN') {
|
||||
familyRole = 'admin';
|
||||
if (!existingMember) {
|
||||
// Determine role based on caretaker's existing role
|
||||
let familyRole = 'member'; // default
|
||||
|
||||
// Use the caretaker's existing role (ADMIN -> admin, USER -> member)
|
||||
if (caretaker.role === 'ADMIN') {
|
||||
familyRole = 'admin';
|
||||
}
|
||||
// USER role becomes member (this is the default we set above)
|
||||
|
||||
familyMemberData.push({
|
||||
familyId: familyId,
|
||||
caretakerId: caretaker.id,
|
||||
role: familyRole,
|
||||
joinedAt: new Date()
|
||||
});
|
||||
} else {
|
||||
console.log(`Caretaker ${caretaker.name} is already a family member.`);
|
||||
}
|
||||
// USER role becomes member (this is the default we set above)
|
||||
|
||||
return {
|
||||
familyId: familyId,
|
||||
caretakerId: caretaker.id,
|
||||
role: familyRole,
|
||||
joinedAt: new Date()
|
||||
};
|
||||
});
|
||||
|
||||
familyMemberData.push(...caretakerData);
|
||||
}
|
||||
}
|
||||
|
||||
// Bulk create all family member relationships
|
||||
|
||||
Reference in New Issue
Block a user