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