Files
ReSendit/internal/file/repository.go
root 73b67ab61d Add reinstate feature for deleted files
- Add MarkNotDeleted method to repository
- Add ReinstateFile method to service
- Add AdminReinstate handler
- Add /reinstate/:id route
- Add Reinstate button in admin menu for deleted files
2026-04-15 16:35:08 +02:00

108 lines
2.3 KiB
Go

package file
import (
"errors"
"gorm.io/gorm"
)
var ErrFileNotFound = errors.New("file not found")
type Repository struct {
db *gorm.DB
}
func NewRepository(db *gorm.DB) *Repository {
return &Repository{db: db}
}
func (r *Repository) Create(f *FileRecord) error {
return r.db.Create(f).Error
}
func (r *Repository) GetAll() ([]FileRecord, error) {
var files []FileRecord
if err := r.db.Find(&files).Error; err != nil {
return nil, err
}
return files, nil
}
func (r *Repository) GetByID(id string) (*FileRecord, error) {
var f FileRecord
if err := r.db.First(&f, "id = ?", id).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, ErrFileNotFound
}
return nil, err
}
return &f, nil
}
func (r *Repository) GetPaginated(limit, offset int) ([]FileRecord, int, error) {
var files []FileRecord
var count int64
if err := r.db.Model(&FileRecord{}).Count(&count).Error; err != nil {
return nil, 0, err
}
if err := r.db.
Order("created_at DESC").
Limit(limit).
Offset(offset).
Find(&files).Error; err != nil {
return nil, 0, err
}
return files, int(count), nil
}
func (r *Repository) GetByDeletionID(delID string) (*FileRecord, error) {
var f FileRecord
if err := r.db.First(&f, "deletion_id = ?", delID).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, ErrFileNotFound
}
return nil, err
}
return &f, nil
}
func (r *Repository) Update(f *FileRecord) error {
return r.db.Save(f).Error
}
func (r *Repository) GetFileByViewID(viewID string) (*FileRecord, error) {
var f FileRecord
if err := r.db.First(&f, "view_id = ?", viewID).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, ErrFileNotFound
}
return nil, err
}
return &f, nil
}
func (r *Repository) IncrementDownload(f *FileRecord) error {
f.DownloadCount++
return r.db.Save(f).Error
}
// MarkDeleted Soft delete the record by setting Deleted to true
func (r *Repository) MarkDeleted(f *FileRecord) error {
f.Deleted = true
return r.db.Save(f).Error
}
// MarkNotDeleted Restore a deleted record by setting Deleted to false
func (r *Repository) MarkNotDeleted(f *FileRecord) error {
f.Deleted = false
return r.db.Save(f).Error
}
// Delete Permanently delete the record from the database
func (r *Repository) Delete(f *FileRecord) error {
return r.db.Delete(f).Error
}