diff --git a/app.js b/app.js index e1b424a..e0b5294 100644 --- a/app.js +++ b/app.js @@ -10,6 +10,7 @@ var usersRouter = require('./routes/user'); var messagesRouter = require('./routes/message'); var loginRouter = require('./routes/login'); var registerRouter = require('./routes/register'); +var followRouter = require('./routes/follow'); var app = express(); @@ -33,6 +34,7 @@ app.use('/user', usersRouter); app.use('/message', messagesRouter); app.use('/login', loginRouter); app.use('/register', registerRouter); +app.use('/follow', followRouter); // catch 404 and forward to error handler app.use(function(req, res, next) { diff --git a/database/socialbot.db b/database/socialbot.db index c74d782..097ea6e 100644 Binary files a/database/socialbot.db and b/database/socialbot.db differ diff --git a/models/index.js b/models/index.js index 0645cc5..706adda 100644 --- a/models/index.js +++ b/models/index.js @@ -28,6 +28,7 @@ fs db.Message.belongsTo(db.User, {through: 'UserMessages'}); db.User.hasMany(db.Session); db.Session.belongsTo(db.User); + db.User.belongsToMany(db.User, {as: 'follow', through: 'UserFollows'}); Object.keys(db).forEach(modelName => { if (db[modelName].associate) { diff --git a/public/stylesheets/style.css b/public/stylesheets/style.css index ac469cc..e087c81 100644 --- a/public/stylesheets/style.css +++ b/public/stylesheets/style.css @@ -1,5 +1,9 @@ -/* -! tailwindcss v3.0.18 | MIT License | https://tailwindcss.com +/* + npx tailwindcss -i ./src/style.css -o ./public/stylesheets/style.css --watch +*/ + +/* + ! tailwindcss v3.0.18 | MIT License | https://tailwindcss.com */ /* @@ -562,6 +566,10 @@ Ensure the default browser behavior of the `hidden` attribute. display: flex; } +.inline-flex { + display: inline-flex; +} + .hidden { display: none; } @@ -852,16 +860,6 @@ Ensure the default browser behavior of the `hidden` attribute. color: rgb(37 99 235 / var(--tw-text-opacity)); } -.text-gray-300 { - --tw-text-opacity: 1; - color: rgb(209 213 219 / var(--tw-text-opacity)); -} - -.text-gray-800 { - --tw-text-opacity: 1; - color: rgb(31 41 55 / var(--tw-text-opacity)); -} - .text-gray-500 { --tw-text-opacity: 1; color: rgb(107 114 128 / var(--tw-text-opacity)); diff --git a/routes/follow.js b/routes/follow.js new file mode 100644 index 0000000..fff5d6c --- /dev/null +++ b/routes/follow.js @@ -0,0 +1,38 @@ +var express = require('express'); +var router = express.Router(); +var db = require('../models'); +var User = db.User; +var Messages = db.Messages; +var Session = db.Session; +var lib = require('../lib'); + +/* GET home page. */ +router.get('/add/:id', async function(req, res, next) { + var id = req.params.id; + console.log(req.cookies.sessionid); + var sessionId = req.cookies.sessionid; + var user = await lib.getAuthUser(sessionId); + if(user) { + var follow = await user.addFollow(id); + res.send(follow); + } else { + res.redirect('/login'); + } +}); + +router.get('/get', async function(req, res, next) { + var id = req.params.id; + console.log(req.cookies.sessionid); + var sessionId = req.cookies.sessionid; + var user = await lib.getAuthUser(sessionId); + if(user) { + var follow = await user.getFollow({ + attributes: ['id'] + }); + res.send(follow); + } else { + res.redirect('/login'); + } +}); + +module.exports = router; diff --git a/routes/index.js b/routes/index.js index 43ae4d6..fb1c6d0 100644 --- a/routes/index.js +++ b/routes/index.js @@ -2,6 +2,7 @@ var express = require('express'); var router = express.Router(); var db = require('../models'); var User = db.User; +var Messages = db.Messages; var Session = db.Session; var lib = require('../lib'); @@ -11,8 +12,14 @@ router.get('/', async function(req, res, next) { var sessionId = req.cookies.sessionid; var user = await lib.getAuthUser(sessionId); if(user) { - var messages = await user.getMessages(); - res.render('index', { auth:user, messages:messages }); + var messages = await user.getMessages({ + order: [ + ['id', 'DESC'], + ], + limit: 10 + }); + var messageCount = await user.countMessages(); + res.render('index', { auth:user, messages:messages, messageCount:messageCount }); } else { res.redirect('/login'); } diff --git a/routes/message.js b/routes/message.js index efb8d98..428cddf 100644 --- a/routes/message.js +++ b/routes/message.js @@ -2,6 +2,26 @@ var express = require('express'); const db = require('../models'); var router = express.Router(); var lib = require('../lib'); +var Message = db.Message; +var User = db.User; +var Op = db.Sequelize.Op; + +async function getAllMessages(user) { + if(user) { + var follows = await user.getFollow(); + var timelineMessages = []; + for(var i = 0; i < follows.length; i++) { + timelineMessages[i] = follows[i] + timelineMessages[i].messages = []; + var messages = await follows[i].getMessages(); + for(var j = 0; j < messages.length; j++) { + timelineMessages[i].messages.push(messages[j]); + } + } + //var messages = fore + return timelineMessages; + } +} /* POST a new message */ router.post('/add', async function(req, res, next) { @@ -15,4 +35,37 @@ router.post('/add', async function(req, res, next) { } }); +router.get('/timeline', async function(req, res, next) { + var sessionId = req.cookies.sessionid; + var user = await lib.getAuthUser(sessionId); + var timeline = await getAllMessages(user); + res.send(timeline); +}); + +router.get('/timeline2', async function(req, res, next) { + var sessionId = req.cookies.sessionid; + var user = await lib.getAuthUser(sessionId); + if(user) { + var follows = await user.getFollow(); + var userList = []; + follows.forEach(element => { + userList.push(element.id); + }); + var userMessages = await db.User.findAll({ + include: Message, + //required: true, + where: { + id: userList, + '$Messages.createdAt$': { + [Op.like]: '2022%', + } + }, + + }); + res.send(userMessages); + } else { + res.redirect('/login'); + } +}); + module.exports = router; diff --git a/routes/user.js b/routes/user.js index 3f318b7..59b3427 100644 --- a/routes/user.js +++ b/routes/user.js @@ -2,30 +2,31 @@ var express = require('express'); const db = require('../models'); var router = express.Router(); var User = db.User; +var lib = require('../lib'); /* GET users listing. */ -router.get('/', async function(req, res, next) { - var users = await User.findAll(); - res.send(users); -}); - -router.get('/get/:id', async function(req, res, next) { - var users = await User.findByPk (req.params.id); - res.send(users); -}); - -router.put('/update/:id', async function(req, res, next) { - var users = await User.update({'email':'eve@uplink.si'}, {where:{'ID':req.params.id}}); - res.send(users); -}); - -router.get('/new', async function(req, res, next) { - var users = await User.create({'name':'EVE2', 'email':'eve@2uplink.si', 'password':'some-random-password'}); - res.send(users); -}); - -router.get('/add', function(req, res, next) { - res.send('respond with a resource'); +router.get('/:username', async function(req, res, next) { + var test = 123; + var sessionId = req.cookies.sessionid; + var search = req.params.username; + var auth = await lib.getAuthUser(sessionId); + if(auth) { + var user = await User.findOne({ + where: { + name: search, + } + }); + if(user) { + var messages = await user.getMessages(); + var messageCount = await user.countMessages(); + res.render('user', {auth:auth, user:user, messages:messages, messageCount:messageCount}); + } else { + res.redirect('/'); + } + } else { + res.redirect('/login'); + } + }); module.exports = router; diff --git a/seeders/20220213160925-users.js b/seeders/20220213160925-users.js new file mode 100644 index 0000000..bbc1e70 --- /dev/null +++ b/seeders/20220213160925-users.js @@ -0,0 +1,46 @@ +'use strict'; + +module.exports = { + async up (queryInterface, Sequelize) { + /** + * Add seed commands here. + * + * Example: + * await queryInterface.bulkInsert('People', [{ + * name: 'John Doe', + * isBetaMember: false + * }], {}); + */ + await queryInterface.bulkInsert('users', [ + {id: null, name: 'John Doe', email: 'John.Doe@email.com', password: 'password', createdAt: '2021-02-09 22:16:34.901 +00:00', updatedAt: '2022-02-09 22:16:34.901 +00:00'}, + {name: 'Valentin', password: 'random-password', email: 'valentin@uplink.si', createdAt: '2021-02-09 22:16:34.901 +00:00', updatedAt: '2022-02-09 22:16:34.901 +00:00'}, + {name: 'Helena', password: 'random-password', email: 'helena@uplink.si', createdAt: '2021-02-09 22:16:34.901 +00:00', updatedAt: '2022-02-09 22:16:34.901 +00:00'}, + {name: 'Oto', password: 'random-password', email: 'oto@uplink.si', createdAt: '2021-02-09 22:16:34.901 +00:00', updatedAt: '2022-02-09 22:16:34.901 +00:00'}, + {name: 'Peter', password: 'random-password', email: 'peter@uplink.si', createdAt: '2021-02-09 22:16:34.901 +00:00', updatedAt: '2022-02-09 22:16:34.901 +00:00'}, + {name: 'Igor', password: 'random-password', email: 'igor@uplink.si', createdAt: '2021-02-09 22:16:34.901 +00:00', updatedAt: '2022-02-09 22:16:34.901 +00:00'}, + {name: 'Matic', password: 'random-password', email: 'matic@uplink.si', createdAt: '2021-02-09 22:16:34.901 +00:00', updatedAt: '2022-02-09 22:16:34.901 +00:00'}, + {name: 'Jože', password: 'random-password', email: 'joze@uplink.si', createdAt: '2021-02-09 22:16:34.901 +00:00', updatedAt: '2022-02-09 22:16:34.901 +00:00'}, + {name: 'Marko', password: 'random-password', email: 'marko@uplink.si', createdAt: '2021-02-09 22:16:34.901 +00:00', updatedAt: '2022-02-09 22:16:34.901 +00:00'}, + {name: 'Marija', password: 'random-password', email: 'marija@uplink.si', createdAt: '2021-02-09 22:16:34.901 +00:00', updatedAt: '2022-02-09 22:16:34.901 +00:00'}, + {name: 'Brigita', password: 'random-password', email: 'brigita@uplink.si', createdAt: '2021-02-09 22:16:34.901 +00:00', updatedAt: '2022-02-09 22:16:34.901 +00:00'}, + {name: 'Andrej', password: 'random-password', email: 'andrej@uplink.si', createdAt: '2021-02-09 22:16:34.901 +00:00', updatedAt: '2022-02-09 22:16:34.901 +00:00'}, + {name: 'Jaka', password: 'random-password', email: 'jaka@uplink.si', createdAt: '2021-02-09 22:16:34.901 +00:00', updatedAt: '2022-02-09 22:16:34.901 +00:00'}, + {name: 'Natalija', password: 'random-password', email: 'natalija@uplink.si', createdAt: '2021-02-09 22:16:34.901 +00:00', updatedAt: '2022-02-09 22:16:34.901 +00:00'}, + {name: 'Lotta', password: 'random-password', email: 'lotta@uplink.si', createdAt: '2021-02-09 22:16:34.901 +00:00', updatedAt: '2022-02-09 22:16:34.901 +00:00'}, + {name: 'Sven', password: 'random-password', email: 'sven@uplink.si', createdAt: '2021-02-09 22:16:34.901 +00:00', updatedAt: '2022-02-09 22:16:34.901 +00:00'}, + {name: 'Bjorn', password: 'random-password', email: 'bjorn@uplink.si', createdAt: '2021-02-09 22:16:34.901 +00:00', updatedAt: '2022-02-09 22:16:34.901 +00:00'}, + {name: 'Lars', password: 'random-password', email: 'lars@uplink.si', createdAt: '2021-02-09 22:16:34.901 +00:00', updatedAt: '2022-02-09 22:16:34.901 +00:00'}, + {name: 'Matjaž', password: 'random-password', email: 'matjaz.m@uplink.si', createdAt: '2021-02-09 22:16:34.901 +00:00', updatedAt: '2022-02-09 22:16:34.901 +00:00'}, + ], {}); + }, + + async down (queryInterface, Sequelize) { + /** + * Add commands to revert seed here. + * + * Example: + * await queryInterface.bulkDelete('People', null, {}); + */ + //await queryInterface.bulkDelete('Users', null, {}); + } +}; diff --git a/src/style.css b/src/style.css index bd6213e..f077a89 100644 --- a/src/style.css +++ b/src/style.css @@ -1,3 +1,7 @@ +/* + npx tailwindcss -i ./src/style.css -o ./public/stylesheets/style.css --watch +*/ + @tailwind base; @tailwind components; @tailwind utilities; \ No newline at end of file diff --git a/views/index.ejs b/views/index.ejs index b847a32..88c8f4d 100644 --- a/views/index.ejs +++ b/views/index.ejs @@ -74,8 +74,8 @@
Joined <%= auth.createdAt %>
+ <%= messages[i].body%> +
+