events.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. package controllers
  2. import (
  3. "net/http"
  4. "strconv"
  5. "time"
  6. "github.com/gorilla/mux"
  7. "github.com/gravitl/netmaker/db"
  8. "github.com/gravitl/netmaker/logic"
  9. "github.com/gravitl/netmaker/models"
  10. "github.com/gravitl/netmaker/schema"
  11. )
  12. func EventHandlers(r *mux.Router) {
  13. r.HandleFunc("/api/v1/network/activity", logic.SecurityCheck(true, http.HandlerFunc(listNetworkActivity))).Methods(http.MethodGet)
  14. r.HandleFunc("/api/v1/user/activity", logic.SecurityCheck(true, http.HandlerFunc(listUserActivity))).Methods(http.MethodGet)
  15. r.HandleFunc("/api/v1/activity", logic.SecurityCheck(true, http.HandlerFunc(listActivity))).Methods(http.MethodGet)
  16. }
  17. // @Summary list activity.
  18. // @Router /api/v1/activity [get]
  19. // @Tags Activity
  20. // @Param network_id query string true "network_id required to get the network events"
  21. // @Success 200 {object} models.ReturnSuccessResponseWithJson
  22. // @Failure 500 {object} models.ErrorResponse
  23. func listNetworkActivity(w http.ResponseWriter, r *http.Request) {
  24. netID := r.URL.Query().Get("network_id")
  25. // Parse query parameters with defaults
  26. if netID == "" {
  27. logic.ReturnErrorResponse(w, r, models.ErrorResponse{
  28. Code: http.StatusBadRequest,
  29. Message: "network_id param is missing",
  30. })
  31. return
  32. }
  33. fromDateStr := r.URL.Query().Get("from_date")
  34. toDateStr := r.URL.Query().Get("to_date")
  35. var err error
  36. var fromDate, toDate time.Time
  37. if fromDateStr != "" && toDateStr != "" {
  38. fromDate, err = time.Parse(time.RFC3339, fromDateStr)
  39. if err != nil {
  40. logic.ReturnErrorResponse(w, r, models.ErrorResponse{
  41. Code: http.StatusBadRequest,
  42. Message: err.Error(),
  43. })
  44. return
  45. }
  46. toDate, err = time.Parse(time.RFC3339, toDateStr)
  47. if err != nil {
  48. logic.ReturnErrorResponse(w, r, models.ErrorResponse{
  49. Code: http.StatusBadRequest,
  50. Message: err.Error(),
  51. })
  52. return
  53. }
  54. }
  55. page, _ := strconv.Atoi(r.URL.Query().Get("page"))
  56. pageSize, _ := strconv.Atoi(r.URL.Query().Get("per_page"))
  57. ctx := db.WithContext(r.Context())
  58. netActivity, err := (&schema.Event{NetworkID: models.NetworkID(netID)}).ListByNetwork(db.SetPagination(ctx, page, pageSize), fromDate, toDate)
  59. if err != nil {
  60. logic.ReturnErrorResponse(w, r, models.ErrorResponse{
  61. Code: http.StatusInternalServerError,
  62. Message: err.Error(),
  63. })
  64. return
  65. }
  66. logic.ReturnSuccessResponseWithJson(w, r, netActivity, "successfully fetched network activity")
  67. }
  68. // @Summary list activity.
  69. // @Router /api/v1/activity [get]
  70. // @Tags Activity
  71. // @Param network_id query string true "network_id required to get the network events"
  72. // @Success 200 {object} models.ReturnSuccessResponseWithJson
  73. // @Failure 500 {object} models.ErrorResponse
  74. func listUserActivity(w http.ResponseWriter, r *http.Request) {
  75. username := r.URL.Query().Get("username")
  76. // Parse query parameters with defaults
  77. if username == "" {
  78. logic.ReturnErrorResponse(w, r, models.ErrorResponse{
  79. Code: http.StatusBadRequest,
  80. Message: "username param is missing",
  81. })
  82. return
  83. }
  84. fromDateStr := r.URL.Query().Get("from_date")
  85. toDateStr := r.URL.Query().Get("to_date")
  86. var err error
  87. var fromDate, toDate time.Time
  88. if fromDateStr != "" && toDateStr != "" {
  89. fromDate, err = time.Parse(time.RFC3339, fromDateStr)
  90. if err != nil {
  91. logic.ReturnErrorResponse(w, r, models.ErrorResponse{
  92. Code: http.StatusBadRequest,
  93. Message: err.Error(),
  94. })
  95. return
  96. }
  97. toDate, err = time.Parse(time.RFC3339, toDateStr)
  98. if err != nil {
  99. logic.ReturnErrorResponse(w, r, models.ErrorResponse{
  100. Code: http.StatusBadRequest,
  101. Message: err.Error(),
  102. })
  103. return
  104. }
  105. }
  106. page, _ := strconv.Atoi(r.URL.Query().Get("page"))
  107. pageSize, _ := strconv.Atoi(r.URL.Query().Get("per_page"))
  108. ctx := db.WithContext(r.Context())
  109. userActivity, err := (&schema.Event{TriggeredBy: username}).ListByUser(db.SetPagination(ctx, page, pageSize), fromDate, toDate)
  110. if err != nil {
  111. logic.ReturnErrorResponse(w, r, models.ErrorResponse{
  112. Code: http.StatusInternalServerError,
  113. Message: err.Error(),
  114. })
  115. return
  116. }
  117. logic.ReturnSuccessResponseWithJson(w, r, userActivity, "successfully fetched user activity "+username)
  118. }
  119. // @Summary list activity.
  120. // @Router /api/v1/activity [get]
  121. // @Tags Activity
  122. // @Success 200 {object} models.ReturnSuccessResponseWithJson
  123. // @Failure 500 {object} models.ErrorResponse
  124. func listActivity(w http.ResponseWriter, r *http.Request) {
  125. username := r.URL.Query().Get("username")
  126. network := r.URL.Query().Get("network_id")
  127. page, _ := strconv.Atoi(r.URL.Query().Get("page"))
  128. pageSize, _ := strconv.Atoi(r.URL.Query().Get("per_page"))
  129. ctx := db.WithContext(r.Context())
  130. var err error
  131. fromDateStr := r.URL.Query().Get("from_date")
  132. toDateStr := r.URL.Query().Get("to_date")
  133. var fromDate, toDate time.Time
  134. if fromDateStr != "" && toDateStr != "" {
  135. fromDate, err = time.Parse(time.RFC3339, fromDateStr)
  136. if err != nil {
  137. logic.ReturnErrorResponse(w, r, models.ErrorResponse{
  138. Code: http.StatusBadRequest,
  139. Message: err.Error(),
  140. })
  141. return
  142. }
  143. toDate, err = time.Parse(time.RFC3339, toDateStr)
  144. if err != nil {
  145. logic.ReturnErrorResponse(w, r, models.ErrorResponse{
  146. Code: http.StatusBadRequest,
  147. Message: err.Error(),
  148. })
  149. return
  150. }
  151. }
  152. var events []schema.Event
  153. e := &schema.Event{TriggeredBy: username, NetworkID: models.NetworkID(network)}
  154. if username != "" && network != "" {
  155. events, err = e.ListByUserAndNetwork(db.SetPagination(ctx, page, pageSize), fromDate, toDate)
  156. } else if username != "" && network == "" {
  157. events, err = e.ListByUser(db.SetPagination(ctx, page, pageSize), fromDate, toDate)
  158. } else if username == "" && network != "" {
  159. events, err = e.ListByNetwork(db.SetPagination(ctx, page, pageSize), fromDate, toDate)
  160. } else {
  161. events, err = e.List(db.SetPagination(ctx, page, pageSize), fromDate, toDate)
  162. }
  163. if err != nil {
  164. logic.ReturnErrorResponse(w, r, models.ErrorResponse{
  165. Code: http.StatusInternalServerError,
  166. Message: err.Error(),
  167. })
  168. return
  169. }
  170. logic.ReturnSuccessResponseWithJson(w, r, events, "successfully fetched all events ")
  171. }