62 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			62 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| import moment from 'moment';
 | |
| import { Scheduler, Observable } from 'rx';
 | |
| import { timeCache, observeQuery } from '../utils/rx';
 | |
| import { dasherize } from '../utils';
 | |
| 
 | |
| const cacheTimeout = [ 24, 'hours' ];
 | |
| const appUrl = 'https://www.freecodecamp.org';
 | |
| 
 | |
| // getCachedObservable(
 | |
| //   app: ExpressApp,
 | |
| //   modelName: String,
 | |
| //   nameProp: String,
 | |
| //   blockProp: String,
 | |
| //   map: (nameProp: String) => String
 | |
| // ) => Observable[models]
 | |
| function getCachedObservable(app, modelName, nameProp, blockProp, map) {
 | |
|   return observeQuery(
 | |
|     app.models[modelName],
 | |
|     'find',
 | |
|     { fields: { [nameProp]: true, [blockProp]: true } }
 | |
|   )
 | |
|     .flatMap(models => {
 | |
|       return Observable.from(models, null, null, Scheduler.default);
 | |
|     })
 | |
|     .filter(model => !!model[nameProp] && !!model[blockProp])
 | |
|     .map(map ? map : (x) => x)
 | |
|     .toArray()
 | |
|     ::timeCache(cacheTimeout[0], cacheTimeout[1]);
 | |
| }
 | |
| 
 | |
| export default function sitemapRouter(app) {
 | |
|   const router = app.loopback.Router();
 | |
|   const challengeProps = ['dashedName', 'block'];
 | |
|   const challenges$ = getCachedObservable(app, 'Challenge', ...challengeProps);
 | |
|   const stories$ = getCachedObservable(app, 'Story', 'storyLink', dasherize);
 | |
|   function sitemap(req, res, next) {
 | |
|     const now = moment(new Date()).format('YYYY-MM-DD');
 | |
|     return Observable.combineLatest(
 | |
|       challenges$,
 | |
|       stories$,
 | |
|       (
 | |
|         challenges,
 | |
|         stories,
 | |
|       ) => ({ challenges, stories })
 | |
|     )
 | |
|       .subscribe(
 | |
|         ({ challenges, stories }) => {
 | |
|           res.header('Content-Type', 'application/xml');
 | |
|           res.render('resources/sitemap', {
 | |
|             appUrl,
 | |
|             now,
 | |
|             challenges,
 | |
|             stories
 | |
|           });
 | |
|         },
 | |
|         next
 | |
|       );
 | |
|   }
 | |
|   router.get('/sitemap.xml', sitemap);
 | |
|   app.use(router);
 | |
| }
 |