core

package
v0.2.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 13, 2024 License: MIT Imports: 10 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	ErrExpiredTokenLifetime         = errors.New("expired token lifetime")
	ErrExpiredInactiveTokenLifetime = errors.New("expired inactive token lifetime")
	ErrTokenInvalid                 = errors.New("token invalid")

	ErrInvalidUsernameOrPassword   = errors.New("invalid username or password")
	ErrConfirmationPasswordInvalid = errors.New("confirmation password is invalid")

	ErrTwoFactorRequired    = errors.New("two factor auth is required")
	ErrTwoFactorCodeInvalid = errors.New("invalid two factor code provided")

	ErrTwoFactorAuthAlreadyEnabled  = errors.New("two factor auth is already enabled")
	ErrTwoFactorAuthNotEnabled      = errors.New("two factor auth is not enabled")
	ErrTwoFactorAuthSetupNotRunning = errors.New("two factor auth setup not running")
)
View Source
var (
	ErrPaginationInvalidLimit  = errors.New("pagination limit invalid")
	ErrPaginationInvalidOffset = errors.New("pagination offset invalid")
	ErrSortInvalidDirection    = errors.New("sort direction invalid")
)
View Source
var (
	ErrRecordingNotFound = errors.New("recording not found")

	ErrGetRecordingsInvalidStatus = errors.New("get recording status invalid")

	ErrCreateRecordingInvalidEventID = errors.New("recording event id invalid")

	ErrRecordingInvalidTitle     = errors.New("recording invalid title")
	ErrRecordingInvalidChannelID = errors.New("recording invalid channel id")
	ErrRecordingInvalidStartDate = errors.New("recording invalid start date")
	ErrRecordingInvalidEndDate   = errors.New("recording invalid end date")
	ErrRecordingInvalidEventID   = errors.New("recording invalid event id")
)
View Source
var (
	ErrUsernameAlreadyExists = errors.New("username already exists")
	ErrEmailAlreadyExists    = errors.New("email already exists")
)
View Source
var (
	ErrChannelNotFound = errors.New("channel not found")
)
View Source
var (
	ErrEpgEventNotFound = errors.New("epg event not found")
)
View Source
var (
	ErrPiconNotFound = errors.New("picon not found")
)
View Source
var (
	ErrUnexpectedError = errors.New("unexpected error")
)

Functions

func BuildTvheadendDvrUpdateRecordingOpts

func BuildTvheadendDvrUpdateRecordingOpts(
	idnode tvheadend.Idnode,
	opts UpdateRecording,
) (*tvheadend.DvrUpdateRecordingOpts, error)

BuildTvheadendDvrUpdateRecordingOpts builds tvheadend.DvrUpdateRecordingOpts from an existing recording idnode and UpdateRecording.

func MapTvheadendIconUrlToPiconID

func MapTvheadendIconUrlToPiconID(iconUrl string) int

Types

type AuthContext

type AuthContext struct {
	UserID int64

	// SessionID is the session id for authorizations via session tokens.
	SessionID *int64

	// ForwardAuth is true if the request was forwarded from a reverse proxy.
	ForwardAuth bool
}

AuthContext represent the authenticated context for a user and a session.

type Channel

type Channel struct {
	ID      string `json:"id"`
	Enabled bool   `json:"enabled"`
	Name    string `json:"name"`
	Number  int    `json:"number"`
	PiconID int    `json:"piconId"`
}

Channel defines a channel in tvheadend.

func MapTvheadendIdnodeToChannel

func MapTvheadendIdnodeToChannel(idnode tvheadend.Idnode) (*Channel, error)

MapTvheadendIdnodeToChannel maps a tvheadend.Idnode to a Channel.

type ChannelService

type ChannelService interface {
	// GetAll returns a list of channels.
	GetAll(ctx context.Context, params PaginationSortQueryParams) ([]*Channel, error)
	// Get returns a channel by id.
	Get(ctx context.Context, id string) (*Channel, error)
}

ChannelService provides access to channel resources from the tvheadend server.

type Clock

type Clock interface {
	Now() time.Time
}

type CreateRecording

