diff --git a/dbTools/post.js b/dbTools/post.js index f829991..4176505 100644 --- a/dbTools/post.js +++ b/dbTools/post.js @@ -15,9 +15,7 @@ postDB = (DB)=>{ const id = DB.ObjectID(postid); let update = { $set:{ - reactions:{ - [userid]: reaction - }, + ["reactions." + userid]: reaction, lastUpdated: new Date() } } @@ -80,7 +78,15 @@ postDB = (DB)=>{ } DB.getPosts = (userObj) => { - return DB.postCols.find().toArray().catch((err)=>{ + return DB.postCols.find().sort({_id: -1}).toArray().catch((err)=>{ + console.log(err); + return false; + }); + } + + DB.getPostsOfUser = (userId) => { + let userid = DB.ObjectID(userId); + return DB.postCols.find({userid}).sort({_id: -1}).toArray().catch((err)=>{ console.log(err); return false; }); diff --git a/dbTools/user.js b/dbTools/user.js new file mode 100644 index 0000000..d715c49 --- /dev/null +++ b/dbTools/user.js @@ -0,0 +1,31 @@ +const DBName = "EMI_SOCIAL"; +const User = require("./../def/user.js"); + +let userProfileCache = {}; + +userDB = (DB)=>{ + DB.profileCols = DB.db.db(DBName).collection("profiles"); + + DB.newProfile = (userObj) => { + console.log(userObj.toObj()) + return DB.profileCols.insertOne(userObj.toObj()).catch((err)=>{ + console.log(err); + return false; + }); + } + + DB.getProfile = async (userid)=>{ + if(userProfileCache[userid]) return userProfileCache[userid]; + const id = DB.ObjectID(userid) + let r = await DB.profileCols.findOne({userid: id}).catch((err)=>{ + console.log(err); + return false; + }); + if(r) userProfileCache[userid] = r; + return r; + } + + +} + +module.exports = userDB; \ No newline at end of file diff --git a/def/post.js b/def/post.js index a69842f..20ddfaa 100644 --- a/def/post.js +++ b/def/post.js @@ -1,6 +1,6 @@ class Post { constructor(info){ - if(!info || !info.userid) throw "Can not construct empty posts" + if(!info || !info.userid) throw "Can not construct empty posts"; this.userid = info.userid; this.content = info.content; this.createdAt = info.createdAt || new Date(); diff --git a/def/user.js b/def/user.js index 14537dd..2332e5c 100644 --- a/def/user.js +++ b/def/user.js @@ -1,20 +1,38 @@ class User { - constructor(json){ - this.username = 'aeroreyna'; - this.following = []; - this.lastUpdate = new Date(); - this.newsFeedCache = []; - this.isGroup = false; + constructor(info){ + if(!info || !info.userid) throw "Can not construct empty profile"; + this.userid = info.userid; + this.profile = { + firstName: info.profile && info.profile.firstName || '', + lastName: info.profile && info.profile.lastName || '', + photo: info.profile && info.profile.photo || '', + location: info.profile && info.profile.location || '', + language: info.profile && info.profile.language || '', + status: info.profile && info.profile.status || '', + description: info.profile && info.profile.description || '', + }; + this.data = info.data || {}; + this.username = info.username || ''; + this.following = info.following || []; + this.lastUpdate = info.lastUpdate || new Date(); + this.newsFeedCache = info.newsFeedCache || []; + this.isGroup = info.isGroup || false; } - newPost(content){ - - } - newComment(post){ - - } - newReaction(){ - + toObj(){ + let r = {}; + r.userid = this.userid + r.username = this.username; + r.profile = this.profile; + r.data = this.data; + r.username = this.username; + r.following = this.following; + r.lastUpdate = this.lastUpdate; + r.newsFeedCache = this.newsFeedCache; + r.isGroup = this.isGroup; + return r; } -} \ No newline at end of file +} + +module.exports = User; \ No newline at end of file diff --git a/index.js b/index.js index 2e4b9e7..6d3fa15 100644 --- a/index.js +++ b/index.js @@ -31,6 +31,9 @@ const getUserId = function(req){ // Definitions const Post = require("./def/post.js") +const User = require("./def/user.js"); +var userRoute = require('./routes/user.js'); +var postRoute = require('./routes/post.js'); DB.getDB.then((DB)=>{ @@ -59,15 +62,23 @@ DB.getDB.then((DB)=>{ const username = req.query.username || req.body.username; const password = req.query.password || req.body.password; const email = req.query.email || req.body.email; + const profile = req.query.profile || req.body.profile; if(!username || !password || !email) return res.json({status: "fail"}) - const hashedPassword = await bcrypt.hash(password, 10); + //const hashedPassword = await bcrypt.hash(password, 10); + const hashedPassword = await bcrypt.hash('12345', 10); const success = await DB.newUser({ username: username, email: email, password: hashedPassword }); if(success){ - return login(req, res); + let user = { + userid: success.insertedId, + profile: profile, + } + const userObj = new User(user); + DB.newProfile(userObj) + return await login(req, res); } res.redirect('/signup'); } @@ -131,84 +142,9 @@ DB.getDB.then((DB)=>{ app.get('/logout', (req, res) => { return logout(req, res); }); - - app.get("/post/", sessionChecker, async (req, res) => { - let posts = await DB.getPosts(); - return res.json(posts) - }); - - app.get("/post/new", sessionChecker, async (req, res) => { - let post = { - userid: getUserId(req), - content: req.query.content - } - let postObj = new Post(post); - DB.newPost(postObj) - return res.json({ - status: "ok" - }) - }); - - app.get("/post/newComment", sessionChecker, async (req, res) => { - let userid = getUserId(req); - let postid = req.query.postid; - let content = req.query.content; - let comment = { - userid: userid, - content: content, - createdAt: new Date(), - lastUpdated: new Date(), - reactions: {} - } - console.log("comment", postid, comment); - r = await DB.newComment(postid, comment); - console.log(r) - return res.json({ - status: "ok" - }) - }); - - app.get("/post/react", sessionChecker, async (req, res) => { - let userid = getUserId(req); - let postid = req.query.postid; - let reaction = { - type: "like", - createdAt: new Date() - }; - console.log("reaction". postid, reaction); - r = await DB.newReaction(postid, userid, reaction); - console.log(r); - return res.json({ - status: "ok" - }); - }) - - app.get("/post/unreact", sessionChecker, async (req, res) => { - let userid = getUserId(req); - let postid = req.query.postid; - r = await DB.removeReaction(postid, userid); - console.log(r) - return res.json({ - status: "ok" - }) - }); - - app.get("/post/comment/react", sessionChecker, async (req, res) => { - let userid = getUserId(req); - let postid = req.query.postid; - let commentDate = new Date(req.query.commentDate); - let reaction = { - type: "like", - createdAt: new Date() - }; - console.log(req.query) - console.log("comment reaction", postid, commentDate, reaction); - r = await DB.newCommentReaction(postid, commentDate, userid, reaction); - console.log(r) - return res.json({ - status: "ok" - }) - }); + + app.use('/user', sessionChecker, userRoute); + app.use('/post', sessionChecker, postRoute); // route for handling 404 requests(unavailable routes) app.use(function (req, res, next) { diff --git a/mongoDB.js b/mongoDB.js index 2a599d4..91c820d 100644 --- a/mongoDB.js +++ b/mongoDB.js @@ -4,6 +4,7 @@ const ObjectID = mongo.ObjectID; const DBName = "EMI_SOCIAL"; const mongoUrl = process.env.MONGO_URL; const postDB = require("./dbTools/post.js"); +const userDB = require("./dbTools/user.js"); const getDB = new Promise((resolve, reject) => { @@ -34,7 +35,6 @@ const getDB = new Promise((resolve, reject) => { } DB.newUser = (userInformation)=>{ - console.log("NewUser", userInformation); return DB.usersCol.insertOne(userInformation).catch((err)=>{ console.log(err); return false; @@ -51,6 +51,7 @@ const getDB = new Promise((resolve, reject) => { } postDB(DB); + userDB(DB); resolve(DB); }); diff --git a/routes/post.js b/routes/post.js new file mode 100644 index 0000000..f2d7140 --- /dev/null +++ b/routes/post.js @@ -0,0 +1,97 @@ +var express = require('express') +var router = express.Router() + +const DB = require("./../mongoDB.js"); +const Post = require("./../def/post.js"); + +const getUserId = function(req){ + const user_sid = req.cookies.user_sid || req.query.user_sid || req.body.user_sid; + return user_sid +} + +DB.getDB.then((DB)=>{ + + router.get("/", async (req, res) => { + let posts = await DB.getPosts(); + return res.json(posts) + }); + + router.get("/new", async (req, res) => { + let post = { + userid: getUserId(req), + content: req.query.content + } + let postObj = new Post(post); + let dbr = await DB.newPost(postObj) + post = postObj.toObj(); + post._id = dbr.insertedId; + return res.json({ + status: "ok", + ...post + }) + }); + + router.get("/newComment", async (req, res) => { + let userid = getUserId(req); + let postid = req.query.postid; + let content = req.query.content; + let comment = { + userid: userid, + content: content, + createdAt: new Date(), + lastUpdated: new Date(), + reactions: {} + } + console.log("comment", postid, comment); + r = await DB.newComment(postid, comment); + console.log(r) + return res.json({ + status: "ok" + }) + }); + + router.get("/react", async (req, res) => { + let userid = getUserId(req); + let postid = req.query.postid; + let reaction = { + type: "like", + createdAt: new Date() + }; + console.log("reaction". postid, reaction); + r = await DB.newReaction(postid, userid, reaction); + console.log(r); + return res.json({ + status: "ok" + }); + }) + + router.get("/unreact", async (req, res) => { + let userid = getUserId(req); + let postid = req.query.postid; + r = await DB.removeReaction(postid, userid); + console.log(r) + return res.json({ + status: "ok" + }) + }); + + router.get("/comment/react", async (req, res) => { + let userid = getUserId(req); + let postid = req.query.postid; + let commentDate = new Date(req.query.commentDate); + let reaction = { + type: "like", + createdAt: new Date() + }; + console.log(req.query) + console.log("comment reaction", postid, commentDate, reaction); + r = await DB.newCommentReaction(postid, commentDate, userid, reaction); + console.log(r) + return res.json({ + status: "ok" + }) + }); + +}); + +module.exports = router \ No newline at end of file diff --git a/routes/user.js b/routes/user.js new file mode 100644 index 0000000..c604be4 --- /dev/null +++ b/routes/user.js @@ -0,0 +1,32 @@ +var express = require('express') +var router = express.Router() + +const DB = require("./../mongoDB.js"); +const User = require("./../def/user.js"); + +DB.getDB.then((DB)=>{ + + router.get("/new", async (req, res) => { + let user = { + userid: getUserId(req), + ... req.query.content + }; + let userObj = new User(user); + DB.newProfile(userObj) + return res.json({ + status: "ok" + }); + }); + + router.get("/:id", async (req, res) => { + let userid = req.params.id; + let user = await DB.getProfile(userid); + return res.json({ + status: "ok", + user + }); + }); + +}); + +module.exports = router \ No newline at end of file