From 8115d8b6601e070f50d337c6ed9436f55a798271 Mon Sep 17 00:00:00 2001
From: ns17 <ns17@inf.ufpr.br>
Date: Wed, 17 Jun 2020 12:02:26 -0300
Subject: [PATCH] Adding csv download of geolocation data and category

---
 common/models/category.js    |  61 ++++++++++++++++++++
 common/models/geolocation.js | 105 +++++++++++++++++++++++++++++++++++
 2 files changed, 166 insertions(+)

diff --git a/common/models/category.js b/common/models/category.js
index 101e682..4425169 100644
--- a/common/models/category.js
+++ b/common/models/category.js
@@ -21,4 +21,65 @@ along with SMPPIR-CheckIn.  If not, see <https://www.gnu.org/licenses/>.
 'use strict';
 
 module.exports = function(Category) {
+    Category.csvexport = function(type, res, callback ) {
+        var datetime = new Date();
+        var datetimeFuture = new Date(datetime.getFullYear(), datetime.getMonth(), datetime.getDate()+7)
+        res.set('Expires', datetimeFuture+'');
+        res.set('Cache-Control', 'max-age=0, no-cache, must-revalidate, proxy-revalidate');
+        res.set('Last-Modified', datetime+'');
+        res.set('Content-Type','application/force-download');
+        res.set('Content-Type','application/octet-stream');
+        res.set('Content-Type','application/download');
+        res.set('Content-Disposition','attachment;filename=category.csv');
+        res.set('Content-Transfer-Encoding','binary');
+
+        Category.find(function(err, categories) {
+              // conversão JSON para CSV
+              var itemsFormatted = [];
+
+              // cabeçalho do csv
+              var headers = {
+                category_name: "category_name",
+                category_description: "category_description",
+                id: "id"
+              };
+
+              categories.forEach((item) => {
+                itemsFormatted.push({
+                  category_name: item.category_name,
+                  category_description: item.category_description,
+                  id: item.id
+                });
+              });
+
+              if (headers) {
+                itemsFormatted.unshift(headers);
+              }
+            
+              var jsonObject = JSON.stringify(itemsFormatted);
+              var array = typeof jsonObject != 'object' ? JSON.parse(jsonObject) : jsonObject;
+              var csv = '';
+          
+              for (var i = 0; i < array.length; i++) {
+                var line = '';
+                for (var index in array[i]) {
+                  if (line != '') line += ';' // aqui muda o separador do csv
+                    line += array[i][index];
+                }
+                csv += line + '\r\n';
+              }   
+            res.send(csv);
+        });
+    };
+
+    Category.remoteMethod('csvexport',
+      {
+        accepts: [
+          {arg: 'type', type: 'string', required: false},
+          {arg: 'res', type: 'object', 'http': {source: 'res'}}
+        ],
+        returns: {},
+        // Para usar o 'type' -> http: {path: '/csv/:type', verb: 'get'}
+        http: {path: '/csv', verb: 'get'},
+      });
 };
diff --git a/common/models/geolocation.js b/common/models/geolocation.js
index 4dff1e0..bbb00b4 100644
--- a/common/models/geolocation.js
+++ b/common/models/geolocation.js
@@ -21,5 +21,110 @@ along with SMPPIR-CheckIn.  If not, see <https://www.gnu.org/licenses/>.
 'use strict';
 
 module.exports = function(Geolocation) {
+    Geolocation.csvexport = function(type, res, callback ) {
 
+        if (type == "padr" || type == "andr"){
+          var datetime = new Date();
+          var datetimeFuture = new Date(datetime.getFullYear(), datetime.getMonth(), datetime.getDate()+7)
+          res.set('Expires', datetimeFuture+'');
+          res.set('Cache-Control', 'max-age=0, no-cache, must-revalidate, proxy-revalidate');
+          res.set('Last-Modified', datetime +'');
+          res.set('Content-Type','application/force-download');
+          res.set('Content-Type','application/octet-stream');
+          res.set('Content-Type','application/download');
+          res.set('Content-Disposition','attachment;filename=geolocation.csv');
+          res.set('Content-Transfer-Encoding','binary');
+
+          Geolocation.find(function(err, geolocations) {
+            
+                // conversão JSON para CSV
+                var itemsFormatted = [];
+
+                if (type == "padr"){
+                  // cabeçalho do csv
+                  var headers = {
+                    category_id: "category_id",
+                    geolocation_name: "geolocation_name",
+                    latitude: "latitude",
+                    longitude: "longitude",
+                    when_sent: "when_sent",
+                    description_location: "description_location",
+                    user_id: "user_id",
+                    id: "id"
+                  };
+
+                  geolocations.forEach((item) => {
+                    itemsFormatted.push({
+                      category_id: item.category_id,
+                      geolocation_name: item.geolocation_name,
+                      latitude: item.latitude,
+                      longitude: item.longitude,
+                      when_sent: item.when_sent,
+                      description_location: item.description_location,
+                      user_id: item.user_id,
+                      id: item.id
+                    });
+                  });
+                }
+                
+                if (type == "andr"){
+                  // cabeçalho do csv
+                  var headers = {
+                    category_id: "category_id",
+                    geolocation_name: "geolocation_name",
+                    latitude: "latitude",
+                    longitude: "longitude",
+                    android_id: "android_id",
+                    when_sent: "when_sent",
+                    description_location: "description_location",
+                    user_id: "user_id",
+                    id: "id"
+                  };
+
+                  geolocations.forEach((item) => {
+                    itemsFormatted.push({
+                      category_id: item.category_id,
+                      geolocation_name: item.geolocation_name,
+                      latitude: item.latitude,
+                      longitude: item.longitude,
+                      android_id: item.android_id,
+                      when_sent: item.when_sent,
+                      description_location: item.description_location,
+                      user_id: item.user_id,
+                      id: item.id
+                    });
+                  });
+                }
+                if (headers) {
+                  itemsFormatted.unshift(headers);
+                }
+              
+                var jsonObject = JSON.stringify(itemsFormatted);
+                var array = typeof jsonObject != 'object' ? JSON.parse(jsonObject) : jsonObject;
+                var csv = '';
+            
+                for (var i = 0; i < array.length; i++) {
+                  var line = '';
+                  for (var index in array[i]) {
+                    if (line != '') line += ';' // aqui muda o separador do csv
+                      line += array[i][index];
+                  }
+                  csv += line + '\r\n';
+                }   
+              res.send(csv);
+          });
+        }
+        else
+          console.log('Use as rotas /padr ou /andr')
+    };
+
+    Geolocation.remoteMethod('csvexport',
+      {
+        accepts: [
+          {arg: 'type', type: 'string'},
+          {arg: 'res', type: 'object', 'http': {source: 'res'}}
+        ],
+        returns: {},
+        http: {path: '/csv/:type', verb: 'get'}
+      });
 };
-- 
GitLab