type CreateRecording struct {
	// Title title of the recording.
	Title string `json:"title"`
	// ExtraText optional extraText of the recording.
	ExtraText string `json:"extraText"`
	// ChannelID the channel id for the recording.
	ChannelID string `json:"channelId"`
	// StartAt start date of the recording as unix timestamp.
	StartsAt int64 `json:"startsAt"`
	// EndsAt end date of the recording as unix timestamp.
	EndsAt int64 `json:"endsAt"`
	// Comment optional comment of the recording.
	Comment string `json:"comment"`
	// StartPadding optional padding in minutes to record
	// before the recording starts.
	StartPadding int `json:"startPadding"`
	// EndPadding optional padding in minutes to record
	// after the recording ends.
	EndPadding int `json:"endPadding"`
	// Priority priority of the recording.
	Priority int `json:"priority"`
	// ConfigID configuration id of the dvr config.
	ConfigID string `json:"configId"`
}

CreateRecording recording defines options to manually create a recording timer.

func (*CreateRecording) MapToTvheadendOpts

func (c *CreateRecording) MapToTvheadendOpts() tvheadend.DvrCreateRecordingOpts

MapToTvheadendOpts maps CreateRecording to tvheadend.DvrCreateRecordingOpts.

func (*CreateRecording) Validate

func (r *CreateRecording) Validate() error

Validate validates the minimum requirements of CreateRecording.

type CreateRecordingByEvent

type CreateRecordingByEvent struct {
	EventID  int64  `json:"eventId"`
	ConfigID string `json:"configId"`
}

CreateRecordingByEvent defines options to create a recording by an epg event.

func (*CreateRecordingByEvent) Validate

func (o *CreateRecordingByEvent) Validate() error

Validate validates the minimum requirements of CreateRecordingByEvent.

type EpgChannel

type EpgChannel struct {
	ChannelID     string      `json:"channelId"`
	ChannelName   string      `json:"channelName"`
	ChannelNumber int64       `json:"channelNumber"`
	PiconID       int         `json:"piconId"`
	Events        []*EpgEvent `json:"events"`
}

EpgChannel defines a channel with epg events from tvheadend.

func BuildEpgResult

func BuildEpgResult(grid tvheadend.EpgEventGrid, params SortQueryParams) []*EpgChannel

BuildEpgResult builds the epg result for a given tvheadend.EpgEventGrid and sorts th channels by the given SortQueryParams.

type EpgContentType

type EpgContentType struct {
	ID   int    `json:"id"`
	Name string `json:"string"`
}

EpgContentType defines a epg content type from tvheadend.

type EpgEvent

type EpgEvent struct {
	ID            int64  `json:"id"`
	AudioDesc     bool   `json:"audioDesc"`
	ChannelID     string `json:"channelId"`
	ChannelName   string `json:"channelName"`
	ChannelNumber int64  `json:"channelNumber"`
	PiconID       int    `json:"piconId"`
	Description   string `json:"description"`
	EndsAt        int64  `json:"endsAt"`
	HD            bool   `json:"hd"`
	NextEventID   int    `json:"nextEventId"`
	StartsAt      int64  `json:"startsAt"`
	Subtitle      string `json:"subtitle"`
	Subtitled     bool   `json:"subtitled"`
	Title         string `json:"title"`
	Widescreen    bool   `json:"widescreen"`
	DvrUUID       string `json:"dvrUuid,omitempty"`
	DvrState      string `json:"dvrState,omitempty"`
}

EpgEvent defines a epg event from tvheadend.

func BuildEpgEvent

func BuildEpgEvent(src tvheadend.EpgEventGridEntry) EpgEvent

BuildEpgEvent maps a epg grid event entry from Tvheadend to a EpgEvent model.

type EpgEventsResult

type EpgEventsResult = ListResult[*EpgEvent]

EpgEventsResult defines a ListResult of epg events.

func BuildEpgEventsResult

func BuildEpgEventsResult(src tvheadend.EpgEventGrid, offset int64) EpgEventsResult

BuildEpgEventsResult builds the EpgEventsResult model for a given tvheadend.EpgEventGrid.

type EpgService

