diff --git a/DOCS.md b/DOCS.md index 3a8bcb6..56c0d2e 100644 --- a/DOCS.md +++ b/DOCS.md @@ -48,7 +48,8 @@ Response format: ```json { - "before": 100 // message ID. if ommitted just starts from end + "before": 100, // message ID. if ommitted just starts from end + "thread": 1 // thread ID } ``` @@ -69,7 +70,8 @@ Message format: ```json { "name": "unique_username", - "message": "message" + "message": "message", + "thread": 1 // thread ID } ``` @@ -82,6 +84,43 @@ Response format: } ``` +## create_thread + +Message format: + +```json +{ + "name": "thread name" +} +``` + +Response format: + +```json +{ + "success": true, + "id": 111 +} +``` + +## list_threads + +no request message + +Response format: + +```json +{ + "success": true, + "threads": [ + { + "id": 1, + "name": "meow" + } + ] +} +``` + # sent by server ## new_message @@ -90,6 +129,7 @@ Response format: { "id": 69, "name": "unique_username", - "message": "msg text" + "message": "msg text", + "thread": 1 // thread ID } ``` diff --git a/db/1-init.sql b/db/1-init.sql index e47fd1a..6ae8c0c 100644 --- a/db/1-init.sql +++ b/db/1-init.sql @@ -13,7 +13,10 @@ CREATE TABLE authentications ( CREATE TABLE threads ( id integer primary key asc, - created timestamp default current_timestamp + name text, + creator integer, + created timestamp default current_timestamp, + foreign key(creator) references users(id) ); CREATE TABLE posts ( @@ -26,4 +29,4 @@ CREATE TABLE posts ( foreign key(thread) references threads(id) ); -INSERT INTO threads default values; \ No newline at end of file +INSERT INTO threads (name) values ("meow"); \ No newline at end of file diff --git a/src/actions.js b/src/actions.js index 4589219..6946004 100644 --- a/src/actions.js +++ b/src/actions.js @@ -2,10 +2,14 @@ const create_user = require("./create_user"); const get_history = require("./get_history"); const send_message = require("./send_message"); const authenticate = require("./authenticate"); +const create_thread = require("./create_thread"); +const list_threads = require("./list_threads"); module.exports = { create_user, get_history, send_message, authenticate, + create_thread, + list_threads, }; diff --git a/src/authenticate.js b/src/authenticate.js index 49f50af..ac685ab 100644 --- a/src/authenticate.js +++ b/src/authenticate.js @@ -53,7 +53,7 @@ const authenticate = async (msg, respond, socket) => { }); } } catch (err) { - console.err("error in authentication: " + err); + console.error("error in authentication: " + err); return respond({ success: false, message: "Message signature verification failed", diff --git a/src/create_thread.js b/src/create_thread.js new file mode 100644 index 0000000..3899458 --- /dev/null +++ b/src/create_thread.js @@ -0,0 +1,23 @@ +const db = require("../db"); + +const create_thread = async (msg, respond) => { + // validate inputs + if (!msg.name) { + return respond({ + success: false, + message: "Thread name required", + }); + } + // add to db + const insert = await db.query( + "insert into threads (name, creator) values (?, ?) returning id", + [msg.name, msg.auth_user.id] + ); + // respond + return respond({ + success: true, + id: insert.rows[0].id, + }); +}; + +module.exports = create_thread; diff --git a/src/create_user.js b/src/create_user.js index 29033cc..1b5c760 100644 --- a/src/create_user.js +++ b/src/create_user.js @@ -14,6 +14,7 @@ const create_user = async (msg, respond) => { msg.name, ]); if (result.rows.length > 0) { + console.log(result); return respond({ success: false, message: "A user with this name already exists on this server", diff --git a/src/get_history.js b/src/get_history.js index e94ae6b..3a02c34 100644 --- a/src/get_history.js +++ b/src/get_history.js @@ -7,13 +7,20 @@ const get_history = async (msg, respond) => { message: "before must be a number", }); } + if (!msg.thread) { + return respond({ + success: false, + message: "thread ID required", + }); + } const messages = await db.query( `select users.name, posts.id, content from posts join users on posts.user = users.id - ${msg.before ? "where posts.id < ?" : ""} + ${msg.before ? "where posts.id < ? and" : "where"} + thread = ? order by posts.created desc limit 101`, - msg.before ? [msg.before] : [] + msg.before ? [msg.before, msg.thread] : [msg.thread] ); return respond({ success: true, diff --git a/src/list_threads.js b/src/list_threads.js new file mode 100644 index 0000000..b59ad27 --- /dev/null +++ b/src/list_threads.js @@ -0,0 +1,14 @@ +const db = require("../db"); + +const list_threads = async (msg, respond) => { + const threads = await db.query( + "select name, id from threads order by created desc" + ); + // respond + return respond({ + success: true, + threads: threads.rows, + }); +}; + +module.exports = list_threads; diff --git a/src/send_message.js b/src/send_message.js index 0ac15f7..5232fa5 100644 --- a/src/send_message.js +++ b/src/send_message.js @@ -2,15 +2,22 @@ const db = require("../db"); const authwrap = require("./authwrap"); const send_message = async (msg, respond, socket) => { + if (!msg.thread) { + return respond({ + success: false, + message: "thread ID required", + }); + } // add message and send it to everyone const id = await db.query( - "insert into posts (user, thread, content) values (?, 1, ?) returning id", - [msg.auth_user.id, msg.message] + "insert into posts (user, thread, content) values (?, ?, ?) returning id", + [msg.auth_user.id, msg.thread, msg.message] ); socket.broadcast.emit("new_message", { id: id.rows[0].id, name: msg.name, message: msg.message, + thread: msg.thread, }); return respond({ success: true,