Skip to content

Commit eb58383

Browse files
authored
Merge pull request #382 from vinitkumar/upgrade-to-tailwind-and-vanilla-js
Upgrade to tailwind and vanilla js
2 parents 9773591 + afb13ac commit eb58383

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+1038
-22686
lines changed

app/controllers/activity.ts

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,35 @@
11
import { Request, Response } from 'express';
2+
import mongoose from 'mongoose';
23

34
/**
45
* Show activities
56
*/
6-
export const index = (req: Request, res: Response) => {
7-
res.render('pages/activity', { title: 'Activities' });
7+
export const index = async (req: Request, res: Response) => {
8+
const Activity = mongoose.model('Activity');
9+
const page = parseInt((req as any).query.page) || 0;
10+
const perPage = 20;
11+
12+
try {
13+
const activities = await (Activity as any)
14+
.list({
15+
criteria: {},
16+
perPage: perPage,
17+
page: page
18+
})
19+
.exec();
20+
21+
res.render('pages/activity', {
22+
title: 'Activities',
23+
activities: activities || [],
24+
page: page,
25+
pages: Math.ceil(await Activity.countDocuments() / perPage) || 1
26+
});
27+
} catch (err) {
28+
res.render('pages/activity', {
29+
title: 'Activities',
30+
activities: [],
31+
page: 0,
32+
pages: 1
33+
});
34+
}
835
};

app/controllers/tweets.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export const create = async (req: Request, res: Response): Promise<void> => {
2727

2828
try {
2929
await tweet.save();
30-
res.redirect('/tweets/' + tweet._id);
30+
res.redirect('/');
3131
} catch (err: any) {
3232
res.status(400).json({ error: err.message });
3333
}
@@ -42,7 +42,7 @@ export const update = async (req: Request, res: Response): Promise<void> => {
4242

4343
try {
4444
await tweet.save();
45-
res.redirect('/tweets/' + tweet._id);
45+
res.redirect('/');
4646
} catch (err: any) {
4747
res.status(400).json({ error: err.message });
4848
}

app/controllers/users.ts

Lines changed: 149 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ export const user = async (req: Request, res: Response, next: any, id: string) =
88
const User = mongoose.model('User');
99

1010
try {
11-
const user = await (User as any).load({ criteria: { _id: id } });
11+
const user = await (User as any).load({
12+
criteria: { _id: id },
13+
select: 'name username github followers following'
14+
});
1215
if (!user) return next(new Error('Failed to load User ' + id));
1316
(req as any).profile = user;
1417
next();
@@ -33,9 +36,19 @@ export const create = async (req: Request, res: Response) => {
3336
return res.redirect('/users/' + user._id);
3437
});
3538
} catch (err: any) {
39+
const Tweet = mongoose.model('Tweet');
40+
const Analytics = mongoose.model('Analytics');
41+
42+
const tweetCount = await Tweet.countDocuments();
43+
const userCount = await User.countDocuments();
44+
const analyticsCount = await Analytics.countDocuments();
45+
3646
return res.render('pages/login', {
3747
errors: err.errors,
38-
user: user
48+
user: user,
49+
tweetCount: tweetCount,
50+
userCount: userCount,
51+
analyticsCount: analyticsCount
3952
});
4053
}
4154
};
@@ -49,41 +62,122 @@ export const show = async (req: Request, res: Response) => {
4962
const user = (req as any).profile;
5063

5164
try {
52-
const count = await Tweet.countDocuments({ user: (req as any).profile._id });
65+
// Get tweet count
66+
const tweetCount = await Tweet.countDocuments({ user: user._id });
67+
68+
// Get actual tweets for this user
69+
const tweets = await (Tweet as any)
70+
.list({
71+
criteria: { user: user._id },
72+
perPage: 20,
73+
page: 0
74+
})
75+
.exec();
76+
77+
// Get follower/following counts
78+
const followerCount = user.followers ? user.followers.length : 0;
79+
const followingCount = user.following ? user.following.length : 0;
80+
5381
res.render('pages/profile', {
5482
title: user.name,
5583
user: user,
56-
tweets: count
84+
tweets: tweets,
85+
tweetCount: tweetCount,
86+
followerCount: followerCount,
87+
followingCount: followingCount
5788
});
5889
} catch (err) {
5990
res.render('pages/profile', {
6091
title: user.name,
6192
user: user,
62-
tweets: 0
93+
tweets: [],
94+
tweetCount: 0,
95+
followerCount: 0,
96+
followingCount: 0
6397
});
6498
}
6599
};
66100

67101
/**
68102
* Show followers
69103
*/
70-
export const showFollowers = (req: Request, res: Response) => {
104+
export const showFollowers = async (req: Request, res: Response) => {
105+
const User = mongoose.model('User');
106+
const Tweet = mongoose.model('Tweet');
71107
const user = (req as any).profile;
72-
res.render('pages/followers', {
73-
title: user.name + ' followers',
74-
user: user
75-
});
108+
109+
try {
110+
// Populate followers
111+
const populatedUser = await User.findById(user._id)
112+
.populate('followers', 'name username github')
113+
.exec();
114+
115+
const followers = populatedUser?.followers || [];
116+
117+
// Get counts for profile card
118+
const tweetCount = await Tweet.countDocuments({ user: user._id });
119+
const followerCount = user.followers ? user.followers.length : 0;
120+
const followingCount = user.following ? user.following.length : 0;
121+
122+
res.render('pages/followers', {
123+
title: user.name + ' followers',
124+
user: user,
125+
followers: followers,
126+
tweetCount: tweetCount,
127+
followerCount: followerCount,
128+
followingCount: followingCount
129+
});
130+
} catch (err) {
131+
res.render('pages/followers', {
132+
title: user.name + ' followers',
133+
user: user,
134+
followers: [],
135+
tweetCount: 0,
136+
followerCount: 0,
137+
followingCount: 0
138+
});
139+
}
76140
};
77141

78142
/**
79143
* Show following
80144
*/
81-
export const showFollowing = (req: Request, res: Response) => {
145+
export const showFollowing = async (req: Request, res: Response) => {
146+
const User = mongoose.model('User');
147+
const Tweet = mongoose.model('Tweet');
82148
const user = (req as any).profile;
83-
res.render('pages/followers', {
84-
title: user.name + ' following',
85-
user: user
86-
});
149+
150+
try {
151+
// Populate following
152+
const populatedUser = await User.findById(user._id)
153+
.populate('following', 'name username github')
154+
.exec();
155+
156+
const following = populatedUser?.following || [];
157+
158+
// Get counts for profile card
159+
const tweetCount = await Tweet.countDocuments({ user: user._id });
160+
const followerCount = user.followers ? user.followers.length : 0;
161+
const followingCount = user.following ? user.following.length : 0;
162+
163+
res.render('pages/followers', {
164+
title: user.name + ' following',
165+
user: user,
166+
followers: following, // Using 'followers' template variable for both
167+
tweetCount: tweetCount,
168+
followerCount: followerCount,
169+
followingCount: followingCount
170+
});
171+
} catch (err) {
172+
res.render('pages/followers', {
173+
title: user.name + ' following',
174+
user: user,
175+
followers: [],
176+
tweetCount: 0,
177+
followerCount: 0,
178+
followingCount: 0
179+
});
180+
}
87181
};
88182

89183
/**
@@ -98,10 +192,23 @@ export const update = (req: Request, res: Response) => {
98192
/**
99193
* Delete user
100194
*/
101-
export const deleteUser = (req: Request, res: Response) => {
195+
export const deleteUser = async (req: Request, res: Response) => {
196+
const User = mongoose.model('User');
197+
const Tweet = mongoose.model('Tweet');
102198
const user = (req as any).profile;
103-
// Implement delete logic
104-
res.redirect('/');
199+
200+
try {
201+
// Delete user's tweets
202+
await Tweet.deleteMany({ user: user._id });
203+
// Delete the user
204+
await User.findByIdAndDelete(user._id);
205+
// Logout and redirect
206+
req.logout((err: any) => {
207+
res.redirect('/login');
208+
});
209+
} catch (err) {
210+
res.redirect('/');
211+
}
105212
};
106213

107214
/**
@@ -114,10 +221,30 @@ export const session = (req: Request, res: Response) => {
114221
/**
115222
* Login page
116223
*/
117-
export const login = (req: Request, res: Response) => {
118-
res.render('pages/login', {
119-
title: 'Login'
120-
});
224+
export const login = async (req: Request, res: Response) => {
225+
const Tweet = mongoose.model('Tweet');
226+
const User = mongoose.model('User');
227+
const Analytics = mongoose.model('Analytics');
228+
229+
try {
230+
const tweetCount = await Tweet.countDocuments();
231+
const userCount = await User.countDocuments();
232+
const analyticsCount = await Analytics.countDocuments();
233+
234+
res.render('pages/login', {
235+
title: 'Login',
236+
tweetCount: tweetCount,
237+
userCount: userCount,
238+
analyticsCount: analyticsCount
239+
});
240+
} catch (err) {
241+
res.render('pages/login', {
242+
title: 'Login',
243+
tweetCount: 0,
244+
userCount: 0,
245+
analyticsCount: 0
246+
});
247+
}
121248
};
122249

123250
/**

app/views/chat/chat.pug

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,25 @@
11
extends ../layouts/default
22

33
block content
4-
.row.twitter-container
5-
.col-xl-12.col-lg-12.first-column
6-
.logged-user
7-
.row.chatbox
8-
- if (chats.length == 0)
9-
h2 No chats sorry!
10-
ul.chatlist
11-
- if (chats)
12-
each chat in chats
13-
li
14-
- if (chat.sender != null)
15-
img(class='tweet__image', src=chat.sender.github.avatar_url)
16-
p.chatMessage
17-
a(class='sender', href="/users/" + chat.sender._id)
18-
span.sender #{chat.sender.username}:
19-
span.message #{chat.message}
20-
p.msgtime #{moment(chat.createdAt).format("MMM D, YYYY [at] h:mm a")}
21-
4+
.max-w-4xl.mx-auto
5+
.bg-yankees-blue.rounded-lg.border.border-black.overflow-hidden
6+
.bg-jungle-dark.px-6.py-4.border-b.border-black
7+
h2.text-xl.font-display.font-semibold.text-white Messages
8+
9+
.p-6
10+
- if (chats.length == 0)
11+
.text-center.py-12
12+
i.far.fa-comments.text-6xl.text-grey-blue.mb-4
13+
h2.text-xl.text-white.font-medium No messages yet
14+
p.text-grey-blue.mt-2 Start a conversation with someone!
15+
else
16+
.space-y-4
17+
each chat in chats
18+
if (chat.sender != null)
19+
.flex.gap-4.p-4.bg-jungle-dark.rounded-lg.border.border-black
20+
img.w-10.h-10.rounded-full.border.border-black.flex-shrink-0(src=chat.sender.github.avatar_url)
21+
.flex-1.min-w-0
22+
.flex.items-center.gap-2.mb-1
23+
a.text-twitter-blue.font-semibold(href="/users/" + chat.sender._id, class="hover:underline") #{chat.sender.username}
24+
span.text-grey-blue.text-sm #{moment(chat.createdAt).format("MMM D, YYYY [at] h:mm a")}
25+
p.text-white.break-words #{chat.message}

0 commit comments

Comments
 (0)