type EpgService interface {
	// GetEpg returns the epg (events for each channel).
	GetEpg(ctx context.Context, params GetEpgQueryParams) ([]*EpgChannel, error)

	// GetEvents returns a list of epg events.
	GetEvents(ctx context.Context, params GetEpgEventsQueryParams) (*EpgEventsResult, error)

	// GetEvent returns a epg event.
	GetEvent(ctx context.Context, id int64) (*EpgEvent, error)

	// GetRelatedEvents returns a list of epg related events for a given event.
	GetRelatedEvents(
		ctx context.Context,
		eventId int64,
		params PaginationSortQueryParams,
	) (*EpgEventsResult, error)

	// GetContentTypes returns a list of epg content types.
	GetContentTypes(ctx context.Context) ([]*EpgContentType, error)
}

EpgService provides access to epg resources from the tvheadend server.

type GetEpgEventsQueryParams

type GetEpgEventsQueryParams struct {
	PaginationSortQueryParams
	Title      string `schema:"title"`
	FullText   bool   `schema:"fullText"`
	Language   string `schema:"lang"`
	NowPlaying bool   `schema:"nowPlaying"`
	// Channel name or id of the channel.
	Channel     string `schema:"channel"`
	ContentType string `schema:"contentType"`
	DurationMin int64  `schema:"durationMin"`
	DurationMax int64  `schema:"durationMax"`
	StartsAt    int64  `schema:"startsAt"`
	EndsAt      int64  `schema:"endsAt"`
}

GetEpgEventsQueryParams defines query params to paginate, sort and filter the epg.

func (*GetEpgEventsQueryParams) MapToTvheadendQuery

func (p *GetEpgEventsQueryParams) MapToTvheadendQuery(
	sortKeyMapping map[string]string,
) (*tvheadend.Query, error)

MapToTvheadendQuery maps a GetEpgEventsQueryParams model to a tvheadend query model.

type GetEpgQueryParams

type GetEpgQueryParams struct {
	SortQueryParams
	StartsAt int64 `schema:"startsAt"`
	EndsAt   int64 `schema:"endsAt"`
}

func (*GetEpgQueryParams) MapToTvheadendQuery

func (p *GetEpgQueryParams) MapToTvheadendQuery(
	sortKeyMapping map[string]string,
) (*tvheadend.Query, error)

MapToTvheadendQuery maps a GetEpgQueryParams model to a tvheadend query model.

type GetRecordingsParams

type GetRecordingsParams struct {
	PaginationSortQueryParams
	// upcoming, finished, failed, removed
	Status string `schema:"status"`
}

GetRecordingsParams defines query params to paginate, sort and filter the recordings.

func (*GetRecordingsParams) Validate

func (o *GetRecordingsParams) Validate() error

Validate validates the minimum requirements of GetRecordingsParams.

type InvalidOrExpiredTokenError

type InvalidOrExpiredTokenError struct {
	// Reason is the reason why the token is invalid or expired.
	Reason error
}

InvalidOrExpiredTokenError is returned when a token / session is invalid or expired.

func (InvalidOrExpiredTokenError) Error

type ListResult

type ListResult[T any] struct {
	Entries []T   `json:"entries"`
	Total   int64 `json:"total"`
	Offset  int64 `json:"offset"`
}

ListResult defines a generic result of multiple entries combined with the number of total results and the offset.

type PaginationQueryParams

type PaginationQueryParams struct {
	// (Optional) Limit the result.
	Limit int64 `schema:"limit"`
	// (Optional) Offset the result.
	Offset int64 `schema:"offset"`
}

PaginationQueryParams defines query params to paginate the result.

func (*PaginationQueryParams) MapToTvheadendQuery

func (p *PaginationQueryParams) MapToTvheadendQuery() tvheadend.Query

func (*PaginationQueryParams) Validate

func (p *PaginationQueryParams) Validate() error

type PaginationSortQueryParams

type PaginationSortQueryParams struct {
	PaginationQueryParams
	SortQueryParams
}

PaginationSortQueryParams defines query params to paginate and sort the result.

func (*PaginationSortQueryParams) MapToTvheadendQuery

