index.js 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. const express = require('express');
  2. const app = express();
  3. const helpers = require('./helpers.js');
  4. const nutsData = require('./nuts-data.js');
  5. const cors = require('cors');
  6. var _datasetsFilePath = 'data/datasets.csv';
  7. var _dataFilePath = 'data/data.csv';
  8. var _datasets = undefined;
  9. var _ruralData = undefined;
  10. // parse incoming POST requests body to JSON
  11. app.use(express.json());
  12. // handle CORS
  13. app.use(cors())
  14. /* Dummy web service call without the method specified */
  15. app.get('/', (req, res) => {
  16. res.send('Rural attractivness web service');
  17. });
  18. /* Makes refresh of the data loaded to the server objects.
  19. Must be called after the CSV data has changed */
  20. app.get('/refresh', (req, res, next) => {
  21. nutsData.loadDatasets(_datasetsFilePath, function (ds) {
  22. console.log('Datasets loaded succesfully');
  23. _datasets = ds;
  24. nutsData.loadRuralData(_dataFilePath, _datasets, function (rd) {
  25. console.log('Rural data loaded succesfully');
  26. _ruralData = rd;
  27. });
  28. });
  29. });
  30. /* Returns JSON array with the list of all the datasets */
  31. app.get('/datasets', (req, res, next) => {
  32. if (_datasets) {
  33. helpers.formatResponse(_datasets, req, res);
  34. }
  35. else {
  36. nutsData.loadDatasets(_datasetsFilePath, function (ds) {
  37. console.log('Datasets loaded callback');
  38. _datasets = ds;
  39. helpers.formatResponse(_datasets, req, res);
  40. });
  41. }
  42. });
  43. /* Returns attractivity data for the region with ID equal to the 'nuts' parameter */
  44. app.get('/scores/:nuts', (req, res, next) => {
  45. if (_ruralData) {
  46. returnReqionScores(req.params.nuts, req, res);
  47. }
  48. else {
  49. if (_datasets) { // datasets must be loaded prior to data loading
  50. nutsData.loadRuralData(_dataFilePath, _datasets, function (rd) {
  51. _ruralData = rd;
  52. returnReqionScores(req.params.nuts, req, res);
  53. });
  54. }
  55. else {
  56. nutsData.loadDatasets(_datasetsFilePath, function (ds) {
  57. _datasets = ds;
  58. nutsData.loadRuralData(_dataFilePath, _datasets, function (rd) {
  59. _ruralData = rd;
  60. returnReqionScores(req.params.nuts, req, res);
  61. });
  62. });
  63. }
  64. }
  65. });
  66. /* Returns attractivity data for all the regions in source CSV data. */
  67. app.get('/scores', (req, res, next) => {
  68. if (_ruralData)
  69. helpers.formatResponse(_ruralData, req, res);
  70. else {
  71. if (_datasets) { // datasets must be loaded prior to data loading
  72. nutsData.loadRuralData(_dataFilePath, _datasets, function (rd) {
  73. _ruralData = rd;
  74. helpers.formatResponse(_ruralData, req, res);
  75. });
  76. }
  77. else {
  78. nutsData.loadDatasets(_datasetsFilePath, function (ds) {
  79. _datasets = ds;
  80. nutsData.loadRuralData(_dataFilePath, _datasets, function (rd) {
  81. _ruralData = rd;
  82. helpers.formatResponse(_ruralData, req, res);
  83. });
  84. });
  85. }
  86. }
  87. });
  88. /* Computes and returns attractivity data for all the NUTS regions based on the
  89. incomming datasets and factor weights. */
  90. app.post('/scores', (req, res, next) => {
  91. //console.log("query: " + JSON.stringify(req.body.factors, null, 4));
  92. if (_ruralData) {
  93. returnAllScores(req, res);
  94. }
  95. else {
  96. if (_datasets) { // datasets must be loaded prior to data loading
  97. nutsData.loadRuralData(_dataFilePath, _datasets, function (rd) {
  98. _ruralData = rd;
  99. returnAllScores(req, res);
  100. });
  101. }
  102. else {
  103. nutsData.loadDatasets(_datasetsFilePath, function (ds) {
  104. _datasets = ds;
  105. nutsData.loadRuralData(_dataFilePath, _datasets, function (rd) {
  106. _ruralData = rd;
  107. returnAllScores(req, res);
  108. });
  109. });
  110. }
  111. }
  112. });
  113. // start the service on the port xxxx
  114. app.listen(3000, () => console.log('Rural attractivity WS listening on port 3000...'));
  115. function returnAllScores(req, res) {
  116. var resData = [];
  117. _ruralData.forEach(region => {
  118. //var region = _ruralData[0];
  119. var sumWeight = 0;
  120. var sumValue = 0;
  121. let regionIndexes = { code: region.nuts };
  122. req.body.factors.forEach(f => {
  123. let fi = nutsData.getFactorIndex(region, f);
  124. //console.log("f: " + JSON.stringify(f));
  125. //console.log("fi: " + JSON.stringify(fi));
  126. regionIndexes[f.factor] = fi.index;
  127. sumValue += fi.sumValue * f.weight;
  128. sumWeight += fi.sumWeight;
  129. });
  130. regionIndexes.aggregate = sumValue / sumWeight;
  131. resData.push(regionIndexes);
  132. });
  133. helpers.formatResponse(resData, req, res);
  134. }
  135. function returnReqionScores(nuts, req, res) {
  136. var found = false;
  137. res.header("Content-Type", 'application/json');
  138. _ruralData.forEach(region => {
  139. if (region.nuts == nuts) {
  140. helpers.formatResponse(region, req, res);
  141. found = true;
  142. }
  143. });
  144. if (!found)
  145. // NUTS region not found
  146. res.status(404).send('NUTS region not found.');
  147. }