user can join

This commit is contained in:
metacryst
2026-01-13 11:22:37 -06:00
parent 604ba9f01c
commit 6efc5b6f97
8 changed files with 64 additions and 82 deletions

View File

@@ -2,6 +2,7 @@ import fs from 'fs/promises';
import chalk from 'chalk'; import chalk from 'chalk';
import path from 'path'; import path from 'path';
import {nodeModels, edgeModels} from './model/import.js' import {nodeModels, edgeModels} from './model/import.js'
import Edge from "./model/edge.js"
export default class Database { export default class Database {
@@ -20,18 +21,27 @@ export default class Database {
let key = eValues[i].constructor.name let key = eValues[i].constructor.name
this[key] = eValues[i] this[key] = eValues[i]
} }
this.edge = new Edge()
this.loadData() this.loadData()
} }
addNode(id, node) { getNextIndex(model) {
return model.indices[1] - model.indices[0] + 1
}
addNode(prefix, node) {
try { try {
let type = id.split("-")[0] let model = nodeModels[prefix]
let model = nodeModels[type[0] + type.slice(1).toLowerCase()]
if(model) { if(model) {
let toAdd = {
id: this.getNextIndex(model),
...node,
}
if(!toAdd.created) toAdd.created = global.currentTime()
let schema = model.schema let schema = model.schema
let result = schema.safeParse(node) let result = schema.safeParse(toAdd)
if(result.success) { if(result.success) {
this.nodes[model.indices[1]] = node this.nodes[model.indices[1]] = toAdd
model.indices[1]++; model.indices[1]++;
} else { } else {
console.error(result.error) console.error(result.error)
@@ -45,15 +55,21 @@ export default class Database {
} }
} }
addEdge(id, edge) { addEdge(prefix, edge) {
try { try {
let type = id.split("-")[0] let type = prefix
let model = edgeModels[type] let model = edgeModels[type]
if(model) { 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 schema = model.schema
let result = schema.safeParse(edge) let result = schema.safeParse(toAdd)
if(result.success) { if(result.success) {
this.edges[model.indices[1]] = edge this.edges[model.indices[1]] = toAdd
model.indices[1]++; model.indices[1]++;
} else { } else {
console.error(result.error) console.error(result.error)
@@ -81,7 +97,7 @@ export default class Database {
for(let i=0; i<entries.length; i++) { for(let i=0; i<entries.length; i++) {
let entry = entries[i] let entry = entries[i]
let id = entry[0]; let node = entry[1]; let id = entry[0]; let node = entry[1];
this.addNode(id, node) this.addNode(id.split("-")[0], node)
} }
let edges = dbJson["edges"]; let edges = dbJson["edges"];
@@ -89,7 +105,7 @@ export default class Database {
for(let i=0; i<edgeEntries.length; i++) { for(let i=0; i<edgeEntries.length; i++) {
let entry = edgeEntries[i] let entry = edgeEntries[i]
let id = entry[0]; let node = entry[1]; let id = entry[0]; let node = entry[1];
this.addEdge(id, node) this.addEdge(id.split("-")[0], node)
} }
setInterval(() => { setInterval(() => {

View File

@@ -1,27 +1,11 @@
import { z } from 'zod';
export default class Edge { export default class Edge {
schema = z.object({ add(n) {
id: z.number(), let toPrefix = n.to.split("-")[0]
from: z.string(), let fromPrefix = n.from.split("-")[0]
to: z.string(), let type = n.type
created: z.string() let prefix = `${fromPrefix}_${type}_${toPrefix}`
})
.strict()
save(n, id) { global.db.addEdge(prefix, n)
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!");
}
} }
getByFrom(fromID) { getByFrom(fromID) {

View File

@@ -10,6 +10,7 @@ export default class MEMBER_IN_NETWORK {
schema = z.object({ schema = z.object({
id: z.number(), id: z.number(),
type: z.string(),
from: z.string(), from: z.string(),
to: z.string(), to: z.string(),
created: z.string() created: z.string()

View File

@@ -22,12 +22,12 @@ let eIndices = {
} }
export let nodeModels = { export let nodeModels = {
Member: new Member(nIndices.MEMBER), MEMBER: new Member(nIndices.MEMBER),
Network: new Network(nIndices.NETWORK), NETWORK: new Network(nIndices.NETWORK),
Title: new Title(nIndices.TITLE), TITLE: new Title(nIndices.TITLE),
Payment: new Payment(nIndices.PAYMENT), PAYMENT: new Payment(nIndices.PAYMENT),
Post: new Post(nIndices.POST), POST: new Post(nIndices.POST),
Conversation: new Conversation(nIndices.CONVERSATION), CONVERSATION: new Conversation(nIndices.CONVERSATION),
DM: new DM(nIndices.DM), DM: new DM(nIndices.DM),
} }

View File

@@ -1,7 +1,7 @@
import argon2 from 'argon2'; import argon2 from 'argon2';
import { z } from 'zod'; import { z } from 'zod';
export default class Member { export default class Member {
prefix = "MEMBER" prefix = "MEMBER"
indices = null indices = null
@@ -9,47 +9,34 @@ export default class Member {
this.indices = indices 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({ schema = z.object({
id: z.number(), id: z.number(),
email: z.string().email(), email: z.string().email(),
firstName: z.string(), firstName: z.string(),
lastName: z.string(), lastName: z.string(),
password: z.string(), password: z.string(),
joined: z.string(), created: z.string()
address: this.addressSchema.optional()
}) })
isHashed = (s) => {return s.startsWith("$argon2")} isHashed = (s) => {return s.startsWith("$argon2")}
save(member) { async add(newMember, network = null) {
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) {
const hash = await argon2.hash(newMember.password); const hash = await argon2.hash(newMember.password);
newMember.password = hash newMember.password = hash
newMember.joined = global.currentTime()
newMember.id = this.indices[1] - 1 try {
this.save(newMember) 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) { get(id) {

View File

@@ -13,7 +13,8 @@ export default class Network {
name: z.string(), name: z.string(),
apps: z.array(z.string()), apps: z.array(z.string()),
logo: z.string(), logo: z.string(),
abbreviation: z.string() abbreviation: z.string(),
created: z.string()
}) })
.strict() .strict()

View File

@@ -79,8 +79,9 @@ class Server {
} }
newUserSubmission = async (req, res) => { newUserSubmission = async (req, res) => {
const { network } = req.query;
try { try {
await db.members.add(req.body) await db.members.add(req.body, network)
global.db.saveData() global.db.saveData()
return res.status(200).json({}); return res.status(200).json({});
} catch(e) { } catch(e) {

View File

@@ -1,7 +1,7 @@
class SignupForm extends Shadow { class SignupForm extends Shadow {
errorMessage = "Error signing up. Please try again later or email samuel@sun.museum if the problem persists." 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 <a style="color: black; text-decoration: underline" href="/login">log in</a>.`
inputStyles(el) { inputStyles(el) {
return el return el
@@ -69,14 +69,6 @@ class SignupForm extends Shadow {
"lastName": data.lastName, "lastName": data.lastName,
"password": data.password "password": data.password
} }
let address = {
"address1": data.address1,
"address2": data.address2,
"zip": data.zip,
"state": data.state,
"city": data.city
}
newMember.address = address
try { try {
const response = await fetch(window.location.pathname + window.location.search, { const response = await fetch(window.location.pathname + window.location.search, {
@@ -89,11 +81,11 @@ class SignupForm extends Shadow {
if (!response.ok) { if (!response.ok) {
$("#signupMessage").style.display = "block" $("#signupMessage").style.display = "block"
$("#signupMessage").innerText = this.errorMessage $("#signupMessage").innerHTML = this.errorMessage
throw new Error(`HTTP error! status: ${response.status}`); throw new Error(`HTTP error! status: ${response.status}`);
} else { } else {
$("#signupMessage").style.display = "block" $("#signupMessage").style.display = "block"
$("#signupMessage").innerText = this.successMessage $("#signupMessage").innerHTML = this.successMessage
} }
} catch (err) { } catch (err) {