UNPKG

openhim-core

Version:

The OpenHIM core application that provides logging and routing of http requests

630 lines (629 loc) 24.6 kB
<!doctype html> <html lang="en"> <head> <title>Code coverage report for src/upgradeDB.coffee</title> <meta charset="utf-8" /> <link rel="stylesheet" href="../prettify.css" /> <link rel="stylesheet" href="../base.css" /> <meta name="viewport" content="width=device-width, initial-scale=1"> <style type='text/css'> .coverage-summary .sorter { background-image: url(../sort-arrow-sprite.png); } </style> </head> <body> <div class='wrapper'> <div class='pad1'> <h1> <a href="../index.html">All files</a> / <a href="index.html">src</a> upgradeDB.coffee </h1> <div class='clearfix'> <div class='fl pad1y space-right2'> <span class="strong">21.11% </span> <span class="quiet">Statements</span> <span class='fraction'>19/90</span> </div> <div class='fl pad1y space-right2'> <span class="strong">5.88% </span> <span class="quiet">Branches</span> <span class='fraction'>1/17</span> </div> <div class='fl pad1y space-right2'> <span class="strong">0% </span> <span class="quiet">Functions</span> <span class='fraction'>0/33</span> </div> <div class='fl pad1y space-right2'> <span class="strong">20.45% </span> <span class="quiet">Lines</span> <span class='fraction'>18/88</span> </div> </div> </div> <div class='status-line low'></div> <pre><table class="coverage"> <tr><td class="line-count quiet">1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189</td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span> <span class="cline-any cline-no">&nbsp;</span> <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="fstat-no" title="function not covered" ><span class="branch-1 cbranch-no" title="branch not covered" >dbVersion = require('./model/dbVersion').dbVersion</span></span> Keystore = require('./model/keystore').Keystore Client = require('./model/clients').Client User = require('./model/users').User Visualizer = require('./model/visualizer').Visualizer logger = require 'winston' pem = require 'pem' Q = require 'q' &nbsp; dedupName = <span class="fstat-no" title="function not covered" >(</span>name, names, num) -&gt; if num <span class="cstat-no" title="statement not covered" > newName = "#{name} #{num}"</span> else <span class="cstat-no" title="statement not covered" > newName = name</span> if newName in names if not num <span class="cstat-no" title="statement not covered" > num = 1</span> <span class="cstat-no" title="statement not covered" > return dedupName(name, names, ++num)</span> else <span class="cstat-no" title="statement not covered" > return newName</span> &nbsp; # push new upgrade functions to this array, function must return a promise # Warning: only add new function below existing functions, order matters! upgradeFuncs = [] &nbsp; upgradeFuncs.push description: "Ensure that all certs have a fingerprint property" func: <span class="fstat-no" title="function not covered" ></span>-&gt; <span class="cstat-no" title="statement not covered" > defer = Q</span>.defer() &nbsp; <span class="cstat-no" title="statement not covered" > Keystore.findOne <span class="fstat-no" title="function not covered" >(</span>err, keystore) -&gt;</span> <span class="cstat-no" title="statement not covered" ></span> return defer.resolve() if not keystore &nbsp; # convert server cert pem.getFingerprint keystore.cert.data, <span class="fstat-no" title="function not covered" >(</span>err, obj) -&gt; <span class="cstat-no" title="statement not covered" > keystore.cert.fingerprint = obj.f</span>ingerprint &nbsp; <span class="cstat-no" title="statement not covered" > promises = [</span>] <span class="cstat-no" title="statement not covered" > for cert, i in keystore.ca</span> <span class="cstat-no" title="statement not covered" > caDefer = Q</span>.defer() <span class="cstat-no" title="statement not covered" > promises.push caDefer.promise</span> do <span class="fstat-no" title="function not covered" >(</span>caDefer, i) -&gt; pem.getFingerprint cert.data, <span class="fstat-no" title="function not covered" >(</span>err, obj) -&gt; <span class="cstat-no" title="statement not covered" > keystore.ca[i].fingerprint = obj.f</span>ingerprint caDefer.resolve() &nbsp; Q.all(promises).then <span class="fstat-no" title="function not covered" ></span>-&gt; keystore.save <span class="fstat-no" title="function not covered" >(</span>err) -&gt; <span class="cstat-no" title="statement not covered" ></span> logger.error "Failed to save keystore: #{err}" if err? defer.resolve() &nbsp; <span class="cstat-no" title="statement not covered" > return defer.p</span>romise &nbsp; upgradeFuncs.push description: "Convert clients link to certs via their domain to use the cert fingerprint instead" func: <span class="fstat-no" title="function not covered" ></span>-&gt; <span class="cstat-no" title="statement not covered" > defer = Q</span>.defer() &nbsp; <span class="cstat-no" title="statement not covered" > Client.find <span class="fstat-no" title="function not covered" >(</span>err, clients) -&gt;</span> if err? <span class="cstat-no" title="statement not covered" > logger.error "Couldn't fetch all clients to upgrade db: #{err}"</span> <span class="cstat-no" title="statement not covered" > return defer.reject()</span> &nbsp; Keystore.findOne <span class="fstat-no" title="function not covered" >(</span>err, keystore) -&gt; if err? <span class="cstat-no" title="statement not covered" > logger.error "Couldn't fetch keystore to upgrade db: #{err}"</span> <span class="cstat-no" title="statement not covered" > return defer.reject()</span> &nbsp; <span class="cstat-no" title="statement not covered" > promises = [</span>] <span class="cstat-no" title="statement not covered" > for client in clients</span> <span class="cstat-no" title="statement not covered" > clientDefer = Q</span>.defer() <span class="cstat-no" title="statement not covered" > promises.push clientDefer.promise</span> &nbsp; if keystore?.ca? <span class="cstat-no" title="statement not covered" ><span class="cstat-no" title="statement not covered" > for cert in keystore.ca</span></span> if client.clientDomain is cert.commonName and not client.certFingerprint? <span class="cstat-no" title="statement not covered" > client.certFingerprint = cert.f</span>ingerprint <span class="cstat-no" title="statement not covered" > break</span> &nbsp; do <span class="fstat-no" title="function not covered" >(</span>clientDefer) -&gt; client.save <span class="fstat-no" title="function not covered" >(</span>err) -&gt; if err? <span class="cstat-no" title="statement not covered" > logger.error "Couldn't save client #{client.clientID} while upgrading db: #{err}"</span> <span class="cstat-no" title="statement not covered" > return clientDefer.reject()</span> &nbsp; clientDefer.resolve() &nbsp; Q.all(promises).then <span class="fstat-no" title="function not covered" ></span>-&gt; defer.resolve() &nbsp; <span class="cstat-no" title="statement not covered" > return defer.p</span>romise &nbsp; upgradeFuncs.push description: "Migrate visualizer setting from a user's profile to a shared collection" func: <span class="fstat-no" title="function not covered" ></span>-&gt; <span class="cstat-no" title="statement not covered" > defer = Q</span>.defer() <span class="cstat-no" title="statement not covered" > User.find <span class="fstat-no" title="function not covered" >(</span>err, users) -&gt;</span> if err <span class="cstat-no" title="statement not covered" > return Q.defer().reject(err)</span> &nbsp; <span class="cstat-no" title="statement not covered" > visNames = [</span>] <span class="cstat-no" title="statement not covered" > promises = [</span>] <span class="cstat-no" title="statement not covered" > users.forEach <span class="fstat-no" title="function not covered" >(</span>user) -&gt;</span> if user.settings?.visualizer? <span class="cstat-no" title="statement not covered" > vis = user.settings.v</span>isualizer <span class="cstat-no" title="statement not covered" > if vis.components.length &gt; 0 or vis.mediators.length &gt; 0 or vis.channels.length &gt; 0</span> <span class="cstat-no" title="statement not covered" > userDefer = Q</span>.defer() <span class="cstat-no" title="statement not covered" > promises.push userDefer.promise</span> &nbsp; <span class="cstat-no" title="statement not covered" > name = "#{user.firstname} #{user.surname}'</span>s visualizer" <span class="cstat-no" title="statement not covered" > name = d</span>edupName name, visNames <span class="cstat-no" title="statement not covered" > vis.name = n</span>ame <span class="cstat-no" title="statement not covered" > visNames.push name</span> &nbsp; <span class="cstat-no" title="statement not covered" > vis = new V</span>isualizer vis <span class="cstat-no" title="statement not covered" > logger.debug "Migrating visualizer from user profile #{user.email}, using visualizer name '#{name}'"</span> vis.save <span class="fstat-no" title="function not covered" >(</span>err, vis) -&gt; if err <span class="cstat-no" title="statement not covered" > logger.error "Error migrating visualizer from user profile #{user.email}: #{err.stack}"</span> <span class="cstat-no" title="statement not covered" > return userDefer.reject err</span> &nbsp; # delete the visualizer settings from this user profile <span class="cstat-no" title="statement not covered" > user.set 'settings.visualizer', null</span> user.save <span class="fstat-no" title="function not covered" >(</span>err, user) -&gt; i</span>f err then <span class="cstat-no" title="statement not covered" >return userDefer.reject err <span class="cstat-no" title="statement not covered" > return u</span>serDefer.resolve() &nbsp; Q.all(promises).then <span class="fstat-no" title="function not covered" ></span>-&gt; defer.resolve() .catch <span class="fstat-no" title="function not covered" >(</span>err) -&gt; defer.reject err &nbsp; <span class="cstat-no" title="statement not covered" > return defer.p</span>romise &nbsp; # add new upgrade functions here ^^ &nbsp; runUpgradeFunc = <span class="fstat-no" title="function not covered" >(</span>i, dbVer) -&gt; <span class="cstat-no" title="statement not covered" > logger.info " \u2022 Running update: #{upgradeFuncs[i].description}..."</span> <span class="cstat-no" title="statement not covered" > defer = Q</span>.defer() # run upgrade function <span class="cstat-no" title="statement not covered" > upgradeFuncs[i].func().then <span class="fstat-no" title="function not covered" ></span>-&gt;</span> # update the datbase version <span class="cstat-no" title="statement not covered" > dbVer.version = i</span> <span class="cstat-no" title="statement not covered" > dbVer.lastUpdated = new D</span>ate() dbVer.save <span class="fstat-no" title="function not covered" >(</span>err) -&gt; <span class="cstat-no" title="statement not covered" ></span> logger.error err if err? <span class="cstat-no" title="statement not covered" > logger.info " \u2713 Done."</span> defer.resolve() .catch <span class="fstat-no" title="function not covered" >(</span>err) -&gt; defer.reject err <span class="cstat-no" title="statement not covered" > return defer.p</span>romise &nbsp; if process.env.NODE_ENV == "test" exports.upgradeFuncs = upgradeFuncs exports.runUpgradeFunc = runUpgradeFunc exports.dedupName = dedupName &nbsp; exports.upgradeDb = <span class="fstat-no" title="function not covered" >(</span>callback) -&gt; dbVersion.findOne <span class="fstat-no" title="function not covered" >(</span>err, dbVer) -&gt; if dbVer is null <span class="cstat-no" title="statement not covered" > dbVer = new dbVersion</span> version: -1 lastUpdated: new Date() &nbsp; # check if the database version need to be upgraded if dbVer.version &lt; (upgradeFuncs.length - 1) <span class="cstat-no" title="statement not covered" > logger.info 'Upgrading the database...'</span> <span class="cstat-no" title="statement not covered" > promise = n</span>ull # call each database upgrade function sequentially <span class="cstat-no" title="statement not covered" > for i in [(dbVer.version + 1)..(upgradeFuncs.length - 1)]</span> do <span class="fstat-no" title="function not covered" >(</span>i) -&gt; if not promise? promise = runUpgradeFunc(i, dbVer) else promise = promise.then <span class="fstat-no" title="function not covered" ></span>-&gt; runUpgradeFunc(i, dbVer) &nbsp; promise.then <span class="fstat-no" title="function not covered" ></span>-&gt; <span class="cstat-no" title="statement not covered" > logger.info 'Completed database upgrade'</span> callback() .catch <span class="fstat-no" title="function not covered" >(</span>err) -&gt; <span class="cstat-no" title="statement not covered" > logger.error "There was an error upgrading your database, you will need to fix this manually to continue. #{err.stack}"</span> process.exit() else <span class="cstat-no" title="statement not covered" > logger.info 'No database upgrades needed'</span> callback() &nbsp; if not module.parent <span class="cstat-no" title="statement not covered" > exports.upgradeDb(<span class="fstat-no" title="function not covered" ></span>-&gt; process.exit())</span> &nbsp;</pre></td></tr> </table></pre> <div class='push'></div><!-- for sticky footer --> </div><!-- /wrapper --> <div class='footer quiet pad2 space-top1 center small'> Code coverage generated by <a href="http://istanbul-js.org/" target="_blank">istanbul</a> at Mon Oct 10 2016 13:39:22 GMT+0200 (SAST) </div> </div> <script src="../prettify.js"></script> <script> window.onload = function () { if (typeof prettyPrint === 'function') { prettyPrint(); } }; </script> <script src="../sorter.js"></script> </body> </html>