summaryrefslogtreecommitdiff
path: root/player-server/internal/service/admin.go
blob: 9b30cc3f2bb4ff82bbfb0bc231f0d98ca1bce8a1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package service

import (
	"context"
	"log/slog"

	"codeberg.org/snonux/player/internal/auth"
	"codeberg.org/snonux/player/internal/clock"
	"codeberg.org/snonux/player/internal/model"
	"codeberg.org/snonux/player/internal/repository"
	"codeberg.org/snonux/player/internal/scanner"
)

// Compile-time check that *adminService satisfies AdminService.
var _ AdminService = (*adminService)(nil)

// adminService is the concrete implementation of AdminService.
// It composes role-focused sub-services to satisfy SRP.
type adminService struct {
	*trashService
	*scanService
	*userAdminService
	*permissionAdminService
}

// NewAdminService creates a concrete AdminService.
func NewAdminService(store repository.AdminServiceStore, clk clock.Clock, hasher auth.Hasher, sc scanner.Scanner, mediaRoot string, appCtx context.Context) *adminService {
	return NewAdminServiceWithLogger(store, clk, hasher, sc, mediaRoot, appCtx, slog.Default())
}

// NewAdminServiceWithLogger creates a concrete AdminService with an injected logger.
func NewAdminServiceWithLogger(store repository.AdminServiceStore, clk clock.Clock, hasher auth.Hasher, sc scanner.Scanner, mediaRoot string, appCtx context.Context, logger *slog.Logger) *adminService {
	return &adminService{
		trashService:           NewTrashService(store),
		scanService:            NewScanService(appCtx, sc, mediaRoot, clk, logger),
		userAdminService:       NewUserAdminService(store, clk, hasher),
		permissionAdminService: NewPermissionAdminService(store, clk),
	}
}

// ListTrash delegates to trashService.
func (s *adminService) ListTrash(ctx context.Context) ([]model.Media, error) {
	return s.trashService.ListTrash(ctx)
}

// TriggerRescan delegates to scanService.
func (s *adminService) TriggerRescan(ctx context.Context) error {
	return s.scanService.TriggerRescan(ctx)
}

// ScanProgress delegates to scanService.
func (s *adminService) ScanProgress(ctx context.Context) model.ScanProgress {
	return s.scanService.ScanProgress(ctx)
}

// ListUsers delegates to userAdminService.
func (s *adminService) ListUsers(ctx context.Context) ([]model.User, error) {
	return s.userAdminService.ListUsers(ctx)
}

// CreateUser delegates to userAdminService.
func (s *adminService) CreateUser(ctx context.Context, username, password string, isAdmin bool) (*model.User, error) {
	return s.userAdminService.CreateUser(ctx, username, password, isAdmin)
}

// DeleteUser delegates to userAdminService.
func (s *adminService) DeleteUser(ctx context.Context, callerID, id int64) error {
	return s.userAdminService.DeleteUser(ctx, callerID, id)
}

// ListPermissions delegates to permissionAdminService.
func (s *adminService) ListPermissions(ctx context.Context) (*PermissionsMatrix, error) {
	return s.permissionAdminService.ListPermissions(ctx)
}

// GrantPermission delegates to permissionAdminService.
func (s *adminService) GrantPermission(ctx context.Context, setID, userID int64, role model.Role) error {
	return s.permissionAdminService.GrantPermission(ctx, setID, userID, role)
}

// RevokePermission delegates to permissionAdminService.
func (s *adminService) RevokePermission(ctx context.Context, setID, userID int64) error {
	return s.permissionAdminService.RevokePermission(ctx, setID, userID)
}