@@ -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/**
0 commit comments