From 3cbd0da00252bd6c78d841451b7252cc769fb09b Mon Sep 17 00:00:00 2001 From: Oscar May Date: Mon, 26 May 2025 11:06:44 +0100 Subject: [PATCH 1/4] allow all cors so that the desktop and mobile clients work --- app/auth.js | 5 +- app/auth.ts | 229 +++++++++++++++++++++++++++++++++++++++++++++++++- app/server.js | 14 +-- 3 files changed, 236 insertions(+), 12 deletions(-) diff --git a/app/auth.js b/app/auth.js index fca10c5..f0df778 100644 --- a/app/auth.js +++ b/app/auth.js @@ -1,5 +1,5 @@ import { betterAuth } from "better-auth"; -import { openAPI, organization, oidcProvider, multiSession, } from "better-auth/plugins" +import { bearer, openAPI, organization, oidcProvider, multiSession, } from "better-auth/plugins" import pg from "pg" import { expo } from "@better-auth/expo" var { Pool } = pg @@ -466,7 +466,8 @@ export const auth = betterAuth({ oidcProvider(), organization(), multiSession(), - expo() + expo(), + bearer(), ], trustedOrigins: [process.env.BETTER_AUTH_URL], }) \ No newline at end of file diff --git a/app/auth.ts b/app/auth.ts index 1bca069..b47db78 100644 --- a/app/auth.ts +++ b/app/auth.ts @@ -1,5 +1,5 @@ import { betterAuth } from "better-auth"; -import { openAPI, organization, oidcProvider, multiSession, } from "better-auth/plugins" +import { bearer, openAPI, organization, oidcProvider, multiSession, } from "better-auth/plugins" import pg from "pg" import { expo } from "@better-auth/expo" var { Pool } = pg @@ -16,6 +16,228 @@ export const auth = betterAuth({ database: new Pool({ connectionString: "postgres://postgres:password@db:5432/auth", }), + emailVerification: { + sendVerificationEmail: async ( { user, url, token }, request) => { + console.log(url, user) + console.log(process.env.RESEND_KEY) + var email = ` + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + ` + await resend.emails.send({ + from: 'Clatter Auth ', + to: [user.email], + subject: 'Reset Clatter Password', + html: email, + }); + }, + }, emailAndPassword: { enabled: true, autoSignIn: true, @@ -232,7 +454,7 @@ export const auth = betterAuth({ ` await resend.emails.send({ - from: 'Clatter Auth ', + from: 'Clatter Auth ', to: [user.email], subject: 'Reset Clatter Password', html: email, @@ -244,7 +466,8 @@ export const auth = betterAuth({ oidcProvider(), organization(), multiSession(), - expo() + expo(), + bearer(), ], trustedOrigins: [process.env.BETTER_AUTH_URL], }) \ No newline at end of file diff --git a/app/server.js b/app/server.js index 7f9a358..869658b 100644 --- a/app/server.js +++ b/app/server.js @@ -12,13 +12,13 @@ const server = createServer(app) const prisma = new PrismaClient() const io = new Server(server) -// app.use( -// cors({ -// origin: "*", // Replace with your frontend's origin -// methods: ["GET", "POST", "PUT", "DELETE"], // Specify allowed HTTP methods -// credentials: true, // Allow credentials (cookies, authorization headers, etc.) -// }) -// ); +app.use( + cors({ + origin: "*", // Replace with your frontend's origin + methods: ["GET", "POST", "PUT", "DELETE"], // Specify allowed HTTP methods + credentials: true, // Allow credentials (cookies, authorization headers, etc.) + }) +); app.all("/api/auth/*", toNodeHandler(auth)); From 1a5798d42bee0b8c259a05f623b95cc22ba378c5 Mon Sep 17 00:00:00 2001 From: Oscar May Date: Mon, 26 May 2025 13:02:13 +0100 Subject: [PATCH 2/4] fix cors on socketio --- app/server.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/server.js b/app/server.js index 869658b..3d5fd81 100644 --- a/app/server.js +++ b/app/server.js @@ -10,7 +10,11 @@ import { createServer } from "http" const app = express(); const server = createServer(app) const prisma = new PrismaClient() -const io = new Server(server) +const io = new Server(server, { + cors: { + origin: "*", + }, +}) app.use( cors({ From 527d0adc310d3f4268088860852b188acdb3e54b Mon Sep 17 00:00:00 2001 From: Oscar May Date: Tue, 27 May 2025 11:33:19 +0100 Subject: [PATCH 3/4] massive changes to message system, and threads now live update --- app/client/pages/channelpage.html | 51 +++++++++++-------------- app/client/pages/channelthreadpage.html | 27 ++++--------- app/server.js | 23 +++++++++++ 3 files changed, 53 insertions(+), 48 deletions(-) diff --git a/app/client/pages/channelpage.html b/app/client/pages/channelpage.html index 635a756..6025b06 100644 --- a/app/client/pages/channelpage.html +++ b/app/client/pages/channelpage.html @@ -12,9 +12,11 @@ } try { - var socket = io(); + socket.destroy() + delete socket + socket = io() } catch { - socket = io(); + var socket = io() } socket.off("clatter.channel.message.recieve") socket.off("clatter.channel.join.response") @@ -30,8 +32,8 @@ if (element.parentmessageid == undefined) { if (lastsenderid == element.userid) { $("#messagearea").append(` -
- +
+ ` + sanitizeHTML(element.content) + ` @@ -50,9 +52,9 @@ } }) $("#messagearea").append(` -
+
- + ` + sanitizeHTML(element.sendername) + ` ` + monthNames[d.getMonth()] + " " + d.getDate().toString() + " " + (d.getHours() < 10 ? '0' : '') + d.getHours().toString() + ":" + (d.getMinutes() < 10 ? '0' : '') + d.getMinutes().toString() + ` @@ -66,6 +68,14 @@ `) } lastsenderid = element.userid + } else { + var refmessage = $("#messagearea").find("[data-messageid='" + element.parentmessageid + "']") + if(refmessage.attr("isthread") != "true") { + refmessage.attr("isthread", "true") + refmessage.find(".mstack").append(` +
View Thread
+ `) + } } // Broken Code @@ -122,8 +132,8 @@ } if (lastsenderid == element.sender) { $("#messagearea").append(` -
- +
+ ` + sanitizeHTML(element.content) + ` @@ -143,9 +153,9 @@ } }) $("#messagearea").append(` -
+
- + ` + sanitizeHTML(element.sendername) + ` ` + monthNames[d.getMonth()] + " " + d.getDate().toString() + " " + (d.getHours() < 10 ? '0' : '') + d.getHours().toString() + ":" + (d.getMinutes() < 10 ? '0' : '') + d.getMinutes().toString() + ` @@ -165,29 +175,14 @@ } var sendmessage = function(msg) { - fetch("/api/channel/" + currentchannelid + "/messages/send?message=" + msg, { - "method": "POST", - }) - - .then(function (response) { - console.log(response.status); - return response.text(); - }) - - .then(function (data) { - console.log(data); - }) - - .catch(function (error) { - console.log(error.message); - }); - socket.emit("clatter.channel.message.send", JSON.stringify({ "room": currentchannelid, "userid": authsession.data.user.id, "sendername": authsession.data.user.name, "content": msg, - "type": "text" + "type": "text", + "method": "modern", + "token": authsession.data.session.token, })) } diff --git a/app/client/pages/channelthreadpage.html b/app/client/pages/channelthreadpage.html index 6a87e87..5913983 100644 --- a/app/client/pages/channelthreadpage.html +++ b/app/client/pages/channelthreadpage.html @@ -12,9 +12,11 @@ } try { - var socket = io(); + socket.destroy() + delete socket + socket = io() } catch { - socket = io(); + var socket = io() } socket.off("clatter.channel.message.recieve") socket.off("clatter.channel.join.response") @@ -221,30 +223,15 @@ } var sendmessage = function(msg) { - fetch("/api/channel/" + currentchannelid + "/thread/" + currentmessageid + "/send?message=" + msg, { - "method": "POST", - }) - - .then(function (response) { - console.log(response.status); - return response.text(); - }) - - .then(function (data) { - console.log(data); - }) - - .catch(function (error) { - console.log(error.message); - }); - socket.emit("clatter.channel.message.send", JSON.stringify({ "room": currentchannelid, "userid": authsession.data.user.id, "sendername": authsession.data.user.name, "content": msg, "type": "text", - "parentmessageid": currentmessageid + "parentmessageid": currentmessageid, + "method": "modern", + "token": authsession.data.session.token, })) } diff --git a/app/server.js b/app/server.js index 3d5fd81..2c68947 100644 --- a/app/server.js +++ b/app/server.js @@ -254,6 +254,29 @@ io.on("connection", (socket) => { argjson.DateCreated = new Date().toISOString() + if(argjson.method === "modern") { + const session = await auth.api.getSession({ + headers: new Headers({ + authorization: "Bearer " + argjson.token + }) + }); + if(argjson.parentmessageid) { + var parentid = argjson.parentmessageid + } else { + var parentid = null + } + var message = await prisma.message.create({ + data: { + content: argjson.content, + sender: session.session.userId, + parentid: argjson.room, + parentmessageid: parentid, + sendername: session.user.name + } + }) + argjson.id = message.id + } + socket.emit("clatter.channel.message.send.response", "Sent Message") socket.to(argjson.room).emit("clatter.channel.message.recieve", JSON.stringify(argjson)) }) From 6bb4d070ad4160156895cb58b0778f9d49d55d78 Mon Sep 17 00:00:00 2001 From: Oscar May Date: Tue, 27 May 2025 12:13:14 +0100 Subject: [PATCH 4/4] change to DVH to fix mobile --- app/client/global/styles.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/client/global/styles.css b/app/client/global/styles.css index 87b986e..20c0235 100644 --- a/app/client/global/styles.css +++ b/app/client/global/styles.css @@ -29,7 +29,7 @@ body { top: 0px; left: 0px; width: 100vw; - height: 100vh; + height: 100dvh; background-color: #f4f4f4; font-family: 'Figtree', sans-serif; user-select: none;