func (p *PaginationSortQueryParams) MapToTvheadendQuery(
	sortKeyMapping map[string]string,
) tvheadend.Query

func (*PaginationSortQueryParams) Validate

func (p *PaginationSortQueryParams) Validate() error

type PasswordAuthenticator

type PasswordAuthenticator interface {
	// Login logs in a user via login, password and optional totp code.
	Login(ctx context.Context, login string, username string, totp *string) (*User, error)

	// ConfirmPassword confirms the password of a user.
	ConfirmPassword(ctx context.Context, userID int64, password string) error
}

PasswordAuthenticator defines operations to log in users via login and password.

type PiconService

type PiconService interface {
	// GetPicon returns the picon of a channel.
	Get(ctx context.Context, id int) (io.Reader, error)
}

type Recording

type Recording struct {
	ChannelID string `json:"channelId"`
	// ID of the event when the recordings was created by event.
	EventID     int64             `json:"eventId,omitempty"`
	ChannelName string            `json:"channelName"`
	PiconID     int               `json:"piconId"`
	CreatedAt   int64             `json:"createdAt"`
	Duration    int64             `json:"duration"`
	Enabled     bool              `json:"enabled"`
	Filename    string            `json:"filename"`
	ID          string            `json:"id"`
	LangTitle   map[string]string `json:"langTitle"`
	Title       string            `json:"title"`
	Subtitle    string            `json:"subtitle"`
	Description string            `json:"description"`
	ExtraText   string            `json:"extraText"`
	// OriginalStartsAt time stamp of the original start date
	// without StartPadding.
	OriginalStartsAt int64 `json:"originalStartsAt"`
	// OriginalEndsAt time stamp of the original end date
	// without theEndPadding.
	OriginalEndsAt int64 `json:"originalEndsAt"`
	// StartAt start date of the recording as unix timestamp.
	StartsAt int64 `json:"startsAt"`
	// EndsAt end date of the recording as unix timestamp.
	EndsAt int64 `json:"endsAt"`
	// StartPadding optional padding in minutes to record
	// before the recording starts.
	StartPadding int `json:"startPadding"`
	// EndPadding optional padding in minutes to record
	// after the recording ends.
	EndPadding int    `json:"endPadding"`
	Status     string `json:"status"`
}

Recording defines a dvr entry from tvheadend. TODO: extend necessary fields.

func MapToTvheadendDvrGridEntryToRecording

func MapToTvheadendDvrGridEntryToRecording(entry tvheadend.DvrGridEntry) Recording

MapToTvheadendDvrGridEntryToRecording maps a tvheadend.DvrGridEntry to a Recording.

func MapTvheadendIdnodeToRecording

func MapTvheadendIdnodeToRecording(idnode tvheadend.Idnode) (*Recording, error)

MapTvheadendIdnodeToRecording maps a tvheadend.Idnode to a Recording.

type RecordingListResult

type RecordingListResult = ListResult[*Recording]

RecordingListResult defines a ListResult of recordings.

type RecordingService

type RecordingService interface {
	// CreateByEvent creates a new recording by an epg event.
	CreateByEvent(ctx context.Context, opts CreateRecordingByEvent) error

	// CreateByEvent creates a new recording by an epg event.
	Create(ctx context.Context, opts CreateRecording) error

	// GetAll returns a list of recordings.
	GetAll(ctx context.Context, params GetRecordingsParams) (*RecordingListResult, error)

	// Get returns a recording by its id.
	Get(ctx context.Context, id string) (*Recording, error)

	// Stop gracefully stops a running recording.
	Stop(ctx context.Context, id string) error

	// BatchStop gracefully stops running recordings.
	BatchStop(ctx context.Context, ids []string) error

	// Cancel deletes a upcoming recording or aborts a running recording.
	Cancel(ctx context.Context, id string) error

	// BatchCancel deletes multiple upcoming recordings or aborts running recordings.
	BatchCancel(ctx context.Context, ids []string) error

	// Remove removes a finished recording from disk.
	Remove(ctx context.Context, id string) error

	// BatchRemove removes multiple recordings from disk.
	BatchRemove(ctx context.Context, ids []string) error

	// MoveFinished moves a recording to finished status.
	MoveFinished(ctx context.Context, id string) error

	// MoveFailed moves a recording to failed status.
	MoveFailed(ctx context.Context, id string) error

	// UpdateRecording updates a recording.
	UpdateRecording(ctx context.Context, id string, opts UpdateRecording) error
}

