Timesheets-Server
Timesheets server
Načítám...
Vyhledávám...
Nebylo nic nalezeno
controllerevents.cpp
Zobrazit dokumentaci tohoto souboru.
1
6
7#include "controllerevents.h"
8#include "httprequest.h"
9#include "db.h"
10#include "pdebug.h"
11#include <QSet>
12#include <QDate>
13
14using namespace Httpd;
15
16ControllerEvents::ControllerEvents(HobrasoftHttpd::HttpConnection *parent) : AbstractController(parent) {
17 PDEBUG;
18}
19
20void ControllerEvents::serviceList (HobrasoftHttpd::HttpRequest *request, HobrasoftHttpd::HttpResponse *response) {
21 PDEBUG;
22 int offset = request->parameter("offset").toInt();
23 int limit = request->parameter("limit").toInt();
24 int employee = request->parameter("employee").toInt();
25 QString smonth = request->parameter("month");
26 QDate month;
27 if (!smonth.isEmpty()) {
28 month = QDate::fromString(smonth + "-01", "yyyy-MM-dd");
29 }
30 QList<Dbt::Events> list = db()->events(-1, employee, month, limit, offset);
31 list = filterAccessible(list);
32 serviceOK(request, response, toList(list));
33}
34
35void ControllerEvents::serviceIdGet (HobrasoftHttpd::HttpRequest *request, HobrasoftHttpd::HttpResponse *response, const QString& id) {
36 PDEBUG;
37 int event = id.toInt();
38 if (event <= 0) {
39 serviceError(request, response, 404, "not-found", "NotFound");
40 return;
41 }
42 auto list = db()->events(event);
43 if (list.isEmpty()) {
44 serviceError(request, response, 404, "not-found", "NotFound");
45 return;
46 }
47 if (!canAccessEmployee(list.first().employee)) {
48 serviceError(request, response, 403, "forbidden", "Forbidden");
49 return;
50 }
51 serviceOK(request, response, list[0].toMap());
52}
53
54void ControllerEvents::serviceIdPut(HobrasoftHttpd::HttpRequest *request, HobrasoftHttpd::HttpResponse *response, const QVariantMap& data) {
55 QVariantMap d = data;
56 d["user_edited"] = authenticatedUser()->user();
57 if (!canAccessEmployee(d["employee"].toInt())) {
58 serviceError(request, response, 403, "forbidden", "Forbidden");
59 return;
60 }
61 serviceOK(request, response, putKey(db()->save(Dbt::Events::fromMap(d))));
62}
63
64void ControllerEvents::serviceIdPost(HobrasoftHttpd::HttpRequest *request, HobrasoftHttpd::HttpResponse *response, const QVariantMap& data) {
65 serviceIdPut(request, response, data);
66}
67
68void ControllerEvents::serviceIdDelete(HobrasoftHttpd::HttpRequest *request, HobrasoftHttpd::HttpResponse *response, const QString& id) {
69 int evId = id.toInt();
70 auto list = db()->events(evId);
71 if (list.isEmpty()) {
72 serviceError(request, response, 404, "not-found", "NotFound");
73 return;
74 }
75 Dbt::Events e = list.first();
76 if (!canAccessEmployee(e.employee)) {
77 serviceError(request, response, 403, "forbidden", "Forbidden");
78 return;
79 }
80 e.valid = false;
81 e.user_edited = authenticatedUser()->user();
82 db()->save(e);
83 serviceOK(request, response);
84}
85
86bool ControllerEvents::canAccessEmployee(int employee) {
87 if (authenticatedUser() == nullptr || authenticatedUser()->admin()) {
88 return true;
89 }
90 QList<Dbt::DepartmentHasManager> mng = db()->departmentHasManager(Dbt::DepartmentHasManager(0, authenticatedUser()->user()));
91 for (const auto& mm : mng) {
92 if (!db()->departmentHasMember(Dbt::DepartmentHasMember(mm.department, employee)).isEmpty()) {
93 return true;
94 }
95 }
96 return false;
97}
98
99QList<Dbt::Events> ControllerEvents::filterAccessible(const QList<Dbt::Events>& list) {
100 if (authenticatedUser() == nullptr || authenticatedUser()->admin()) {
101 return list;
102 }
103 QSet<int> allowed;
104 QList<Dbt::DepartmentHasManager> mng = db()->departmentHasManager(Dbt::DepartmentHasManager(0, authenticatedUser()->user()));
105 for (const auto& mm : mng) {
106 auto members = db()->departmentHasMember(Dbt::DepartmentHasMember(mm.department, 0));
107 for (const auto& mem : members) { allowed.insert(mem.employee); }
108 }
109 QList<Dbt::Events> out;
110 for (const auto& e : list) {
111 if (allowed.contains(e.employee)) out << e;
112 }
113 return out;
114}
115
Virtuální třída pro vyřizování unifikovaných Http požadavků na server API.
virtual void serviceOK(HobrasoftHttpd::HttpRequest *request, HobrasoftHttpd::HttpResponse *response, const QVariant &data=QVariant())
Pošle odpověď 200 OK.
HobrasoftHttpd::HttpRequest * request() const
Vrací ukazatel na aktuální request.
void serviceList(HobrasoftHttpd::HttpRequest *request, HobrasoftHttpd::HttpResponse *response) Q_DECL_OVERRIDE
Pošle chybovou odpověď
void serviceIdGet(HobrasoftHttpd::HttpRequest *request, HobrasoftHttpd::HttpResponse *response, const QString &id) Q_DECL_OVERRIDE
Pošle odpověď na požadavek konkrétního ID metodou GET.
void serviceIdPut(HobrasoftHttpd::HttpRequest *request, HobrasoftHttpd::HttpResponse *response, const QVariantMap &data) Q_DECL_OVERRIDE
Pošle odpověď na požadavek konkrétního ID metodou PUT - obvykle vloží nový objekt nebo přepíše existu...
void serviceIdPost(HobrasoftHttpd::HttpRequest *request, HobrasoftHttpd::HttpResponse *response, const QVariantMap &data) Q_DECL_OVERRIDE
Pošle odpověď na požadavek konkrétního ID metodou PUT - obvykle vloží nový objekt nebo přepíše existu...
void serviceIdDelete(HobrasoftHttpd::HttpRequest *request, HobrasoftHttpd::HttpResponse *response, const QString &id) Q_DECL_OVERRIDE
Pošle odpověď na požadavek konkrétního ID metodou DELETE - obvykle objekt smaže.
Jmenný prostor pro obsluhu konkrétních HTTP požadavků aplikace.