diff --git a/src/app/components/form/PasswordField.vue b/src/app/components/form/PasswordField.vue new file mode 100644 index 00000000..e2bca565 --- /dev/null +++ b/src/app/components/form/PasswordField.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/app/components/form/TextField.vue b/src/app/components/form/TextField.vue index f3271074..6a1a79fa 100644 --- a/src/app/components/form/TextField.vue +++ b/src/app/components/form/TextField.vue @@ -4,7 +4,7 @@ {{ $t('me.sectionGeneral') }} - + @@ -26,12 +26,12 @@ Address diff --git a/src/app/pages/me.vue b/src/app/pages/me.vue index a3bb970d..1a367611 100644 --- a/src/app/pages/me.vue +++ b/src/app/pages/me.vue @@ -5,116 +5,106 @@ -
-

- {{ $t('me.sectionGeneral') }} -

- - - - - - -
- {{ $t('save') }} -
-
-
-

- {{ $t('me.sectionPassword') }} -

- - - - - - -
- {{ - $t('updatePassword') - }} -
-
+ + + {{ $t('me.sectionGeneral') }} + + + + + + + + {{ $t('me.sectionPassword') }} + + + + + +
diff --git a/src/server/api/me/index.post.ts b/src/server/api/me/index.post.ts new file mode 100644 index 00000000..324b4552 --- /dev/null +++ b/src/server/api/me/index.post.ts @@ -0,0 +1,13 @@ +import { UserUpdateSchema } from '#db/repositories/user/types'; + +export default definePermissionEventHandler( + actions.CLIENT, + async ({ event, user }) => { + const { name, email } = await readValidatedBody( + event, + validateZod(UserUpdateSchema) + ); + await Database.users.update(user.id, name, email); + return { success: true }; + } +); diff --git a/src/server/database/repositories/user/service.ts b/src/server/database/repositories/user/service.ts index 209fe99d..34cffff1 100644 --- a/src/server/database/repositories/user/service.ts +++ b/src/server/database/repositories/user/service.ts @@ -14,6 +14,14 @@ function createPreparedStatement(db: DBType) { where: eq(user.username, sql.placeholder('username')), }) .prepare(), + update: db + .update(user) + .set({ + name: sql.placeholder('name') as never as string, + email: sql.placeholder('email') as never as string, + }) + .where(eq(user.id, sql.placeholder('id'))) + .prepare(), }; } @@ -60,4 +68,8 @@ export class UserService { }); }); } + + async update(id: ID, name: string, email: string | null) { + return this.#statements.update.execute({ id, name, email }); + } } diff --git a/src/server/database/repositories/user/types.ts b/src/server/database/repositories/user/types.ts index 7b629365..9c519d7d 100644 --- a/src/server/database/repositories/user/types.ts +++ b/src/server/database/repositories/user/types.ts @@ -20,6 +20,18 @@ const password = z const remember = z.boolean({ message: 'zod.user.remember' }); +const name = z + .string({ message: 'zod.user.name' }) + .min(1, 'zod.user.nameMin') + .pipe(safeStringRefine); + +const email = z + .string({ message: 'zod.user.email' }) + .min(5, 'zod.user.emailMin') + .email({ message: 'zod.user.emailInvalid' }) + .pipe(safeStringRefine) + .nullable(); + export const UserLoginSchema = z.object( { username: username, @@ -41,3 +53,11 @@ export const UserSetupType = z.object( }, { message: objectMessage } ); + +export const UserUpdateSchema = z.object( + { + name: name, + email: email, + }, + { message: objectMessage } +);