Files
silo-server/internal/requests/types.go
T
Silo Server Migration 98ea57ead8 chore: add planning docs and requests updates
- Add plans for date-named episodes and Jellyfin autoscan compat
- Update requests handlers, service, and UI hooks
- Remove Makefile.local.example
2026-05-25 12:07:50 -04:00

292 lines
9.8 KiB
Go

package requests
import (
"time"
)
type MediaType string
const (
MediaTypeMovie MediaType = "movie"
MediaTypeSeries MediaType = "series"
MediaTypeAll MediaType = "all"
)
type Status string
const (
StatusPending Status = "pending"
StatusApproved Status = "approved"
StatusQueued Status = "queued"
StatusDownloading Status = "downloading"
StatusCompleted Status = "completed"
)
type Outcome string
const (
OutcomeActive Outcome = "active"
OutcomeDeclined Outcome = "declined"
OutcomeCancelled Outcome = "cancelled"
OutcomeFailed Outcome = "failed"
)
type Availability string
const (
AvailabilityMissing Availability = "missing"
AvailabilityAvailable Availability = "available"
)
type LimitMode string
const (
LimitModeInherit LimitMode = "inherit"
LimitModeCustom LimitMode = "custom"
LimitModeUnlimited LimitMode = "unlimited"
LimitModeBlocked LimitMode = "blocked"
)
type ApprovalMode string
const (
ApprovalModeInherit ApprovalMode = "inherit"
ApprovalModeManual ApprovalMode = "manual"
ApprovalModeAuto ApprovalMode = "auto"
ApprovalModeBlocked ApprovalMode = "blocked"
)
type Viewer struct {
UserID int
ProfileID string
IsAdmin bool
}
type Settings struct {
RequestsEnabled bool `json:"requests_enabled"`
GlobalMaxRequests int `json:"global_max_requests"`
GlobalWindowDays int `json:"global_window_days"`
GlobalAutoApprovalEnabled bool `json:"global_auto_approval_enabled"`
UpdatedAt time.Time `json:"updated_at"`
}
type FeatureStatus struct {
RequestsEnabled bool `json:"requests_enabled"`
}
type UserLimit struct {
UserID int `json:"user_id"`
LimitMode LimitMode `json:"limit_mode"`
MaxRequests *int `json:"max_requests,omitempty"`
WindowDays *int `json:"window_days,omitempty"`
ApprovalMode ApprovalMode `json:"approval_mode"`
UpdatedAt time.Time `json:"updated_at"`
}
type EffectivePolicy struct {
RequestsEnabled bool
MaxRequests int
WindowDays int
Unlimited bool
Blocked bool
AutoApprove bool
Used int
Remaining int
WindowStart time.Time
}
type Request struct {
ID string `json:"id"`
Provider string `json:"provider"`
MediaType MediaType `json:"media_type"`
TMDBID int `json:"tmdb_id"`
TVDBID *int `json:"tvdb_id,omitempty"`
IMDbID string `json:"imdb_id,omitempty"`
Title string `json:"title"`
Year *int `json:"year,omitempty"`
Overview string `json:"overview,omitempty"`
PosterPath string `json:"poster_path,omitempty"`
BackdropPath string `json:"backdrop_path,omitempty"`
Status Status `json:"status"`
Outcome Outcome `json:"outcome"`
RequestedByUserID int `json:"requested_by_user_id,omitempty"`
RequestedByProfileID string `json:"requested_by_profile_id,omitempty"`
IntegrationKind string `json:"integration_kind,omitempty"`
ExternalID string `json:"external_id,omitempty"`
ExternalStatus string `json:"external_status,omitempty"`
LastError string `json:"last_error,omitempty"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
ApprovedAt *time.Time `json:"approved_at,omitempty"`
CompletedAt *time.Time `json:"completed_at,omitempty"`
}
type RequestEvent struct {
ID int64 `json:"id"`
RequestID string `json:"request_id"`
EventType string `json:"event_type"`
ActorUserID *int `json:"actor_user_id,omitempty"`
ActorProfileID string `json:"actor_profile_id,omitempty"`
Message string `json:"message,omitempty"`
CreatedAt time.Time `json:"created_at"`
}
type RequestState struct {
Status Status `json:"status,omitempty"`
Requestable bool `json:"requestable"`
Reason string `json:"reason,omitempty"`
RequestID string `json:"request_id,omitempty"`
}
type MediaResult struct {
MediaType MediaType `json:"media_type"`
TMDBID int `json:"tmdb_id"`
Title string `json:"title"`
Year int `json:"year,omitempty"`
Overview string `json:"overview,omitempty"`
PosterPath string `json:"poster_path,omitempty"`
BackdropPath string `json:"backdrop_path,omitempty"`
ReleaseDate string `json:"release_date,omitempty"`
Popularity float64 `json:"popularity,omitempty"`
VoteAverage float64 `json:"vote_average,omitempty"`
Availability Availability `json:"availability"`
Request RequestState `json:"request"`
}
type MediaPage struct {
Page int `json:"page"`
TotalPages int `json:"total_pages"`
TotalResults int `json:"total_results"`
Results []MediaResult `json:"results"`
}
type MediaCastMember struct {
Name string `json:"name"`
Character string `json:"character,omitempty"`
ProfilePath string `json:"profile_path,omitempty"`
Order int `json:"order"`
}
type MediaDetail struct {
MediaType MediaType `json:"media_type"`
TMDBID int `json:"tmdb_id"`
IMDbID string `json:"imdb_id,omitempty"`
TVDBID *int `json:"tvdb_id,omitempty"`
Title string `json:"title"`
OriginalTitle string `json:"original_title,omitempty"`
Tagline string `json:"tagline,omitempty"`
Overview string `json:"overview,omitempty"`
PosterPath string `json:"poster_path,omitempty"`
BackdropPath string `json:"backdrop_path,omitempty"`
ReleaseDate string `json:"release_date,omitempty"`
Year int `json:"year,omitempty"`
Runtime int `json:"runtime,omitempty"`
Genres []string `json:"genres,omitempty"`
VoteAverage float64 `json:"vote_average,omitempty"`
VoteCount int `json:"vote_count,omitempty"`
Status string `json:"status,omitempty"`
Homepage string `json:"homepage,omitempty"`
ContentRating string `json:"content_rating,omitempty"`
ProductionCompanies []string `json:"production_companies,omitempty"`
NumberOfSeasons int `json:"number_of_seasons,omitempty"`
NumberOfEpisodes int `json:"number_of_episodes,omitempty"`
FirstAirDate string `json:"first_air_date,omitempty"`
LastAirDate string `json:"last_air_date,omitempty"`
Networks []string `json:"networks,omitempty"`
Cast []MediaCastMember `json:"cast,omitempty"`
Director string `json:"director,omitempty"`
Creators []string `json:"creators,omitempty"`
Recommendations []MediaResult `json:"recommendations,omitempty"`
Availability Availability `json:"availability"`
Request RequestState `json:"request"`
}
type CreateRequestInput struct {
MediaType MediaType `json:"media_type"`
TMDBID int `json:"tmdb_id"`
TVDBID *int `json:"tvdb_id,omitempty"`
IMDbID string `json:"imdb_id,omitempty"`
Title string `json:"title"`
Year *int `json:"year,omitempty"`
Overview string `json:"overview,omitempty"`
PosterPath string `json:"poster_path,omitempty"`
BackdropPath string `json:"backdrop_path,omitempty"`
}
type ListFilter struct {
Status Status
Outcome Outcome
Limit int
Offset int
}
type Integration struct {
Kind string `json:"kind"`
Enabled bool `json:"enabled"`
BaseURL string `json:"base_url"`
APIKeyRef string `json:"api_key_ref,omitempty"`
RootFolder string `json:"root_folder"`
QualityProfileID *int `json:"quality_profile_id,omitempty"`
Tags []int `json:"tags"`
Options map[string]any `json:"options"`
LastCheckAt *time.Time `json:"last_check_at,omitempty"`
LastCheckStatus string `json:"last_check_status,omitempty"`
LastCheckError string `json:"last_check_error,omitempty"`
UpdatedAt time.Time `json:"updated_at"`
}
type IntegrationRootFolder struct {
Path string `json:"path"`
FreeSpace int64 `json:"free_space,omitempty"`
TotalSpace int64 `json:"total_space,omitempty"`
Accessible bool `json:"accessible"`
}
type IntegrationQualityProfile struct {
ID int `json:"id"`
Name string `json:"name"`
}
type IntegrationTag struct {
ID int `json:"id"`
Label string `json:"label"`
}
type IntegrationOptions struct {
Kind string `json:"kind"`
RootFolders []IntegrationRootFolder `json:"root_folders"`
QualityProfiles []IntegrationQualityProfile `json:"quality_profiles"`
Tags []IntegrationTag `json:"tags"`
}
type QueueUpdate struct {
IntegrationKind string
ExternalID string
ExternalStatus string
}
type FulfillmentResult struct {
IntegrationKind string
ExternalID string
ExternalStatus string
}
type FulfillmentStatus struct {
Status Status
Outcome Outcome
IntegrationKind string
ExternalID string
ExternalStatus string
Message string
}
type ReconcileResult struct {
Checked int `json:"checked"`
Submitted int `json:"submitted"`
Downloading int `json:"downloading"`
Completed int `json:"completed"`
Failed int `json:"failed"`
Skipped int `json:"skipped"`
Errors int `json:"errors"`
}