Files
tm_back/internal/document_scraper/handler.go
T
2026-04-28 16:53:36 +03:30

96 lines
3.3 KiB
Go

package document_scraper
import (
"strconv"
"tm/pkg/logger"
"tm/pkg/response"
"github.com/labstack/echo/v4"
)
// Handler handles HTTP requests for the document scraper API
type Handler struct {
service Service
logger logger.Logger
}
// NewHandler creates a new document scraper handler
func NewHandler(service Service, logger logger.Logger) *Handler {
return &Handler{
service: service,
logger: logger,
}
}
// ListPendingTenders retrieves tenders that need document scraping
// @Summary List pending tenders for document scraping
// @Description Retrieve tenders that have not yet been scraped for documents, including notice ID, title, description, and parsed XML
// @Tags Document-Scraper
// @Produce json
// @Param limit query int false "Number of items per page (default: 20, max: 100)"
// @Param offset query int false "Number of items to skip (default: 0)"
// @Success 200 {object} response.APIResponse{data=DocumentScraperListResponse} "List of pending tenders"
// @Failure 401 {object} response.APIResponse "Invalid or missing API key"
// @Failure 500 {object} response.APIResponse "Internal server error"
// @Security ApiKeyAuth
// @Router /api/v1/scraper/tenders [get]
func (h *Handler) ListPendingTenders(c echo.Context) error {
// Parse pagination parameters
limit, err := strconv.Atoi(c.QueryParam("limit"))
if err != nil || limit <= 0 {
limit = 20
}
if limit > 100 {
limit = 100
}
offset, err := strconv.Atoi(c.QueryParam("offset"))
if err != nil || offset < 0 {
offset = 0
}
tenders, meta, err := h.service.ListPendingTenders(c.Request().Context(), limit, offset)
if err != nil {
h.logger.Error("Failed to list pending tenders", map[string]interface{}{
"error": err.Error(),
})
return response.InternalServerError(c, "Failed to list pending tenders")
}
return response.SuccessWithMeta(c, tenders, meta, "Pending tenders retrieved successfully")
}
// GetTenderByNoticeID retrieves a specific tender by its notice publication ID
// @Summary Get tender by notice ID for document scraping
// @Description Retrieve a specific tender by its notice publication ID, including notice ID, title, description, and parsed XML
// @Tags Document-Scraper
// @Produce json
// @Param notice_id path string true "Notice Publication ID"
// @Success 200 {object} response.APIResponse{data=DocumentScraperTenderResponse} "Tender details"
// @Failure 400 {object} response.APIResponse "Invalid notice ID"
// @Failure 401 {object} response.APIResponse "Invalid or missing API key"
// @Failure 404 {object} response.APIResponse "Tender not found"
// @Failure 500 {object} response.APIResponse "Internal server error"
// @Security ApiKeyAuth
// @Router /api/v1/scraper/tenders/{notice_id} [get]
func (h *Handler) GetTenderByNoticeID(c echo.Context) error {
noticeID := c.Param("notice_id")
if noticeID == "" {
return response.BadRequest(c, "Notice ID is required", "notice_id parameter cannot be empty")
}
tender, err := h.service.GetTenderByNoticeID(c.Request().Context(), noticeID)
if err != nil {
if err.Error() == "tender not found" {
return response.NotFound(c, "Tender not found")
}
h.logger.Error("Failed to get tender by notice ID", map[string]interface{}{
"notice_id": noticeID,
"error": err.Error(),
})
return response.InternalServerError(c, "Failed to get tender")
}
return response.Success(c, tender, "Tender retrieved successfully")
}