From edf23bdbaa110946f4ee3a15ebfd859169785b48 Mon Sep 17 00:00:00 2001 From: Peaceultime Date: Tue, 30 Jul 2024 23:25:47 +0200 Subject: [PATCH] Registration completed --- .gitignore | 2 + assets/common.css | 19 ++++++- bun.lockb | Bin 347136 -> 347136 bytes components/Input.vue | 7 ++- composables/useAuth.ts | 88 +++++++++++++++++++++++-------- db.sqlite | Bin 69632 -> 69632 bytes middleware/auth.ts | 4 +- nuxt.config.ts | 3 +- pages/user/register.vue | 56 +++++++++++++------- schemas/registration.ts | 3 ++ server/api/auth/login.post.ts | 1 + server/api/auth/register.post.ts | 81 ++++++++++++++++++---------- 12 files changed, 191 insertions(+), 73 deletions(-) diff --git a/.gitignore b/.gitignore index 66f00b6..c62c698 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,5 @@ logs .env .env.* !.env.example + +db.sqlite-* \ No newline at end of file diff --git a/assets/common.css b/assets/common.css index 7922b2d..96583a8 100644 --- a/assets/common.css +++ b/assets/common.css @@ -192,13 +192,19 @@ html.light-mode .light-block { .input-form.input-form-wide { width: 600px; + min-height: 300px; + justify-content: center; + align-items: stretch; } .input-form { width: 400px; + min-height: 200px; + justify-content: center; + align-items: center; display: flex; flex-direction: column; - padding: 0 2em 2em 2em; + padding: 2em 2em 2em 2em; border: 1px solid var(--background-modifier-border); } @@ -209,6 +215,7 @@ html.light-mode .light-block { } .input-form h1 { + margin-top: 0px; font-size: x-large; } @@ -253,4 +260,14 @@ html.light-mode .light-block { .password-validation-item.validation-error { color: var(--text-error); +} + +.input-form .loading { + width: 24px; + height: 24px; + border: 4px solid var(--color-purple); + border-right-color: transparent; + border-radius: 50%; + box-sizing: content-box; + animation: rotate 1s linear infinite; } \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index 996f7023f183c9ae15eb786cde59b640474d29b9..04cd812944758a4ba047b05b40c7170bea7ffccc 100644 GIT binary patch delta 71 zcmZpeA=&^$EsQNpTbQ@jvoppS>KW>pweP8C-oB@vWy)yds4y@z VFhBukR@L*@f8WiXezBZs0swVO8A<>E delta 71 zcmZpeA=&^$EsQNpTbQ@jvokS(LHnM1=IwjxS*Dy;IJ3`0X#dBzw>xG(Z$E TFz84puX^*X@%i+N(); const model = defineModel(); + +const err = ref(props.error); \ No newline at end of file diff --git a/composables/useAuth.ts b/composables/useAuth.ts index d2efa9d..a82456c 100644 --- a/composables/useAuth.ts +++ b/composables/useAuth.ts @@ -6,49 +6,91 @@ export interface Auth { id: Ref; data: Ref>; - token: Ref; - session_id: Ref; + sessionId: Ref; status: Ref; lastRefresh: Ref; - register: (username: string, email: string, password: string, data?: Record) => AuthStatus; - login: (usernameOrEmail: string, password: string) => AuthStatus; - logout: () => AuthStatus; + register: (username: string, email: string, password: string, data?: Record) => Promise; + login: (usernameOrEmail: string, password: string) => Promise; + logout: () => Promise; - refresh: () => AuthStatus; + refresh: () => Promise; } -const id = useState("auth:id", () => 0); -const data = useState("auth:data", () => {}); -const token = useState("auth:token", () => ''); -const session_id = useState("auth:session_id", () => 0); -const status = useState("auth:status", () => 0); -const lastRefresh = useState("auth:date", () => new Date()); +async function register(username: string, email: string, password: string, additionalData?: Record): Promise +{ + const id = useState("auth:id"); + const data = useState("auth:data"); + const sessionId = useState("auth:sessionId"); + const status = useState("auth:status"); + const lastRefresh = useState("auth:date"); + status.value = AuthStatus.loading; -function register(username: string, email: string, password: string, data?: Record): AuthStatus -{ - - return AuthStatus.disconnected; + try + { + const result = await $fetch("/api/auth/register", { + method: 'POST', + body: { username, email, password, additionalData }, + ignoreResponseError: true, + }); + + if(result.success) + { + id.value = result.id!; + data.value = { ...additionalData, username: username, email: email }; + sessionId.value = result.sessionId!; + status.value = AuthStatus.connected; + lastRefresh.value = new Date(); + + return; + } + else if(result.error) + { + status.value = AuthStatus.disconnected; + + return result.error; + } + else + { + status.value = AuthStatus.disconnected; + + return; + } + } + catch(e) { + console.log(JSON.stringify(e)); + status.value = AuthStatus.disconnected; + } } -function login(usernameOrEmail: string, password: string): AuthStatus +async function login(usernameOrEmail: string, password: string): Promise { - return AuthStatus.disconnected; + const status = useState("auth:status"); + status.value = AuthStatus.disconnected; } -function logout(): AuthStatus +async function logout(): Promise { - return AuthStatus.disconnected; + const status = useState("auth:status"); + status.value = AuthStatus.disconnected; } -function refresh(): AuthStatus +async function refresh(): Promise { - return AuthStatus.disconnected; + const status = useState("auth:status"); + status.value = AuthStatus.disconnected; } export default function useAuth(): Auth { + const id = useState("auth:id", () => 0); + const data = useState("auth:data", () => { }); + const sessionId = useState("auth:sessionId", () => ''); + const status = useState("auth:status", () => AuthStatus.disconnected); + + const lastRefresh = useState("auth:date", () => new Date()); + return { - id, data, token, session_id, status, lastRefresh, + id, data, sessionId, status, lastRefresh, register, login, logout, refresh }; } \ No newline at end of file diff --git a/db.sqlite b/db.sqlite index 3d36073c900cb31d2c31b22ca0f7ba6ee3d29fd2..fee7ba934dc6feeda8d7b07ff477cadf164b4552 100644 GIT binary patch delta 843 zcmbV|%~I1)6vywSNov}rxAkMHpaVvrRT&F3DjheJ5)lUZEEd?rG+feX+Cq~sI4*?3 zUTPjd_AVSJ58wl^z@0uq7mm|~G6TcHODaRfopa~R+;i^lp8x-xja_PEm)dCyvjBiF z2}FV-(OvCHK(_k4o%_K$?0R6$JMdnRqvE3Vq$KkeO$~heyt9ni{abZPrQ>pTZ zuMBiGi1t&W(j9XvTdz+mfBg~8Hxa1xjF`%Z9hub7xY)rry$4T3C4ujV`B+|CvZqn2 zo%eRewH2Pti1V2qQkGR*G|y69Hq05kT*gM8XGbS8;)poo?0NHW)c*m9k!TcdGdx4a z1|WHpi9C%$pcR+!I#Jb3EXkJ1bTLfq4-q|2B=0a0`=kE>9ZcSKZ!!DWhkTV*GBfGD zW!PC(v}e)P|M6+>d6gEi&3+#ocBcJZkV>7XZTc?13o!P6AaqTT`kS`XSWYll0_i5` ziXip<1JTZL09|tYgNMkWdVj?)K+C{ogXSE#bBIC!w9qZUM|J|y5kN;y_)8sKq&*PQ zH0M@x0Oio46An!vKSMEq<2bO{M%(!9uwoix)NGBto|s78RV=!V;cbc2eH3yD7AVegoE5C=8s0%?$phMNRf6xbN~lNk7ufH4=&&(hc^%{V!=-z6eS+qE>k%)=zD#K_0Y z)iA^$&?sEr(k8npwk%nKQaIjh{*|b!UKLO zem-Vp&Vba! { const meta = to.meta.auth; - //to. + //useSession(to.) + + return to; }) \ No newline at end of file diff --git a/nuxt.config.ts b/nuxt.config.ts index 364e4ab..890aefb 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -5,7 +5,8 @@ export default defineNuxtConfig({ modules: [CanvasModule, "@nuxt/content", "@nuxtjs/color-mode"], css: ['~/assets/common.css', '~/assets/global.css'], runtimeConfig: { - dbFile: '' + dbFile: '', + sessionPassword: '699c46bd-9aaa-4364-ad01-510ee4fe7013' }, components: [ { diff --git a/pages/user/register.vue b/pages/user/register.vue index d58189a..3d7fb87 100644 --- a/pages/user/register.vue +++ b/pages/user/register.vue @@ -16,7 +16,7 @@ const state = reactive({ const confirmPassword = ref(""); -const { status, signUp } = useAuth(); +const { status, register } = useAuth(); const checkedLength = computed(() => state.password.length >= 8 && state.password.length <= 128); const checkedLowerUpper = computed(() => state.password.toLowerCase() !== state.password && state.password.toUpperCase() !== state.password); @@ -26,17 +26,23 @@ const checkedSymbol = computed(() => " !\"#$%&'()*+,-./:;<=>?@[]^_`{|}~".split(" const usernameError = ref(""); const emailError = ref(""); -function register(): void +async function submit() { const data = schema.safeParse(state); if(data.success && state.password !== "" && confirmPassword.value === state.password) { - try { - signUp({ ...data.data }, { redirect: true, callbackUrl: '/' }); - } catch(e) { - usernameError.value = e?.data?.find(e => e.path.includes("username"))?.message ?? ""; - emailError.value = e?.data?.find(e => e.path.includes("email"))?.message ?? ""; + let errors = await register(data.data.username, data.data.email, data.data.password, {}); + + if(status.value === AuthStatus.connected) + { + await navigateTo('/'); + } + else + { + errors = errors?.issues ?? errors; + usernameError.value = errors?.find((e: any) => e.path.includes("username"))?.message ?? ""; + emailError.value = errors?.find((e: any) => e.path.includes("email"))?.message ?? ""; } } else @@ -48,27 +54,41 @@ function register(): void