RecordingService provides access to recording resources from the tvheadend server.

type Session

type Session struct {
	ID          int64  `json:"id"`
	UserId      int64  `json:"userId"`
	HashedToken string `json:"-"`
	ClientIP    string `json:"clientIp"`
	UserAgent   string `json:"userAgent"`
	CreatedAt   int64  `json:"createdAt"`
	LastUsedAt  int64  `json:"lastUsedAt"`
	RotatedAt   int64  `json:"-"`
}

Session defines a representation for a session of a user.

type SessionManager

type SessionManager interface {
	// Validate validates a session and updates the last usage and rotates the token if needed.
	// The rotated token is returned as second return value when the token was rotated.
	Validate(ctx context.Context, token string) (*AuthContext, *string, error)
	// Create creates a new session for a user with a client ip and a user agent.
	Create(ctx context.Context, userId int64, clientIp string, userAgent string) (string, error)
	// Revoke revokes a specific session.
	Revoke(ctx context.Context, sessionID int64, userID int64) error
}

SessionManager defines operations to manage a session of a user.

type SessionRepository

type SessionRepository interface {
	// Find returns a sessions.
	Find(ctx context.Context, hashedToken string) (*Session, error)

	// FindByUser returns a list of sessions for a user.
	FindByUser(ctx context.Context, userID int64) ([]*Session, error)

	// Create persists a new session.
	Create(ctx context.Context, session *Session) error

	// Create persists a updated session.
	Update(ctx context.Context, session *Session) error

	// Delete deletes a session.
	Delete(ctx context.Context, sessionID int64, userID int64) error

	// DeleteExpired deletes all expired sessions.
	DeleteExpired(
		ctx context.Context,
		expirationDate int64,
		inactiveExpirationDate int64,
	) (int64, error)
}

SessionRepository defines CRUD operations for working with sessions.

type SortQueryParams

type SortQueryParams struct {
	// (Optional) Sort key.
	SortKey string `schema:"sort_key"`
	// (Optional) Sort direction.
	SortDirection string `schema:"sort_dir"`
}

SortQueryParams defines query params to sort the result.

func (*SortQueryParams) MapToTvheadendQuery

func (p *SortQueryParams) MapToTvheadendQuery(sortKeyMapping map[string]string) tvheadend.Query

func (*SortQueryParams) Validate

func (p *SortQueryParams) Validate() error

type StreamingService

type StreamingService interface {
	// GetChannelStream returns a raw http response of the channel stream.
	GetChannelStream(
		ctx context.Context,
		channelNumber int64,
		profile string,
	) (*http.Response, error)

	// GetRecordingStream returns a raw http response of the recording stream.
	GetRecordingStream(ctx context.Context, recordingId string) (*http.Response, error)
}

type Token

type Token struct {
	ID          int64  `json:"id"`
	UserID      int64  `json:"-"`
	Name        string `json:"name"`
	HashedToken string `json:"-"`
	CreatedAt   int64  `json:"createdAt"`
	UpdatedAt   int64  `json:"updatedAt"`
}

type TokenRepository

type TokenRepository interface {
	// FindByToken returns a Token by a the hashed token.
	FindByToken(ctx context.Context, token string) (*Token, error)

	// FindByUser returns all token for a user.
	FindByUser(ctx context.Context, userID int64) ([]*Token, error)

	// Create persists a new Token.
	Create(ctx context.Context, token *Token) error

	// Delete deletes a Token.
	Delete(ctx context.Context, token *Token) error
}

TokenRepository defines CRUD operations working with Tokens.

type TokenService

type TokenService interface {
	// Create creates a new token for a user.
	Create(ctx context.Context, userID int64, name string) (string, error)

	// Validate validates a token.
	Validate(ctx context.Context, token string) (*AuthContext, error)

	// Revoke revokes a token.
	Revoke(ctx context.Context, id int64) error
}

