Files
PinePods-nix/PinePods-0.8.2/gpodder-api/internal/models/models.go
2026-03-03 10:57:43 -05:00

172 lines
5.3 KiB
Go

package models
import (
"time"
)
// Device represents a user device
type Device struct {
ID int `json:"-"`
UserID int `json:"-"`
DeviceID string `json:"id"`
Caption string `json:"caption"`
Type string `json:"type"`
Subscriptions int `json:"subscriptions"`
CreatedAt time.Time `json:"-"`
LastUpdated time.Time `json:"-"`
}
// GpodderDevice represents a device from the GpodderDevices table
type GpodderDevice struct {
DeviceID int `json:"-"`
UserID int `json:"-"`
DeviceName string `json:"id"`
DeviceType string `json:"type"`
DeviceCaption string `json:"caption"`
IsDefault bool `json:"-"`
LastSync time.Time `json:"-"`
IsActive bool `json:"-"`
// Additional field for API responses
Subscriptions int `json:"subscriptions"`
}
// Subscription represents a podcast subscription
type Subscription struct {
SubscriptionID int `json:"-"`
UserID int `json:"-"`
DeviceID int `json:"-"`
PodcastURL string `json:"url"`
Action string `json:"-"`
Timestamp int64 `json:"-"`
}
// SubscriptionChange represents a change to subscriptions
type SubscriptionChange struct {
Add []string `json:"add"`
Remove []string `json:"remove"`
}
// SubscriptionResponse represents a response to subscription change request
type SubscriptionResponse struct {
Add []string `json:"add"`
Remove []string `json:"remove"`
Timestamp int64 `json:"timestamp"`
UpdateURLs [][]string `json:"update_urls"` // Removed omitempty to ensure field is always present
}
// EpisodeAction represents an action performed on an episode
// First, create a struct for the JSON request format
type EpisodeActionRequest struct {
Actions []EpisodeAction `json:"actions"`
}
// Then modify the EpisodeAction struct to use a flexible type for timestamp
type EpisodeAction struct {
ActionID int `json:"-"`
UserID int `json:"-"`
DeviceID int `json:"-"`
Podcast string `json:"podcast"`
Episode string `json:"episode"`
Device string `json:"device,omitempty"`
Action string `json:"action"`
Timestamp interface{} `json:"timestamp"` // Accept any type
Started *int `json:"started,omitempty"`
Position *int `json:"position,omitempty"`
Total *int `json:"total,omitempty"`
}
// EpisodeActionResponse represents a response to episode action upload
type EpisodeActionResponse struct {
Timestamp int64 `json:"timestamp"`
UpdateURLs [][]string `json:"update_urls"` // Removed omitempty
}
// EpisodeActionsResponse represents a response for episode actions retrieval
type EpisodeActionsResponse struct {
Actions []EpisodeAction `json:"actions"`
Timestamp int64 `json:"timestamp"`
}
// PodcastList represents a user's podcast list
type PodcastList struct {
ListID int `json:"-"`
UserID int `json:"-"`
Name string `json:"name"`
Title string `json:"title"`
CreatedAt time.Time `json:"-"`
WebURL string `json:"web"`
Podcasts []Podcast `json:"-"`
}
// Podcast represents a podcast
type Podcast struct {
URL string `json:"url"`
Title string `json:"title,omitempty"`
Description string `json:"description,omitempty"`
Website string `json:"website,omitempty"`
Subscribers int `json:"subscribers,omitempty"`
LogoURL string `json:"logo_url,omitempty"`
ScaledLogoURL string `json:"scaled_logo_url,omitempty"`
Author string `json:"author,omitempty"`
MygpoLink string `json:"mygpo_link,omitempty"`
}
// Episode represents a podcast episode
type Episode struct {
Title string `json:"title"`
URL string `json:"url"`
PodcastTitle string `json:"podcast_title"`
PodcastURL string `json:"podcast_url"`
Description string `json:"description"`
Website string `json:"website"`
Released string `json:"released"` // ISO 8601 format
MygpoLink string `json:"mygpo_link"`
}
// Setting represents a user setting
type Setting struct {
SettingID int `json:"-"`
UserID int `json:"-"`
Scope string `json:"-"`
DeviceID int `json:"-"`
PodcastURL string `json:"-"`
EpisodeURL string `json:"-"`
SettingKey string `json:"-"`
SettingValue string `json:"-"`
CreatedAt time.Time `json:"-"`
LastUpdated time.Time `json:"-"`
}
// SettingsRequest represents a settings update request
type SettingsRequest struct {
Set map[string]interface{} `json:"set"`
Remove []string `json:"remove"`
}
// Tag represents a tag
type Tag struct {
Title string `json:"title"`
Tag string `json:"tag"`
Usage int `json:"usage"`
}
// SyncDevicesResponse represents the sync status response
type SyncDevicesResponse struct {
Synchronized [][]string `json:"synchronized"`
NotSynchronized []string `json:"not-synchronized"`
}
// SyncDevicesRequest represents a sync status update request
type SyncDevicesRequest struct {
Synchronize [][]string `json:"synchronize"`
StopSynchronize []string `json:"stop-synchronize"`
}
// DeviceUpdateResponse represents a response to device updates request
type DeviceUpdateResponse struct {
Add []Podcast `json:"add"`
Remove []string `json:"remove"`
Updates []Episode `json:"updates"`
Timestamp int64 `json:"timestamp"`
}