forked from baron/baron-sso
62 lines
1.6 KiB
Go
62 lines
1.6 KiB
Go
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})
|
|
}
|