diff --git a/src/routes/change-password/+page.server.ts b/src/routes/change-password/+page.server.ts
new file mode 100644
index 0000000..96d7411
--- /dev/null
+++ b/src/routes/change-password/+page.server.ts
@@ -0,0 +1,53 @@
+import type { PageServerLoad, Actions } from './$types';
+import { fail, redirect } from '@sveltejs/kit';
+import { db } from '$lib/server/db';
+import { users } from '$lib/server/schema';
+import { eq } from 'drizzle-orm';
+import { hashPassword, verifyPassword } from '$lib/server/auth-utils';
+
+export const load: PageServerLoad = async ({ locals }) => {
+ if (!locals.user) throw redirect(303, '/login');
+ if (!locals.user.mustChangePassword) {
+ throw redirect(303, locals.user.role === 'foster' ? '/foster' : '/admin');
+ }
+ return {};
+};
+
+export const actions: Actions = {
+ default: async ({ request, locals }) => {
+ if (!locals.user) throw redirect(303, '/login');
+
+ const fd = await request.formData();
+ const currentPassword = fd.get('currentPassword')?.toString() ?? '';
+ const newPassword = fd.get('newPassword')?.toString() ?? '';
+ const confirmPassword = fd.get('confirmPassword')?.toString() ?? '';
+
+ if (!currentPassword || !newPassword || !confirmPassword) {
+ return fail(400, { error: 'All fields are required' });
+ }
+
+ if (newPassword.length < 8) {
+ return fail(400, { error: 'Password must be at least 8 characters' });
+ }
+
+ if (newPassword !== confirmPassword) {
+ return fail(400, { error: 'New passwords do not match' });
+ }
+
+ const [user] = await db.select().from(users).where(eq(users.id, locals.user.id));
+ if (!user) throw redirect(303, '/login');
+
+ const valid = await verifyPassword(user.passwordHash, currentPassword);
+ if (!valid) {
+ return fail(400, { error: 'Current password is incorrect' });
+ }
+
+ const newHash = await hashPassword(newPassword);
+ await db.update(users).set({
+ passwordHash: newHash,
+ mustChangePassword: false
+ }).where(eq(users.id, locals.user.id));
+
+ throw redirect(303, locals.user.role === 'foster' ? '/foster' : '/admin');
+ }
+};
diff --git a/src/routes/change-password/+page.svelte b/src/routes/change-password/+page.svelte
new file mode 100644
index 0000000..17b92d5
--- /dev/null
+++ b/src/routes/change-password/+page.svelte
@@ -0,0 +1,82 @@
+
+
+
Staff & Foster Portal
+Staff & Foster Portal
+Your registration request has been submitted. You'll receive an email when your account is approved.
+