Skip to content

Commit

Permalink
Merge pull request #114 from AO-StreetArt/privatePublicSceneSupport
Browse files Browse the repository at this point in the history
Private public scene support
  • Loading branch information
AO-StreetArt committed Jan 10, 2019
2 parents 8e150ac + bc23bbe commit eae1034
Show file tree
Hide file tree
Showing 14 changed files with 225 additions and 45 deletions.
57 changes: 57 additions & 0 deletions src/api/json_scene_list.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,24 @@ JsonSceneList::JsonSceneList(const rapidjson::Document& d) {
scd->set_name(name_iter->value.GetString());
}
}
// Scene Description
rapidjson::Value::ConstMemberIterator desc_iter = \
itr.FindMember("description");
if (desc_iter != itr.MemberEnd()) {
SceneList::logger().debug("Description found");
if (desc_iter->value.IsString()) {
scd->set_description(desc_iter->value.GetString());
}
}
// Scene Thumbnail
rapidjson::Value::ConstMemberIterator thumbnail_iter = \
itr.FindMember("thumbnail");
if (thumbnail_iter != itr.MemberEnd()) {
SceneList::logger().debug("Thumbnail found");
if (thumbnail_iter->value.IsString()) {
scd->set_thumbnail(thumbnail_iter->value.GetString());
}
}
// Is Scene Active
rapidjson::Value::ConstMemberIterator active_iter = \
itr.FindMember("active");
Expand All @@ -208,6 +226,24 @@ JsonSceneList::JsonSceneList(const rapidjson::Document& d) {
scd->set_active(active_iter->value.GetBool());
}
}
// Is Scene Public
rapidjson::Value::ConstMemberIterator public_iter = \
itr.FindMember("public");
if (public_iter != itr.MemberEnd()) {
SceneList::logger().debug("Public flag found");
if (!(public_iter->value.IsBool())) {
scd->set_public(public_iter->value.GetBool());
}
}
// Is Scene Private
rapidjson::Value::ConstMemberIterator private_iter = \
itr.FindMember("private");
if (private_iter != itr.MemberEnd()) {
SceneList::logger().debug("Private flag found");
if (!(private_iter->value.IsBool())) {
scd->set_public(!(private_iter->value.GetBool()));
}
}
rapidjson::Value::ConstMemberIterator region_iter = \
itr.FindMember("region");
if (region_iter != itr.MemberEnd()) {
Expand Down Expand Up @@ -557,6 +593,24 @@ JsonSceneList::JsonSceneList(const rapidjson::Document& d) {
writer.String(get_scene(a)->get_name().c_str(), \
(rapidjson::SizeType)get_scene(a)->get_name().length());
}
// Add the description
if (!(get_scene(a)->get_description().empty())) {
writer.Key("description");
writer.String(get_scene(a)->get_description().c_str(), \
(rapidjson::SizeType)get_scene(a)->get_description().length());
}
// Add the user
if (!(get_scene(a)->get_user().empty())) {
writer.Key("user");
writer.String(get_scene(a)->get_user().c_str(), \
(rapidjson::SizeType)get_scene(a)->get_user().length());
}
// Add the thumbnail
if (!(get_scene(a)->get_thumbnail().empty())) {
writer.Key("thumbnail");
writer.String(get_scene(a)->get_thumbnail().c_str(), \
(rapidjson::SizeType)get_scene(a)->get_thumbnail().length());
}
// Add the region
if (!(get_scene(a)->get_region().empty())) {
writer.Key("region");
Expand All @@ -571,6 +625,9 @@ JsonSceneList::JsonSceneList(const rapidjson::Document& d) {
// Add the active flag
writer.Key("active");
writer.Bool(get_scene(a)->active());
// Add the public flag
writer.Key("public");
writer.Bool(get_scene(a)->is_public());
// Add the longitude
if (get_scene(a)->get_longitude() > -9999.0) {
writer.Key("longitude");
Expand Down
9 changes: 5 additions & 4 deletions src/controller/include/scene_base_handler.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,11 +54,12 @@ class SceneBaseRequestHandler: public Poco::Net::HTTPRequestHandler {
SceneListFactory scene_list_factory;
SceneFactory scene_factory;
std::string input_id = "";
std::string aesel_principal = "";
public:
SceneBaseRequestHandler(AOSSL::KeyValueStoreInterface *conf, ProcessorInterface *processor, int mtype) \
{config=conf;proc=processor;msg_type=mtype;}
SceneBaseRequestHandler(AOSSL::KeyValueStoreInterface *conf, ProcessorInterface *processor, int mtype, std::string& id) \
{config=conf;proc=processor;msg_type=mtype;input_id.assign(id);}
SceneBaseRequestHandler(AOSSL::KeyValueStoreInterface *conf, ProcessorInterface *processor, int mtype, std::string& principal_header) \
{config=conf;proc=processor;msg_type=mtype;aesel_principal.assign(principal_header);}
SceneBaseRequestHandler(AOSSL::KeyValueStoreInterface *conf, ProcessorInterface *processor, int mtype, std::string& principal_header, std::string& id) \
{config=conf;proc=processor;msg_type=mtype;aesel_principal.assign(principal_header);input_id.assign(id);}
void handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response) {
Poco::Logger::get("Controller").debug("Responding to Scene Request");
response.setChunkedTransferEncoding(true);
Expand Down
25 changes: 15 additions & 10 deletions src/controller/include/scene_handler_factory.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,8 @@ class SceneHandlerFactory: public Poco::Net::HTTPRequestHandlerFactory {
AOSSL::TieredApplicationProfile *config = NULL;
AccountManagerInterface *accounts = NULL;
DeviceCache *event_cache = NULL;
std::string PRINCIPAL_HEADER_NAME = "X-Aesel-Principal";
std::string PRINCIPAL_DEFALT_VALUE = "";
public:
SceneHandlerFactory(AOSSL::TieredApplicationProfile *conf, ProcessorInterface *processor, AccountManagerInterface *accts, DeviceCache *cache) \
{config=conf;proc=processor;accounts = accts;event_cache=cache;}
Expand Down Expand Up @@ -98,6 +100,9 @@ class SceneHandlerFactory: public Poco::Net::HTTPRequestHandlerFactory {
}
if (authentication_failure) return NULL;

// Extract the X-Aesel-Principal header, if available
std::string principal_header = request.get(PRINCIPAL_HEADER_NAME, PRINCIPAL_DEFALT_VALUE);

// Parse the URI Path
Poco::Logger::get("Controller").information("Responding to Request at: %s", request.getURI());
std::vector<std::string> uri_path;
Expand All @@ -109,23 +114,23 @@ class SceneHandlerFactory: public Poco::Net::HTTPRequestHandlerFactory {
// Build a request handler for the message
if (uri_path.size() > 1 && uri_path[0] == "v1" && request.getMethod() == "POST") {
if (uri_path.size() == 2 && uri_path[1] == "scene") {
return new SceneBaseRequestHandler(config, proc, SCENE_CRT);
return new SceneBaseRequestHandler(config, proc, SCENE_CRT, principal_header);
} else if (uri_path.size() == 3 && uri_path[1] == "scene" && uri_path[2] == "query") {
return new SceneBaseRequestHandler(config, proc, SCENE_GET);
return new SceneBaseRequestHandler(config, proc, SCENE_GET, principal_header);
} else if (uri_path.size() == 3 && uri_path[1] == "scene") {
return new SceneUpdateRequestHandler(config, proc, uri_path[2]);
return new SceneUpdateRequestHandler(config, proc, uri_path[2], principal_header);
} else if (uri_path.size() == 2 && uri_path[1] == "register") {
return new SceneBaseRequestHandler(config, proc, SCENE_ENTER);
return new SceneBaseRequestHandler(config, proc, SCENE_ENTER, principal_header);
} else if (uri_path.size() == 2 && uri_path[1] == "deregister") {
return new SceneBaseRequestHandler(config, proc, SCENE_LEAVE);
return new SceneBaseRequestHandler(config, proc, SCENE_LEAVE, principal_header);
} else if (uri_path.size() == 2 && uri_path[1] == "align") {
return new SceneBaseRequestHandler(config, proc, DEVICE_ALIGN);
return new SceneBaseRequestHandler(config, proc, DEVICE_ALIGN, principal_header);
} else if (uri_path.size() == 3 && uri_path[1] == "device" && uri_path[2] == "query") {
return new SceneBaseRequestHandler(config, proc, DEVICE_GET);
return new SceneBaseRequestHandler(config, proc, DEVICE_GET, principal_header);
}
} else if (uri_path.size() == 3 && request.getMethod() == "PUT" && \
uri_path[0] == "v1" && uri_path[1] == "scene") {
return new SceneBaseRequestHandler(config, proc, SCENE_CRT, uri_path[2]);
return new SceneBaseRequestHandler(config, proc, SCENE_CRT, principal_header, uri_path[2]);
} else if (uri_path.size() == 4 && uri_path[0] == "v1" && \
uri_path[1] == "scene" && uri_path[2] == "cache") {
if (request.getMethod() == "PUT") {
Expand All @@ -135,7 +140,7 @@ class SceneHandlerFactory: public Poco::Net::HTTPRequestHandlerFactory {
}
} else if (uri_path.size() == 3 && uri_path[0] == "v1" && \
uri_path[1] == "scene" && request.getMethod() == "DELETE") {
return new SceneKeyRequestHandler(config, proc, uri_path[2], SCENE_DEL);
return new SceneKeyRequestHandler(config, proc, uri_path[2], SCENE_DEL, principal_header);
} else if (uri_path.size() == 5 && uri_path[0] == "v1" && \
uri_path[1] == "scene" && uri_path[3] == "asset") {
if (request.getMethod() == "PUT") {
Expand All @@ -146,7 +151,7 @@ class SceneHandlerFactory: public Poco::Net::HTTPRequestHandlerFactory {
return new AssetUpdateRequestHandler(config, proc, uri_path[2], uri_path[4], ASSET_DEL);
}
} else if (request.getMethod() == "GET" && uri_path[0] == "v1" && uri_path[1] == "scene") {
return new SceneKeyRequestHandler(config, proc, uri_path[2], SCENE_GET);
return new SceneKeyRequestHandler(config, proc, uri_path[2], SCENE_GET, principal_header);
} else if (uri_path.size() == 1 && uri_path[0] == "health" && \
request.getMethod() == "GET") {
return new HeartbeatHandler();
Expand Down
5 changes: 3 additions & 2 deletions src/controller/include/scene_key_handler.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,10 @@ class SceneKeyRequestHandler: public Poco::Net::HTTPRequestHandler {
SceneListFactory scene_list_factory;
SceneFactory scene_factory;
int msg_type = -1;
std::string aesel_principal = "";
public:
SceneKeyRequestHandler(AOSSL::KeyValueStoreInterface *conf, ProcessorInterface *processor, std::string &inp_key, int mtype) \
{config=conf;proc=processor;input_key.assign(inp_key);msg_type=mtype;}
SceneKeyRequestHandler(AOSSL::KeyValueStoreInterface *conf, ProcessorInterface *processor, std::string &inp_key, int mtype, std::string& principal_header) \
{config=conf;proc=processor;input_key.assign(inp_key);msg_type=mtype;aesel_principal.assign(principal_header);}
void handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response) {
Poco::Logger::get("Controller").debug("Responding to Scene Key Request");
response.setChunkedTransferEncoding(true);
Expand Down
5 changes: 3 additions & 2 deletions src/controller/include/scene_update_handler.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,10 @@ class SceneUpdateRequestHandler: public Poco::Net::HTTPRequestHandler {
std::string input_key;
SceneListFactory scene_list_factory;
SceneFactory scene_factory;
std::string aesel_principal = "";
public:
SceneUpdateRequestHandler(AOSSL::KeyValueStoreInterface *conf, ProcessorInterface *processor, std::string &inp_key) \
{config=conf;proc=processor;input_key.assign(inp_key);}
SceneUpdateRequestHandler(AOSSL::KeyValueStoreInterface *conf, ProcessorInterface *processor, std::string &inp_key, std::string& principal_header) \
{config=conf;proc=processor;input_key.assign(inp_key);aesel_principal.assign(principal_header);}
void handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response) {
Poco::Logger::get("Controller").debug("Responding to Scene Update Request");
response.setChunkedTransferEncoding(true);
Expand Down
16 changes: 14 additions & 2 deletions src/model/include/scene.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,8 +44,12 @@ class SceneDocument : public SceneData, public SceneInterface {
std::string key = "";
std::string name = "";
std::string region = "";
std::string description = "";
std::string thumbnail = "";
std::string user = "";
double distance = 0.0;
bool is_active = true;
bool _is_public = true;
bool trns_flag = false;
TransformInterface* scene_transform;
std::vector<std::string> tag_vect;
Expand All @@ -63,20 +67,28 @@ class SceneDocument : public SceneData, public SceneInterface {
// Setters
void set_key(std::string new_key) {key = new_key;}
void set_name(std::string new_name) {name = new_name;}
void set_description(std::string new_desc) {description = new_desc;}
void set_user(std::string new_user) {user = new_user;}
void set_region(std::string new_region) {region = new_region;}
void set_thumbnail(std::string new_thumbnail) {thumbnail = new_thumbnail;}
void set_latitude(double new_lat) {SceneData::set_latitude(new_lat);}
void set_longitude(double new_long) {SceneData::set_longitude(new_long);}
void set_distance(double new_dist) {distance = new_dist;}
void set_active(bool new_active) {is_active = new_active;}
void set_public(bool new_public) {_is_public = new_public;}

// Getters
std::string get_key() const {return key;}
std::string get_description() const {return description;}
std::string get_name() const {return name;}
std::string get_user() const {return user;}
std::string get_thumbnail() const {return thumbnail;}
std::string get_region() const {return region;}
double get_latitude() const {return SceneData::get_latitude();}
double get_longitude() const {return SceneData::get_longitude();}
double get_distance() const {return distance;}
bool active() const {return is_active;}
bool is_public() const {return _is_public;}

// List
void add_device(UserDeviceInterface *d) {SceneData::add_device(d);}
Expand Down Expand Up @@ -108,8 +120,8 @@ class SceneDocument : public SceneData, public SceneInterface {

// Print
inline void print() {
Poco::Logger::get("Data").debug("{\"Scene\": {\"key\": \"%s\", \"name\": \"%s\", \"latitude\": %f, \"longitude\": %f, \"distance\": %f}}", \
key, name, get_latitude(), get_longitude(), distance);
Poco::Logger::get("Data").debug("{\"Scene\": {\"key\": \"%s\", \"name\": \"%s\", \"description\": \"%s\", \"user\": \"%s\", \"thumbnail\": \"%s\", \"latitude\": %f, \"longitude\": %f, \"distance\": %f}}", \
key, name, description, user, thumbnail, get_latitude(), get_longitude(), distance);
for (int i = 0; i < num_devices(); i++) {get_device(i)->print();}
for (int j = 0; j < num_assets(); j++) {Poco::Logger::get("Data").debug(get_asset(j));}
if (trns_flag) {scene_transform->print();}
Expand Down
8 changes: 8 additions & 0 deletions src/model/include/scene_interface.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,20 +33,28 @@ class SceneInterface {
// Setters
virtual void set_key(std::string new_key) = 0;
virtual void set_name(std::string new_name) = 0;
virtual void set_description(std::string new_desc) = 0;
virtual void set_thumbnail(std::string new_thumbnail) = 0;
virtual void set_user(std::string new_user) = 0;
virtual void set_region(std::string new_region) = 0;
virtual void set_latitude(double new_lat) = 0;
virtual void set_longitude(double new_long) = 0;
virtual void set_distance(double new_dist) = 0;
virtual void set_active(bool new_active) = 0;
virtual void set_public(bool new_public) = 0;

// Getters
virtual std::string get_key() const = 0;
virtual std::string get_name() const = 0;
virtual std::string get_description() const = 0;
virtual std::string get_thumbnail() const = 0;
virtual std::string get_user() const = 0;
virtual std::string get_region() const = 0;
virtual double get_latitude() const = 0;
virtual double get_longitude() const = 0;
virtual double get_distance() const = 0;
virtual bool active() const = 0;
virtual bool is_public() const = 0;

// DeviceList
virtual void add_device(UserDeviceInterface *d) = 0;
Expand Down
4 changes: 4 additions & 0 deletions src/model/scene.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,15 @@ SceneDocument::SceneDocument(const SceneDocument& sd) {
// Basic Attributes
key = sd.get_key();
name = sd.get_name();
description = sd.get_description();
user = sd.get_user();
thumbnail = sd.get_thumbnail();
region = sd.get_region();
SceneData::set_latitude(sd.get_latitude());
SceneData::set_longitude(sd.get_longitude());
distance = sd.get_distance();
is_active = sd.active();
_is_public = sd.is_public();
trns_flag = false;
//Scene Assets
for (int i = 0; i < sd.num_assets(); i++) {
Expand Down
8 changes: 6 additions & 2 deletions src/proc/processor/crud_message_processor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,9 @@ ProcessResult* \
obj_msg->get_scene(0)->get_longitude() == -9999.0 && \
obj_msg->get_scene(0)->get_key().empty() && \
obj_msg->get_scene(0)->get_region().empty() && \
obj_msg->get_scene(0)->get_description().empty() && \
obj_msg->get_scene(0)->get_user().empty() && \
obj_msg->get_scene(0)->get_thumbnail().empty() && \
obj_msg->get_scene(0)->num_tags() == 0 && \
obj_msg->get_scene(0)->num_assets() == 0) {
BaseMessageProcessor::logger().error("No fields found in update message");
Expand Down Expand Up @@ -189,7 +192,8 @@ ProcessResult* \
ProcessResult *response = new ProcessResult;
std::unordered_map<std::string, Neocpp::Neo4jQueryParameterInterface*> \
scene_params;
if (obj_msg->num_scenes() > 0) {
if (obj_msg->num_scenes() > 0 && (obj_msg->get_scene(0)->is_public() || \
!(obj_msg->get_scene(0)->get_user().empty() || obj_msg->get_scene(0)->is_public()))) {
Neocpp::ResultsIteratorInterface *results = NULL;
BaseMessageProcessor::logger().debug("Processing Scene Retrieve message");

Expand Down Expand Up @@ -266,7 +270,7 @@ ProcessResult* \
}
return response;
}
response->set_error(PROCESSING_ERROR, "No Scene Data recieved");
response->set_error(PROCESSING_ERROR, "Insufficient Scene Data recieved");
return response;
}

Expand Down

0 comments on commit eae1034

Please sign in to comment.