1*5e44e3d8SAppaRao Puli #pragma once
2*5e44e3d8SAppaRao Puli 
3*5e44e3d8SAppaRao Puli #include <app.hpp>
4*5e44e3d8SAppaRao Puli #include <event_service_manager.hpp>
5*5e44e3d8SAppaRao Puli 
6*5e44e3d8SAppaRao Puli namespace redfish
7*5e44e3d8SAppaRao Puli {
8*5e44e3d8SAppaRao Puli 
9*5e44e3d8SAppaRao Puli inline void createSubscription(crow::sse_socket::Connection& conn)
10*5e44e3d8SAppaRao Puli {
11*5e44e3d8SAppaRao Puli     EventServiceManager& manager =
12*5e44e3d8SAppaRao Puli         EventServiceManager::getInstance(&conn.getIoContext());
13*5e44e3d8SAppaRao Puli     if ((manager.getNumberOfSubscriptions() >= maxNoOfSubscriptions) ||
14*5e44e3d8SAppaRao Puli         manager.getNumberOfSSESubscriptions() >= maxNoOfSSESubscriptions)
15*5e44e3d8SAppaRao Puli     {
16*5e44e3d8SAppaRao Puli         BMCWEB_LOG_WARNING << "Max SSE subscriptions reached";
17*5e44e3d8SAppaRao Puli         conn.close("Max SSE subscriptions reached");
18*5e44e3d8SAppaRao Puli         return;
19*5e44e3d8SAppaRao Puli     }
20*5e44e3d8SAppaRao Puli     std::shared_ptr<redfish::Subscription> subValue =
21*5e44e3d8SAppaRao Puli         std::make_shared<redfish::Subscription>(conn);
22*5e44e3d8SAppaRao Puli 
23*5e44e3d8SAppaRao Puli     // GET on this URI means, Its SSE subscriptionType.
24*5e44e3d8SAppaRao Puli     subValue->subscriptionType = redfish::subscriptionTypeSSE;
25*5e44e3d8SAppaRao Puli 
26*5e44e3d8SAppaRao Puli     subValue->protocol = "Redfish";
27*5e44e3d8SAppaRao Puli     subValue->retryPolicy = "TerminateAfterRetries";
28*5e44e3d8SAppaRao Puli     subValue->eventFormatType = "Event";
29*5e44e3d8SAppaRao Puli 
30*5e44e3d8SAppaRao Puli     std::string id = manager.addSubscription(subValue, false);
31*5e44e3d8SAppaRao Puli     if (id.empty())
32*5e44e3d8SAppaRao Puli     {
33*5e44e3d8SAppaRao Puli         conn.close("Internal Error");
34*5e44e3d8SAppaRao Puli     }
35*5e44e3d8SAppaRao Puli }
36*5e44e3d8SAppaRao Puli 
37*5e44e3d8SAppaRao Puli inline void deleteSubscription(crow::sse_socket::Connection& conn)
38*5e44e3d8SAppaRao Puli {
39*5e44e3d8SAppaRao Puli     redfish::EventServiceManager::getInstance(&conn.getIoContext())
40*5e44e3d8SAppaRao Puli         .deleteSseSubscription(conn);
41*5e44e3d8SAppaRao Puli }
42*5e44e3d8SAppaRao Puli 
43*5e44e3d8SAppaRao Puli inline void requestRoutesEventServiceSse(App& app)
44*5e44e3d8SAppaRao Puli {
45*5e44e3d8SAppaRao Puli     // Note, this endpoint is given the same privilege level as creating a
46*5e44e3d8SAppaRao Puli     // subscription, because functionally, that's the operation being done
47*5e44e3d8SAppaRao Puli     BMCWEB_ROUTE(app, "/redfish/v1/EventService/SSE")
48*5e44e3d8SAppaRao Puli         .privileges(redfish::privileges::postEventDestinationCollection)
49*5e44e3d8SAppaRao Puli         .serverSentEvent()
50*5e44e3d8SAppaRao Puli         .onopen(createSubscription)
51*5e44e3d8SAppaRao Puli         .onclose(deleteSubscription);
52*5e44e3d8SAppaRao Puli }
53*5e44e3d8SAppaRao Puli } // namespace redfish
54