summaryrefslogtreecommitdiff
path: root/backend/src
diff options
context:
space:
mode:
Diffstat (limited to 'backend/src')
-rw-r--r--backend/src/db.ts (renamed from backend/src/db.js)31
-rw-r--r--backend/src/routes/api.js12
-rw-r--r--backend/src/routes/api.ts10
-rw-r--r--backend/src/routes/events.ts (renamed from backend/src/routes/events.js)62
-rw-r--r--backend/src/routes/users.ts (renamed from backend/src/routes/users.js)42
-rw-r--r--backend/src/server.js40
-rw-r--r--backend/src/server.ts37
-rw-r--r--backend/src/types.ts24
8 files changed, 141 insertions, 117 deletions
diff --git a/backend/src/db.js b/backend/src/db.ts
index f20cac1..2b124f1 100644
--- a/backend/src/db.js
+++ b/backend/src/db.ts
@@ -1,16 +1,15 @@
-import Database from 'better-sqlite3';
-import EVENTS from './data/events.json' with {type: 'json'};
-import USERS from './data/users.json' with {type: 'json'};
-import RSVPS from './data/rsvps.json' with {type: 'json'};
+import DatabaseConstructor, { type Database } from "better-sqlite3";
+import EVENTS from "./data/events.json" with { type: "json" };
+import USERS from "./data/users.json" with { type: "json" };
+import RSVPS from "./data/rsvps.json" with { type: "json" };
-
-const db = new Database('src/sqlite.db', { verbose: console.log });
+const db: Database = new DatabaseConstructor("src/sqlite.db", {
+ verbose: console.log,
+});
console.log(`Initializing database: ${db.name} `);
-
-db.pragma('foreign_keys = ON');
-
+db.pragma("foreign_keys = ON");
db.exec(`
CREATE TABLE IF NOT EXISTS users (
@@ -32,24 +31,22 @@ db.exec(`
CREATE INDEX IF NOT EXISTS eventhosts ON events(host_id);
`);
-
const upsertUser = db.prepare(`
INSERT INTO users VALUES (@id, @username, @name, @email)
ON CONFLICT(id) DO NOTHING
- `)
+ `);
USERS.map((user) => upsertUser.run(user));
const upsertEvent = db.prepare(`
INSERT INTO events VALUES (@id, @title, @description, @image_url, @date, @host_id)
ON CONFLICT(id) DO NOTHING
- `)
+ `);
EVENTS.map((event) => {
- upsertEvent.run(event);
+ upsertEvent.run(event);
});
-
db.exec(`
CREATE TABLE IF NOT EXISTS rsvps (
event_id INTEGER REFERENCES events NOT NULL,
@@ -64,9 +61,7 @@ const upsertRSVP = db.prepare(`
INSERT INTO rsvps VALUES (@event_id, @name, @email)
`);
RSVPS.map((rsvp) => {
- upsertRSVP.run(rsvp);
+ upsertRSVP.run(rsvp);
});
-
-
-export default db; \ No newline at end of file
+export default db;
diff --git a/backend/src/routes/api.js b/backend/src/routes/api.js
deleted file mode 100644
index 2eb07d1..0000000
--- a/backend/src/routes/api.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import { Router } from 'express';
-import usersRouter from './users.js';
-import eventsRouter from './events.js';
-
-
-const router = Router();
-
-router.use('/users', usersRouter);
-router.use('/events', eventsRouter);
-
-
-export default router;
diff --git a/backend/src/routes/api.ts b/backend/src/routes/api.ts
new file mode 100644
index 0000000..92eae46
--- /dev/null
+++ b/backend/src/routes/api.ts
@@ -0,0 +1,10 @@
+import { Router } from "express";
+import usersRouter from "./users.js";
+import eventsRouter from "./events.js";
+
+const router = Router();
+
+router.use("/users", usersRouter);
+router.use("/events", eventsRouter);
+
+export default router;
diff --git a/backend/src/routes/events.js b/backend/src/routes/events.ts
index b95c747..df65eb5 100644
--- a/backend/src/routes/events.js
+++ b/backend/src/routes/events.ts
@@ -1,52 +1,56 @@
-import db from '../db.js';
-import { Router } from 'express';
-import { getUser } from './users.js';
+import db from "../db.js";
+import { Router } from "express";
+import { getUser } from "./users.js";
+import { type Event, type Id, type Rsvps, type User } from "../types.js";
const router = Router();
-const joinHost = (event) => {
- const host = getUser(event.host_id);
+const joinHost = (event: Event) => {
+ const host = getUser(event.host_id) as User;
return { ...event, host };
-}
+};
-const joinRSVPs = (event) => {
+const joinRSVPs = (event: Event) => {
const { id } = event;
- const getRSVPs = db.prepare('SELECT * FROM rsvps WHERE event_id = @id');
- const rsvps = getRSVPs.all({ id });
+ const getRSVPs = db.prepare("SELECT * FROM rsvps WHERE event_id = @id");
+ const rsvps = getRSVPs.all({ id }) as Rsvps[];
return { ...event, rsvps };
-}
+};
-const getEvent = (eventId) => {
- const byId = db.prepare('SELECT * FROM events WHERE id = @eventId');
- const event = byId.get({ eventId });
+const getEvent = (eventId: Id) => {
+ const byId = db.prepare("SELECT * FROM events WHERE id = @eventId");
+ const event = byId.get({ eventId }) as Event;
return joinHost(event);
-}
+};
-router.get('/', (_req, res) => {
+router.get("/", (_req, res) => {
const listEvents = db.prepare(`SELECT * FROM events`);
- const events = listEvents.all();
+ const events = listEvents.all() as Event[];
res.json(events.map(joinHost).map(joinRSVPs));
});
-const insertEvent = db.prepare(`INSERT INTO events VALUES (@id, @title, @description, @image_url, @date, @host_id)`);
+const insertEvent = db.prepare(
+ `INSERT INTO events VALUES (@id, @title, @description, @image_url, @date, @host_id)`,
+);
-router.post('/new', (req, res) => {
+router.post("/new", (req, res) => {
const data = req.body;
- const { lastInsertRowid: id } = insertEvent.run(data);
+ const { lastInsertRowid } = insertEvent.run(data);
+ const id = lastInsertRowid as number;
const event = getEvent(id);
res.status(201).json(event);
});
-router.get('/:id', (req, res) => {
+router.get("/:id", (req, res) => {
const id = parseInt(req.params.id);
const event = getEvent(id);
if (!event) {
- return res.status(404).json({ error: 'Event not found' });
+ return res.status(404).json({ error: "Event not found" });
}
res.json(event);
});
-router.patch('/:id', (req, res) => {
+router.patch("/:id", (req, res) => {
const eventId = parseInt(req.params.id);
const patch = req.body;
@@ -64,23 +68,27 @@ router.patch('/:id', (req, res) => {
res.json(updated);
});
-router.delete('/:id', (req, res) => {
+router.delete("/:id", (req, res) => {
const deleteEvent = db.prepare(`DELETE FROM events WHERE id = @eventId`);
const eventId = parseInt(req.params.id);
const event = getEvent(eventId);
if (!event) {
- return res.status(404).json({ error: 'Event not found' });
+ return res.status(404).json({ error: "Event not found" });
}
deleteEvent.run({ eventId });
res.json(event);
});
-router.post('/:id/rsvp', (req, res) => {
+router.post("/:id/rsvp", (req, res) => {
const eventId = parseInt(req.params.id);
const { name, email } = req.body;
- const getRSVP = db.prepare(`SELECT * FROM rsvps WHERE (event_id = ${eventId} AND email = '${email}')`);
- const insertRSVP = db.prepare(`INSERT INTO rsvps VALUES (@eventId, @name, @email)`);
+ const getRSVP = db.prepare(
+ `SELECT * FROM rsvps WHERE (event_id = ${eventId} AND email = '${email}')`,
+ );
+ const insertRSVP = db.prepare(
+ `INSERT INTO rsvps VALUES (@eventId, @name, @email)`,
+ );
let [rsvp] = getRSVP.all({ eventId, email });
if (rsvp) {
diff --git a/backend/src/routes/users.js b/backend/src/routes/users.ts
index 6d874e9..98ec361 100644
--- a/backend/src/routes/users.js
+++ b/backend/src/routes/users.ts
@@ -1,40 +1,42 @@
-import { Router } from 'express';
-import db from '../db.js';
+import { Router } from "express";
+import db from "../db.js";
+import type { User } from "../types.js";
const router = Router();
-export const getUser = (userId) => {
- const byId = db.prepare('SELECT * FROM users WHERE id = @userId');
+export const getUser = (userId: User["id"]) => {
+ const byId = db.prepare("SELECT * FROM users WHERE id = @userId");
return byId.get({ userId });
-}
+};
-router.get('/', (_req, res) => {
- const listUsers = db.prepare(`SELECT * FROM users`)
+router.get("/", (_req, res) => {
+ const listUsers = db.prepare(`SELECT * FROM users`);
const users = listUsers.all();
res.json(users);
});
-router.post('/new', (req, res) => {
+router.post("/new", (req, res) => {
const data = req.body;
- const cols = Object.keys(data).join(' , ');
- const vals = Object.values(data).join(' , ');
+ const cols = Object.keys(data).join(" , ");
+ const vals = Object.values(data).join(" , ");
const insertUser = db.prepare(`INSERT INTO users(@cols) VALUES (@vals)`);
- const { lastInsertRowid: id } = insertUser.run({ cols, vals });
+ const { lastInsertRowid } = insertUser.run({ cols, vals });
+ const id = lastInsertRowid as number;
const user = getUser(id);
res.json(user);
});
-router.get('/:id', (req, res) => {
- const id = req.params.id;
+router.get("/:id", (req, res) => {
+ const id = Number(req.params.id);
const user = getUser(id);
if (!user) {
- res.status(404).json({ error: 'User not found' });
+ res.status(404).json({ error: "User not found" });
}
res.json(user);
});
-router.patch('/:id', (req, res) => {
- const userId = req.params.id;
+router.patch("/:id", (req, res) => {
+ const userId = Number(req.params.id);
const patch = req.body;
const updateCol = db.prepare(`
@@ -43,7 +45,7 @@ router.patch('/:id', (req, res) => {
const updateUser = db.transaction((patch) => {
for (const [col, val] of Object.entries(patch)) {
updateCol.run(col, val, userId);
- };
+ }
});
updateUser(Object.entries(patch));
@@ -51,12 +53,12 @@ router.patch('/:id', (req, res) => {
res.json(updated);
});
-router.delete('/:id', (req, res) => {
- const deleteUser = db.prepare(`DELETE FROM users WHERE id = @userId`)
+router.delete("/:id", (req, res) => {
+ const deleteUser = db.prepare(`DELETE FROM users WHERE id = @userId`);
const userId = parseInt(req.params.id);
const user = getUser(userId);
if (!user) {
- res.status(404).json({ error: 'User not found' });
+ res.status(404).json({ error: "User not found" });
}
deleteUser.run({ userId });
res.json(user);
diff --git a/backend/src/server.js b/backend/src/server.js
deleted file mode 100644
index 8b579b3..0000000
--- a/backend/src/server.js
+++ /dev/null
@@ -1,40 +0,0 @@
-import express from 'express';
-import cookieParser from 'cookie-parser';
-import logger from 'morgan';
-import cors from 'cors';
-import helmet from 'helmet';
-
-import apiRouter from './routes/api.js';
-
-
-const PORT = process.env.PORT || 3000;
-const NODE_ENV = process.env.NODE_ENV || 'development';
-
-const app = express();
-
-
-app.use(logger('dev'));
-app.use(express.json());
-app.use(express.urlencoded({ extended: false }));
-app.use(cookieParser());
-app.use(helmet());
-app.use(cors({
- origin: 'http://localhost:5173'
-}));
-
-app.use('/api', apiRouter);
-
-app.use((_req, res) => {
- res.status(404).json({
- error: 'Not Found',
- endpoints: [
- '/api/events',
- '/api/users'
- ]
- });
-});
-
-app.listen(PORT, () => {
- console.log(`\nServer listening at http://localhost:${PORT}`);
- console.log(`Server running in ${NODE_ENV} mode\n`);
-}); \ No newline at end of file
diff --git a/backend/src/server.ts b/backend/src/server.ts
new file mode 100644
index 0000000..8582347
--- /dev/null
+++ b/backend/src/server.ts
@@ -0,0 +1,37 @@
+import express from "express";
+import cookieParser from "cookie-parser";
+import logger from "morgan";
+import cors from "cors";
+import helmet from "helmet";
+
+import apiRouter from "./routes/api.js";
+
+const PORT = process.env.PORT || 3000;
+const NODE_ENV = process.env.NODE_ENV || "development";
+
+const app = express();
+
+app.use(logger("dev"));
+app.use(express.json());
+app.use(express.urlencoded({ extended: false }));
+app.use(cookieParser());
+app.use(helmet());
+app.use(
+ cors({
+ origin: "http://localhost:5173",
+ }),
+);
+
+app.use("/api", apiRouter);
+
+app.use((_req, res) => {
+ res.status(404).json({
+ error: "Not Found",
+ endpoints: ["/api/events", "/api/users"],
+ });
+});
+
+app.listen(PORT, () => {
+ console.log(`\nServer listening at http://localhost:${PORT}`);
+ console.log(`Server running in ${NODE_ENV} mode\n`);
+});
diff --git a/backend/src/types.ts b/backend/src/types.ts
new file mode 100644
index 0000000..5c8112c
--- /dev/null
+++ b/backend/src/types.ts
@@ -0,0 +1,24 @@
+export type Id = number;
+
+export interface Event {
+ id: Id;
+ title: string;
+ description?: string;
+ date: Date;
+ host_id: number;
+ image_url?: string;
+ host: User;
+ rsvps: Rsvps[];
+}
+
+export interface User {
+ id: number;
+ name: string;
+ email: string;
+}
+
+export interface Rsvps {
+ id: number;
+ name: string;
+ email: string;
+}