TokenService defines operations to manage tokens for a user.

type TwoFactorAuthService

type TwoFactorAuthService interface {
	// GetSettings returns the current two factor settings for a user.
	GetSettings(ctx context.Context, userId int64) (*TwoFactorSettings, error)

	// Setup starts the setup process for two factor auth for a user.
	Setup(ctx context.Context, userId int64) (string, error)

	// Deactivate deactivates two factor auth for a user.
	Deactivate(ctx context.Context, userId int64, code string) error

	// Activate activates two factor auth for a user.
	Activate(ctx context.Context, userID int64, code string) error

	// Verify verifies a two factor code for a user.
	Verify(ctx context.Context, userId int64, code *string) error
}

TwoFactorAuthService defines operations to manage two factor auth for a user.

type TwoFactorSettings

type TwoFactorSettings struct {
	UserID    int64  `json:"-"`
	Secret    string `json:"-"`
	Enabled   bool   `json:"enabled"`
	CreatedAt int64  `json:"-"`
	UpdatedAt int64  `json:"-"`
}

TwoFactorSettings defines the two factor settings of a user.

type TwoFactorSettingsRepository

type TwoFactorSettingsRepository interface {
	// Find returns two factor settings by a user id.
	Find(ctx context.Context, userID int64) (*TwoFactorSettings, error)

	// Create persists new two factor settings.
	Create(ctx context.Context, settings *TwoFactorSettings) error

	// Delete deletes two factor settings.
	Delete(ctx context.Context, settings *TwoFactorSettings) error

	Update(ctx context.Context, settings *TwoFactorSettings) error

	Save(ctx context.Context, settings *TwoFactorSettings) error
}

TwoFactorSettingsRepository defines CRUD operations working with TwoFactorSettings.

type UpdateRecording

type UpdateRecording struct {
	// Title title of the recording.
	Title *string `json:"title"`
	// ExtraText optional extraText of the recording.
	ExtraText *string `json:"extraText"`
	// StartAt start date of the recording as unix timestamp.
	StartsAt *int64 `json:"startsAt"`
	// EndsAt end date of the recording as unix timestamp.
	EndsAt *int64 `json:"endsAt"`
	// Comment optional comment of the recording.
	Comment *string `json:"comment"`
	// StartPadding optional padding in minutes to record
	// before the recording starts.
	StartPadding *int `json:"startPadding"`
	// EndPadding optional padding in minutes to record
	// after the recording ends.
	EndPadding *int `json:"endPadding"`
	// Priority priority of the recording.
	Priority *int `json:"priority"`
	// Enabled enabled status of the recording.
	Enabled *bool `json:"enabled"`
	// Episode episode of the recording.
	Episode *string `json:"episode"`
}

UpdateRecording recording defines options to update a recording timer. The values are pointers because they are optional to provide.

func (*UpdateRecording) Validate

func (r *UpdateRecording) Validate() error

type User

type User struct {
	ID       int64  `json:"id"`
	Username string `json:"username"`
	// PasswordHash hash of the users password
	PasswordHash string `json:"-"`
	Email        string `json:"email"`
	DisplayName  string `json:"displayName"`
	CreatedAt    int64  `json:"createdAt"`
	UpdatedAt    int64  `json:"updatedAt"`
}

User represents a user.

type UserQueryParams

type UserQueryParams struct {
	// (Optional) Limit the result.
	Limit int64
	// (Optional) Offset the result.
	// Can only be used together with Limit.
	Offset int64
}

UserQueryParams defines user query parameters.

type UserRepository

type UserRepository interface {
	// FindById returns a user by id.
	FindById(ctx context.Context, id int64) (*User, error)

	// FindByUsername returns a user by username.
	FindByUsername(ctx context.Context, user string) (*User, error)

	// Find returns a list of users paginated by UserQueryParams.
	Find(ctx context.Context, params UserQueryParams) ([]*User, error)

	// Create persists a new user.
	Create(ctx context.Context, user *User) error

	// Update persists an updated user.
	Update(ctx context.Context, user *User) error

	// Delete deletes a user.
	Delete(ctx context.Context, user *User) error
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL