Timesheets-Server
Timesheets server
Načítám...
Vyhledávám...
Nebylo nic nalezeno
controllerdepartmentemployees.cpp
1#include "controllerdepartmentemployees.h"
2#include "httprequest.h"
3#include "db.h"
4#include <QRegularExpression>
5#include "pdebug.h"
6#include "json.h"
7
8using namespace Httpd;
9
10ControllerDepartmentEmployees::ControllerDepartmentEmployees(HobrasoftHttpd::HttpConnection *parent)
11 : AbstractController(parent) {}
12
13void ControllerDepartmentEmployees::service(HobrasoftHttpd::HttpRequest *request, HobrasoftHttpd::HttpResponse *response)
14{
15 static const QRegularExpression re("^/api/v1/departments/(\\d+)/employees(?:/(\\d+))?/?$");
16 auto m = re.match(request->path());
17 if (!m.hasMatch()) {
18 serviceError(request, response, 405, "bad-request", "Invalid request");
19 return;
20 }
21
22 int department = m.captured(1).toInt();
23 int employee = m.captured(2).isEmpty() ? -1 : m.captured(2).toInt();
24
25 if (request->method() == "GET") {
26 serviceGet(request, response, department, employee);
27 return;
28 }
29
30 if (request->method() == "PUT") {
31 bool ok = false;
32 QVariantMap data = JSON::data(request->body(), &ok).toMap();
33 if (!ok) {
34 serviceError(request, response, 400, "bad-request", "Could not parse JSON data");
35 return;
36 }
37 servicePut(request, response, department, data);
38 return;
39 }
40
41 if (request->method() == "DELETE") {
42 if (employee <= 0) {
43 serviceError(request, response, 400, "bad-request", "Employee id required");
44 return;
45 }
46 serviceDelete(request, response, department, employee);
47 return;
48 }
49
50 serviceError(request, response, 405, "bad-request", "Invalid request");
51}
52
53void ControllerDepartmentEmployees::serviceGet(HobrasoftHttpd::HttpRequest *request, HobrasoftHttpd::HttpResponse *response, int department, int employee)
54{
56 filter.department = department;
57 filter.employee = employee > 0 ? employee : 0;
58 auto list = db()->departmentHasMember(filter);
59 if (employee > 0) {
60 if (list.isEmpty()) {
61 serviceError(request, response, 404, "not-found", "NotFound");
62 return;
63 }
64 serviceOK(request, response, list.first().toMap());
65 } else {
66 serviceOK(request, response, toList(list));
67 }
68}
69
70void ControllerDepartmentEmployees::servicePut(HobrasoftHttpd::HttpRequest *request, HobrasoftHttpd::HttpResponse *response, int department, const QVariantMap &data)
71{
72 QVariantMap d = data;
73 d["department"] = department;
74 db()->save(Dbt::DepartmentHasMember::fromMap(d));
75 serviceOK(request, response);
76}
77
78void ControllerDepartmentEmployees::serviceDelete(HobrasoftHttpd::HttpRequest *request, HobrasoftHttpd::HttpResponse *response, int department, int employee)
79{
80 db()->remove(Dbt::DepartmentHasMember(department, employee));
81 serviceOK(request, response);
82}
83
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 service(HobrasoftHttpd::HttpRequest *request, HobrasoftHttpd::HttpResponse *response) Q_DECL_OVERRIDE
Obsluha požadavku.
static QVariant data(const QByteArray &json)
Converts json to data.
Definition json.cpp:69
Jmenný prostor pro obsluhu konkrétních HTTP požadavků aplikace.