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 Puli inline 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 Puli inline 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 Puli inline 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