abb7d2b5ad6d3973e95494fba96a2425508531ae
[motion.git] / server / api / custom_report / custom_report.controller.js
1 'use strict';
2
3 var _ = require('lodash');
4 var util = require('util');
5 var CustomReport = require('../../models').CustomReport;
6 var ReportTree = require('../../models').ReportTree;
7
8
9 // Get list of custom reports
10 exports.index = function(req, res, next) {
11
12   var attributes = ['name', 'description', 'parent'];
13   var per_page = req.query.per_page ? parseInt(req.query.per_page, 10) : 100;
14   var page = req.query.page ? parseInt(req.query.page, 10) : 0;
15
16   var query = {
17     where: {},
18     limit: per_page,
19     offset: page * per_page
20   };
21
22   _.forIn(req.query, function(value, key) {
23     switch (key) {
24       case 'per_page':
25       case 'page':
26         break;
27       case 'sort_by':
28         query.order = util.format('%s %s', req.query.sort_by, req.query.sort_order || 'ASC') || null;
29         break;
30       case 'sort_order':
31         break;
32       case '$':
33         query.where.$or = [];
34         attributes.forEach(function(attribute) {
35           var tmp = {};
36           tmp[attribute] = {
37             $like: '%' + value + '%'
38           };
39
40           query.where.$or.push(tmp);
41         });
42         break;
43       case 'role':
44         query.where.role = {
45           $or: value.split(/[\s,]+/)
46         };
47         break;
48       case 'clientQuery':
49         var params = JSON.parse(value);
50         _.forOwn(params, function(pValue, pKey) {
51           query.where[pKey] = pValue;
52         });
53         break;
54       default:
55         query.where[key] = {
56           $like: {}
57         };
58         query.where[key].$like = '%' + value + '%';
59     }
60   });
61
62   CustomReport
63     .findAndCountAll(query)
64     .then(function(result) {
65       var total_pages = Math.ceil(result.count / per_page);
66       var next_page = total_pages > (query.offset + 1) ? util.format('%s://%s%s?page=%d', req.protocol, req.headers.host, req.baseUrl, page + 1) : null;
67       var previous_page = page > 0 ? util.format('%s://%s%s?page=%d', req.protocol, req.headers.host, req.baseUrl, page - 1) : null;
68
69       res.status(200).send({
70         count: result.count,
71         rows: result.rows,
72         next_page: next_page,
73         previous_page: previous_page,
74         total_pages: total_pages
75       });
76
77     })
78     .catch(function(err) {
79       res.status(500).send({
80         error: 'Something blew up!'
81       });
82     });
83 };
84
85 // Get a single report
86 exports.show = function(req, res) {
87   CustomReport
88     .findById(req.params.id)
89     .then(function(report) {
90       if (!report) {
91         return res.sendStatus(404);
92       }
93       return res.send(report);
94     })
95     .catch(function(err) {
96       return handleError(res, err);
97     });
98 };
99
100 // Creates a new report in the DB.
101 exports.create = function(req, res) {
102   CustomReport
103     .create(req.body)
104     .then(function(report) {
105       return res.status(201).send(report);
106     })
107     .catch(function(err) {
108       return handleError(res, err);
109     });
110 };
111
112 // Updates an existing report in the DB.
113 exports.update = function(req, res) {
114   if (req.body.id) {
115     delete req.body.id;
116   }
117   CustomReport
118     .findById(req.params.id)
119     .then(function(report) {
120       if (!report) {
121         return res.sendStatus(404);
122       }
123       var updated = _.merge(report, req.body);
124       updated.save()
125         .then(function() {
126           return res.status(200).send(report);
127         })
128         .catch(function(err) {
129           return handleError(res, err);
130         });
131     })
132     .catch(function(err) {
133       return handleError(res, err);
134     });
135 };
136
137 // Deletes a report from the DB.
138 exports.destroy = function(req, res) {
139   CustomReport
140     .findById(req.params.id)
141     .then(function(report) {
142       if (!report) {
143         return res.sendStatus(404);
144       }
145       report.destroy()
146         .then(function() {
147           return res.sendStatus(204);
148         })
149         .catch(function(err) {
150           return handleError(res, err);
151         });
152     })
153     .catch(function(err) {
154       return handleError(res, err);
155     });
156 };
157
158 function handleError(res, err) {
159   return res.status(500).send(err);
160 }