diff --git a/src/api/account.ts b/src/api/account.ts index 6d49d98..3bc160c 100644 --- a/src/api/account.ts +++ b/src/api/account.ts @@ -1,5 +1,5 @@ import type { Actor } from "@/types/aggregate"; -import type { RecoverPasswordPayload, RegisterPayload, SignInPayload } from "@/types/account"; +import type { RecoverPasswordPayload, RegisterPayload, ResetPasswordPayload, SignInPayload } from "@/types/account"; import { useUserStore } from "@/stores/user"; function sleep(delay: number): Promise { @@ -23,6 +23,12 @@ export async function register(payload: RegisterPayload): Promise { users.create(payload); } +export async function resetPassword(payload: ResetPasswordPayload): Promise { + await sleep(2500); + const users = useUserStore(); + return users.resetPassword(payload); +} + export async function signIn(payload: SignInPayload): Promise { await sleep(2500); const users = useUserStore(); diff --git a/src/stores/user.ts b/src/stores/user.ts index 96aa6ef..cb9f3df 100644 --- a/src/stores/user.ts +++ b/src/stores/user.ts @@ -4,7 +4,7 @@ import { nanoid } from "nanoid"; import UserRepository from "./userRepository"; import type { Actor } from "@/types/aggregate"; import type { ErrorDetail } from "@/types/api"; -import type { RegisterPayload, SignInPayload } from "@/types/account"; +import type { RegisterPayload, ResetPasswordPayload, SignInPayload } from "@/types/account"; import type { User } from "@/types/users"; function buildFullName(...names: (string | undefined)[]): string | undefined { @@ -100,6 +100,22 @@ export const useUserStore = defineStore("user", () => { users.save(user, passwordHash); } + function resetPassword(payload: ResetPasswordPayload): Actor | undefined { + // Initialize storage + const users = new UserRepository(localStorage); + + // Try finding the user by username or email address + const user: User | undefined = users.findByUsername(payload.token) ?? users.findByEmail(payload.token); + if (!user) { + return; + } + + // Change the user password + users.save(user, hash(payload.password)); + + return toActor(user); + } + function signIn(payload: SignInPayload): Actor { // Initialize storage const users = new UserRepository(localStorage); @@ -155,5 +171,5 @@ export const useUserStore = defineStore("user", () => { return actor; } - return { create, signIn, verifyEmail }; + return { create, resetPassword, signIn, verifyEmail }; }); diff --git a/src/types/account.ts b/src/types/account.ts index d2181f6..64670f5 100644 --- a/src/types/account.ts +++ b/src/types/account.ts @@ -10,6 +10,11 @@ export type RegisterPayload = { lastName?: string; }; +export type ResetPasswordPayload = { + token: string; + password: string; +}; + export type SignInPayload = { username: string; password?: string; diff --git a/src/views/account/ConfirmView.vue b/src/views/account/ConfirmView.vue index 7458ea5..9df22e2 100644 --- a/src/views/account/ConfirmView.vue +++ b/src/views/account/ConfirmView.vue @@ -15,7 +15,8 @@ onMounted(async () => { const token = route.params.token as string; const actor: Actor | undefined = await confirm(token); if (!actor) { - return router.push({ name: "SignIn" }); + router.push({ name: "SignIn" }); + return; } account.signIn(actor); router.push({ name: "Profile" }); diff --git a/src/views/account/RegisterView.vue b/src/views/account/RegisterView.vue index 8053877..7f91e2f 100644 --- a/src/views/account/RegisterView.vue +++ b/src/views/account/RegisterView.vue @@ -9,8 +9,8 @@ import { register } from "@/api/account"; const router = useRouter(); const loading = ref(false); -const payload = ref({ username: "" }); const passwordConfirmation = ref(); +const payload = ref({ username: "" }); const success = ref(false); async function submit(): Promise { diff --git a/src/views/account/ResetPasswordView.vue b/src/views/account/ResetPasswordView.vue index 5c645b8..bd0bb12 100644 --- a/src/views/account/ResetPasswordView.vue +++ b/src/views/account/ResetPasswordView.vue @@ -1,7 +1,76 @@ - +