From 85c3332c76acf80ecb48e93c2bea01684196758e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B3=E5=85=83=E7=9A=93?= Date: Sat, 14 Jun 2025 21:04:06 +0800 Subject: [PATCH 1/6] Update sendUserChanges to make the settings system work. --- components/app/windows/settings.vue | 11 ++++++----- server/api/user/login.ts | 3 +++ server/api/user/sendUserChanges.post.ts | 25 ++++++++++++++----------- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/components/app/windows/settings.vue b/components/app/windows/settings.vue index ae6ec37..2db04b5 100644 --- a/components/app/windows/settings.vue +++ b/components/app/windows/settings.vue @@ -100,23 +100,24 @@ const checkValidApiKey = () => { const showDeleteDialog = ref(false); const showLogoutDialog = ref(false); const confirmDelete = async () => { + showDeleteDialog.value = false; await deleteAccount(); await validateUserInfo(); - showDeleteDialog.value = false; }; const deleteAccount = async () => { const req = await fetch("/api/user/sendUserChanges", { method: "DELETE", }); - const res = await res.json(); + const res = await req.json(); console.log(res); }; const submitChangeAction = async (action: string) => { + //const allowedColumns = ["firstname", "email"]; const actions = [ - { name: "NAME", sendValue: enterFirstName.value }, - { name: "USER_EMAIL", sendValue: enteruseremail.value }, + { name: "NAME", SQLSystem: "firstname", sendValue: enterFirstName.value }, + { name: "USER_EMAIL", SQLSystem: "email", sendValue: enteruseremail.value }, ]; const actionMatch = actions.find((a) => a.name === action); @@ -131,7 +132,7 @@ const submitChangeAction = async (action: string) => { "Content-Type": "application/json", }, body: JSON.stringify({ - action: actionMatch.name, + action: actionMatch.SQLSystem, value: actionMatch.sendValue, jsonValue: "", }), diff --git a/server/api/user/login.ts b/server/api/user/login.ts index 0bd32f1..67dfd42 100644 --- a/server/api/user/login.ts +++ b/server/api/user/login.ts @@ -81,6 +81,9 @@ export default defineEventHandler(async (event) => { VALUES (${fetchUserInfoAgain[0].username}, ${newToken}) `; + const getUserFirstName = await sql` + select * from user_other_data`; + setCookie(event, "token", newToken); return { user: fetchUserInfoAgain, diff --git a/server/api/user/sendUserChanges.post.ts b/server/api/user/sendUserChanges.post.ts index 1dc17a4..6c18f9c 100644 --- a/server/api/user/sendUserChanges.post.ts +++ b/server/api/user/sendUserChanges.post.ts @@ -12,23 +12,26 @@ export default defineEventHandler(async (event) => { const body = await readBody(event); if (body.jsonValue.length === 0) { const clearBadDataRegex = /[@-_.+a-zA-Z0-9]{2,}/; - let allowed = true; - if (body.value.match()) { - allowed = false; - } // Use Static values for now. - const requestChange = "groq_api_key"; + const requestChange = body.name; const apiKeyqq = body.value.match(clearBadDataRegex); - const allowedColumns = ["groq_api_key", "another_column_name"]; + const allowedColumns = ["firstname", "email"]; if (!allowedColumns.includes(requestChange)) { - throw new Error("Invalid column name provided"); + return { + error: "ERR_NOT_ALLOWED", + }; + } else if (requestChange === "name") { + const sqlC = await sql` + UPDATE users SET firstname = ${apiKeyqq[0]} + WHERE username = ${token.user}`; + return { + sqlC: sqlC, + success: true, + }; } - const sqlC = await sql.unsafe( - ` - UPDATE user_other_data SET ${requestChange} = $1 - WHERE username = $2`, + `UPDATE user_other_data SET ${requestChange} = $1 WHERE username = $2`, [apiKeyqq[0], token.user], ); return { From f1324ae0e4419301b1e131068378d484193d6331 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B3=E5=85=83=E7=9A=93?= Date: Sat, 14 Jun 2025 21:43:21 +0800 Subject: [PATCH 2/6] Oops --- components/app/windows/tos.vue | 5 ++++- server/api/user/sendUserChanges.post.ts | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/components/app/windows/tos.vue b/components/app/windows/tos.vue index c05d3dd..d5b8323 100644 --- a/components/app/windows/tos.vue +++ b/components/app/windows/tos.vue @@ -2,5 +2,8 @@ const { t } = useI18n(); diff --git a/server/api/user/sendUserChanges.post.ts b/server/api/user/sendUserChanges.post.ts index 6c18f9c..c8a683b 100644 --- a/server/api/user/sendUserChanges.post.ts +++ b/server/api/user/sendUserChanges.post.ts @@ -13,7 +13,7 @@ export default defineEventHandler(async (event) => { if (body.jsonValue.length === 0) { const clearBadDataRegex = /[@-_.+a-zA-Z0-9]{2,}/; // Use Static values for now. - const requestChange = body.name; + const requestChange = body.action; const apiKeyqq = body.value.match(clearBadDataRegex); const allowedColumns = ["firstname", "email"]; From 68d1c8f0187846dd669727ed58fc79826e020c4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B3=E5=85=83=E7=9A=93?= Date: Sat, 14 Jun 2025 21:56:50 +0800 Subject: [PATCH 3/6] Fix the var that is causing platforms to not send correctly & fix check user info everytime after you file for a change. --- components/app/windows/settings.vue | 2 ++ server/api/user/sendUserChanges.post.ts | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/components/app/windows/settings.vue b/components/app/windows/settings.vue index 2db04b5..4f741e8 100644 --- a/components/app/windows/settings.vue +++ b/components/app/windows/settings.vue @@ -141,7 +141,9 @@ const submitChangeAction = async (action: string) => { const response = await req.json(); if (response.error) { console.error("Error updating user data:", response.error); + return; } + await validateUserInfo(); } catch (error) { console.error("Failed to submit change:", error); } diff --git a/server/api/user/sendUserChanges.post.ts b/server/api/user/sendUserChanges.post.ts index c8a683b..f25ca7c 100644 --- a/server/api/user/sendUserChanges.post.ts +++ b/server/api/user/sendUserChanges.post.ts @@ -13,7 +13,7 @@ export default defineEventHandler(async (event) => { if (body.jsonValue.length === 0) { const clearBadDataRegex = /[@-_.+a-zA-Z0-9]{2,}/; // Use Static values for now. - const requestChange = body.action; + const requestChange = body.action || ""; const apiKeyqq = body.value.match(clearBadDataRegex); const allowedColumns = ["firstname", "email"]; @@ -21,7 +21,7 @@ export default defineEventHandler(async (event) => { return { error: "ERR_NOT_ALLOWED", }; - } else if (requestChange === "name") { + } else if (requestChange === "firstname") { const sqlC = await sql` UPDATE users SET firstname = ${apiKeyqq[0]} WHERE username = ${token.user}`; From 026c4a31a3341723ffc9415aca990e25cc3485bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B3=E5=85=83=E7=9A=93?= Date: Sat, 14 Jun 2025 23:31:24 +0800 Subject: [PATCH 4/6] LoadInfo stuff & Fix validating stuff. (PLEASE DO THE STARRING FEAT!!!) --- server/api/user/loadInfo.ts | 49 ++++++++++++++++++++++++++-- server/api/user/validateUserToken.ts | 2 +- 2 files changed, 48 insertions(+), 3 deletions(-) diff --git a/server/api/user/loadInfo.ts b/server/api/user/loadInfo.ts index 71188b0..7d0f1f1 100644 --- a/server/api/user/loadInfo.ts +++ b/server/api/user/loadInfo.ts @@ -1,7 +1,6 @@ -// Fixed data for testing +/*// Fixed data for testing export default defineEventHandler(async (event) => { return { - langPref: "en", doNotShowLangPrefPopUp: false, email: "test@yuanhau.com", name: "Howard", @@ -13,3 +12,49 @@ export default defineEventHandler(async (event) => { }, }; }); +*/ +import sql from "~/server/components/postgres"; +import getUserTokenMinusSQLInjection from "~/server/components/getUserToken"; +export default defineEventHandler(async (event) => { + try { + const token = await getUserTokenMinusSQLInjection(event); + if (token.error.length !== 0) { + return { + error: token.error, + }; + } + const fetchMainData = await sql` + SELECT * FROM users + WHERE username = ${token.user} + `; + const fetchOtherUserData = await sql` + SELECT * FROM user_other_data + WHERE username = ${token.user} + `; + + if (fetchMainData.length === 0 || fetchOtherUserData.length === 0) { + return { + error: "ERR_USER_DOESNT_EXIST", + }; + } + return { + doNotShowLangPrefPopUp: + fetchOtherUserData[0].remove_translate_popup || false, + email: fetchMainData[0].email || "", + name: fetchMainData[0].firstname || "", + useCustomGroqKey: + fetchOtherUserData[0].groq_api_key.length !== 0 || false, + translate: { + enabled: fetchOtherUserData[0].translate_enabled || false, + lang: "en", + provider: fetchOtherUserData[0].translate_provider || "google", + }, + }; + } catch (e) { + console.log(e); + return { + error: "ERR_SERVER_SIDE", + e: e.message, + }; + } +}); diff --git a/server/api/user/validateUserToken.ts b/server/api/user/validateUserToken.ts index 76a0fa3..f147a86 100644 --- a/server/api/user/validateUserToken.ts +++ b/server/api/user/validateUserToken.ts @@ -43,7 +43,7 @@ export default defineEventHandler(async (event) => { } return { userAccount: fetchViaSQL[0].username, - firstName: fetchViaSQL[0].firstName, + firstName: "", requested_action: "CONTINUE", current_spot: "KEEP_LOGIN", email: fetchViaSQL[0].email, From 2cf787a4016aa25533a0c706066f9794cec19018 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=90=B3=E5=85=83=E7=9A=93?= Date: Sat, 14 Jun 2025 23:46:23 +0800 Subject: [PATCH 5/6] Update some code & made a basic isThis ArticleStarred api? & starring is now a wip! --- components/app/windows/newsView.vue | 8 ++++- .../api/user/[slug]/isThisArticleStarred.ts | 30 +++++++++++++++++++ server/api/user/[slug]/star.ts | 30 +++++++++++++++++++ server/api/user/sendUserChanges.post.ts | 8 +++++ 4 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 server/api/user/[slug]/isThisArticleStarred.ts create mode 100644 server/api/user/[slug]/star.ts diff --git a/components/app/windows/newsView.vue b/components/app/windows/newsView.vue index 32a3354..8b0fff2 100644 --- a/components/app/windows/newsView.vue +++ b/components/app/windows/newsView.vue @@ -1,6 +1,11 @@