feat(api): create endpoint to fetch all authors (users who have written >1 story)
This commit is contained in:
		
							parent
							
								
									f235d7da44
								
							
						
					
					
						commit
						dbc5cab712
					
				
							
								
								
									
										50
									
								
								server/api/authors.get.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								server/api/authors.get.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,50 @@ | ||||
| import { User } from "~/models/user"; | ||||
| let authorSingleton: { | ||||
| 	lastRefreshed: number; | ||||
| 	data: { | ||||
| 		username: string; | ||||
| 		_id: number; | ||||
| 		numStories: number; | ||||
| 	}[]; | ||||
| } = { | ||||
| 	data: [], | ||||
| 	lastRefreshed: Date.now(), | ||||
| }; | ||||
| 
 | ||||
| const threshold = 60 * 60 * 1000; | ||||
| export default cachedEventHandler( | ||||
| 	async (ev) => { | ||||
| 		if ( | ||||
| 			Date.now() - authorSingleton.lastRefreshed >= threshold || | ||||
| 			authorSingleton.data.length < 1 | ||||
| 		) | ||||
| 			authorSingleton.data = await User.aggregate([ | ||||
| 				{ $project: { username: true, _id: true } }, | ||||
| 				{ | ||||
| 					$lookup: { | ||||
| 						from: "stories", | ||||
| 						localField: "_id", | ||||
| 						foreignField: "author", | ||||
| 						as: "stories", | ||||
| 					}, | ||||
| 				}, | ||||
| 				{ $set: { numStories: { $size: "$stories" } } }, | ||||
| 				{ $unset: "stories" }, | ||||
| 				{ | ||||
| 					$match: { | ||||
| 						numStories: { $gte: 1 }, | ||||
| 						_id: { $nin: ev.context.currentUser?.hiddenAuthors || [] }, | ||||
| 					}, | ||||
| 				}, | ||||
| 			]); | ||||
| 		authorSingleton.data.sort((a, b) => { | ||||
| 			if (a.username.toLocaleUpperCase() > b.username.toLocaleUpperCase()) | ||||
| 				return 1; | ||||
| 			else if (a.username.toLocaleUpperCase() < b.username.toLocaleUpperCase()) | ||||
| 				return -1; | ||||
| 			return 0; | ||||
| 		}); | ||||
| 		return authorSingleton.data; | ||||
| 	}, | ||||
| 	{ maxAge: 60 * 60 * 3 }, | ||||
| ); | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user