Merge branch 'hotfix/21.56.9' into master
[gitter.git] / scripts / generate-sitemap.js
blob6b0fe94a706b09f1f2e205728c21eee682146fb7
1 #!/usr/bin/env node
3 'use strict';
5 var env = require('gitter-web-env');
6 var nconf = env.config;
8 var persistence = require('gitter-web-persistence');
9 var fs = require('fs');
10 var BatchStream = require('batch-stream');
11 var through2Concurrent = require('through2-concurrent');
12 var basePath = nconf.get('web:basepath');
13 var sitemapLocation = nconf.get('sitemap:location');
15 var opts = require('yargs')
16   .option('tempdir', {
17     alias: 't',
18     required: true,
19     description: 'Where to write the sitemap files to'
20   })
21   .option('name', {
22     alias: 'n',
23     required: true,
24     description: 'What to call the sitemap (ie. the prefix)'
25   })
26   .help('help')
27   .alias('help', 'h').argv;
29 function die(error) {
30   console.error(error);
31   console.error(error.stack);
32   process.exit(1);
35 function roomToURL(room) {
36   return basePath + '/' + room.uri + '/archives';
39 function createSitemap(urls) {
40   var xml = [];
41   xml.push('<?xml version="1.0" encoding="UTF-8"?>');
42   xml.push('<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">');
43   urls.forEach(function(url) {
44     xml.push('<url>');
45     xml.push('<loc>' + url + '</loc>');
46     xml.push('<changefreq>daily</changefreq>');
47     xml.push('</url>');
48   });
49   xml.push('</urlset>');
50   return xml.join('\n');
53 function createSitemapIndex(urls) {
54   var xml = [];
56   xml.push('<?xml version="1.0" encoding="UTF-8"?>');
57   xml.push(
58     '<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" ' +
59       'xmlns:mobile="http://www.google.com/schemas/sitemap-mobile/1.0" ' +
60       'xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">'
61   );
63   urls.forEach(function(url) {
64     xml.push('<sitemap>');
65     xml.push('<loc>' + url + '</loc>');
66     xml.push('</sitemap>');
67   });
69   xml.push('</sitemapindex>');
70   return xml.join('\n');
73 var pageNum = 0;
74 var sitemapURLs = [];
75 var query = {
76   security: 'PUBLIC',
77   $or: [{ noindex: { $exists: false } }, { noindex: false }]
79 var projection = { _id: 1, uri: 1 };
80 persistence.Troupe.find(query, projection)
81   .sort({ _id: 1 })
82   .slaveOk()
83   .stream()
84   .pipe(new BatchStream({ size: 50000 }))
85   .pipe(
86     through2Concurrent.obj({ maxConcurrency: 10 }, function(rooms, enc, callback) {
87       pageNum++;
88       sitemapURLs.push(sitemapLocation.replace('.xml', '-' + pageNum + '.xml'));
89       var sitemap = createSitemap(rooms.map(roomToURL));
90       fs.writeFile(opts.tempdir + '/' + opts.name + '-' + pageNum + '.xml', sitemap, callback);
91     })
92   )
93   .on('data', function() {})
94   .on('end', function() {
95     var indexData = createSitemapIndex(sitemapURLs);
96     fs.writeFile(opts.tempdir + '/' + opts.name + '.xml', indexData, function() {
97       process.exit(0);
98     });
99   })
100   .on('error', die);