Sync from /srv/compose/unified-media-manager

This commit is contained in:
Christopher Mayor
2026-04-24 10:45:19 -07:00
commit 7dbd00e537
132 changed files with 25394 additions and 0 deletions

View File

@@ -0,0 +1,78 @@
package service
import (
"context"
"fmt"
"time"
"github.com/TopherMayor/unified-media-manager/internal/db"
)
type RootFolder struct {
ID int64 `json:"id"`
Path string `json:"path"`
MediaType string `json:"media_type"`
FreeSpace *int64 `json:"free_space,omitempty"`
CreatedAt time.Time `json:"created_at"`
}
type CreateRootFolderRequest struct {
Path string `json:"path"`
MediaType string `json:"media_type"`
}
type RootFolderService struct {
db *db.DB
}
func NewRootFolderService(database *db.DB) *RootFolderService {
return &RootFolderService{db: database}
}
func (s *RootFolderService) List(ctx context.Context) ([]RootFolder, error) {
rows, err := s.db.Pool.Query(ctx,
"SELECT id, path, media_type, free_space, created_at FROM root_folders ORDER BY path")
if err != nil {
return nil, fmt.Errorf("list root folders: %w", err)
}
defer rows.Close()
var folders []RootFolder
for rows.Next() {
var f RootFolder
if err := rows.Scan(&f.ID, &f.Path, &f.MediaType, &f.FreeSpace, &f.CreatedAt); err != nil {
return nil, fmt.Errorf("scan root folder: %w", err)
}
folders = append(folders, f)
}
return folders, nil
}
func (s *RootFolderService) Create(ctx context.Context, req CreateRootFolderRequest) (int64, error) {
if req.Path == "" {
return 0, fmt.Errorf("path is required")
}
if req.MediaType == "" {
return 0, fmt.Errorf("media_type is required")
}
var id int64
err := s.db.Pool.QueryRow(ctx,
"INSERT INTO root_folders (path, media_type, created_at) VALUES ($1, $2, NOW()) RETURNING id",
req.Path, req.MediaType).Scan(&id)
if err != nil {
return 0, fmt.Errorf("create root folder: %w", err)
}
return id, nil
}
func (s *RootFolderService) Delete(ctx context.Context, id int64) error {
tag, err := s.db.Pool.Exec(ctx, "DELETE FROM root_folders WHERE id = $1", id)
if err != nil {
return fmt.Errorf("delete root folder: %w", err)
}
if tag.RowsAffected() == 0 {
return fmt.Errorf("root folder not found")
}
return nil
}