15e44e3d8SAppaRao Puli #pragma once 25e44e3d8SAppaRao Puli 3*5b90429aSEd Tanous #include "privileges.hpp" 4*5b90429aSEd Tanous #include "registries/privilege_registry.hpp" 5*5b90429aSEd Tanous 65e44e3d8SAppaRao Puli #include <app.hpp> 75e44e3d8SAppaRao Puli #include <event_service_manager.hpp> 85e44e3d8SAppaRao Puli 9*5b90429aSEd Tanous #include <memory> 10*5b90429aSEd Tanous #include <string> 11*5b90429aSEd Tanous 125e44e3d8SAppaRao Puli namespace redfish 135e44e3d8SAppaRao Puli { 145e44e3d8SAppaRao Puli createSubscription(crow::sse_socket::Connection & conn)155e44e3d8SAppaRao Puliinline void createSubscription(crow::sse_socket::Connection& conn) 165e44e3d8SAppaRao Puli { 175e44e3d8SAppaRao Puli EventServiceManager& manager = 185e44e3d8SAppaRao Puli EventServiceManager::getInstance(&conn.getIoContext()); 195e44e3d8SAppaRao Puli if ((manager.getNumberOfSubscriptions() >= maxNoOfSubscriptions) || 205e44e3d8SAppaRao Puli manager.getNumberOfSSESubscriptions() >= maxNoOfSSESubscriptions) 215e44e3d8SAppaRao Puli { 2262598e31SEd Tanous BMCWEB_LOG_WARNING("Max SSE subscriptions reached"); 235e44e3d8SAppaRao Puli conn.close("Max SSE subscriptions reached"); 245e44e3d8SAppaRao Puli return; 255e44e3d8SAppaRao Puli } 265e44e3d8SAppaRao Puli std::shared_ptr<redfish::Subscription> subValue = 275e44e3d8SAppaRao Puli std::make_shared<redfish::Subscription>(conn); 285e44e3d8SAppaRao Puli 295e44e3d8SAppaRao Puli // GET on this URI means, Its SSE subscriptionType. 305e44e3d8SAppaRao Puli subValue->subscriptionType = redfish::subscriptionTypeSSE; 315e44e3d8SAppaRao Puli 325e44e3d8SAppaRao Puli subValue->protocol = "Redfish"; 335e44e3d8SAppaRao Puli subValue->retryPolicy = "TerminateAfterRetries"; 345e44e3d8SAppaRao Puli subValue->eventFormatType = "Event"; 355e44e3d8SAppaRao Puli 365e44e3d8SAppaRao Puli std::string id = manager.addSubscription(subValue, false); 375e44e3d8SAppaRao Puli if (id.empty()) 385e44e3d8SAppaRao Puli { 395e44e3d8SAppaRao Puli conn.close("Internal Error"); 405e44e3d8SAppaRao Puli } 415e44e3d8SAppaRao Puli } 425e44e3d8SAppaRao Puli deleteSubscription(crow::sse_socket::Connection & conn)435e44e3d8SAppaRao Puliinline void deleteSubscription(crow::sse_socket::Connection& conn) 445e44e3d8SAppaRao Puli { 455e44e3d8SAppaRao Puli redfish::EventServiceManager::getInstance(&conn.getIoContext()) 465e44e3d8SAppaRao Puli .deleteSseSubscription(conn); 475e44e3d8SAppaRao Puli } 485e44e3d8SAppaRao Puli requestRoutesEventServiceSse(App & app)495e44e3d8SAppaRao Puliinline void requestRoutesEventServiceSse(App& app) 505e44e3d8SAppaRao Puli { 515e44e3d8SAppaRao Puli // Note, this endpoint is given the same privilege level as creating a 525e44e3d8SAppaRao Puli // subscription, because functionally, that's the operation being done 535e44e3d8SAppaRao Puli BMCWEB_ROUTE(app, "/redfish/v1/EventService/SSE") 545e44e3d8SAppaRao Puli .privileges(redfish::privileges::postEventDestinationCollection) 555e44e3d8SAppaRao Puli .serverSentEvent() 565e44e3d8SAppaRao Puli .onopen(createSubscription) 575e44e3d8SAppaRao Puli .onclose(deleteSubscription); 585e44e3d8SAppaRao Puli } 595e44e3d8SAppaRao Puli } // namespace redfish 60