working updates for family and settings

This commit is contained in:
John Overton
2025-06-27 10:08:59 -05:00
parent 4b062b1af0
commit c46546528f
4 changed files with 170 additions and 28 deletions
+2 -1
View File
@@ -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
},
});
+54 -1
View File
@@ -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',
+25
View File
@@ -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
View File
@@ -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