Files
LuckFox-RV1103-1106/project/app/ipcweb/ipcweb-backend/src/event_api.cpp
T
2023-08-08 20:36:47 +08:00

1444 lines
56 KiB
C++

// Copyright 2019 Fuzhou Rockchip Electronics Co., Ltd. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "event_api.h"
#include "common.h"
#include <time.h>
#include <unistd.h>
namespace rockchip {
namespace cgi {
int GetScheduleId(std::string schedule_name) {
if (!schedule_name.compare("motion")) {
return 0;
} else if (!schedule_name.compare("intrusion")) {
return 1;
} else if (!schedule_name.compare("video-plan")) {
return 2;
} else if (!schedule_name.compare("screenshot")) {
return 3;
} else {
return -1;
}
}
#ifdef USE_RKIPC
nlohmann::json regional_invasion_get() {
int value;
char *str;
nlohmann::json ret;
nlohmann::json regional_invasion;
nlohmann::json normalized_screen_size;
rk_osd_get_normalized_screen_width(&value);
normalized_screen_size.emplace("iNormalizedScreenWidth", value);
rk_osd_get_normalized_screen_height(&value);
normalized_screen_size.emplace("iNormalizedScreenHeight", value);
rk_event_ri_get_enabled(&value);
regional_invasion.emplace("iEnabled", value);
rk_event_ri_get_position_x(&value);
regional_invasion.emplace("iPositionX", value);
rk_event_ri_get_position_y(&value);
regional_invasion.emplace("iPositionY", value);
rk_event_ri_get_width(&value);
regional_invasion.emplace("iWidth", value);
rk_event_ri_get_height(&value);
regional_invasion.emplace("iHeight", value);
rk_event_ri_get_proportion(&value);
regional_invasion.emplace("iProportion", value);
rk_event_ri_get_sensitivity_level(&value);
regional_invasion.emplace("iSensitivityLevel", value);
rk_event_ri_get_time_threshold(&value);
regional_invasion.emplace("iTimeThreshold", value);
ret.emplace("normalizedScreenSize", normalized_screen_size);
ret.emplace("regionalInvasion", regional_invasion);
return ret;
}
void EventApiHandler::handler(const HttpRequest &Req, HttpResponse &Resp) {
std::string path_api_resource;
std::string path_specific_resource;
std::string path_channel_resource;
char *str;
nlohmann::json content;
#ifdef ENABLE_JWT
int user_level = Req.UserLevel;
#endif
// Get Path Information
int pos_first = Req.PathInfo.find_first_of("/");
path_api_resource = Req.PathInfo.substr(pos_first + 1, Req.PathInfo.size());
pos_first = path_api_resource.find_first_of("/");
if (pos_first != -1) {
path_specific_resource =
path_api_resource.substr(pos_first + 1, path_api_resource.size());
pos_first = path_specific_resource.find_first_of("/");
if (pos_first != -1) {
path_channel_resource = path_specific_resource.substr(
pos_first + 1, path_specific_resource.size());
}
}
if (Req.Method == "GET") {
if (path_specific_resource.find("triggers") != std::string::npos) {
// get triggers info
if (!path_channel_resource.compare("vmd_0")) {
content = R"(
{
"iNotificationCenterEnabled": 0,
"iNotificationEmailEnabled": 0,
"iNotificationFTPEnabled": 0,
"iNotificationIO1Enabled": 0,
"iNotificationRecord1Enabled": 0,
"iVideoInputChannelID": 0,
"id": 0,
"sEventType": "VMD"
}
)"_json;
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else if (!path_channel_resource.compare("vri_0")) {
content = R"(
{
"iNotificationCenterEnabled": 0,
"iNotificationEmailEnabled": 0,
"iNotificationFTPEnabled": 0,
"iNotificationIO1Enabled": 0,
"iNotificationRecord1Enabled": 0,
"iVideoInputChannelID": 0,
"id": 1,
"sEventType": "VRI"
}
)"_json;
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
} else if (path_specific_resource.find("schedules") != std::string::npos) {
// get schedules info
if (!path_channel_resource.empty()) {
int para_id = GetScheduleId(path_channel_resource);
// minilog_debug("id is %d", para_id);
if (para_id >= 0) {
content = R"(
{
"sSchedulesJson": "[[],[],[],[],[],[],[]]"
}
)"_json;
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
} else if (path_specific_resource.find("motion-detection") !=
std::string::npos) {
// get motion detection info
if (!path_channel_resource.compare("0")) {
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
} else if (path_specific_resource.find("regional-invasion") !=
std::string::npos) {
// get regional invasion info
if (!path_channel_resource.compare("0")) {
content = regional_invasion_get();
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
} else if (!path_specific_resource.compare("face-list")) {
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else if (path_specific_resource.find("face/") != std::string::npos) {
// get face info
if (!path_channel_resource.empty()) {
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
}
} else if (!path_specific_resource.compare("face-config")) {
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else if (!path_specific_resource.compare("face-waiting")) {
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else if (path_specific_resource.find("smart") != std::string::npos) {
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else if (!path_specific_resource.compare("last-face")) {
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else if (!path_specific_resource.compare("get-record-status")) {
int record_status;
rk_storage_record_statue_get(&record_status);
content = record_status;
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
} else if ((Req.Method == "POST") || (Req.Method == "PUT")) {
nlohmann::json event_config = Req.PostObject; /* must be json::object */
char *config = new char[Req.ContentLength + 1];
strncpy(config, event_config.dump().c_str(), Req.ContentLength);
config[Req.ContentLength] = '\0';
if (path_specific_resource.find("triggers/") != std::string::npos) {
#ifdef ENABLE_JWT
if (user_level > 1) {
Resp.setErrorResponse(HttpStatus::kUnauthorized, "Unauthorized");
return;
}
#endif
if (!path_channel_resource.compare("vmd_0")) {
// // set
// dbserver_event_set((char *)TABLE_EVENT_TRIGGERS, config, 0);
// mediaserver_sync_schedules();
// // get new info
// str = dbserver_event_get((char *)TABLE_EVENT_TRIGGERS);
// content = nlohmann::json::parse(str).at("jData").at(0);
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else if (!path_channel_resource.compare("vri_0")) {
// // set
// dbserver_event_set((char *)TABLE_EVENT_TRIGGERS, config, 1);
// // get new info
// str = dbserver_event_get((char *)TABLE_EVENT_TRIGGERS);
// content = nlohmann::json::parse(str).at("jData").at(1);
content = R"(
{
"iNotificationCenterEnabled": 0,
"iNotificationEmailEnabled": 0,
"iNotificationFTPEnabled": 0,
"iNotificationIO1Enabled": 0,
"iNotificationRecord1Enabled": 0,
"iVideoInputChannelID": 0,
"id": 1,
"sEventType": "VRI"
}
)"_json;
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
} else if (path_specific_resource.find("motion-detection/") !=
std::string::npos) {
#ifdef ENABLE_JWT
if (user_level > 1) {
Resp.setErrorResponse(HttpStatus::kUnauthorized, "Unauthorized");
return;
}
#endif
if (!path_channel_resource.compare("0")) {
// // set
// dbserver_event_set((char *)TABLE_MOVE_DETECTION, config, 0);
// // get new info
// str = dbserver_event_get((char *)TABLE_MOVE_DETECTION);
// content = nlohmann::json::parse(str).at("jData").at(0);
// move_detect_item_set(content, 0);
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
} else if (path_specific_resource.find("regional-invasion/") !=
std::string::npos) {
#ifdef ENABLE_JWT
if (user_level > 1) {
Resp.setErrorResponse(HttpStatus::kUnauthorized, "Unauthorized");
return;
}
#endif
if (!path_channel_resource.compare("0")) {
// set
int value_int;
nlohmann::json param = event_config;
if (param.dump().find("iEnabled") != param.dump().npos) {
value_int = atoi(param.at("iEnabled").dump().c_str());
rk_event_ri_set_enabled(value_int);
}
if (param.dump().find("iPositionX") != param.dump().npos) {
value_int = atoi(param.at("iPositionX").dump().c_str());
rk_event_ri_set_position_x(value_int);
}
if (param.dump().find("iPositionY") != param.dump().npos) {
value_int = atoi(param.at("iPositionY").dump().c_str());
rk_event_ri_set_position_y(value_int);
}
if (param.dump().find("iHeight") != param.dump().npos) {
value_int = atoi(param.at("iHeight").dump().c_str());
rk_event_ri_set_height(value_int);
}
if (param.dump().find("iWidth") != param.dump().npos) {
value_int = atoi(param.at("iWidth").dump().c_str());
rk_event_ri_set_width(value_int);
}
if (param.dump().find("iProportion") != param.dump().npos) {
value_int = atoi(param.at("iProportion").dump().c_str());
rk_event_ri_set_proportion(value_int);
}
if (param.dump().find("iSensitivityLevel") != param.dump().npos) {
value_int = atoi(param.at("iSensitivityLevel").dump().c_str());
rk_event_ri_set_sensitivity_level(value_int);
}
if (param.dump().find("iTimeThreshold") != param.dump().npos) {
value_int = atoi(param.at("iTimeThreshold").dump().c_str());
rk_event_ri_set_time_threshold(value_int);
}
// get new info
content = regional_invasion_get();
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else if (path_specific_resource.find("schedules") !=
std::string::npos) {
#ifdef ENABLE_JWT
if (user_level > 1) {
Resp.setErrorResponse(HttpStatus::kUnauthorized, "Unauthorized");
return;
}
#endif
if (!path_channel_resource.empty()) {
// set
int para_id = GetScheduleId(path_channel_resource);
if (para_id >= 0) {
// dbserver_event_set((char *)TABLE_EVENT_SCHEDULES, config,
// para_id);
// mediaserver_sync_schedules();
// str = dbserver_event_get((char *)TABLE_EVENT_SCHEDULES);
// content = nlohmann::json::parse(str).at("jData").at(para_id);
// content.erase("id");
content = R"(
{
"sSchedulesJson": "[[],[],[],[],[],[],[]]"
}
)"_json;
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented,
"Not Implemented");
}
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
} else if (!path_specific_resource.compare("take-photo")) {
rk_take_photo();
Resp.setHeader(HttpStatus::kOk, "OK");
} else if (!path_specific_resource.compare("start-record")) {
rk_storage_record_start();
Resp.setHeader(HttpStatus::kOk, "OK");
} else if (!path_specific_resource.compare("stop-record")) {
rk_storage_record_stop();
Resp.setHeader(HttpStatus::kOk, "OK");
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
}
#else // #ifdef USE_RKIPC
nlohmann::json regional_invasion_get() {
char *str;
nlohmann::json ret;
nlohmann::json regional_invasion;
nlohmann::json normalized_screen_size;
str = dbserver_event_get((char *)TABLE_REGIONAL_INVASION);
regional_invasion = nlohmann::json::parse(str).at("jData").at(0);
regional_invasion.erase("id");
str = dbserver_media_get((char *)TABLE_NORMALIZED_SCREEN_SIZE);
normalized_screen_size = nlohmann::json::parse(str).at("jData").at(0);
normalized_screen_size.erase("id");
ret.emplace("normalizedScreenSize", normalized_screen_size);
ret.emplace("regionalInvasion", regional_invasion);
return ret;
}
std::string face_list_set(nlohmann::json event_config, int id) {
time_t raw_time;
struct tm *time_info;
int age;
char current_year[30];
char current_time[30];
std::string name;
std::string type_path;
std::string picture_path;
std::string type = event_config.at("sType");
std::string birthday = event_config.at("sBirthday");
if (event_config.dump().find("sName") == std::string::npos)
name = "User";
else
name = event_config.at("sName");
time(&raw_time);
time_info = localtime(&raw_time);
strftime(current_time, 30, "%FT%T", time_info);
strncpy(current_year, current_time, 30);
age = atoi(current_year) - stoi(birthday.substr(0, 4));
char *str = storage_manager_get_media_path();
std::string mount_path = nlohmann::json::parse(str).at("sMountPath");
if (!type.compare("whiteList"))
type_path = "/white_list/";
else
type_path = "/black_list/";
picture_path =
mount_path + type_path + name + "_" + std::to_string(id) + ".jpg";
event_config.emplace("iAge", age);
event_config.emplace("sRegistrationTime", current_time);
event_config.emplace("sPicturePath", picture_path);
dbserver_event_set((char *)TABLE_FACE_LIST,
(char *)event_config.dump().c_str(), id);
return picture_path;
}
nlohmann::json face_list_search_by_condition(nlohmann::json serach_conditions) {
char *str;
nlohmann::json result;
nlohmann::json match_list;
nlohmann::json search_result;
int age_min = serach_conditions.at("minAge");
int age_max = serach_conditions.at("maxAge");
int begin_position = serach_conditions.at("beginPosition");
int end_position = serach_conditions.at("endPosition");
int access_card_number = serach_conditions.at("accessCardNumber");
std::string begin_time = serach_conditions.at("beginTime");
std::string end_time = serach_conditions.at("endTime");
std::string type = serach_conditions.at("type");
std::string gender = serach_conditions.at("gender");
std::string gender_condition;
std::string type_condition;
if (!gender.compare("all"))
gender_condition = "(1=1)";
else
gender_condition = "(sGender = '" + gender + "')";
if (!type.compare("all"))
// type_condition = "((sType = 'whiteList') or (sType = 'blackList'))";
type_condition = "(1=1)";
else
type_condition = "(sType = '" + type + "')";
std::string conditions =
"from FaceList where (iAge between " + std::to_string(age_min) + " and " +
std::to_string(age_max) + ") and (instr(iAccessCardNumber," +
std::to_string(access_card_number) +
")>0) and "
"(sRegistrationTime between '" +
begin_time + "' and '" + end_time + "') and " + gender_condition +
" and " + type_condition;
std::string cmd = "select count(*) " + conditions;
str = dbserver_sql((char *)cmd.c_str(), (char *)DBSERVER_EVENT_INTERFACE);
std::string result_num =
nlohmann::json::parse(str).at("jData").at(0).at("count(*)");
int num_of_matches = stoi(result_num);
// limit number
cmd = "select * " + conditions + "limit " + std::to_string(begin_position) +
"," + std::to_string(end_position - begin_position + 1);
// minilog_debug("cmd is %s\n", cmd.c_str());
str = dbserver_sql((char *)cmd.c_str(), (char *)DBSERVER_EVENT_INTERFACE);
match_list = nlohmann::json::parse(str).at("jData");
std::string ipv4_address = ipv4_address_get();
for (auto &x : nlohmann::json::iterator_wrapper(match_list)) {
std::string path = x.value().at("sPicturePath");
std::string download_path = "http://" + ipv4_address + path;
std::string note = x.value().at("sNote");
if (!note.compare("undone")) {
x.value().erase("sNote");
x.value().emplace("sNote", "");
}
x.value().erase("sPicturePath");
x.value().emplace("sPicturePath", download_path);
}
result.emplace("matchList", match_list);
result.emplace("numOfMatches", num_of_matches);
return result;
}
nlohmann::json face_list_search_by_name(nlohmann::json serach_conditions) {
nlohmann::json result;
nlohmann::json match_list;
nlohmann::json search_result;
int begin_position = serach_conditions.at("beginPosition");
int end_position = serach_conditions.at("endPosition");
std::string name = serach_conditions.at("name");
std::string condition = "from FaceList where sName like '%" + name + "%'";
std::string cmd = "select count(*) " + condition;
char *str =
dbserver_sql((char *)cmd.c_str(), (char *)DBSERVER_EVENT_INTERFACE);
std::string result_num =
nlohmann::json::parse(str).at("jData").at(0).at("count(*)");
int num_of_matches = stoi(result_num);
// limit number
cmd = "select * " + condition + " limit " + std::to_string(begin_position) +
"," + std::to_string(end_position - begin_position + 1);
// minilog_debug("cmd is %s\n", cmd.c_str());
str = dbserver_sql((char *)cmd.c_str(), (char *)DBSERVER_EVENT_INTERFACE);
match_list = nlohmann::json::parse(str).at("jData");
std::string ipv4_address = ipv4_address_get();
for (auto &x : nlohmann::json::iterator_wrapper(match_list)) {
std::string path = x.value().at("sPicturePath");
std::string download_path = "http://" + ipv4_address + path;
std::string note = x.value().at("sNote");
if (!note.compare("undone")) {
x.value().erase("sNote");
x.value().emplace("sNote", "");
}
x.value().erase("sPicturePath");
x.value().emplace("sPicturePath", download_path);
}
result.emplace("matchList", match_list);
result.emplace("numOfMatches", num_of_matches);
return result;
}
nlohmann::json snapshot_record_search(nlohmann::json serach_conditions) {
nlohmann::json result;
nlohmann::json match_list;
nlohmann::json search_result;
int begin_position = serach_conditions.at("beginPosition");
int end_position = serach_conditions.at("endPosition");
std::string begin_time = serach_conditions.at("beginTime");
std::string end_time = serach_conditions.at("endTime");
std::string conditions = "from FaceSnapshotRecord where (sTime between '" +
begin_time + "' and '" + end_time + "')";
std::string cmd = "select count(*) " + conditions;
char *str =
dbserver_sql((char *)cmd.c_str(), (char *)DBSERVER_EVENT_INTERFACE);
std::string result_num =
nlohmann::json::parse(str).at("jData").at(0).at("count(*)");
int num_of_matches = stoi(result_num);
// limit number
cmd = "select * " + conditions + "limit " + std::to_string(begin_position) +
"," + std::to_string(end_position - begin_position + 1);
// minilog_debug("cmd is %s\n", cmd.c_str());
str = dbserver_sql((char *)cmd.c_str(), (char *)DBSERVER_EVENT_INTERFACE);
match_list = nlohmann::json::parse(str).at("jData");
std::string ipv4_address = ipv4_address_get();
for (auto &x : nlohmann::json::iterator_wrapper(match_list)) {
std::string path = x.value().at("sPicturePath");
std::string download_path = "http://" + ipv4_address + path;
x.value().erase("sPicturePath");
x.value().emplace("sPicturePath", download_path);
x.value().emplace("sSnapshotName", path);
}
result.emplace("matchList", match_list);
result.emplace("numOfMatches", num_of_matches);
return result;
}
nlohmann::json
control_record_search_by_condition(nlohmann::json serach_conditions) {
nlohmann::json result;
nlohmann::json match_list;
int age_min = serach_conditions.at("minAge");
int age_max = serach_conditions.at("maxAge");
int begin_position = serach_conditions.at("beginPosition");
int end_position = serach_conditions.at("endPosition");
int access_card_number = serach_conditions.at("accessCardNumber");
std::string begin_time = serach_conditions.at("beginTime");
std::string end_time = serach_conditions.at("endTime");
std::string status = serach_conditions.at("status");
std::string gender = serach_conditions.at("gender");
std::string gender_condition;
if (!gender.compare("all"))
gender_condition = "(1=1)";
else
gender_condition = "(FaceList.sGender = '" + gender + "')";
#ifdef MEDIASERVER_ROCKFACE
std::string conditions =
"from FaceList inner join FaceControlRecord where (FaceList.iFaceDBId = "
"FaceControlRecord.iFaceId) and (FaceList.iAge between " +
std::to_string(age_min) + " and " + std::to_string(age_max) +
") and (FaceList.iAccessCardNumber = " +
std::to_string(access_card_number) +
") and "
"(FaceControlRecord.sTime between '" +
begin_time + "' and '" + end_time + "') and " + gender_condition;
std::string cmd = "select count(*) " + conditions;
char *str =
dbserver_sql((char *)cmd.c_str(), (char *)DBSERVER_EVENT_INTERFACE);
std::string result_num =
nlohmann::json::parse(str).at("jData").at(0).at("count(*)");
int num_of_matches = stoi(result_num);
#else
std::string conditions =
"from FaceList inner join FaceControlRecord where (FaceList.id = "
"FaceControlRecord.iFaceId) and (FaceList.iAge between " +
std::to_string(age_min) + " and " + std::to_string(age_max) +
") and (FaceList.iAccessCardNumber = " +
std::to_string(access_card_number) +
") and "
"(FaceControlRecord.sTime between '" +
begin_time + "' and '" + end_time + "') and " + gender_condition;
std::string cmd = "select count(*) " + conditions;
char *str =
dbserver_sql((char *)cmd.c_str(), (char *)DBSERVER_EVENT_INTERFACE);
std::string result_num =
nlohmann::json::parse(str).at("jData").at(0).at("count(*)");
int num_of_matches = stoi(result_num);
#endif
// limit number
cmd = "select * " + conditions + "limit " + std::to_string(begin_position) +
"," + std::to_string(end_position - begin_position + 1);
minilog_debug("cmd is %s\n", cmd.c_str());
str = dbserver_sql((char *)cmd.c_str(), (char *)DBSERVER_EVENT_INTERFACE);
match_list = nlohmann::json::parse(str).at("jData");
std::string ipv4_address = ipv4_address_get();
for (auto &x : nlohmann::json::iterator_wrapper(match_list)) {
std::string picture_path = x.value().at("sPicturePath");
std::string snapshot_path = x.value().at("sSnapshotPath");
std::string picture_address = "http://" + ipv4_address + picture_path;
std::string snapshot_address = "http://" + ipv4_address + snapshot_path;
std::string note = x.value().at("sNote");
if (!note.compare("undone")) {
x.value().erase("sNote");
x.value().emplace("sNote", "");
}
x.value().erase("sPicturePath");
x.value().erase("sSnapshotPath");
x.value().emplace("sPicturePath", picture_address);
x.value().emplace("sSnapshotPath", snapshot_address);
x.value().emplace("sSnapshotName", snapshot_path);
}
result.emplace("matchList", match_list);
result.emplace("numOfMatches", num_of_matches);
return result;
}
nlohmann::json control_record_search_by_name(nlohmann::json serach_conditions) {
nlohmann::json result;
nlohmann::json match_list;
int begin_position = serach_conditions.at("beginPosition");
int end_position = serach_conditions.at("endPosition");
std::string name = serach_conditions.at("name");
#ifdef MEDIASERVER_ROCKFACE
std::string conditions =
"from FaceList inner join FaceControlRecord where "
"(FaceList.iFaceDBId = FaceControlRecord.iFaceId) and "
"(FaceList.sName like '%" +
name + "%')";
std::string cmd = "select count(*) " + conditions;
char *str =
dbserver_sql((char *)cmd.c_str(), (char *)DBSERVER_EVENT_INTERFACE);
std::string result_num =
nlohmann::json::parse(str).at("jData").at(0).at("count(*)");
int num_of_matches = stoi(result_num);
#else
std::string conditions = "from FaceList inner join FaceControlRecord where "
"(FaceList.id = FaceControlRecord.iFaceId) and "
"(FaceList.sName like '%" +
name + "%')";
std::string cmd = "select count(*) " + conditions;
char *str =
dbserver_sql((char *)cmd.c_str(), (char *)DBSERVER_EVENT_INTERFACE);
std::string result_num =
nlohmann::json::parse(str).at("jData").at(0).at("count(*)");
int num_of_matches = stoi(result_num);
#endif
cmd = "select * " + conditions + " limit " + std::to_string(begin_position) +
"," + std::to_string(end_position - begin_position + 1);
minilog_debug("cmd is %s\n", cmd.c_str());
str = dbserver_sql((char *)cmd.c_str(), (char *)DBSERVER_EVENT_INTERFACE);
match_list = nlohmann::json::parse(str).at("jData");
std::string ipv4_address = ipv4_address_get();
for (auto &x : nlohmann::json::iterator_wrapper(match_list)) {
std::string picture_path = x.value().at("sPicturePath");
std::string snapshot_path = x.value().at("sSnapshotPath");
std::string picture_address = "http://" + ipv4_address + picture_path;
std::string snapshot_address = "http://" + ipv4_address + snapshot_path;
std::string note = x.value().at("sNote");
if (!note.compare("undone")) {
x.value().erase("sNote");
x.value().emplace("sNote", "");
}
x.value().erase("sPicturePath");
x.value().erase("sSnapshotPath");
x.value().emplace("sPicturePath", picture_address);
x.value().emplace("sSnapshotName", snapshot_path);
x.value().emplace("sSnapshotPath", snapshot_address);
}
result.emplace("matchList", match_list);
result.emplace("numOfMatches", num_of_matches);
return result;
}
void move_detect_item_set(nlohmann::json config, int id) {
if (!config.empty()) {
mediaserver_set((char *)TABLE_MOVE_DETECTION, id,
(char *)config.dump().c_str());
}
}
void region_invade_item_set(nlohmann::json config, int id) {
if (!config.empty()) {
nlohmann::json param = config.at("regionalInvasion");
if (!config.empty()) {
mediaserver_set((char *)TABLE_REGIONAL_INVASION, id,
(char *)param.dump().c_str());
}
}
}
void smart_cover_item_set(nlohmann::json smart_cover) {
if (smart_cover.empty())
return;
std::string smart_cover_string = smart_cover.dump();
if (smart_cover_string.find("iFaceEnabled") != std::string::npos) {
int enable = smart_cover.at("iFaceEnabled");
mediaserver_feature_id_int((char *)"SetFaceDetectEn", 0, enable);
}
if (smart_cover_string.find("iImageOverlayEnabled") != std::string::npos) {
int enable = smart_cover.at("iImageOverlayEnabled");
mediaserver_feature_id_int((char *)"SetFaceCaptureEn", 0, enable);
}
if (smart_cover_string.find("iStreamOverlayEnabled") != std::string::npos) {
int enable = smart_cover.at("iStreamOverlayEnabled");
mediaserver_feature_id_int((char *)"SetDrawFaceEn", 0, enable);
}
if (smart_cover_string.find("iFaceRecognitionEnabled") != std::string::npos) {
int enable = smart_cover.at("iFaceRecognitionEnabled");
mediaserver_feature_id_int((char *)"SetFaceRegEn", 0, enable);
}
}
nlohmann::json smart_cover_get() {
char *str;
nlohmann::json db_cover;
nlohmann::json db_overlays;
str = dbserver_event_get((char *)TABLE_SMART_COVER);
db_cover = nlohmann::json::parse(str).at("jData").at(0);
str = dbserver_event_get((char *)TABLE_SMART_COVER_OVERLAY);
db_overlays = nlohmann::json::parse(str).at("jData");
db_cover.emplace("infoOverlay", db_overlays);
return db_cover;
}
void smart_cover_set(nlohmann::json smart_cover) {
char *event_config = new char[1024];
std::string smart_cover_string = smart_cover.dump();
if (smart_cover_string.find("infoOverlay") != std::string::npos) {
nlohmann::json overlay_info = smart_cover.at("infoOverlay");
for (auto &x : nlohmann::json::iterator_wrapper(overlay_info)) {
nlohmann::json overlay_part = x.value();
int id = overlay_part.at("id");
strcpy(event_config, overlay_part.dump().c_str());
dbserver_event_set((char *)TABLE_SMART_COVER_OVERLAY, event_config, id);
}
smart_cover.erase("infoOverlay");
}
strcpy(event_config, smart_cover.dump().c_str());
dbserver_event_set((char *)TABLE_SMART_COVER, event_config, 0);
delete[] event_config;
}
void set_mediaserver_face_config(nlohmann::json new_cfg,
nlohmann::json old_cfg) {
nlohmann::json diff = nlohmann::json::diff(new_cfg, old_cfg);
// minilog_error("diff %s\n", diff.dump().c_str());
for (auto &x : nlohmann::json::iterator_wrapper(old_cfg)) {
if (diff.dump().find(x.key()) == diff.dump().npos) {
new_cfg.erase(x.key());
}
}
mediaserver_set((char *)TABLE_FACE_CONFIG, 0, new_cfg.dump().c_str());
}
void reset_face_db_and_delete_pic(std::string table, std::string path_key,
int delete_face_db) {
std::string cmd = "select " + path_key + " from " + table;
char *str =
dbserver_sql((char *)cmd.c_str(), (char *)DBSERVER_EVENT_INTERFACE);
nlohmann::json rst;
if (str) {
rst = nlohmann::json::parse(str).at("jData");
} else {
return;
}
// TODO: Delete target dir
for (auto &x : nlohmann::json::iterator_wrapper(rst)) {
nlohmann::json pat = x.value();
if (!pat.empty()) {
std::string file_path = pat.at(path_key);
unlink((char *)file_path.c_str());
}
}
#ifdef MEDIASERVER_ROCKFACE
if (delete_face_db)
mediaserver_clear_face_db();
#endif
dbserver_face_reset((char *)table.c_str());
dbserver_reset_face_table((char *)table.c_str());
minilog_debug("delete table is %s, pic path key is %s\n",
(char *)table.c_str(), (char *)path_key.c_str());
}
void EventApiHandler::handler(const HttpRequest &Req, HttpResponse &Resp) {
std::string path_api_resource;
std::string path_specific_resource;
std::string path_channel_resource;
char *str;
nlohmann::json content;
#ifdef ENABLE_JWT
int user_level = Req.UserLevel;
#endif
// Get Path Information
int pos_first = Req.PathInfo.find_first_of("/");
path_api_resource = Req.PathInfo.substr(pos_first + 1, Req.PathInfo.size());
pos_first = path_api_resource.find_first_of("/");
if (pos_first != -1) {
path_specific_resource =
path_api_resource.substr(pos_first + 1, path_api_resource.size());
pos_first = path_specific_resource.find_first_of("/");
if (pos_first != -1) {
path_channel_resource = path_specific_resource.substr(
pos_first + 1, path_specific_resource.size());
}
}
if (Req.Method == "GET") {
if (path_specific_resource.find("triggers") != std::string::npos) {
// get triggers info
if (!path_channel_resource.compare("vmd_0")) {
str = dbserver_event_get((char *)TABLE_EVENT_TRIGGERS);
content = nlohmann::json::parse(str).at("jData").at(0);
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else if (!path_channel_resource.compare("vri_0")) {
str = dbserver_event_get((char *)TABLE_EVENT_TRIGGERS);
content = nlohmann::json::parse(str).at("jData").at(1);
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
} else if (path_specific_resource.find("schedules") != std::string::npos) {
// get schedules info
if (!path_channel_resource.empty()) {
int para_id = GetScheduleId(path_channel_resource);
// minilog_debug("id is %d", para_id);
if (para_id >= 0) {
str = dbserver_event_get((char *)TABLE_EVENT_SCHEDULES);
content = nlohmann::json::parse(str).at("jData").at(para_id);
content.erase("id");
// for calculating info for device
// std::string test =
// nlohmann::json::parse(str).at("jData").at(para_id).at("sSchedulesJson");
// content = nlohmann::json::parse((char*)test.c_str());
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
} else if (path_specific_resource.find("motion-detection") !=
std::string::npos) {
// get motion detection info
if (!path_channel_resource.compare("0")) {
str = dbserver_event_get((char *)TABLE_MOVE_DETECTION);
content = nlohmann::json::parse(str).at("jData").at(0);
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
} else if (path_specific_resource.find("regional-invasion") !=
std::string::npos) {
// get regional invasion info
if (!path_channel_resource.compare("0")) {
content = regional_invasion_get();
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
} else if (!path_specific_resource.compare("face-list")) {
// get face list
str = dbserver_event_get((char *)TABLE_FACE_LIST);
content = nlohmann::json::parse(str).at("jData");
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else if (path_specific_resource.find("face/") != std::string::npos) {
// get face info
if (!path_channel_resource.empty()) {
// path example is face/0
int id = stoi(path_channel_resource);
str = dbserver_event_get_by_id((char *)TABLE_FACE_LIST, id);
content = nlohmann::json::parse(str).at("jData").at(0);
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
}
} else if (!path_specific_resource.compare("face-config")) {
// get face config
str = dbserver_event_get((char *)TABLE_FACE_CONFIG);
content = nlohmann::json::parse(str).at("jData").at(0);
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else if (!path_specific_resource.compare("face-waiting")) {
// get the number of face lists without feature values loaded
std::string cmd =
"select count(*) from FaceList where (iLoadCompleted == 0)";
str = dbserver_sql((char *)cmd.c_str(), (char *)DBSERVER_EVENT_INTERFACE);
std::string count =
nlohmann::json::parse(str).at("jData").at(0).at("count(*)");
int waiting_num = stoi(count);
content.emplace("numOfWaiting", waiting_num);
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else if (path_specific_resource.find("smart") != std::string::npos) {
if (!path_channel_resource.compare("cover")) {
content = smart_cover_get();
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
} else if (!path_specific_resource.compare("get-record-status")) {
content = mediaserver_get_record_status(0);
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else if (!path_specific_resource.compare("last-face")) {
int id = -1;
str = dbserver_sql(
(char *)"select * from FaceList ORDER BY id DESC LIMIT 1",
(char *)DBSERVER_EVENT_INTERFACE);
nlohmann::json face_last = nlohmann::json::parse(str).at("jData");
if (!face_last.empty()) {
id = face_last.at(0).at("id");
}
content.emplace("id", id);
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
} else if ((Req.Method == "POST") || (Req.Method == "PUT")) {
nlohmann::json event_config = Req.PostObject; /* must be json::object */
char *config = new char[Req.ContentLength + 1];
strncpy(config, event_config.dump().c_str(), Req.ContentLength);
config[Req.ContentLength] = '\0';
if (path_specific_resource.find("triggers/") != std::string::npos) {
#ifdef ENABLE_JWT
if (user_level > 1) {
Resp.setErrorResponse(HttpStatus::kUnauthorized, "Unauthorized");
return;
}
#endif
if (!path_channel_resource.compare("vmd_0")) {
// set
dbserver_event_set((char *)TABLE_EVENT_TRIGGERS, config, 0);
mediaserver_sync_schedules();
// get new info
str = dbserver_event_get((char *)TABLE_EVENT_TRIGGERS);
content = nlohmann::json::parse(str).at("jData").at(0);
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else if (!path_channel_resource.compare("vri_0")) {
// set
dbserver_event_set((char *)TABLE_EVENT_TRIGGERS, config, 1);
// get new info
str = dbserver_event_get((char *)TABLE_EVENT_TRIGGERS);
content = nlohmann::json::parse(str).at("jData").at(1);
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
} else if (path_specific_resource.find("schedules") != std::string::npos) {
#ifdef ENABLE_JWT
if (user_level > 1) {
Resp.setErrorResponse(HttpStatus::kUnauthorized, "Unauthorized");
return;
}
#endif
if (!path_channel_resource.empty()) {
// set
int para_id = GetScheduleId(path_channel_resource);
if (para_id >= 0) {
dbserver_event_set((char *)TABLE_EVENT_SCHEDULES, config, para_id);
mediaserver_sync_schedules();
str = dbserver_event_get((char *)TABLE_EVENT_SCHEDULES);
content = nlohmann::json::parse(str).at("jData").at(para_id);
content.erase("id");
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
} else if (path_specific_resource.find("motion-detection/") !=
std::string::npos) {
#ifdef ENABLE_JWT
if (user_level > 1) {
Resp.setErrorResponse(HttpStatus::kUnauthorized, "Unauthorized");
return;
}
#endif
if (!path_channel_resource.compare("0")) {
// set
dbserver_event_set((char *)TABLE_MOVE_DETECTION, config, 0);
// get new info
str = dbserver_event_get((char *)TABLE_MOVE_DETECTION);
content = nlohmann::json::parse(str).at("jData").at(0);
move_detect_item_set(content, 0);
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
} else if (path_specific_resource.find("regional-invasion/") !=
std::string::npos) {
#ifdef ENABLE_JWT
if (user_level > 1) {
Resp.setErrorResponse(HttpStatus::kUnauthorized, "Unauthorized");
return;
}
#endif
if (!path_channel_resource.compare("0")) {
// set
dbserver_event_set((char *)TABLE_REGIONAL_INVASION, config, 0);
// get new info
content = regional_invasion_get();
region_invade_item_set(content, 0);
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
} else if (!path_specific_resource.compare("face-config")) {
#ifdef ENABLE_JWT
if (user_level > 1) {
Resp.setErrorResponse(HttpStatus::kUnauthorized, "Unauthorized");
return;
}
#endif
// get old info
str = dbserver_event_get((char *)TABLE_FACE_CONFIG);
nlohmann::json old_cfg = nlohmann::json::parse(str).at("jData").at(0);
// set
int volume = event_config.at("iPromptVolume");
std::string cmd = "amixer -q set Master " + std::to_string(volume) + "%";
system(cmd.c_str());
int sig = system("alsactl store -f /userdata/asound.state");
if (sig)
system("alsactl store -f /etc/asound.state");
dbserver_event_set((char *)TABLE_FACE_CONFIG, config, 0);
// get new info
str = dbserver_event_get((char *)TABLE_FACE_CONFIG);
content = nlohmann::json::parse(str).at("jData").at(0);
// set to mediaserver
set_mediaserver_face_config(content, old_cfg);
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else if (!path_specific_resource.compare("face-list")) {
// search face list
for (auto p : Req.Params) {
if (p.Key == "search") {
if (p.Value == "condition")
content = face_list_search_by_condition(event_config);
else if (p.Value == "name")
content = face_list_search_by_name(event_config);
}
}
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else if (!path_specific_resource.compare("snapshot-record")) {
// search snapshot record
content = snapshot_record_search(event_config);
// dbserver_snapshot_record_set("/data/test_1.jpg");
// str = dbserver_event_get((char *)TABLE_FACE_SNAPSHOT_RECORD);
// content = nlohmann::json::parse(str).at("jData");
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else if (!path_specific_resource.compare("control-record")) {
// search control record
for (auto p : Req.Params) {
if (p.Key == "search") {
if (p.Value == "condition") {
content = control_record_search_by_condition(event_config);
// dbserver_control_record_set(1, "/data/test_2.jpg", "open",
// "72.22");
// str = dbserver_event_get((char *)TABLE_FACE_CONTROL_RECORD);
// content = nlohmann::json::parse(str).at("jData");
} else if (p.Value == "name") {
content = control_record_search_by_name(event_config);
}
}
}
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else if (!path_specific_resource.compare("check-face")) {
#ifdef ENABLE_JWT
if (user_level > 1) {
Resp.setErrorResponse(HttpStatus::kUnauthorized, "Unauthorized");
return;
}
#endif
for (auto p : Req.Params) {
if (p.Key == "id") {
std::string id_str = p.Value;
std::string cmd = "select sName, iLoadCompleted, sPicturePath from "
"FaceList where (id > " +
id_str + ") and (iLoadCompleted != 1)";
str = dbserver_sql((char *)cmd.c_str(),
(char *)DBSERVER_EVENT_INTERFACE);
if (str) {
content = nlohmann::json::parse(str).at("jData");
}
std::string cmd_delete = "delete from FaceList where (id > " +
id_str + ") and (iLoadCompleted != 1)";
dbserver_sql((char *)cmd_delete.c_str(),
(char *)DBSERVER_EVENT_INTERFACE);
if (content.empty()) {
break;
}
for (auto &x : nlohmann::json::iterator_wrapper(content)) {
nlohmann::json pat = x.value();
if (!pat.empty()) {
std::string file_path = pat.at("sPicturePath");
unlink((char *)file_path.c_str());
}
}
break;
}
}
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else if (!path_specific_resource.compare("reset-face")) {
#ifdef ENABLE_JWT
if (user_level > 1) {
Resp.setErrorResponse(HttpStatus::kUnauthorized, "Unauthorized");
return;
}
#endif
reset_face_db_and_delete_pic(TABLE_FACE_LIST, "sPicturePath", 1);
reset_face_db_and_delete_pic(TABLE_FACE_CONTROL_RECORD, "sSnapshotPath",
0);
Resp.setHeader(HttpStatus::kOk, "OK");
} else if (!path_specific_resource.compare("reset-snap")) {
#ifdef ENABLE_JWT
if (user_level > 1) {
Resp.setErrorResponse(HttpStatus::kUnauthorized, "Unauthorized");
return;
}
#endif
reset_face_db_and_delete_pic(TABLE_FACE_SNAPSHOT_RECORD, "sPicturePath",
0);
Resp.setHeader(HttpStatus::kOk, "OK");
} else if (!path_specific_resource.compare("reset-control")) {
#ifdef ENABLE_JWT
if (user_level > 1) {
Resp.setErrorResponse(HttpStatus::kUnauthorized, "Unauthorized");
return;
}
#endif
reset_face_db_and_delete_pic(TABLE_FACE_CONTROL_RECORD, "sSnapshotPath",
0);
Resp.setHeader(HttpStatus::kOk, "OK");
} else if (path_specific_resource.find("face-picture") !=
std::string::npos) {
#ifdef ENABLE_JWT
if (user_level > 1) {
Resp.setErrorResponse(HttpStatus::kUnauthorized, "Unauthorized");
return;
}
#endif
// upload face picture
for (auto p : Req.Params) {
if (p.Key == "path") {
std::string file_path = p.Value;
std::string new_file_path = DecodeURI(file_path);
for (int i = 0; i < Req.Files.size(); i++) {
if (Req.Files.at(i).getDataLength() > (1024 * 1024)) { // 1Mbyte
Resp.setErrorResponse(HttpStatus::kBadRequest, "jpg is too big!");
} else {
int end_position = 0;
// overwrite
std::ofstream picture_file(new_file_path, std::ofstream::out);
picture_file << Req.Files.at(i).getData();
end_position = picture_file.tellp();
picture_file.close();
if (end_position == Req.Files.at(i).getDataLength()) {
#ifdef MEDIASERVER_ROCKFACE
str = dbserver_event_get_by_key_char(
(char *)TABLE_FACE_LIST, (char *)"sPicturePath",
(char *)new_file_path.c_str());
nlohmann::json info_cfg =
nlohmann::json::parse(str).at("jData");
if (!info_cfg.empty()) {
int id = info_cfg.at(0).at("id");
mediaserver_set_face_image(id, new_file_path.c_str());
}
#endif
Resp.setHeader(HttpStatus::kOk, "OK");
} else {
Resp.setErrorResponse(HttpStatus::kBadRequest,
"picture upload failed!");
}
}
}
} else if (p.Key == "copy-path") {
std::string copy_path = p.Value;
std::string new_copy_path = DecodeURI(copy_path);
std::string src_path = event_config.at("path");
std::string new_src_path = DecodeURI(src_path);
// copy modification time and access
std::string cmd =
"cp -p \"" + new_src_path + "\" \"" + new_copy_path + "\"";
int ret = system(cmd.c_str());
content.emplace("copyResultCode", ret);
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
}
}
} else if (path_specific_resource.find("face") != std::string::npos) {
#ifdef ENABLE_JWT
if (user_level > 1) {
Resp.setErrorResponse(HttpStatus::kUnauthorized, "Unauthorized");
return;
}
#endif
// add or modify
int id = 0;
if (path_channel_resource.empty()) {
// path is face
str = dbserver_sql(
(char *)"select * from FaceList ORDER BY id DESC LIMIT 1",
(char *)DBSERVER_EVENT_INTERFACE);
nlohmann::json face_last = nlohmann::json::parse(str).at("jData");
if (!face_last.empty()) {
id = face_last.at(0).at("id");
id++;
}
// set
std::string picture_path = face_list_set(event_config, id);
content.emplace("sPicturePath", picture_path);
content.emplace("id", id);
} else {
// path example is face/0
std::string path_old;
std::string path_new;
int old_face_id;
id = stoi(path_channel_resource); // modify table
str = dbserver_event_get_by_id((char *)TABLE_FACE_LIST, id);
if (str != NULL) {
path_old =
nlohmann::json::parse(str).at("jData").at(0).at("sPicturePath");
old_face_id =
nlohmann::json::parse(str).at("jData").at(0).at("iFaceDBId");
// set
face_list_set(event_config, id);
str = dbserver_event_get_by_id((char *)TABLE_FACE_LIST, id);
if (str != NULL) {
content = nlohmann::json::parse(str).at("jData").at(0);
path_new = content.at("sPicturePath");
// move picture to new path
int face_id = content.at("iFaceDBId");
// minilog_debug("in modify, old_face_id is %d, face id is %d\n",
// old_face_id, face_id);
// before a new pic set, send face_id = -2 to delete old data
if (face_id == -2 && old_face_id >= 0) {
mediaserver_delete_face(id, old_face_id);
}
if (path_old.compare(path_new)) {
std::string cmd = "mv \"" + path_old + "\" \"" + path_new + "\"";
// minilog_debug("cmd is %s\n", cmd.c_str());
system(cmd.c_str());
}
} else {
minilog_debug("dbserver_event_get_by_id fail!, new id is %d\n", id);
}
} else {
minilog_debug("dbserver_event_get_by_id fail!, id is %d\n", id);
}
}
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else if (!path_specific_resource.compare("take-photo")) {
mediaserver_take_photo(0, 1);
Resp.setHeader(HttpStatus::kOk, "OK");
} else if (!path_specific_resource.compare("start-record")) {
mediaserver_start_record(0);
Resp.setHeader(HttpStatus::kOk, "OK");
} else if (!path_specific_resource.compare("stop-record")) {
mediaserver_stop_record(0);
Resp.setHeader(HttpStatus::kOk, "OK");
} else if (path_specific_resource.find("smart") != std::string::npos) {
if (!path_channel_resource.compare("cover")) {
#ifdef ENABLE_JWT
if (user_level > 1) {
Resp.setErrorResponse(HttpStatus::kUnauthorized, "Unauthorized");
return;
}
#endif
/* Erase unchanged data */
nlohmann::json cfg_old = smart_cover_get();
nlohmann::json diff = nlohmann::json::diff(cfg_old, event_config);
for (auto &x : nlohmann::json::iterator_wrapper(cfg_old)) {
if (diff.dump().find(x.key()) == diff.dump().npos)
event_config.erase(x.key());
}
/* Set */
if (!event_config.empty())
smart_cover_set(event_config);
smart_cover_item_set(event_config);
/* Get new info */
content = smart_cover_get();
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
delete[] config;
} else if (Req.Method == "DELETE") {
if (path_specific_resource.find("face") != std::string::npos) {
#ifdef ENABLE_JWT
if (user_level > 1) {
Resp.setErrorResponse(HttpStatus::kUnauthorized, "Unauthorized");
return;
}
#endif
if (path_channel_resource.empty()) {
// path is face
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
} else {
// path example is face/0
int id = stoi(path_channel_resource);
char *delete_string = dbserver_face_list_delete(id);
if (strlen(delete_string) > 0) {
nlohmann::json delete_info =
nlohmann::json::parse(delete_string).at("jData");
std::string path = delete_info.at(0).at("sPicturePath");
unlink((char *)path.c_str());
#ifdef MEDIASERVER_ROCKFACE
int face_id = delete_info.at(0).at("iFaceDBId");
#else
int complete_status = delete_info.at(0).at("iLoadCompleted");
int face_id = -1;
if (complete_status == 1)
face_id = id;
#endif
if (face_id >= 0) {
int id = delete_info.at(0).at("id");
#ifdef MEDIASERVER_ROCKFACE
mediaserver_delete_face(id, face_id);
#endif
char *delete_str = dbserver_event_get_by_key_int(
(char *)TABLE_FACE_CONTROL_RECORD, (char *)"iFaceId", face_id);
nlohmann::json control_data =
nlohmann::json::parse(delete_str).at("jData");
if (control_data.size() > 0) {
nlohmann::json delete_list;
for (auto &x : nlohmann::json::iterator_wrapper(control_data)) {
nlohmann::json item_info = x.value();
std::string sanp_path = item_info["sSnapshotPath"];
if (!sanp_path.empty()) {
unlink((char *)sanp_path.c_str());
}
}
dbserver_event_delete_by_key_int(
(char *)TABLE_FACE_CONTROL_RECORD, (char *)"iFaceId",
face_id);
}
}
} else {
minilog_debug("delete_string is empty");
}
Resp.setHeader(HttpStatus::kOk, "OK");
}
} else if (!path_specific_resource.compare("control-record")) {
#ifdef ENABLE_JWT
if (user_level > 0) {
Resp.setErrorResponse(HttpStatus::kUnauthorized, "Unauthorized");
return;
}
#endif
if (Req.Params.empty()) {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
} else {
for (auto p : Req.Params) {
if (p.Key == "delete") {
int id = stoi(p.Value);
dbserver_event_delete_by_key_int((char *)TABLE_FACE_CONTROL_RECORD,
(char *)"id", id);
}
}
Resp.setHeader(HttpStatus::kOk, "OK");
}
} else if (!path_specific_resource.compare("snapshot-record")) {
#ifdef ENABLE_JWT
if (user_level > 0) {
Resp.setErrorResponse(HttpStatus::kUnauthorized, "Unauthorized");
return;
}
#endif
if (Req.Params.empty()) {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
} else {
for (auto p : Req.Params) {
if (p.Key == "delete") {
int id = stoi(p.Value);
dbserver_event_delete_by_key_int((char *)TABLE_FACE_SNAPSHOT_RECORD,
(char *)"id", id);
}
}
Resp.setHeader(HttpStatus::kOk, "OK");
}
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
}
#endif
} // namespace cgi
} // namespace rockchip