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