dhowden/tag's readTFrame splits ID3v2 null-separated multi-value text frames and rejoins them with the EMPTY string, so a file tagged "Alternative Rock" + "Rock" was stored as "Alternative RockRock". It also leaves bare numeric ID3v1 references unresolved, which is why the library showed genres like "4017" and "526617". This corrupted more than the browse axis added in #367: taste_profile.sql reads tracks.genre directly, so the welded tokens were entering the taste profile's tag vocabulary, and recommendation.sql/discover.sql were comparing them as single opaque tags. Genre counts were wrong everywhere. ffprobe is not a fix — ffmpeg's read_ttag calls decode_str once with no loop, keeping only the first value. Truncating multi-genre tags would blunt the similarity signal genre mainly feeds. So the TCON frame is now parsed directly (ID3v2.2/2.3/2.4, all four text encodings, per-frame and tag-level unsynchronisation, numeric and parenthesised ID3v1 references); everything else still comes from dhowden/tag. Values are stored ";"-delimited, which the read side already splits on, so no query changes. Existing rows are repaired without an operator-run rebuild: migration 0054 adds tracks.tag_read_version DEFAULT 0, below the scanner's current tagReadVersion, so the next scan re-reads tags it would otherwise skip on mtime. Such a re-read reuses the stored duration instead of re-running ffprobe, keeping a repair pass tag-read-bound rather than one fork+exec per file. Bumping the constant is how a future extraction fix reaches an existing library. Only ID3v2 is in scope — dhowden welds nowhere else. The Vorbis/MP4 repeated-field question is #2500, unproven and deliberately not built.
703 lines
16 KiB
Go
703 lines
16 KiB
Go
// Code generated by sqlc. DO NOT EDIT.
|
|
// versions:
|
|
// sqlc v1.31.1
|
|
|
|
package dbq
|
|
|
|
import (
|
|
"database/sql/driver"
|
|
"fmt"
|
|
|
|
"github.com/jackc/pgx/v5/pgtype"
|
|
)
|
|
|
|
type LidarrQuarantineActionKind string
|
|
|
|
const (
|
|
LidarrQuarantineActionKindResolved LidarrQuarantineActionKind = "resolved"
|
|
LidarrQuarantineActionKindDeletedFile LidarrQuarantineActionKind = "deleted_file"
|
|
LidarrQuarantineActionKindDeletedViaLidarr LidarrQuarantineActionKind = "deleted_via_lidarr"
|
|
)
|
|
|
|
func (e *LidarrQuarantineActionKind) Scan(src interface{}) error {
|
|
switch s := src.(type) {
|
|
case []byte:
|
|
*e = LidarrQuarantineActionKind(s)
|
|
case string:
|
|
*e = LidarrQuarantineActionKind(s)
|
|
default:
|
|
return fmt.Errorf("unsupported scan type for LidarrQuarantineActionKind: %T", src)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
type NullLidarrQuarantineActionKind struct {
|
|
LidarrQuarantineActionKind LidarrQuarantineActionKind
|
|
Valid bool // Valid is true if LidarrQuarantineActionKind is not NULL
|
|
}
|
|
|
|
// Scan implements the Scanner interface.
|
|
func (ns *NullLidarrQuarantineActionKind) Scan(value interface{}) error {
|
|
if value == nil {
|
|
ns.LidarrQuarantineActionKind, ns.Valid = "", false
|
|
return nil
|
|
}
|
|
ns.Valid = true
|
|
return ns.LidarrQuarantineActionKind.Scan(value)
|
|
}
|
|
|
|
// Value implements the driver Valuer interface.
|
|
func (ns NullLidarrQuarantineActionKind) Value() (driver.Value, error) {
|
|
if !ns.Valid {
|
|
return nil, nil
|
|
}
|
|
return string(ns.LidarrQuarantineActionKind), nil
|
|
}
|
|
|
|
type LidarrQuarantineReason string
|
|
|
|
const (
|
|
LidarrQuarantineReasonBadRip LidarrQuarantineReason = "bad_rip"
|
|
LidarrQuarantineReasonWrongFile LidarrQuarantineReason = "wrong_file"
|
|
LidarrQuarantineReasonWrongTags LidarrQuarantineReason = "wrong_tags"
|
|
LidarrQuarantineReasonDuplicate LidarrQuarantineReason = "duplicate"
|
|
LidarrQuarantineReasonOther LidarrQuarantineReason = "other"
|
|
)
|
|
|
|
func (e *LidarrQuarantineReason) Scan(src interface{}) error {
|
|
switch s := src.(type) {
|
|
case []byte:
|
|
*e = LidarrQuarantineReason(s)
|
|
case string:
|
|
*e = LidarrQuarantineReason(s)
|
|
default:
|
|
return fmt.Errorf("unsupported scan type for LidarrQuarantineReason: %T", src)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
type NullLidarrQuarantineReason struct {
|
|
LidarrQuarantineReason LidarrQuarantineReason
|
|
Valid bool // Valid is true if LidarrQuarantineReason is not NULL
|
|
}
|
|
|
|
// Scan implements the Scanner interface.
|
|
func (ns *NullLidarrQuarantineReason) Scan(value interface{}) error {
|
|
if value == nil {
|
|
ns.LidarrQuarantineReason, ns.Valid = "", false
|
|
return nil
|
|
}
|
|
ns.Valid = true
|
|
return ns.LidarrQuarantineReason.Scan(value)
|
|
}
|
|
|
|
// Value implements the driver Valuer interface.
|
|
func (ns NullLidarrQuarantineReason) Value() (driver.Value, error) {
|
|
if !ns.Valid {
|
|
return nil, nil
|
|
}
|
|
return string(ns.LidarrQuarantineReason), nil
|
|
}
|
|
|
|
type LidarrRequestKind string
|
|
|
|
const (
|
|
LidarrRequestKindArtist LidarrRequestKind = "artist"
|
|
LidarrRequestKindAlbum LidarrRequestKind = "album"
|
|
LidarrRequestKindTrack LidarrRequestKind = "track"
|
|
)
|
|
|
|
func (e *LidarrRequestKind) Scan(src interface{}) error {
|
|
switch s := src.(type) {
|
|
case []byte:
|
|
*e = LidarrRequestKind(s)
|
|
case string:
|
|
*e = LidarrRequestKind(s)
|
|
default:
|
|
return fmt.Errorf("unsupported scan type for LidarrRequestKind: %T", src)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
type NullLidarrRequestKind struct {
|
|
LidarrRequestKind LidarrRequestKind
|
|
Valid bool // Valid is true if LidarrRequestKind is not NULL
|
|
}
|
|
|
|
// Scan implements the Scanner interface.
|
|
func (ns *NullLidarrRequestKind) Scan(value interface{}) error {
|
|
if value == nil {
|
|
ns.LidarrRequestKind, ns.Valid = "", false
|
|
return nil
|
|
}
|
|
ns.Valid = true
|
|
return ns.LidarrRequestKind.Scan(value)
|
|
}
|
|
|
|
// Value implements the driver Valuer interface.
|
|
func (ns NullLidarrRequestKind) Value() (driver.Value, error) {
|
|
if !ns.Valid {
|
|
return nil, nil
|
|
}
|
|
return string(ns.LidarrRequestKind), nil
|
|
}
|
|
|
|
type LidarrRequestStatus string
|
|
|
|
const (
|
|
LidarrRequestStatusPending LidarrRequestStatus = "pending"
|
|
LidarrRequestStatusApproved LidarrRequestStatus = "approved"
|
|
LidarrRequestStatusRejected LidarrRequestStatus = "rejected"
|
|
LidarrRequestStatusCompleted LidarrRequestStatus = "completed"
|
|
LidarrRequestStatusFailed LidarrRequestStatus = "failed"
|
|
)
|
|
|
|
func (e *LidarrRequestStatus) Scan(src interface{}) error {
|
|
switch s := src.(type) {
|
|
case []byte:
|
|
*e = LidarrRequestStatus(s)
|
|
case string:
|
|
*e = LidarrRequestStatus(s)
|
|
default:
|
|
return fmt.Errorf("unsupported scan type for LidarrRequestStatus: %T", src)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
type NullLidarrRequestStatus struct {
|
|
LidarrRequestStatus LidarrRequestStatus
|
|
Valid bool // Valid is true if LidarrRequestStatus is not NULL
|
|
}
|
|
|
|
// Scan implements the Scanner interface.
|
|
func (ns *NullLidarrRequestStatus) Scan(value interface{}) error {
|
|
if value == nil {
|
|
ns.LidarrRequestStatus, ns.Valid = "", false
|
|
return nil
|
|
}
|
|
ns.Valid = true
|
|
return ns.LidarrRequestStatus.Scan(value)
|
|
}
|
|
|
|
// Value implements the driver Valuer interface.
|
|
func (ns NullLidarrRequestStatus) Value() (driver.Value, error) {
|
|
if !ns.Valid {
|
|
return nil, nil
|
|
}
|
|
return string(ns.LidarrRequestStatus), nil
|
|
}
|
|
|
|
type Album struct {
|
|
ID pgtype.UUID
|
|
Title string
|
|
SortTitle string
|
|
ArtistID pgtype.UUID
|
|
ReleaseDate pgtype.Date
|
|
Mbid *string
|
|
CoverArtPath *string
|
|
CreatedAt pgtype.Timestamptz
|
|
UpdatedAt pgtype.Timestamptz
|
|
CoverArtSource *string
|
|
CoverArtSourcesVersion int32
|
|
}
|
|
|
|
type Artist struct {
|
|
ID pgtype.UUID
|
|
Name string
|
|
SortName string
|
|
Mbid *string
|
|
CreatedAt pgtype.Timestamptz
|
|
UpdatedAt pgtype.Timestamptz
|
|
ArtistThumbPath *string
|
|
ArtistFanartPath *string
|
|
ArtistArtSource *string
|
|
ArtistArtSourcesVersion int32
|
|
}
|
|
|
|
type ArtistSimilarity struct {
|
|
ArtistAID pgtype.UUID
|
|
ArtistBID pgtype.UUID
|
|
Score float64
|
|
Source string
|
|
FetchedAt pgtype.Timestamptz
|
|
}
|
|
|
|
type ArtistSimilarityUnmatched struct {
|
|
SeedArtistID pgtype.UUID
|
|
CandidateMbid string
|
|
CandidateName string
|
|
Score float64
|
|
Source string
|
|
FetchedAt pgtype.Timestamptz
|
|
}
|
|
|
|
type AuditLog struct {
|
|
ID pgtype.UUID
|
|
ActorID pgtype.UUID
|
|
TargetID pgtype.UUID
|
|
Action string
|
|
Metadata []byte
|
|
CreatedAt pgtype.Timestamptz
|
|
}
|
|
|
|
type CandidateArtistTag struct {
|
|
CandidateMbid string
|
|
Tag string
|
|
Weight float64
|
|
}
|
|
|
|
type CandidateArtistTagState struct {
|
|
CandidateMbid string
|
|
TagSource string
|
|
TagSourcesVersion int32
|
|
UpdatedAt pgtype.Timestamptz
|
|
}
|
|
|
|
type ContextualLike struct {
|
|
ID pgtype.UUID
|
|
UserID pgtype.UUID
|
|
TrackID pgtype.UUID
|
|
LikedAt pgtype.Timestamptz
|
|
DeletedAt pgtype.Timestamptz
|
|
SessionVector []byte
|
|
SessionID pgtype.UUID
|
|
}
|
|
|
|
type CoverArtProviderSetting struct {
|
|
ProviderID string
|
|
Enabled bool
|
|
ApiKey *string
|
|
DisplayOrder int32
|
|
CreatedAt pgtype.Timestamptz
|
|
UpdatedAt pgtype.Timestamptz
|
|
}
|
|
|
|
type CoverArtSourcesMetum struct {
|
|
ID bool
|
|
CurrentVersion int32
|
|
LastRegisteredProvidersHash string
|
|
}
|
|
|
|
type DiagnosticEvent struct {
|
|
ID pgtype.UUID
|
|
UserID pgtype.UUID
|
|
ClientID string
|
|
AppVersion *string
|
|
OsVersion *string
|
|
Kind string
|
|
Payload []byte
|
|
OccurredAt pgtype.Timestamptz
|
|
ReceivedAt pgtype.Timestamptz
|
|
}
|
|
|
|
type DiscoverTuning struct {
|
|
Singleton bool
|
|
TagOverlapWeight float64
|
|
SnoozeDays float64
|
|
UpdatedAt pgtype.Timestamptz
|
|
}
|
|
|
|
type GeneralLike struct {
|
|
UserID pgtype.UUID
|
|
TrackID pgtype.UUID
|
|
LikedAt pgtype.Timestamptz
|
|
}
|
|
|
|
type GeneralLikesAlbum struct {
|
|
UserID pgtype.UUID
|
|
AlbumID pgtype.UUID
|
|
LikedAt pgtype.Timestamptz
|
|
}
|
|
|
|
type GeneralLikesArtist struct {
|
|
UserID pgtype.UUID
|
|
ArtistID pgtype.UUID
|
|
LikedAt pgtype.Timestamptz
|
|
}
|
|
|
|
type LibraryChange struct {
|
|
ID int64
|
|
EntityType string
|
|
EntityID string
|
|
Op string
|
|
ChangedAt pgtype.Timestamptz
|
|
}
|
|
|
|
type LidarrConfig struct {
|
|
ID int16
|
|
Enabled bool
|
|
BaseUrl *string
|
|
ApiKey *string
|
|
DefaultQualityProfileID *int32
|
|
DefaultRootFolderPath *string
|
|
CreatedAt pgtype.Timestamptz
|
|
UpdatedAt pgtype.Timestamptz
|
|
DefaultMetadataProfileID *int32
|
|
}
|
|
|
|
type LidarrQuarantine struct {
|
|
UserID pgtype.UUID
|
|
TrackID pgtype.UUID
|
|
Reason LidarrQuarantineReason
|
|
Notes *string
|
|
CreatedAt pgtype.Timestamptz
|
|
}
|
|
|
|
type LidarrQuarantineAction struct {
|
|
ID pgtype.UUID
|
|
TrackID pgtype.UUID
|
|
TrackTitle string
|
|
ArtistName string
|
|
AlbumTitle *string
|
|
Action LidarrQuarantineActionKind
|
|
AdminID pgtype.UUID
|
|
LidarrAlbumMbid *string
|
|
AffectedUsers int32
|
|
CreatedAt pgtype.Timestamptz
|
|
}
|
|
|
|
type LidarrRequest struct {
|
|
ID pgtype.UUID
|
|
UserID pgtype.UUID
|
|
Status LidarrRequestStatus
|
|
Kind LidarrRequestKind
|
|
LidarrArtistMbid string
|
|
LidarrAlbumMbid *string
|
|
LidarrTrackMbid *string
|
|
ArtistName string
|
|
AlbumTitle *string
|
|
TrackTitle *string
|
|
QualityProfileID *int32
|
|
RootFolderPath *string
|
|
DecidedAt pgtype.Timestamptz
|
|
DecidedBy pgtype.UUID
|
|
Notes *string
|
|
CompletedAt pgtype.Timestamptz
|
|
MatchedTrackID pgtype.UUID
|
|
MatchedAlbumID pgtype.UUID
|
|
MatchedArtistID pgtype.UUID
|
|
RequestedAt pgtype.Timestamptz
|
|
UpdatedAt pgtype.Timestamptz
|
|
LidarrAddConfirmedAt pgtype.Timestamptz
|
|
}
|
|
|
|
type NetworkSetting struct {
|
|
ID bool
|
|
TrustedProxyHops int32
|
|
}
|
|
|
|
type PasswordReset struct {
|
|
Token string
|
|
UserID pgtype.UUID
|
|
CreatedAt pgtype.Timestamptz
|
|
ExpiresAt pgtype.Timestamptz
|
|
UsedAt pgtype.Timestamptz
|
|
}
|
|
|
|
type PlayEvent struct {
|
|
ID pgtype.UUID
|
|
UserID pgtype.UUID
|
|
TrackID pgtype.UUID
|
|
SessionID pgtype.UUID
|
|
StartedAt pgtype.Timestamptz
|
|
EndedAt pgtype.Timestamptz
|
|
DurationPlayedMs *int32
|
|
CompletionRatio *float64
|
|
WasSkipped bool
|
|
ClientID *string
|
|
SessionVectorAtPlay []byte
|
|
ScrobbledAt pgtype.Timestamptz
|
|
Source *string
|
|
PickKind *string
|
|
DeviceClass *string
|
|
}
|
|
|
|
type PlaySession struct {
|
|
ID pgtype.UUID
|
|
UserID pgtype.UUID
|
|
StartedAt pgtype.Timestamptz
|
|
EndedAt pgtype.Timestamptz
|
|
LastEventAt pgtype.Timestamptz
|
|
TrackCount int32
|
|
ClientID *string
|
|
}
|
|
|
|
type PlaybackError struct {
|
|
ID pgtype.UUID
|
|
TrackID pgtype.UUID
|
|
UserID pgtype.UUID
|
|
ClientID string
|
|
Kind string
|
|
Detail *string
|
|
OccurredAt pgtype.Timestamptz
|
|
ResolvedAt pgtype.Timestamptz
|
|
ResolvedBy pgtype.UUID
|
|
Resolution *string
|
|
}
|
|
|
|
type Playlist struct {
|
|
ID pgtype.UUID
|
|
UserID pgtype.UUID
|
|
Name string
|
|
Description string
|
|
IsPublic bool
|
|
CoverPath *string
|
|
TrackCount int32
|
|
DurationSec int32
|
|
CreatedAt pgtype.Timestamptz
|
|
UpdatedAt pgtype.Timestamptz
|
|
Kind string
|
|
SystemVariant *string
|
|
SeedArtistID pgtype.UUID
|
|
}
|
|
|
|
type PlaylistTrack struct {
|
|
PlaylistID pgtype.UUID
|
|
Position int32
|
|
TrackID pgtype.UUID
|
|
Title string
|
|
ArtistName string
|
|
AlbumTitle string
|
|
DurationSec int32
|
|
AddedAt pgtype.Timestamptz
|
|
PickKind *string
|
|
}
|
|
|
|
type RecommendationTuningAudit struct {
|
|
ID int64
|
|
ChangedAt pgtype.Timestamptz
|
|
Scope string
|
|
Action string
|
|
Changes []byte
|
|
}
|
|
|
|
type RecommendationWeightProfile struct {
|
|
Profile string
|
|
BaseWeight float64
|
|
LikeBoost float64
|
|
RecencyWeight float64
|
|
SkipPenalty float64
|
|
JitterMagnitude float64
|
|
ContextWeight float64
|
|
SimilarityWeight float64
|
|
TasteWeight float64
|
|
UpdatedAt pgtype.Timestamptz
|
|
ContextTimeWeight float64
|
|
}
|
|
|
|
type RegistrationSetting struct {
|
|
ID bool
|
|
Mode string
|
|
}
|
|
|
|
type ScanRun struct {
|
|
ID pgtype.UUID
|
|
StartedAt pgtype.Timestamptz
|
|
FinishedAt pgtype.Timestamptz
|
|
Library []byte
|
|
MbidBackfill []byte
|
|
CoverEnrich []byte
|
|
ErrorMessage *string
|
|
ArtistArtEnrich []byte
|
|
}
|
|
|
|
type ScrobbleQueue struct {
|
|
ID pgtype.UUID
|
|
UserID pgtype.UUID
|
|
PlayEventID pgtype.UUID
|
|
Status string
|
|
Attempts int32
|
|
NextAttemptAt pgtype.Timestamptz
|
|
LastError *string
|
|
EnqueuedAt pgtype.Timestamptz
|
|
}
|
|
|
|
type Session struct {
|
|
ID pgtype.UUID
|
|
UserID pgtype.UUID
|
|
TokenHash []byte
|
|
UserAgent string
|
|
CreatedAt pgtype.Timestamptz
|
|
LastSeenAt pgtype.Timestamptz
|
|
CreatedIp string
|
|
LastIp string
|
|
}
|
|
|
|
type SkipEvent struct {
|
|
ID pgtype.UUID
|
|
UserID pgtype.UUID
|
|
TrackID pgtype.UUID
|
|
SessionID pgtype.UUID
|
|
SkippedAt pgtype.Timestamptz
|
|
PositionMs int32
|
|
}
|
|
|
|
type SmtpConfig struct {
|
|
ID bool
|
|
Enabled bool
|
|
Host string
|
|
Port int32
|
|
Username string
|
|
Password string
|
|
FromAddress string
|
|
FromName string
|
|
UseTls bool
|
|
UpdatedAt pgtype.Timestamptz
|
|
}
|
|
|
|
type SuggestionSnooze struct {
|
|
UserID pgtype.UUID
|
|
CandidateMbid string
|
|
CandidateName string
|
|
SnoozedUntil pgtype.Timestamptz
|
|
CreatedAt pgtype.Timestamptz
|
|
}
|
|
|
|
type SystemPlaylistRotationState struct {
|
|
UserID pgtype.UUID
|
|
PlaylistKind string
|
|
PlayedTrackIds []pgtype.UUID
|
|
RotationStartedAt pgtype.Timestamptz
|
|
UpdatedAt pgtype.Timestamptz
|
|
}
|
|
|
|
type SystemPlaylistRun struct {
|
|
UserID pgtype.UUID
|
|
LastRunAt pgtype.Timestamptz
|
|
LastRunDate pgtype.Date
|
|
InFlight bool
|
|
LastError *string
|
|
}
|
|
|
|
type TagProviderSetting struct {
|
|
ProviderID string
|
|
Enabled bool
|
|
ApiKey *string
|
|
DisplayOrder int32
|
|
CreatedAt pgtype.Timestamptz
|
|
UpdatedAt pgtype.Timestamptz
|
|
}
|
|
|
|
type TagSourcesMetum struct {
|
|
ID bool
|
|
CurrentVersion int32
|
|
LastRegisteredProvidersHash string
|
|
}
|
|
|
|
type TasteProfileArtist struct {
|
|
UserID pgtype.UUID
|
|
ArtistID pgtype.UUID
|
|
Weight float64
|
|
UpdatedAt pgtype.Timestamptz
|
|
}
|
|
|
|
type TasteProfileEra struct {
|
|
UserID pgtype.UUID
|
|
Era string
|
|
Weight float64
|
|
UpdatedAt pgtype.Timestamptz
|
|
}
|
|
|
|
type TasteProfileMood struct {
|
|
UserID pgtype.UUID
|
|
Mood string
|
|
Weight float64
|
|
UpdatedAt pgtype.Timestamptz
|
|
}
|
|
|
|
type TasteProfileTag struct {
|
|
UserID pgtype.UUID
|
|
Tag string
|
|
Weight float64
|
|
UpdatedAt pgtype.Timestamptz
|
|
}
|
|
|
|
type TasteTuning struct {
|
|
Singleton bool
|
|
HalfLifeDays float64
|
|
EngagementHardSkip float64
|
|
EngagementNeutral float64
|
|
EngagementFull float64
|
|
UpdatedAt pgtype.Timestamptz
|
|
EnrichedTagScale float64
|
|
EraScale float64
|
|
MoodScale float64
|
|
}
|
|
|
|
type Track struct {
|
|
ID pgtype.UUID
|
|
Title string
|
|
AlbumID pgtype.UUID
|
|
ArtistID pgtype.UUID
|
|
TrackNumber *int32
|
|
DiscNumber *int32
|
|
DurationMs int32
|
|
FilePath string
|
|
FileSize int64
|
|
FileFormat string
|
|
Bitrate *int32
|
|
Mbid *string
|
|
Genre *string
|
|
AddedAt pgtype.Timestamptz
|
|
UpdatedAt pgtype.Timestamptz
|
|
TagSource *string
|
|
TagSourcesVersion int32
|
|
TagReadVersion int16
|
|
}
|
|
|
|
type TrackSimilarity struct {
|
|
TrackAID pgtype.UUID
|
|
TrackBID pgtype.UUID
|
|
Score float64
|
|
Source string
|
|
FetchedAt pgtype.Timestamptz
|
|
}
|
|
|
|
type TrackTag struct {
|
|
TrackID pgtype.UUID
|
|
Tag string
|
|
Weight float64
|
|
}
|
|
|
|
type User struct {
|
|
ID pgtype.UUID
|
|
Username string
|
|
PasswordHash string
|
|
ApiToken string
|
|
IsAdmin bool
|
|
CreatedAt pgtype.Timestamptz
|
|
SubsonicPassword *string
|
|
ListenbrainzToken *string
|
|
ListenbrainzEnabled bool
|
|
DisplayName *string
|
|
AutoApproveRequests bool
|
|
Email *string
|
|
Timezone string
|
|
TimezoneUpdatedAt pgtype.Timestamptz
|
|
DebugModeEnabled bool
|
|
}
|
|
|
|
type UserInvite struct {
|
|
Token string
|
|
InvitedBy pgtype.UUID
|
|
Note *string
|
|
CreatedAt pgtype.Timestamptz
|
|
ExpiresAt pgtype.Timestamptz
|
|
RedeemedAt pgtype.Timestamptz
|
|
RedeemedBy pgtype.UUID
|
|
}
|
|
|
|
type YouMightLikeAlbum struct {
|
|
UserID pgtype.UUID
|
|
AlbumID pgtype.UUID
|
|
Rank int32
|
|
BuiltAt pgtype.Timestamptz
|
|
}
|
|
|
|
type YouMightLikeArtist struct {
|
|
UserID pgtype.UUID
|
|
ArtistID pgtype.UUID
|
|
Rank int32
|
|
BuiltAt pgtype.Timestamptz
|
|
}
|