mirror of
https://github.com/navidrome/navidrome.git
synced 2025-07-14 15:41:18 +03:00
* feat(scanner): add LastScanError tracking to scanner status - Introduced LastScanErrorKey constant for error tracking. - Updated StatusInfo struct to include LastError field. - Modified scanner logic to store and retrieve last scan error. - Enhanced ScanStatus response to include error information. - Updated UI components to display last scan error when applicable. - Added tests to verify last scan error functionality. Signed-off-by: Deluan <deluan@navidrome.org> * feat(scanner): enhance scan status with type and elapsed time tracking - Added LastScanTypeKey and LastScanStartTimeKey constants for tracking scan type and start time. - Updated StatusInfo struct to include ScanType and ElapsedTime fields. - Implemented getScanInfo method to retrieve scan type, elapsed time, and last error. - Modified scanner logic to store scan type and start time during scans. - Enhanced ScanStatus response and UI components to display scan type and elapsed time. - Added formatShortDuration utility for better elapsed time representation. - Updated activity reducer to handle new scan status fields. Signed-off-by: Deluan <deluan@navidrome.org> * refactor(tests): consolidate controller status tests into a single file - Removed the old controller_status_test.go file. - Merged relevant tests into the new controller_test.go file for better organization and maintainability. - Ensured all existing test cases for controller status are preserved and functional. Signed-off-by: Deluan <deluan@navidrome.org> * Fix formatting issues * refactor(scanner): update getScanInfo method documentation --------- Signed-off-by: Deluan <deluan@navidrome.org>
85 lines
1.8 KiB
Go
85 lines
1.8 KiB
Go
package events
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"reflect"
|
|
"strings"
|
|
"time"
|
|
"unicode"
|
|
)
|
|
|
|
type eventCtxKey string
|
|
|
|
const broadcastToAllKey eventCtxKey = "broadcastToAll"
|
|
|
|
// BroadcastToAll is a context key that can be used to broadcast an event to all clients
|
|
func BroadcastToAll(ctx context.Context) context.Context {
|
|
return context.WithValue(ctx, broadcastToAllKey, true)
|
|
}
|
|
|
|
type Event interface {
|
|
Name(Event) string
|
|
Data(Event) string
|
|
}
|
|
|
|
type baseEvent struct{}
|
|
|
|
func (e *baseEvent) Name(evt Event) string {
|
|
str := strings.TrimPrefix(reflect.TypeOf(evt).String(), "*events.")
|
|
return str[:0] + string(unicode.ToLower(rune(str[0]))) + str[1:]
|
|
}
|
|
|
|
func (e *baseEvent) Data(evt Event) string {
|
|
data, _ := json.Marshal(evt)
|
|
return string(data)
|
|
}
|
|
|
|
type ScanStatus struct {
|
|
baseEvent
|
|
Scanning bool `json:"scanning"`
|
|
Count int64 `json:"count"`
|
|
FolderCount int64 `json:"folderCount"`
|
|
Error string `json:"error"`
|
|
ScanType string `json:"scanType"`
|
|
ElapsedTime time.Duration `json:"elapsedTime"`
|
|
}
|
|
|
|
type KeepAlive struct {
|
|
baseEvent
|
|
TS int64 `json:"ts"`
|
|
}
|
|
|
|
type ServerStart struct {
|
|
baseEvent
|
|
StartTime time.Time `json:"startTime"`
|
|
Version string `json:"version"`
|
|
}
|
|
|
|
const Any = "*"
|
|
|
|
type RefreshResource struct {
|
|
baseEvent
|
|
resources map[string][]string
|
|
}
|
|
|
|
func (rr *RefreshResource) With(resource string, ids ...string) *RefreshResource {
|
|
if rr.resources == nil {
|
|
rr.resources = make(map[string][]string)
|
|
}
|
|
if len(ids) == 0 {
|
|
rr.resources[resource] = append(rr.resources[resource], Any)
|
|
}
|
|
rr.resources[resource] = append(rr.resources[resource], ids...)
|
|
return rr
|
|
}
|
|
|
|
func (rr *RefreshResource) Data(evt Event) string {
|
|
if rr.resources == nil {
|
|
return `{"*":"*"}`
|
|
}
|
|
r := evt.(*RefreshResource)
|
|
data, _ := json.Marshal(r.resources)
|
|
return string(data)
|
|
}
|