From 55bd1272546b10886c72c6f8ac64f1e4e768f2cc Mon Sep 17 00:00:00 2001 From: Bram Date: Fri, 20 Mar 2026 14:05:29 +0100 Subject: [PATCH] Add export / import routes --- internal/file/handlers.go | 28 ++++++++++++++++++++++++++++ internal/file/model.go | 12 ++++++++++++ internal/file/routes.go | 15 +++++++++------ internal/file/service.go | 37 +++++++++++++++++++++++++++++++++++++ 4 files changed, 86 insertions(+), 6 deletions(-) diff --git a/internal/file/handlers.go b/internal/file/handlers.go index e86e6c7..5dd331e 100644 --- a/internal/file/handlers.go +++ b/internal/file/handlers.go @@ -142,3 +142,31 @@ func (h *Handler) AdminForceDelete(c *gin.Context) { c.Redirect(301, "/admin") } + +func (h *Handler) Import(c *gin.Context) { + var records []ImportFileRecord + + if err := c.ShouldBindJSON(&records); err != nil { + c.JSON(400, gin.H{"error": "invalid JSON"}) + return + } + + if err := h.service.ImportFiles(records); err != nil { + c.JSON(500, gin.H{"error": err.Error()}) + return + } + + c.JSON(200, gin.H{ + "imported": len(records), + }) +} + +func (h *Handler) Export(c *gin.Context) { + records, err := h.service.GetAllFiles() + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) + return + } + + c.JSON(http.StatusOK, records) +} diff --git a/internal/file/model.go b/internal/file/model.go index d33545d..ddcf87c 100644 --- a/internal/file/model.go +++ b/internal/file/model.go @@ -16,3 +16,15 @@ type FileRecord struct { Deleted bool `json:"deleted"` CreatedAt time.Time `json:"created_at"` } + +type ImportFileRecord struct { + ID string `json:"id"` + DeletionID string `json:"deletion_id"` + Filename string `json:"filename"` + ExpiresAt time.Time `json:"expires_at"` + DeleteAfterDownload bool `json:"delete_after_download"` + Size int64 `json:"size"` + DownloadCount int `json:"download_count"` + Deleted bool `json:"deleted"` + CreatedAt time.Time `json:"created_at"` +} diff --git a/internal/file/routes.go b/internal/file/routes.go index da16e82..fd37202 100644 --- a/internal/file/routes.go +++ b/internal/file/routes.go @@ -14,15 +14,18 @@ func RegisterRoutes(r *gin.RouterGroup, h *Handler) { files.GET("/delete/:del_id", h.Delete) - adminRoutes := files.Group("/") + adminRoutes := files.Group("/admin") adminRoutes.Use(middleware.AuthMiddleware()) adminRoutes.Use(middleware.RequireRole("admin")) - adminRoutes.GET("/admin", h.AdminList) - adminRoutes.GET("/admin/:id", h.AdminGet) + adminRoutes.GET("/", h.AdminList) + adminRoutes.GET("/:id", h.AdminGet) - adminRoutes.GET("/admin/download/:id", h.AdminGet) + adminRoutes.GET("/download/:id", h.AdminGet) - adminRoutes.GET("/admin/delete/:id", h.AdminDelete) - adminRoutes.GET("/admin/delete/fr/:id", h.AdminForceDelete) + adminRoutes.GET("/delete/:id", h.AdminDelete) + adminRoutes.GET("/delete/fr/:id", h.AdminForceDelete) + + adminRoutes.POST("/import", h.Import) + adminRoutes.GET("/export", h.Export) } diff --git a/internal/file/service.go b/internal/file/service.go index 5ae8fd2..433f196 100644 --- a/internal/file/service.go +++ b/internal/file/service.go @@ -142,3 +142,40 @@ func (s *Service) GetFileByID(id string) (*FileRecord, error) { func (s *Service) GetFileByDeletionID(delID string) (*FileRecord, error) { return s.repo.GetByDeletionID(delID) } + +func (s *Service) ImportFiles(records []ImportFileRecord) error { + for _, r := range records { + + existing, _ := s.repo.GetByID(r.ID) + if existing != nil { + continue + } + + record := &FileRecord{ + ID: r.ID, + DeletionID: r.DeletionID, + Filename: r.Filename, + Path: s.buildPath(r.ID, r.Filename), + ExpiresAt: r.ExpiresAt, + DeleteAfterDownload: r.DeleteAfterDownload, + Size: r.Size, + DownloadCount: r.DownloadCount, + Deleted: r.Deleted, + CreatedAt: r.CreatedAt, + } + + if err := s.repo.Create(record); err != nil { + return err + } + } + + return nil +} + +func (s *Service) buildPath(id, filename string) string { + return s.storageDir + "/" + id + "/" + filename +} + +func (s *Service) GetAllFiles() ([]FileRecord, error) { + return s.repo.GetAll() +}