freeCodeCamp/server/boot/sitemap.js

61 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.com';
// getCachedObservable(
// app: ExpressApp,
// modelName: String,
// nameProp: String,
// map: (nameProp: String) => String
// ) => Observable[models]
function getCachedObservable(app, modelName, nameProp, map) {
return observeQuery(
app.models[modelName],
'find',
{ fields: { [nameProp]: true } }
)
.flatMap(models => {
return Observable.from(models, null, null, Scheduler.default);
})
.filter(model => !!model[nameProp])
.map(model => model[nameProp])
.map(map ? map : (x) => x)
.toArray()
::timeCache(cacheTimeout[0], cacheTimeout[1]);
}
export default function sitemapRouter(app) {
const router = app.loopback.Router();
const challenges$ = getCachedObservable(app, 'Challenge', 'dashedName');
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);
}