package handler import ( "baron-sso-backend/internal/service" "log/slog" "github.com/gofiber/fiber/v2" ) type OrgChartHandler struct { Service service.OrgChartService } func NewOrgChartHandler(s service.OrgChartService) *OrgChartHandler { return &OrgChartHandler{Service: s} } func (h *OrgChartHandler) ImportOrgChart(c *fiber.Ctx) error { tenantID := c.Params("tenantId") if tenantID == "" { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "tenantId is required"}) } file, err := c.FormFile("file") if err != nil { return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "failed to get file from form"}) } f, err := file.Open() if err != nil { return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": "failed to open file"}) } defer f.Close() progressID := c.Query("progressId") result, err := h.Service.ImportOrgChart(c.Context(), tenantID, f, file.Filename, progressID) if err != nil { slog.Error("Failed to import org chart", "error", err, "tenantID", tenantID, "filename", file.Filename) // If we have a result even with error, return it if result != nil { return c.Status(fiber.StatusOK).JSON(fiber.Map{ "message": "Import completed with errors", "data": result, }) } return errorJSON(c, fiber.StatusInternalServerError, err.Error()) } return c.JSON(fiber.Map{ "message": "Import completed", "data": result, }) } func (h *OrgChartHandler) GetImportProgress(c *fiber.Ctx) error { pid := c.Params("progressId") if val, ok := service.ImportProgressCache.Load(pid); ok { return c.JSON(val) } return c.JSON(fiber.Map{"current": 0, "total": 0}) }