@@ -185,3 +185,37 @@ func (h *AlertHandler) CountOpenAlerts(c *gin.Context) {
185185 // Java returns bare Long — match that contract.
186186 c .JSON (http .StatusOK , resp .Count )
187187}
188+
189+ // @Summary List echoes of an alert
190+ // @Description Returns the child alerts (parentId == :id) of a parent alert, paginated and sorted.
191+ // @Tags Alerts
192+ // @Security BearerAuth
193+ // @Produce json
194+ // @Param id path string true "Parent alert id"
195+ // @Param page query int false "Page number (1-based, default 1)"
196+ // @Param size query int false "Page size (default 20, max 100)"
197+ // @Param sortBy query string false "Sort field (default @timestamp)"
198+ // @Param sortOrder query string false "Sort order: asc|desc (default desc)"
199+ // @Success 200 {array} domain.UtmAlert
200+ // @Header 200 {string} X-Total-Count "Total matching echoes"
201+ // @Failure 400 {object} map[string]string
202+ // @Failure 500 {object} map[string]string
203+ // @Router /utm-alerts/{id}/echoes [get]
204+ func (h * AlertHandler ) ListEchoes (c * gin.Context ) {
205+ parentID := c .Param ("id" )
206+ if parentID == "" {
207+ c .JSON (http .StatusBadRequest , gin.H {"error" : "missing alert id" })
208+ return
209+ }
210+ page := queryInt (c , "page" , 1 )
211+ size := queryInt (c , "size" , 20 )
212+ sortBy := c .Query ("sortBy" )
213+ sortOrder := c .DefaultQuery ("sortOrder" , "desc" )
214+
215+ items , total , err := h .usecase .ListEchoes (c .Request .Context (), parentID , page , size , sortBy , sortOrder )
216+ if err != nil {
217+ writeAlertError (c , err )
218+ return
219+ }
220+ writePagedArray (c , items , total )
221+ }
0 commit comments