admin_pipeline_handler.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. package handlers
  2. import (
  3. "io"
  4. "net/http"
  5. "strconv"
  6. "strings"
  7. "cmr-backend/internal/apperr"
  8. "cmr-backend/internal/httpx"
  9. "cmr-backend/internal/service"
  10. )
  11. type AdminPipelineHandler struct {
  12. service *service.AdminPipelineService
  13. }
  14. func NewAdminPipelineHandler(service *service.AdminPipelineService) *AdminPipelineHandler {
  15. return &AdminPipelineHandler{service: service}
  16. }
  17. func (h *AdminPipelineHandler) GetEventPipeline(w http.ResponseWriter, r *http.Request) {
  18. limit := 20
  19. if raw := r.URL.Query().Get("limit"); raw != "" {
  20. if parsed, err := strconv.Atoi(raw); err == nil {
  21. limit = parsed
  22. }
  23. }
  24. result, err := h.service.GetEventPipeline(r.Context(), r.PathValue("eventPublicID"), limit)
  25. if err != nil {
  26. httpx.WriteError(w, err)
  27. return
  28. }
  29. httpx.WriteJSON(w, http.StatusOK, map[string]any{"data": result})
  30. }
  31. func (h *AdminPipelineHandler) BuildSource(w http.ResponseWriter, r *http.Request) {
  32. result, err := h.service.BuildSource(r.Context(), r.PathValue("sourceID"))
  33. if err != nil {
  34. httpx.WriteError(w, err)
  35. return
  36. }
  37. httpx.WriteJSON(w, http.StatusOK, map[string]any{"data": result})
  38. }
  39. func (h *AdminPipelineHandler) GetBuild(w http.ResponseWriter, r *http.Request) {
  40. result, err := h.service.GetBuild(r.Context(), r.PathValue("buildID"))
  41. if err != nil {
  42. httpx.WriteError(w, err)
  43. return
  44. }
  45. httpx.WriteJSON(w, http.StatusOK, map[string]any{"data": result})
  46. }
  47. func (h *AdminPipelineHandler) PublishBuild(w http.ResponseWriter, r *http.Request) {
  48. var req service.AdminPublishBuildInput
  49. if r.Body != nil {
  50. raw, err := io.ReadAll(r.Body)
  51. if err != nil {
  52. httpx.WriteError(w, apperr.New(http.StatusBadRequest, "invalid_json", "failed to read request body: "+err.Error()))
  53. return
  54. }
  55. if len(raw) > 0 {
  56. r.Body = io.NopCloser(strings.NewReader(string(raw)))
  57. if err := httpx.DecodeJSON(r, &req); err != nil {
  58. httpx.WriteError(w, apperr.New(http.StatusBadRequest, "invalid_json", "invalid request body: "+err.Error()))
  59. return
  60. }
  61. }
  62. }
  63. result, err := h.service.PublishBuild(r.Context(), r.PathValue("buildID"), req)
  64. if err != nil {
  65. httpx.WriteError(w, err)
  66. return
  67. }
  68. httpx.WriteJSON(w, http.StatusOK, map[string]any{"data": result})
  69. }
  70. func (h *AdminPipelineHandler) GetRelease(w http.ResponseWriter, r *http.Request) {
  71. result, err := h.service.GetRelease(r.Context(), r.PathValue("releasePublicID"))
  72. if err != nil {
  73. httpx.WriteError(w, err)
  74. return
  75. }
  76. httpx.WriteJSON(w, http.StatusOK, map[string]any{"data": result})
  77. }
  78. func (h *AdminPipelineHandler) BindReleaseRuntime(w http.ResponseWriter, r *http.Request) {
  79. var req service.AdminBindReleaseRuntimeInput
  80. if err := httpx.DecodeJSON(r, &req); err != nil {
  81. httpx.WriteError(w, apperr.New(http.StatusBadRequest, "invalid_json", "invalid request body: "+err.Error()))
  82. return
  83. }
  84. result, err := h.service.BindReleaseRuntime(r.Context(), r.PathValue("releasePublicID"), req)
  85. if err != nil {
  86. httpx.WriteError(w, err)
  87. return
  88. }
  89. httpx.WriteJSON(w, http.StatusOK, map[string]any{"data": result})
  90. }
  91. func (h *AdminPipelineHandler) RollbackRelease(w http.ResponseWriter, r *http.Request) {
  92. var req service.AdminRollbackReleaseInput
  93. if err := httpx.DecodeJSON(r, &req); err != nil {
  94. httpx.WriteError(w, apperr.New(http.StatusBadRequest, "invalid_json", "invalid request body: "+err.Error()))
  95. return
  96. }
  97. result, err := h.service.RollbackRelease(r.Context(), r.PathValue("eventPublicID"), req)
  98. if err != nil {
  99. httpx.WriteError(w, err)
  100. return
  101. }
  102. httpx.WriteJSON(w, http.StatusOK, map[string]any{"data": result})
  103. }