package handlers import ( "gitea.d3m0k1d.ru/d3m0k1d/d3m0k1d.ru/backend/internal/logger" "gitea.d3m0k1d.ru/d3m0k1d/d3m0k1d.ru/backend/internal/models" "github.com/gin-gonic/gin" "os" "path/filepath" "strings" ) type StaticHandlers struct { logger *logger.Logger } func NewStaticHandlers() *StaticHandlers { return &StaticHandlers{ logger: logger.New(false), } } // PostStatic godoc // @Summary Upload static content // @Description Upload static content to the server // @Tags static // @Produce json // @Success 200 {object} models.SuccessResponse(data=string) "Static content" // @Failure 500 {object} models.ErrorResponse "Internal server error" // @Router /upload [post] func (h *StaticHandlers) PostStatic(c *gin.Context) { content, err := c.FormFile("file") if err != nil { h.logger.Error("error request: " + err.Error()) models.Error(c, 500, "Internal server error", err.Error()) return } dst := "/data/upload/" + content.Filename if err = c.SaveUploadedFile(content, dst); err != nil { h.logger.Error("error request: " + err.Error()) models.Error(c, 500, "Internal server error", err.Error()) return } models.Success(c, "Static content saved") } // GetStatic godoc // @Summary Get static content // @Description Get static content // @Tags static // @Accept json // @Produce json // @Param file path string true "File name" // @Success 200 {object} models.SuccessResponse{data=string} "Static content" // @Failure 500 {object} models.ErrorResponse "Internal server error" // @Failure 404 {object} models.ErrorResponse "File not found" // @Router /upload/{file} [get] func (h *StaticHandlers) GetStatic(c *gin.Context) { filename := c.Param("file") if filename == "" { models.Error(c, 404, "File not found", "") return } filename = filepath.Clean(filename) if strings.Contains(filename, "..") { models.Error(c, 400, "Invalid file path", "") return } if filepath.IsAbs(filename) { models.Error(c, 400, "Invalid file path", "") return } baseDir := "/data/upload/" fullPath := filepath.Join(baseDir, filename) if !strings.HasPrefix(fullPath, baseDir) { models.Error(c, 400, "Invalid file path", "") return } if _, err := os.Stat(fullPath); os.IsNotExist(err) { models.Error(c, 404, "File not found", "") return } c.File(fullPath) }