#include #include "event_manager.h" Option EventManager::add_event(const nlohmann::json& event, const std::string& client_ip) { /* Sample event payload: { "type": "search", "data": { "q": "Nike shoes", "collections": ["products"] } } */ if(!event.contains("type")) { return Option(404, "key `type` not found."); } const auto& event_type_val = event[EVENT_TYPE]; if(event_type_val.is_string()) { const std::string& event_type = event_type_val.get(); if(event_type == "search") { if(!event.contains("data")) { return Option(404, "key `data` not found."); } const auto& event_data_val = event[EVENT_DATA]; if(!event_data_val.is_object()) { return Option(500, "event_data_val is not object."); } const auto& event_data_query_it = event_data_val["q"]; if(!event_data_query_it.is_string()) { return Option(500, "`q` value should be string."); } if(!event_data_val["collections"].is_array() || !event_data_val["collections"][0].is_string()) { return Option(500, "`collections` value should be string array."); } for(const auto& coll: event_data_val["collections"]) { const std::string& query = event_data_query_it.get(); AnalyticsManager::get_instance().add_suggestion(coll.get(), query, query, false, ""); } } else if(event_type == AnalyticsManager::CLICK_EVENT || event_type == AnalyticsManager::CONVERSION_EVENT || event_type == AnalyticsManager::VISIT_EVENT || event_type == AnalyticsManager::CUSTOM_EVENT) { if (!event.contains(EVENT_DATA)) { return Option(404, "key `data` not found."); } const auto &event_data_val = event[EVENT_DATA]; if (!event.contains(EVENT_NAME)) { return Option(404, "key `name` not found."); } const auto &event_name = event[EVENT_NAME]; if (!event_data_val.is_object()) { return Option(500, "event_data_val is not object."); } if(event_type != AnalyticsManager::CUSTOM_EVENT) { //visit event might not contain query so exclude check if(event_type != AnalyticsManager::VISIT_EVENT && !event_data_val.contains("q")) { return Option(500,"event json data fields should contain `q`."); } if (event_data_val.contains("q") && !event_data_val["q"].is_string()) { return Option(500, "`q` value should be string."); } if (!event_data_val.contains("doc_id") || !event_data_val.contains("user_id")) { return Option(500, "event json data fields should contain `doc_id`, `user_id`."); } if (!event_data_val["doc_id"].is_string()) { return Option(500, "`doc_id` value should be string."); } if (!event_data_val["user_id"].is_string()) { return Option(500, "`user_id` value should be string."); } } auto op = AnalyticsManager::get_instance().add_event(client_ip, event_type, event_name, event_data_val); if(!op.ok()) { return Option(op.code(), op.error()); } } else { return Option(404, "event_type " + event_type + " not found."); } } else { return Option(500, "`event_type` value should be string."); } return Option(true); }