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);
|
||
|
}
|