From 6efc5b6f97fbf96a25aaf162f2c523e6637d731d Mon Sep 17 00:00:00 2001 From: metacryst Date: Tue, 13 Jan 2026 11:22:37 -0600 Subject: [PATCH] user can join --- server/db/db.js | 38 ++++++++++++----- server/db/model/edge.js | 28 +++---------- server/db/model/edges/MEMBER_IN_NETWORK.js | 1 + server/db/model/import.js | 12 +++--- server/db/model/member.js | 47 ++++++++-------------- server/db/model/network.js | 3 +- server/index.js | 3 +- ui/public/pages/SignupForm.js | 14 ++----- 8 files changed, 64 insertions(+), 82 deletions(-) diff --git a/server/db/db.js b/server/db/db.js index 6630e31..83be3ad 100644 --- a/server/db/db.js +++ b/server/db/db.js @@ -2,6 +2,7 @@ import fs from 'fs/promises'; import chalk from 'chalk'; import path from 'path'; import {nodeModels, edgeModels} from './model/import.js' +import Edge from "./model/edge.js" export default class Database { @@ -20,18 +21,27 @@ export default class Database { let key = eValues[i].constructor.name this[key] = eValues[i] } + this.edge = new Edge() this.loadData() } - addNode(id, node) { + getNextIndex(model) { + return model.indices[1] - model.indices[0] + 1 + } + + addNode(prefix, node) { try { - let type = id.split("-")[0] - let model = nodeModels[type[0] + type.slice(1).toLowerCase()] + let model = nodeModels[prefix] if(model) { + let toAdd = { + id: this.getNextIndex(model), + ...node, + } + if(!toAdd.created) toAdd.created = global.currentTime() let schema = model.schema - let result = schema.safeParse(node) + let result = schema.safeParse(toAdd) if(result.success) { - this.nodes[model.indices[1]] = node + this.nodes[model.indices[1]] = toAdd model.indices[1]++; } else { console.error(result.error) @@ -45,15 +55,21 @@ export default class Database { } } - addEdge(id, edge) { + addEdge(prefix, edge) { try { - let type = id.split("-")[0] + let type = prefix let model = edgeModels[type] if(model) { + let toAdd = { + id: model.indices[1] - model.indices[0] + 1, + ...edge + } + if(!toAdd.created) toAdd.created = global.currentTime() + console.log(toAdd) let schema = model.schema - let result = schema.safeParse(edge) + let result = schema.safeParse(toAdd) if(result.success) { - this.edges[model.indices[1]] = edge + this.edges[model.indices[1]] = toAdd model.indices[1]++; } else { console.error(result.error) @@ -81,7 +97,7 @@ export default class Database { for(let i=0; i { diff --git a/server/db/model/edge.js b/server/db/model/edge.js index 778aa20..e619f95 100644 --- a/server/db/model/edge.js +++ b/server/db/model/edge.js @@ -1,27 +1,11 @@ -import { z } from 'zod'; - export default class Edge { - schema = z.object({ - id: z.number(), - from: z.string(), - to: z.string(), - created: z.string() - }) - .strict() + add(n) { + let toPrefix = n.to.split("-")[0] + let fromPrefix = n.from.split("-")[0] + let type = n.type + let prefix = `${fromPrefix}_${type}_${toPrefix}` - save(n, id) { - let result = this.schema.safeParse(n) - if(result.success) { - try { - super.add(id, n) - } catch(e) { - console.error(e) - throw e - } - } else { - console.error(result.error) - throw new global.ServerError(400, "Invalid Member Data!"); - } + global.db.addEdge(prefix, n) } getByFrom(fromID) { diff --git a/server/db/model/edges/MEMBER_IN_NETWORK.js b/server/db/model/edges/MEMBER_IN_NETWORK.js index ba692c8..8a30245 100644 --- a/server/db/model/edges/MEMBER_IN_NETWORK.js +++ b/server/db/model/edges/MEMBER_IN_NETWORK.js @@ -10,6 +10,7 @@ export default class MEMBER_IN_NETWORK { schema = z.object({ id: z.number(), + type: z.string(), from: z.string(), to: z.string(), created: z.string() diff --git a/server/db/model/import.js b/server/db/model/import.js index c4a54b3..5ecc710 100644 --- a/server/db/model/import.js +++ b/server/db/model/import.js @@ -22,12 +22,12 @@ let eIndices = { } export let nodeModels = { - Member: new Member(nIndices.MEMBER), - Network: new Network(nIndices.NETWORK), - Title: new Title(nIndices.TITLE), - Payment: new Payment(nIndices.PAYMENT), - Post: new Post(nIndices.POST), - Conversation: new Conversation(nIndices.CONVERSATION), + MEMBER: new Member(nIndices.MEMBER), + NETWORK: new Network(nIndices.NETWORK), + TITLE: new Title(nIndices.TITLE), + PAYMENT: new Payment(nIndices.PAYMENT), + POST: new Post(nIndices.POST), + CONVERSATION: new Conversation(nIndices.CONVERSATION), DM: new DM(nIndices.DM), } diff --git a/server/db/model/member.js b/server/db/model/member.js index c8cbacc..9ec1a50 100644 --- a/server/db/model/member.js +++ b/server/db/model/member.js @@ -1,7 +1,7 @@ import argon2 from 'argon2'; import { z } from 'zod'; -export default class Member { +export default class Member { prefix = "MEMBER" indices = null @@ -9,47 +9,34 @@ export default class Member { this.indices = indices } - addressSchema = z.object({ - address1: z.string(), - address2: z.string().optional(), - zip: z.string().regex(/^\d{5}(-\d{4})?$/), - state: z.string(), - city: z.string() - }) schema = z.object({ id: z.number(), email: z.string().email(), firstName: z.string(), lastName: z.string(), password: z.string(), - joined: z.string(), - address: this.addressSchema.optional() + created: z.string() }) isHashed = (s) => {return s.startsWith("$argon2")} - save(member) { - let id = `${this.prefix}-${member.id}` - let result = this.schema.safeParse(member) - if(result.success) { - try { - global.db.addNode(id, member) - } catch(e) { - console.error(e) - throw e - } - } else { - console.error("Failed parsing member: ", result.error) - throw new global.ServerError(400, "Invalid Member Data!: "); - } - } - - async add(newMember) { + async add(newMember, network = null) { const hash = await argon2.hash(newMember.password); newMember.password = hash - newMember.joined = global.currentTime() - newMember.id = this.indices[1] - 1 - this.save(newMember) + + try { + global.db.addNode(this.prefix, newMember) + if(network) { + global.db.edge.add({ + type: "IN", + from: `${this.prefix}-${global.db.getNextIndex(this)}`, + to: "NETWORK-1" + }) + } + } catch(e) { + console.error(e) + throw new global.ServerError(400, "Failed to add member!"); + } } get(id) { diff --git a/server/db/model/network.js b/server/db/model/network.js index a6f7017..a4895a8 100644 --- a/server/db/model/network.js +++ b/server/db/model/network.js @@ -13,7 +13,8 @@ export default class Network { name: z.string(), apps: z.array(z.string()), logo: z.string(), - abbreviation: z.string() + abbreviation: z.string(), + created: z.string() }) .strict() diff --git a/server/index.js b/server/index.js index bf3421f..371187c 100644 --- a/server/index.js +++ b/server/index.js @@ -79,8 +79,9 @@ class Server { } newUserSubmission = async (req, res) => { + const { network } = req.query; try { - await db.members.add(req.body) + await db.members.add(req.body, network) global.db.saveData() return res.status(200).json({}); } catch(e) { diff --git a/ui/public/pages/SignupForm.js b/ui/public/pages/SignupForm.js index fadf243..47acdde 100644 --- a/ui/public/pages/SignupForm.js +++ b/ui/public/pages/SignupForm.js @@ -1,7 +1,7 @@ class SignupForm extends Shadow { errorMessage = "Error signing up. Please try again later or email samuel@sun.museum if the problem persists." - successMessage = "Success! You may now log in." + successMessage = `Success! You may now log in.` inputStyles(el) { return el @@ -69,14 +69,6 @@ class SignupForm extends Shadow { "lastName": data.lastName, "password": data.password } - let address = { - "address1": data.address1, - "address2": data.address2, - "zip": data.zip, - "state": data.state, - "city": data.city - } - newMember.address = address try { const response = await fetch(window.location.pathname + window.location.search, { @@ -89,11 +81,11 @@ class SignupForm extends Shadow { if (!response.ok) { $("#signupMessage").style.display = "block" - $("#signupMessage").innerText = this.errorMessage + $("#signupMessage").innerHTML = this.errorMessage throw new Error(`HTTP error! status: ${response.status}`); } else { $("#signupMessage").style.display = "block" - $("#signupMessage").innerText = this.successMessage + $("#signupMessage").innerHTML = this.successMessage } } catch (err) {