mirror of
https://github.com/gabehf/Koito.git
synced 2026-04-22 20:11:50 -07:00
feat: native import & export
This commit is contained in:
parent
1d02cede49
commit
7b0cff0a07
13 changed files with 645 additions and 2 deletions
|
|
@ -82,6 +82,7 @@ type DB interface {
|
|||
ImageHasAssociation(ctx context.Context, image uuid.UUID) (bool, error)
|
||||
GetImageSource(ctx context.Context, image uuid.UUID) (string, error)
|
||||
AlbumsWithoutImages(ctx context.Context, from int32) ([]*models.Album, error)
|
||||
GetExportPage(ctx context.Context, opts GetExportPageOpts) ([]*ExportItem, error)
|
||||
Ping(ctx context.Context) error
|
||||
Close(ctx context.Context)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -147,3 +147,10 @@ type TimeListenedOpts struct {
|
|||
ArtistID int32
|
||||
TrackID int32
|
||||
}
|
||||
|
||||
type GetExportPageOpts struct {
|
||||
UserID int32
|
||||
ListenedAt time.Time
|
||||
TrackID int32
|
||||
Limit int32
|
||||
}
|
||||
|
|
|
|||
|
|
@ -128,6 +128,7 @@ func (d *Psql) SaveArtistAliases(ctx context.Context, id int32, aliases []string
|
|||
}
|
||||
defer tx.Rollback(ctx)
|
||||
qtx := d.q.WithTx(tx)
|
||||
l.Debug().Msgf("Fetching existing artist aliases for artist %d...", id)
|
||||
existing, err := qtx.GetAllArtistAliases(ctx, id)
|
||||
if err != nil {
|
||||
return fmt.Errorf("SaveArtistAliases: GetAllArtistAliases: %w", err)
|
||||
|
|
@ -135,8 +136,10 @@ func (d *Psql) SaveArtistAliases(ctx context.Context, id int32, aliases []string
|
|||
for _, v := range existing {
|
||||
aliases = append(aliases, v.Alias)
|
||||
}
|
||||
l.Debug().Msgf("Ensuring aliases are unique...")
|
||||
utils.Unique(&aliases)
|
||||
for _, alias := range aliases {
|
||||
l.Debug().Msgf("Inserting alias %s for artist with id %d", alias, id)
|
||||
alias = strings.TrimSpace(alias)
|
||||
if alias == "" {
|
||||
return errors.New("SaveArtistAliases: aliases cannot be blank")
|
||||
|
|
|
|||
59
internal/db/psql/exports.go
Normal file
59
internal/db/psql/exports.go
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
package psql
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
|
||||
"github.com/gabehf/koito/internal/db"
|
||||
"github.com/gabehf/koito/internal/models"
|
||||
"github.com/gabehf/koito/internal/repository"
|
||||
)
|
||||
|
||||
func (d *Psql) GetExportPage(ctx context.Context, opts db.GetExportPageOpts) ([]*db.ExportItem, error) {
|
||||
rows, err := d.q.GetListensExportPage(ctx, repository.GetListensExportPageParams{
|
||||
UserID: opts.UserID,
|
||||
TrackID: opts.TrackID,
|
||||
Limit: opts.Limit,
|
||||
ListenedAt: opts.ListenedAt,
|
||||
})
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("GetExportPage: %w", err)
|
||||
}
|
||||
ret := make([]*db.ExportItem, len(rows))
|
||||
for i, row := range rows {
|
||||
|
||||
var trackAliases []models.Alias
|
||||
err = json.Unmarshal(row.TrackAliases, &trackAliases)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("GetExportPage: json.Unmarshal trackAliases: %w", err)
|
||||
}
|
||||
var albumAliases []models.Alias
|
||||
err = json.Unmarshal(row.ReleaseAliases, &albumAliases)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("GetExportPage: json.Unmarshal albumAliases: %w", err)
|
||||
}
|
||||
var artists []models.ArtistWithFullAliases
|
||||
err = json.Unmarshal(row.Artists, &artists)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("GetExportPage: json.Unmarshal artists: %w", err)
|
||||
}
|
||||
|
||||
ret[i] = &db.ExportItem{
|
||||
TrackID: row.TrackID,
|
||||
ListenedAt: row.ListenedAt,
|
||||
UserID: row.UserID,
|
||||
Client: row.Client,
|
||||
TrackMbid: row.TrackMbid,
|
||||
TrackDuration: row.TrackDuration,
|
||||
TrackAliases: trackAliases,
|
||||
ReleaseID: row.ReleaseID,
|
||||
ReleaseMbid: row.ReleaseMbid,
|
||||
ReleaseImageSource: row.ReleaseImageSource.String,
|
||||
VariousArtists: row.VariousArtists,
|
||||
ReleaseAliases: albumAliases,
|
||||
Artists: artists,
|
||||
}
|
||||
}
|
||||
return ret, nil
|
||||
}
|
||||
|
|
@ -2,6 +2,9 @@ package db
|
|||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/gabehf/koito/internal/models"
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
type InformationSource string
|
||||
|
|
@ -24,3 +27,20 @@ type PaginatedResponse[T any] struct {
|
|||
HasNextPage bool `json:"has_next_page"`
|
||||
CurrentPage int32 `json:"current_page"`
|
||||
}
|
||||
|
||||
type ExportItem struct {
|
||||
ListenedAt time.Time
|
||||
UserID int32
|
||||
Client *string
|
||||
TrackID int32
|
||||
TrackMbid *uuid.UUID
|
||||
TrackDuration int32
|
||||
TrackAliases []models.Alias
|
||||
ReleaseID int32
|
||||
ReleaseMbid *uuid.UUID
|
||||
ReleaseImage *uuid.UUID
|
||||
ReleaseImageSource string
|
||||
VariousArtists bool
|
||||
ReleaseAliases []models.Alias
|
||||
Artists []models.ArtistWithFullAliases
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue