From da1ef027825f7ca89a003c3a69cd5e02190121a4 Mon Sep 17 00:00:00 2001 From: Matjaz Date: Sun, 13 Feb 2022 21:48:01 +0100 Subject: [PATCH] =?UTF-8?q?Za=C4=8Detek=20=C4=8Dasovnice.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.js | 2 + database/socialbot.db | Bin 45056 -> 53248 bytes models/index.js | 1 + public/stylesheets/style.css | 22 ++-- routes/follow.js | 38 ++++++ routes/index.js | 11 +- routes/message.js | 53 +++++++++ routes/user.js | 45 ++++---- seeders/20220213160925-users.js | 46 ++++++++ src/style.css | 4 + views/index.ejs | 6 +- views/partials/_toot.ejs | 2 +- views/partials/_user_timeline.ejs | 22 ++++ views/user.ejs | 185 ++++++++++++++++++++++++++++++ 14 files changed, 397 insertions(+), 40 deletions(-) create mode 100644 routes/follow.js create mode 100644 seeders/20220213160925-users.js create mode 100644 views/partials/_user_timeline.ejs create mode 100644 views/user.ejs 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 c74d7824ec7128fe4ea55afe2a324f0a2b7af755..097ea6ea4734cb4808191308f6997dcec4a6952d 100644 GIT binary patch delta 3794 zcmb7GO>Eod8Kxwg6!phAjx5`<0470E7>;QEQ)D-!<`yq>($%Q#6y4UYAEi$bB}z0X z*=@Xol3~CuTbDpUPurTDiUAwe!j}PCyY=8>4+V<$)^>;Ov;q4muwodneWWQ_B9#I& zV0`}GN6+)V-}@)u{Vaa>Vd8#q?sE*ovgmjCbN|5=;fc>N=EnUj^#zt8u4B|D^-ivs zYiA1?Jk?3RpZq8#5!aJ%ynXKvxK4c$`}X&DGeqI?<=79L9x!dV*M;t;W82Ov-LXG2 zUwiJ_#_lzGcSFBl+Q@rkfe((~xJNQLK9lFXCr016Qq8)+r=ehQHPA|H^KlfO;w z5q~9qNG!j7@6Wi@DiBz4jWdjAK(7f--gQBz=CsTEpxb@LacgbQdc?G!KG?UdPK)VU zJj-)~`qc_kTOhFf+NxpP1a3D(vymxEVe5GUE3B;ss>$Vknn|W%D68T0h@b?UGqi<{b#wd-g zXM;>4TFVJViC8TsN?L~*kAym7%Q<-$hDc542u3+O!j;B{8*Bkay#@ zg(s$N@OfihFX0j@5QL;NrM;MUzC0l^8{eBnD|m(Qhr`*jK$b_)@g#&?k>;b9XgPEnMRl-mojjsV3w1I|w|ih(9q2`$O^tHyE3=Bmi;N`sLEhlB(LGT9 zP9DcLP>|bz?g6B2!+p92I&>2vaeE@oNRQPdRpVGjVLiS4xzR09JO1y^Z015TeFLMu zk$WxsVYZlgGb5ybpT2QCcTPz6U9^<2ffgk@0>>tz%0LK!HmS!Zh% zNimfcg!^UmeRc>(PvZT&OBySq`SNFBaumF(gwVK)cDnD=RQj@7t;w)lH=$G(O$GVm zfK;y5VWlF=91D5*u}*nSR2h-21TPJR6hh-J`cm+na&>_hYsj4W_2ES2RIoDvCJOX&8+kziGdiNR*PsfY@I>pR!Ur%m8+gNbT?2(ReHDI%vEM&j9U zAY=RI3@z%*5sl#{L5ZEBQRxS3=nP)gm!^sM`-HDd6$!S@8M>q|PHK#8hzhHY1v2>2 zZju`=i!*3ZFH8{#_JCUP_5xy!?tx%IUzox=opG5}JXU@<^XMM17WDk!z3RIYKwLxi=K>eHg2X#cbsH^^-yNb_{ zu~@0(A1f>VQ7rn$^0I#{E&0ddqJI<${;{y&ANl;T`;*t`3*I*`o@-##@2FQPG55FJ zFLMnfznkmp_~biLTgsX!YJ$K>d}Jo4qPRXgU4vB^NsWBp4K;kUKZH~I%rp@}6BUM4 z9}`FjP3np18Z5`C{CKYn|EG}qnkZ-!@Vp*JA~A9_#{O#LRZWx_K^<25%h9+Vn+)Vs zL)18dktYIK_am7K$5UR>sE;w!4ZXkw%?uk0aisu;gyeIJT|6t(axW>Tm#=nt{(1avKy_C9 zo89cE322LOGBS%Zh8Cw56*KWLG0QRrrxq7y=I0f20j=iZ1WWJ&nIg>pC$k4=Zk%|Y zdGr5ZRvtc9p5+Yu?tFc`S9qm)mIF-; { 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 @@
+ class="place-content-end bg-blue-600 py-2 px-5 rounded-md mr-3 focus:outline-none focus:shadow-outline font-bold" + type="submit">Send
@@ -112,7 +112,7 @@

Joined <%= auth.createdAt %>

-
<%= messages.length %> Posts
+
<%= messageCount %> Posts
3 Following
7 Followers
diff --git a/views/partials/_toot.ejs b/views/partials/_toot.ejs index 4c1abae..a52dec6 100644 --- a/views/partials/_toot.ejs +++ b/views/partials/_toot.ejs @@ -1,4 +1,4 @@ -<% for(var i=messages.length - 1; i>= 0; i--) {%> +<% for(var i = 0; i < messages.length; i++) {%>
diff --git a/views/partials/_user_timeline.ejs b/views/partials/_user_timeline.ejs new file mode 100644 index 0000000..a8e8451 --- /dev/null +++ b/views/partials/_user_timeline.ejs @@ -0,0 +1,22 @@ +<% for(var i = 0; i < messages.length; i++) {%> + +
+
+ <%= user.name %> +
+
+
+
+ <%= user.name %> +
+ +

+ <%= messages[i].body%> +

+
+
Posted on: <%= messages[i].createdAt %> +
+
+
+ + <% } %> \ No newline at end of file diff --git a/views/user.ejs b/views/user.ejs new file mode 100644 index 0000000..0b6c958 --- /dev/null +++ b/views/user.ejs @@ -0,0 +1,185 @@ + + + + + Social Robot + + + + + + + +
+ +
+
+
+
+ + + + +
+
+
+
+ <%= auth.name %> +
+
<%= auth.name %>
+
<%= auth.email %>
+
+
+
+ + + +
+ + +
+ + + +
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+
+
Home
+
+
+
+ paralax +
+
+
+ <%= user.name %> +
+
+ + Link + +
+
+ +
+
+

<%= user.name %>

+

<%= user.email %>

+
+
+

Joined <%= user.createdAt %>

+
+
<%= messageCount %> Posts
+
3 Following
+
7 Followers
+
+
+
+ <%- include('partials/_user_timeline', {user:user, messages:messages}) %> +
+
+ +
+ +
+ +
+
+ + + \ No newline at end of file