From a42edc34418aed99d9f1e9134f80b73b6678c54e Mon Sep 17 00:00:00 2001 From: sentriz Date: Wed, 19 Feb 2020 20:08:37 +0000 Subject: [PATCH] move models into db package --- .golangci.yml | 1 + assets/assets_gen.go | 22 +++++----- db/db.go | 26 ++++-------- db/migrations.go | 1 + {model => db}/model.go | 2 +- model | 0 scanner/scanner.go | 15 ++++--- scanner/stack/stack.go | 10 ++--- scanner/stack/stack_test.go | 20 ++++----- server/ctrladmin/ctrl.go | 16 ++++---- server/ctrladmin/handlers.go | 14 +++---- server/ctrladmin/middleware.go | 5 +-- server/ctrladmin/playlist.go | 9 ++--- server/ctrlsubsonic/handlers_by_folder.go | 22 +++++----- server/ctrlsubsonic/handlers_by_tags.go | 24 +++++------ server/ctrlsubsonic/handlers_common.go | 38 +++++++++--------- server/ctrlsubsonic/handlers_raw.go | 10 ++--- server/ctrlsubsonic/spec/construct.go | 4 +- .../ctrlsubsonic/spec/construct_by_folder.go | 12 +++--- server/ctrlsubsonic/spec/construct_by_tags.go | 8 ++-- server/ctrlsubsonic/testdata/db | Bin 122880 -> 122880 bytes server/lastfm/lastfm.go | 7 ++-- version/version.go | 12 +++--- 23 files changed, 133 insertions(+), 145 deletions(-) create mode 100644 db/migrations.go rename {model => db}/model.go (99%) create mode 100644 model diff --git a/.golangci.yml b/.golangci.yml index 85acfdd..c3e71f1 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -4,6 +4,7 @@ linters: - gochecknoglobals - gochecknoinits - gomnd + - godox - funlen - wsl issues: diff --git a/assets/assets_gen.go b/assets/assets_gen.go index 5f9b9c3..9c99c70 100644 --- a/assets/assets_gen.go +++ b/assets/assets_gen.go @@ -11,7 +11,7 @@ type EmbeddedAsset struct { } var Bytes = map[string]*EmbeddedAsset{ "pages/change_password.tmpl": &EmbeddedAsset{ - ModTime: time.Unix(1580143156, 0), + ModTime: time.Unix(1582000031, 0), Bytes: []byte{ 0x7b,0x7b,0x20,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x22,0x75,0x73,0x65,0x72,0x22,0x20,0x7d,0x7d,0x0a,0x3c,0x64,0x69,0x76, 0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x70,0x61,0x64,0x64,0x65,0x64,0x20,0x62,0x6f,0x78,0x22,0x3e,0x0a,0x20,0x20,0x20, @@ -39,7 +39,7 @@ var Bytes = map[string]*EmbeddedAsset{ 0x64,0x20,0x7d,0x7d,0x0a, }}, "pages/login.tmpl": &EmbeddedAsset{ - ModTime: time.Unix(1580142568, 0), + ModTime: time.Unix(1582000031, 0), Bytes: []byte{ 0x7b,0x7b,0x20,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x22,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x22,0x20,0x7d,0x7d,0x0a,0x3c, 0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x70,0x61,0x64,0x64,0x65,0x64,0x20,0x62,0x6f,0x78,0x22,0x3e,0x0a, @@ -62,7 +62,7 @@ var Bytes = map[string]*EmbeddedAsset{ 0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a, }}, "pages/home.tmpl": &EmbeddedAsset{ - ModTime: time.Unix(1580143754, 0), + ModTime: time.Unix(1582113240, 0), Bytes: []byte{ 0x7b,0x7b,0x20,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x22,0x75,0x73,0x65,0x72,0x22,0x20,0x7d,0x7d,0x0a,0x3c,0x64,0x69,0x76, 0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x70,0x61,0x64,0x64,0x65,0x64,0x20,0x62,0x6f,0x78,0x22,0x3e,0x0a,0x20,0x20,0x20, @@ -282,7 +282,7 @@ var Bytes = map[string]*EmbeddedAsset{ 0x2f,0x64,0x69,0x76,0x3e,0x0a,0x7b,0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a, }}, "pages/delete_user.tmpl": &EmbeddedAsset{ - ModTime: time.Unix(1580143173, 0), + ModTime: time.Unix(1582000031, 0), Bytes: []byte{ 0x7b,0x7b,0x20,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x22,0x75,0x73,0x65,0x72,0x22,0x20,0x7d,0x7d,0x0a,0x3c,0x64,0x69,0x76, 0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x70,0x61,0x64,0x64,0x65,0x64,0x20,0x62,0x6f,0x78,0x22,0x3e,0x0a,0x20,0x20,0x20, @@ -307,7 +307,7 @@ var Bytes = map[string]*EmbeddedAsset{ 0x2f,0x64,0x69,0x76,0x3e,0x0a,0x7b,0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a, }}, "pages/update_lastfm_api_key.tmpl": &EmbeddedAsset{ - ModTime: time.Unix(1580143015, 0), + ModTime: time.Unix(1582000031, 0), Bytes: []byte{ 0x7b,0x7b,0x20,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x22,0x75,0x73,0x65,0x72,0x22,0x20,0x7d,0x7d,0x0a,0x3c,0x64,0x69,0x76, 0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x70,0x61,0x64,0x64,0x65,0x64,0x20,0x62,0x6f,0x78,0x22,0x3e,0x0a,0x20,0x20,0x20, @@ -341,7 +341,7 @@ var Bytes = map[string]*EmbeddedAsset{ 0x3e,0x0a,0x7b,0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a, }}, "pages/change_own_password.tmpl": &EmbeddedAsset{ - ModTime: time.Unix(1580143781, 0), + ModTime: time.Unix(1582000031, 0), Bytes: []byte{ 0x7b,0x7b,0x20,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x22,0x75,0x73,0x65,0x72,0x22,0x20,0x7d,0x7d,0x0a,0x3c,0x64,0x69,0x76, 0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x70,0x61,0x64,0x64,0x65,0x64,0x20,0x62,0x6f,0x78,0x22,0x3e,0x0a,0x20,0x20,0x20, @@ -367,7 +367,7 @@ var Bytes = map[string]*EmbeddedAsset{ 0x7d,0x0a, }}, "pages/create_user.tmpl": &EmbeddedAsset{ - ModTime: time.Unix(1580142992, 0), + ModTime: time.Unix(1582000031, 0), Bytes: []byte{ 0x7b,0x7b,0x20,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x22,0x75,0x73,0x65,0x72,0x22,0x20,0x7d,0x7d,0x0a,0x3c,0x64,0x69,0x76, 0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x70,0x61,0x64,0x64,0x65,0x64,0x20,0x62,0x6f,0x78,0x22,0x3e,0x0a,0x20,0x20,0x20, @@ -10715,7 +10715,7 @@ var Bytes = map[string]*EmbeddedAsset{ 0x55,0x23,0xfe,0x00,0x00,0x00,0x00,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82, }}, "static/main.css": &EmbeddedAsset{ - ModTime: time.Unix(1579270806, 0), + ModTime: time.Unix(1582113240, 0), Bytes: []byte{ 0x3a,0x72,0x6f,0x6f,0x74,0x20,0x7b,0x0a,0x20,0x20,0x2d,0x2d,0x70,0x61,0x64,0x2d,0x73,0x69,0x7a,0x65,0x3a,0x20,0x31,0x2e, 0x37,0x35,0x72,0x65,0x6d,0x3b,0x0a,0x7d,0x0a,0x0a,0x2a,0x2c,0x20,0x73,0x70,0x61,0x6e,0x2c,0x20,0x64,0x69,0x76,0x2c,0x20, @@ -10813,7 +10813,7 @@ var Bytes = map[string]*EmbeddedAsset{ 0x32,0x3b,0x0a,0x7d,0x0a, }}, "partials/head.tmpl": &EmbeddedAsset{ - ModTime: time.Unix(1579908949, 0), + ModTime: time.Unix(1582000031, 0), Bytes: []byte{ 0x7b,0x7b,0x20,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x22,0x68,0x65,0x61,0x64,0x22,0x20,0x7d,0x7d,0x0a,0x3c,0x6c,0x69,0x6e, 0x6b,0x20,0x72,0x65,0x6c,0x3d,0x22,0x73,0x74,0x79,0x6c,0x65,0x73,0x68,0x65,0x65,0x74,0x22,0x20,0x68,0x72,0x65,0x66,0x3d, @@ -10840,7 +10840,7 @@ var Bytes = map[string]*EmbeddedAsset{ 0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a, }}, "layouts/base.tmpl": &EmbeddedAsset{ - ModTime: time.Unix(1579908703, 0), + ModTime: time.Unix(1582000031, 0), Bytes: []byte{ 0x7b,0x7b,0x20,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x22,0x6c,0x61,0x79,0x6f,0x75,0x74,0x22,0x20,0x7d,0x7d,0x0a,0x3c,0x21, 0x64,0x6f,0x63,0x74,0x79,0x70,0x65,0x20,0x68,0x74,0x6d,0x6c,0x3e,0x0a,0x3c,0x68,0x74,0x6d,0x6c,0x3e,0x0a,0x20,0x20,0x20, @@ -10881,7 +10881,7 @@ var Bytes = map[string]*EmbeddedAsset{ 0x3c,0x2f,0x68,0x74,0x6d,0x6c,0x3e,0x0a,0x7b,0x7b,0x20,0x65,0x6e,0x64,0x20,0x7d,0x7d,0x0a, }}, "layouts/user.tmpl": &EmbeddedAsset{ - ModTime: time.Unix(1579908924, 0), + ModTime: time.Unix(1582000031, 0), Bytes: []byte{ 0x7b,0x7b,0x20,0x64,0x65,0x66,0x69,0x6e,0x65,0x20,0x22,0x63,0x6f,0x6e,0x74,0x65,0x6e,0x74,0x22,0x20,0x7d,0x7d,0x0a,0x3c, 0x64,0x69,0x76,0x20,0x63,0x6c,0x61,0x73,0x73,0x3d,0x22,0x73,0x69,0x64,0x65,0x2d,0x70,0x61,0x64,0x64,0x65,0x64,0x20,0x6c, diff --git a/db/db.go b/db/db.go index 53f571d..c66b46f 100644 --- a/db/db.go +++ b/db/db.go @@ -8,8 +8,6 @@ import ( "github.com/jinzhu/gorm" "github.com/pkg/errors" - - "senan.xyz/g/gonic/model" ) var ( @@ -37,18 +35,8 @@ func New(path string) (*DB, error) { db.SetLogger(log.New(os.Stdout, "gorm ", 0)) db.DB().SetMaxOpenConns(dbMaxOpenConns) db.Exec("PRAGMA journal_mode=WAL;") - db.AutoMigrate( - model.Artist{}, - model.Track{}, - model.User{}, - model.Setting{}, - model.Play{}, - model.Album{}, - model.Playlist{}, - model.PlayQueue{}, - ) // TODO: don't log if user already exists - db.FirstOrCreate(&model.User{}, model.User{ + db.FirstOrCreate(&User{}, User{ Name: "admin", Password: "admin", IsAdmin: true, @@ -61,7 +49,7 @@ func NewMock() (*DB, error) { } func (db *DB) GetSetting(key string) string { - setting := &model.Setting{} + setting := &Setting{} db. Where("key = ?", key). First(setting) @@ -70,13 +58,13 @@ func (db *DB) GetSetting(key string) string { func (db *DB) SetSetting(key, value string) { db. - Where(model.Setting{Key: key}). - Assign(model.Setting{Value: value}). - FirstOrCreate(&model.Setting{}) + Where(Setting{Key: key}). + Assign(Setting{Value: value}). + FirstOrCreate(&Setting{}) } -func (db *DB) GetUserFromName(name string) *model.User { - user := &model.User{} +func (db *DB) GetUserFromName(name string) *User { + user := &User{} err := db. Where("name = ?", name). First(user). diff --git a/db/migrations.go b/db/migrations.go new file mode 100644 index 0000000..3a49c63 --- /dev/null +++ b/db/migrations.go @@ -0,0 +1 @@ +package db diff --git a/model/model.go b/db/model.go similarity index 99% rename from model/model.go rename to db/model.go index 9cf228d..9690b4b 100644 --- a/model/model.go +++ b/db/model.go @@ -1,5 +1,5 @@ //nolint:lll -package model +package db import ( "path" diff --git a/model b/model new file mode 100644 index 0000000..e69de29 diff --git a/scanner/scanner.go b/scanner/scanner.go index e68d88c..54a0c96 100644 --- a/scanner/scanner.go +++ b/scanner/scanner.go @@ -17,7 +17,6 @@ import ( "senan.xyz/g/gonic/db" "senan.xyz/g/gonic/mime" - "senan.xyz/g/gonic/model" "senan.xyz/g/gonic/scanner/stack" "senan.xyz/g/gonic/scanner/tags" ) @@ -106,7 +105,7 @@ func (s *Scanner) Start() error { var deleted uint // delete tracks not on filesystem s.db.WithTx(func(tx *gorm.DB) { - var tracks []*model.Track + var tracks []*db.Track tx. Select("id"). Find(&tracks) @@ -120,7 +119,7 @@ func (s *Scanner) Start() error { }) // delete folders not on filesystem s.db.WithTx(func(tx *gorm.DB) { - var folders []*model.Album + var folders []*db.Album tx. Select("id"). Find(&folders) @@ -268,7 +267,7 @@ func (s *Scanner) handleFolder(it *item) error { s.trTx.Commit() s.trTxOpen = false } - folder := &model.Album{} + folder := &db.Album{} defer func() { // folder's id will come from early return // or save at the end @@ -277,7 +276,7 @@ func (s *Scanner) handleFolder(it *item) error { }() err := s.db. Select("id, updated_at"). - Where(model.Album{ + Where(db.Album{ LeftPath: it.directory, RightPath: it.filename, }). @@ -304,10 +303,10 @@ func (s *Scanner) handleTrack(it *item) error { } // // set track basics - track := &model.Track{} + track := &db.Track{} err := s.trTx. Select("id, updated_at"). - Where(model.Track{ + Where(db.Track{ AlbumID: s.curFolders.PeekID(), Filename: it.filename, }). @@ -350,7 +349,7 @@ func (s *Scanner) handleTrack(it *item) error { } return "Unknown Artist" }() - artist := &model.Artist{} + artist := &db.Artist{} err = s.trTx. Select("id"). Where("name = ?", artistName). diff --git a/scanner/stack/stack.go b/scanner/stack/stack.go index 9ee295b..4e90075 100644 --- a/scanner/stack/stack.go +++ b/scanner/stack/stack.go @@ -4,11 +4,11 @@ import ( "fmt" "strings" - "senan.xyz/g/gonic/model" + "senan.xyz/g/gonic/db" ) type item struct { - value *model.Album + value *db.Album next *item } @@ -17,7 +17,7 @@ type Stack struct { len uint } -func (s *Stack) Push(v *model.Album) { +func (s *Stack) Push(v *db.Album) { s.top = &item{ value: v, next: s.top, @@ -25,7 +25,7 @@ func (s *Stack) Push(v *model.Album) { s.len++ } -func (s *Stack) Pop() *model.Album { +func (s *Stack) Pop() *db.Album { if s.len == 0 { return nil } @@ -35,7 +35,7 @@ func (s *Stack) Pop() *model.Album { return v } -func (s *Stack) Peek() *model.Album { +func (s *Stack) Peek() *db.Album { if s.len == 0 { return nil } diff --git a/scanner/stack/stack_test.go b/scanner/stack/stack_test.go index b503824..864d207 100644 --- a/scanner/stack/stack_test.go +++ b/scanner/stack/stack_test.go @@ -3,15 +3,15 @@ package stack import ( "testing" - "senan.xyz/g/gonic/model" + "senan.xyz/g/gonic/db" ) func TestFolderStack(t *testing.T) { sta := &Stack{} - sta.Push(&model.Album{ID: 3}) - sta.Push(&model.Album{ID: 4}) - sta.Push(&model.Album{ID: 5}) - sta.Push(&model.Album{ID: 6}) + sta.Push(&db.Album{ID: 3}) + sta.Push(&db.Album{ID: 4}) + sta.Push(&db.Album{ID: 5}) + sta.Push(&db.Album{ID: 6}) expected := "[6, 5, 4, 3, ]" actual := sta.String() if expected != actual { @@ -20,12 +20,12 @@ func TestFolderStack(t *testing.T) { } // sta = &Stack{} - sta.Push(&model.Album{ID: 27}) - sta.Push(&model.Album{ID: 4}) + sta.Push(&db.Album{ID: 27}) + sta.Push(&db.Album{ID: 4}) sta.Peek() - sta.Push(&model.Album{ID: 5}) - sta.Push(&model.Album{ID: 6}) - sta.Push(&model.Album{ID: 7}) + sta.Push(&db.Album{ID: 5}) + sta.Push(&db.Album{ID: 6}) + sta.Push(&db.Album{ID: 7}) sta.Pop() expected = "[6, 5, 4, 27, ]" actual = sta.String() diff --git a/server/ctrladmin/ctrl.go b/server/ctrladmin/ctrl.go index fa890c2..94d30d5 100644 --- a/server/ctrladmin/ctrl.go +++ b/server/ctrladmin/ctrl.go @@ -3,11 +3,11 @@ package ctrladmin import ( "encoding/gob" "fmt" - "strings" "html/template" "log" "net/http" "path/filepath" + "strings" "time" "github.com/Masterminds/sprig" @@ -18,7 +18,7 @@ import ( "github.com/wader/gormstore" "senan.xyz/g/gonic/assets" - "senan.xyz/g/gonic/model" + "senan.xyz/g/gonic/db" "senan.xyz/g/gonic/server/ctrlbase" "senan.xyz/g/gonic/version" ) @@ -96,22 +96,22 @@ func New(base *ctrlbase.Controller) *Controller { type templateData struct { // common Flashes []interface{} - User *model.User + User *db.User Version string // home AlbumCount int ArtistCount int TrackCount int RequestRoot string - RecentFolders []*model.Album - AllUsers []*model.User + RecentFolders []*db.Album + AllUsers []*db.User LastScanTime time.Time IsScanning bool - Playlists []*model.Playlist + Playlists []*db.Playlist // CurrentLastFMAPIKey string CurrentLastFMAPISecret string - SelectedUser *model.User + SelectedUser *db.User } type adminHandler func(r *http.Request) *Response @@ -168,7 +168,7 @@ func (c *Controller) H(h adminHandler) http.Handler { return } } - if user, ok := r.Context().Value(CtxUser).(*model.User); ok { + if user, ok := r.Context().Value(CtxUser).(*db.User); ok { resp.data.User = user } buff := c.buffPool.Get() diff --git a/server/ctrladmin/handlers.go b/server/ctrladmin/handlers.go index df7449a..0d29e84 100644 --- a/server/ctrladmin/handlers.go +++ b/server/ctrladmin/handlers.go @@ -7,7 +7,7 @@ import ( "strconv" "time" - "senan.xyz/g/gonic/model" + "senan.xyz/g/gonic/db" "senan.xyz/g/gonic/scanner" "senan.xyz/g/gonic/server/lastfm" ) @@ -54,7 +54,7 @@ func (c *Controller) ServeHome(r *http.Request) *Response { data.LastScanTime = time.Unix(i, 0) } // ** begin playlists box - user := r.Context().Value(CtxUser).(*model.User) + user := r.Context().Value(CtxUser).(*db.User) c.DB. Where("user_id = ?", user.ID). Limit(20). @@ -80,7 +80,7 @@ func (c *Controller) ServeChangeOwnPasswordDo(r *http.Request) *Response { flashW: []string{err.Error()}, } } - user := r.Context().Value(CtxUser).(*model.User) + user := r.Context().Value(CtxUser).(*db.User) user.Password = passwordOne c.DB.Save(user) return &Response{redirect: "/admin/home"} @@ -105,14 +105,14 @@ func (c *Controller) ServeLinkLastFMDo(r *http.Request) *Response { flashW: []string{err.Error()}, } } - user := r.Context().Value(CtxUser).(*model.User) + user := r.Context().Value(CtxUser).(*db.User) user.LastFMSession = sessionKey c.DB.Save(&user) return &Response{redirect: "/admin/home"} } func (c *Controller) ServeUnlinkLastFMDo(r *http.Request) *Response { - user := r.Context().Value(CtxUser).(*model.User) + user := r.Context().Value(CtxUser).(*db.User) user.LastFMSession = "" c.DB.Save(&user) return &Response{redirect: "/admin/home"} @@ -210,7 +210,7 @@ func (c *Controller) ServeCreateUserDo(r *http.Request) *Response { flashW: []string{err.Error()}, } } - user := model.User{ + user := db.User{ Name: username, Password: passwordOne, } @@ -273,7 +273,7 @@ func (c *Controller) ServeUploadPlaylistDo(r *http.Request) *Response { code: 500, } } - user := r.Context().Value(CtxUser).(*model.User) + user := r.Context().Value(CtxUser).(*db.User) var playlistCount int var errors []string for _, headers := range r.MultipartForm.File { diff --git a/server/ctrladmin/middleware.go b/server/ctrladmin/middleware.go index bfc7430..6999c04 100644 --- a/server/ctrladmin/middleware.go +++ b/server/ctrladmin/middleware.go @@ -5,8 +5,7 @@ import ( "net/http" "github.com/gorilla/sessions" - - "senan.xyz/g/gonic/model" + "senan.xyz/g/gonic/db" ) func (c *Controller) WithSession(next http.Handler) http.Handler { @@ -47,7 +46,7 @@ func (c *Controller) WithAdminSession(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // session and user exist at this point session := r.Context().Value(CtxSession).(*sessions.Session) - user := r.Context().Value(CtxUser).(*model.User) + user := r.Context().Value(CtxUser).(*db.User) if !user.IsAdmin { sessAddFlashW(session, []string{"you are not an admin"}) sessLogSave(session, w, r) diff --git a/server/ctrladmin/playlist.go b/server/ctrladmin/playlist.go index 1e742d7..4832c57 100644 --- a/server/ctrladmin/playlist.go +++ b/server/ctrladmin/playlist.go @@ -8,15 +8,14 @@ import ( "github.com/jinzhu/gorm" "github.com/pkg/errors" - - "senan.xyz/g/gonic/model" + "senan.xyz/g/gonic/db" ) func playlistParseLine(c *Controller, path string) (int, error) { if strings.HasPrefix(path, "#") || strings.TrimSpace(path) == "" { return 0, nil } - var track model.Track + var track db.Track query := c.DB.Raw(` SELECT tracks.id FROM TRACKS JOIN albums ON tracks.album_id = albums.id @@ -62,8 +61,8 @@ func playlistParseUpload(c *Controller, userID int, header *multipart.FileHeader if err := scanner.Err(); err != nil { return []string{fmt.Sprintf("iterating playlist file: %v", err)}, true } - playlist := &model.Playlist{} - c.DB.FirstOrCreate(playlist, model.Playlist{ + playlist := &db.Playlist{} + c.DB.FirstOrCreate(playlist, db.Playlist{ Name: playlistName, UserID: userID, }) diff --git a/server/ctrlsubsonic/handlers_by_folder.go b/server/ctrlsubsonic/handlers_by_folder.go index 8c1ffed..f298a9e 100644 --- a/server/ctrlsubsonic/handlers_by_folder.go +++ b/server/ctrlsubsonic/handlers_by_folder.go @@ -8,7 +8,7 @@ import ( "github.com/jinzhu/gorm" - "senan.xyz/g/gonic/model" + "senan.xyz/g/gonic/db" "senan.xyz/g/gonic/server/ctrlsubsonic/params" "senan.xyz/g/gonic/server/ctrlsubsonic/spec" ) @@ -20,7 +20,7 @@ import ( // under the root directory func (c *Controller) ServeGetIndexes(r *http.Request) *spec.Response { - var folders []*model.Album + var folders []*db.Album c.DB. Select("*, count(sub.id) as child_count"). Joins(` @@ -65,11 +65,11 @@ func (c *Controller) ServeGetMusicDirectory(r *http.Request) *spec.Response { return spec.NewError(10, "please provide an `id` parameter") } childrenObj := []*spec.TrackChild{} - folder := &model.Album{} + folder := &db.Album{} c.DB.First(folder, id) // // start looking for child childFolders in the current dir - var childFolders []*model.Album + var childFolders []*db.Album c.DB. Where("parent_id = ?", id). Find(&childFolders) @@ -78,7 +78,7 @@ func (c *Controller) ServeGetMusicDirectory(r *http.Request) *spec.Response { } // // start looking for child childTracks in the current dir - var childTracks []*model.Track + var childTracks []*db.Track c.DB. Where("album_id = ?", id). Preload("Album"). @@ -118,7 +118,7 @@ func (c *Controller) ServeGetAlbumList(r *http.Request) *spec.Response { case "alphabeticalByName": q = q.Order("right_path") case "frequent": - user := r.Context().Value(CtxUser).(*model.User) + user := r.Context().Value(CtxUser).(*db.User) q = q.Joins(` JOIN plays ON albums.id = plays.album_id AND plays.user_id = ?`, @@ -129,7 +129,7 @@ func (c *Controller) ServeGetAlbumList(r *http.Request) *spec.Response { case "random": q = q.Order(gorm.Expr("random()")) case "recent": - user := r.Context().Value(CtxUser).(*model.User) + user := r.Context().Value(CtxUser).(*db.User) q = q.Joins(` JOIN plays ON albums.id = plays.album_id AND plays.user_id = ?`, @@ -138,7 +138,7 @@ func (c *Controller) ServeGetAlbumList(r *http.Request) *spec.Response { default: return spec.NewError(10, "unknown value `%s` for parameter 'type'", listType) } - var folders []*model.Album + var folders []*db.Album q. Where("albums.tag_artist_id IS NOT NULL"). Offset(params.GetIntOr("offset", 0)). @@ -165,7 +165,7 @@ func (c *Controller) ServeSearchTwo(r *http.Request) *spec.Response { results := &spec.SearchResultTwo{} // // search "artists" - var artists []*model.Album + var artists []*db.Album c.DB. Where(` parent_id = 1 @@ -181,7 +181,7 @@ func (c *Controller) ServeSearchTwo(r *http.Request) *spec.Response { } // // search "albums" - var albums []*model.Album + var albums []*db.Album c.DB. Where(` tag_artist_id IS NOT NULL @@ -196,7 +196,7 @@ func (c *Controller) ServeSearchTwo(r *http.Request) *spec.Response { } // // search tracks - var tracks []*model.Track + var tracks []*db.Track c.DB. Preload("Album"). Where(` diff --git a/server/ctrlsubsonic/handlers_by_tags.go b/server/ctrlsubsonic/handlers_by_tags.go index c580fe1..4c3d80b 100644 --- a/server/ctrlsubsonic/handlers_by_tags.go +++ b/server/ctrlsubsonic/handlers_by_tags.go @@ -8,14 +8,14 @@ import ( "github.com/jinzhu/gorm" - "senan.xyz/g/gonic/model" + "senan.xyz/g/gonic/db" "senan.xyz/g/gonic/server/ctrlsubsonic/params" "senan.xyz/g/gonic/server/ctrlsubsonic/spec" "senan.xyz/g/gonic/server/lastfm" ) func (c *Controller) ServeGetArtists(r *http.Request) *spec.Response { - var artists []*model.Artist + var artists []*db.Artist c.DB. Select("*, count(sub.id) as album_count"). Joins(` @@ -57,7 +57,7 @@ func (c *Controller) ServeGetArtist(r *http.Request) *spec.Response { if err != nil { return spec.NewError(10, "please provide an `id` parameter") } - artist := &model.Artist{} + artist := &db.Artist{} c.DB. Preload("Albums"). First(artist, id) @@ -77,7 +77,7 @@ func (c *Controller) ServeGetAlbum(r *http.Request) *spec.Response { if err != nil { return spec.NewError(10, "please provide an `id` parameter") } - album := &model.Album{} + album := &db.Album{} err = c.DB. Preload("TagArtist"). Preload("Tracks", func(db *gorm.DB) *gorm.DB { @@ -121,7 +121,7 @@ func (c *Controller) ServeGetAlbumListTwo(r *http.Request) *spec.Response { params.GetIntOr("toYear", 2200)) q = q.Order("tag_year") case "frequent": - user := r.Context().Value(CtxUser).(*model.User) + user := r.Context().Value(CtxUser).(*db.User) q = q.Joins(` JOIN plays ON albums.id = plays.album_id AND plays.user_id = ?`, @@ -132,7 +132,7 @@ func (c *Controller) ServeGetAlbumListTwo(r *http.Request) *spec.Response { case "random": q = q.Order(gorm.Expr("random()")) case "recent": - user := r.Context().Value(CtxUser).(*model.User) + user := r.Context().Value(CtxUser).(*db.User) q = q.Joins(` JOIN plays ON albums.id = plays.album_id AND plays.user_id = ?`, @@ -141,7 +141,7 @@ func (c *Controller) ServeGetAlbumListTwo(r *http.Request) *spec.Response { default: return spec.NewError(10, "unknown value `%s` for parameter 'type'", listType) } - var albums []*model.Album + var albums []*db.Album q. Where("albums.tag_artist_id IS NOT NULL"). Offset(params.GetIntOr("offset", 0)). @@ -169,7 +169,7 @@ func (c *Controller) ServeSearchThree(r *http.Request) *spec.Response { results := &spec.SearchResultThree{} // // search "artists" - var artists []*model.Artist + var artists []*db.Artist c.DB. Where(` name LIKE ? OR @@ -184,7 +184,7 @@ func (c *Controller) ServeSearchThree(r *http.Request) *spec.Response { } // // search "albums" - var albums []*model.Album + var albums []*db.Album c.DB. Preload("TagArtist"). Where(` @@ -200,7 +200,7 @@ func (c *Controller) ServeSearchThree(r *http.Request) *spec.Response { } // // search tracks - var tracks []*model.Track + var tracks []*db.Track c.DB. Preload("Album"). Where(` @@ -229,7 +229,7 @@ func (c *Controller) ServeGetArtistInfoTwo(r *http.Request) *spec.Response { if apiKey == "" { return spec.NewError(0, "please set ask your admin to set the last.fm api key") } - artist := &model.Artist{} + artist := &db.Artist{} err = c.DB. Where("id = ?", id). Find(artist). @@ -263,7 +263,7 @@ func (c *Controller) ServeGetArtistInfoTwo(r *http.Request) *spec.Response { if i == count { break } - artist = &model.Artist{} + artist = &db.Artist{} err = c.DB. Select("*, count(albums.id) as album_count"). Where("name = ?", similarInfo.Name). diff --git a/server/ctrlsubsonic/handlers_common.go b/server/ctrlsubsonic/handlers_common.go index 8ba2421..6506f99 100644 --- a/server/ctrlsubsonic/handlers_common.go +++ b/server/ctrlsubsonic/handlers_common.go @@ -10,7 +10,7 @@ import ( "github.com/jinzhu/gorm" - "senan.xyz/g/gonic/model" + "senan.xyz/g/gonic/db" "senan.xyz/g/gonic/scanner" "senan.xyz/g/gonic/server/ctrlsubsonic/params" "senan.xyz/g/gonic/server/ctrlsubsonic/spec" @@ -44,12 +44,12 @@ func (c *Controller) ServeScrobble(r *http.Request) *spec.Response { return spec.NewError(10, "please provide an `id` parameter") } // fetch user to get lastfm session - user := r.Context().Value(CtxUser).(*model.User) + user := r.Context().Value(CtxUser).(*db.User) if user.LastFMSession == "" { return spec.NewError(0, "you don't have a last.fm session") } // fetch track for getting info to send to last.fm function - track := &model.Track{} + track := &db.Track{} c.DB. Preload("Album"). Preload("Artist"). @@ -96,7 +96,7 @@ func (c *Controller) ServeStartScan(r *http.Request) *spec.Response { func (c *Controller) ServeGetScanStatus(r *http.Request) *spec.Response { var trackCount int c.DB. - Model(model.Track{}). + Model(db.Track{}). Count(&trackCount) sub := spec.NewResponse() sub.ScanStatus = &spec.ScanStatus{ @@ -107,7 +107,7 @@ func (c *Controller) ServeGetScanStatus(r *http.Request) *spec.Response { } func (c *Controller) ServeGetUser(r *http.Request) *spec.Response { - user := r.Context().Value(CtxUser).(*model.User) + user := r.Context().Value(CtxUser).(*db.User) sub := spec.NewResponse() sub.User = &spec.User{ Username: user.Name, @@ -123,8 +123,8 @@ func (c *Controller) ServeNotFound(r *http.Request) *spec.Response { } func (c *Controller) ServeGetPlaylists(r *http.Request) *spec.Response { - user := r.Context().Value(CtxUser).(*model.User) - var playlists []*model.Playlist + user := r.Context().Value(CtxUser).(*db.User) + var playlists []*db.Playlist c.DB.Where("user_id = ?", user.ID).Find(&playlists) sub := spec.NewResponse() sub.Playlists = &spec.Playlists{ @@ -144,7 +144,7 @@ func (c *Controller) ServeGetPlaylist(r *http.Request) *spec.Response { if err != nil { return spec.NewError(10, "please provide an `id` parameter") } - playlist := model.Playlist{} + playlist := db.Playlist{} err = c.DB. Where("id = ?", playlistID). Find(&playlist). @@ -152,7 +152,7 @@ func (c *Controller) ServeGetPlaylist(r *http.Request) *spec.Response { if gorm.IsRecordNotFoundError(err) { return spec.NewError(70, "playlist with id `%d` not found", playlistID) } - user := r.Context().Value(CtxUser).(*model.User) + user := r.Context().Value(CtxUser).(*db.User) sub := spec.NewResponse() sub.Playlist = spec.NewPlaylist(&playlist) sub.Playlist.Owner = user.Name @@ -160,7 +160,7 @@ func (c *Controller) ServeGetPlaylist(r *http.Request) *spec.Response { trackIDs := playlist.GetItems() sub.Playlist.List = make([]*spec.TrackChild, len(trackIDs)) for i, id := range trackIDs { - track := model.Track{} + track := db.Track{} c.DB. Where("id = ?", id). Preload("Album"). @@ -171,7 +171,7 @@ func (c *Controller) ServeGetPlaylist(r *http.Request) *spec.Response { } func (c *Controller) ServeUpdatePlaylist(r *http.Request) *spec.Response { - user := r.Context().Value(CtxUser).(*model.User) + user := r.Context().Value(CtxUser).(*db.User) params := r.Context().Value(CtxParams).(params.Params) var playlistID int if p := params.GetFirstList("id", "playlistId"); p != nil { @@ -179,7 +179,7 @@ func (c *Controller) ServeUpdatePlaylist(r *http.Request) *spec.Response { } // playlistID may be 0 from above. in that case we get a new playlist // as intended - playlist := &model.Playlist{ID: playlistID} + playlist := &db.Playlist{ID: playlistID} c.DB.Where(playlist).First(playlist) // ** begin update meta info playlist.UserID = user.ID @@ -211,13 +211,13 @@ func (c *Controller) ServeDeletePlaylist(r *http.Request) *spec.Response { params := r.Context().Value(CtxParams).(params.Params) c.DB. Where("id = ?", params.GetIntOr("id", 0)). - Delete(&model.Playlist{}) + Delete(&db.Playlist{}) return spec.NewResponse() } func (c *Controller) ServeGetPlayQueue(r *http.Request) *spec.Response { - user := r.Context().Value(CtxUser).(*model.User) - queue := model.PlayQueue{} + user := r.Context().Value(CtxUser).(*db.User) + queue := db.PlayQueue{} err := c.DB. Where("user_id = ?", user.ID). Find(&queue). @@ -235,7 +235,7 @@ func (c *Controller) ServeGetPlayQueue(r *http.Request) *spec.Response { trackIDs := queue.GetItems() sub.PlayQueue.List = make([]*spec.TrackChild, len(trackIDs)) for i, id := range trackIDs { - track := model.Track{} + track := db.Track{} c.DB. Where("id = ?", id). Preload("Album"). @@ -251,8 +251,8 @@ func (c *Controller) ServeSavePlayQueue(r *http.Request) *spec.Response { if tracks == nil { return spec.NewError(10, "please provide some `id` parameters") } - user := r.Context().Value(CtxUser).(*model.User) - queue := &model.PlayQueue{UserID: user.ID} + user := r.Context().Value(CtxUser).(*db.User) + queue := &db.PlayQueue{UserID: user.ID} c.DB.Where(queue).First(queue) queue.Current = params.GetIntOr("current", 0) queue.Position = params.GetIntOr("position", 0) @@ -268,7 +268,7 @@ func (c *Controller) ServeGetSong(r *http.Request) *spec.Response { if err != nil { return spec.NewError(10, "provide an `id` parameter") } - track := &model.Track{} + track := &db.Track{} err = c.DB. Where("id = ?", id). Preload("Album"). diff --git a/server/ctrlsubsonic/handlers_raw.go b/server/ctrlsubsonic/handlers_raw.go index b097afd..6c2e651 100644 --- a/server/ctrlsubsonic/handlers_raw.go +++ b/server/ctrlsubsonic/handlers_raw.go @@ -7,7 +7,7 @@ import ( "github.com/jinzhu/gorm" - "senan.xyz/g/gonic/model" + "senan.xyz/g/gonic/db" "senan.xyz/g/gonic/server/ctrlsubsonic/params" "senan.xyz/g/gonic/server/ctrlsubsonic/spec" ) @@ -24,7 +24,7 @@ func (c *Controller) ServeGetCoverArt(w http.ResponseWriter, r *http.Request) *s if err != nil { return spec.NewError(10, "please provide an `id` parameter") } - folder := &model.Album{} + folder := &db.Album{} err = c.DB. Select("id, left_path, right_path, cover"). First(folder, id). @@ -51,7 +51,7 @@ func (c *Controller) ServeStream(w http.ResponseWriter, r *http.Request) *spec.R if err != nil { return spec.NewError(10, "please provide an `id` parameter") } - track := &model.Track{} + track := &db.Track{} err = c.DB. Preload("Album"). First(track, id). @@ -68,8 +68,8 @@ func (c *Controller) ServeStream(w http.ResponseWriter, r *http.Request) *spec.R http.ServeFile(w, r, absPath) // // after we've served the file, mark the album as played - user := r.Context().Value(CtxUser).(*model.User) - play := model.Play{ + user := r.Context().Value(CtxUser).(*db.User) + play := db.Play{ AlbumID: track.Album.ID, UserID: user.ID, } diff --git a/server/ctrlsubsonic/spec/construct.go b/server/ctrlsubsonic/spec/construct.go index 84d57bb..1aa4cc9 100644 --- a/server/ctrlsubsonic/spec/construct.go +++ b/server/ctrlsubsonic/spec/construct.go @@ -1,8 +1,8 @@ package spec -import "senan.xyz/g/gonic/model" +import "senan.xyz/g/gonic/db" -func NewPlaylist(p *model.Playlist) *Playlist { +func NewPlaylist(p *db.Playlist) *Playlist { return &Playlist{ ID: p.ID, Name: p.Name, diff --git a/server/ctrlsubsonic/spec/construct_by_folder.go b/server/ctrlsubsonic/spec/construct_by_folder.go index 1795553..ad77bbe 100644 --- a/server/ctrlsubsonic/spec/construct_by_folder.go +++ b/server/ctrlsubsonic/spec/construct_by_folder.go @@ -3,10 +3,10 @@ package spec import ( "path" - "senan.xyz/g/gonic/model" + "senan.xyz/g/gonic/db" ) -func NewAlbumByFolder(f *model.Album) *Album { +func NewAlbumByFolder(f *db.Album) *Album { a := &Album{ Artist: f.Parent.RightPath, ID: f.ID, @@ -21,7 +21,7 @@ func NewAlbumByFolder(f *model.Album) *Album { return a } -func NewTCAlbumByFolder(f *model.Album) *TrackChild { +func NewTCAlbumByFolder(f *db.Album) *TrackChild { trCh := &TrackChild{ ID: f.ID, IsDir: true, @@ -35,7 +35,7 @@ func NewTCAlbumByFolder(f *model.Album) *TrackChild { return trCh } -func NewTCTrackByFolder(t *model.Track, parent *model.Album) *TrackChild { +func NewTCTrackByFolder(t *db.Track, parent *db.Album) *TrackChild { trCh := &TrackChild{ ID: t.ID, ContentType: t.MIME(), @@ -66,7 +66,7 @@ func NewTCTrackByFolder(t *model.Track, parent *model.Album) *TrackChild { return trCh } -func NewArtistByFolder(f *model.Album) *Artist { +func NewArtistByFolder(f *db.Album) *Artist { return &Artist{ ID: f.ID, Name: f.RightPath, @@ -74,7 +74,7 @@ func NewArtistByFolder(f *model.Album) *Artist { } } -func NewDirectoryByFolder(f *model.Album, children []*TrackChild) *Directory { +func NewDirectoryByFolder(f *db.Album, children []*TrackChild) *Directory { dir := &Directory{ ID: f.ID, Name: f.RightPath, diff --git a/server/ctrlsubsonic/spec/construct_by_tags.go b/server/ctrlsubsonic/spec/construct_by_tags.go index 1eaa43e..71b5a3c 100644 --- a/server/ctrlsubsonic/spec/construct_by_tags.go +++ b/server/ctrlsubsonic/spec/construct_by_tags.go @@ -3,10 +3,10 @@ package spec import ( "path" - "senan.xyz/g/gonic/model" + "senan.xyz/g/gonic/db" ) -func NewAlbumByTags(a *model.Album, artist *model.Artist) *Album { +func NewAlbumByTags(a *db.Album, artist *db.Artist) *Album { ret := &Album{ Created: a.ModifiedAt, ID: a.ID, @@ -23,7 +23,7 @@ func NewAlbumByTags(a *model.Album, artist *model.Artist) *Album { return ret } -func NewTrackByTags(t *model.Track, album *model.Album) *TrackChild { +func NewTrackByTags(t *db.Track, album *db.Album) *TrackChild { ret := &TrackChild{ ID: t.ID, ContentType: t.MIME(), @@ -55,7 +55,7 @@ func NewTrackByTags(t *model.Track, album *model.Album) *TrackChild { return ret } -func NewArtistByTags(a *model.Artist) *Artist { +func NewArtistByTags(a *db.Artist) *Artist { return &Artist{ ID: a.ID, Name: a.Name, diff --git a/server/ctrlsubsonic/testdata/db b/server/ctrlsubsonic/testdata/db index c9e16a0052b54be71a63da319fb27909914917f7..871b1839f4ca22eb51496172a5ef8055eb32a80b 100644 GIT binary patch delta 22 ecmZoTz}|3xeS$P&;Y1l{#=^#gtqF_^?gIc`S_p&y delta 22 ecmZoTz}|3xeS$P&?nD`9#@xn)tqF_^?gIc`1_*or diff --git a/server/lastfm/lastfm.go b/server/lastfm/lastfm.go index dd14f89..a996ba8 100644 --- a/server/lastfm/lastfm.go +++ b/server/lastfm/lastfm.go @@ -13,7 +13,7 @@ import ( "github.com/pkg/errors" - "senan.xyz/g/gonic/model" + "senan.xyz/g/gonic/db" ) var ( @@ -55,7 +55,6 @@ func makeRequest(method string, params url.Values) (LastFM, error) { if err = decoder.Decode(&lastfm); err != nil { return LastFM{}, errors.Wrap(err, "decoding") } - //? if lastfm.Error.Code != 0 { return LastFM{}, fmt.Errorf("parsing: %v", lastfm.Error.Value) } @@ -76,7 +75,7 @@ func GetSession(apiKey, secret, token string) (string, error) { } type ScrobbleOpts struct { - Track *model.Track + Track *db.Track StampMili int Submission bool } @@ -103,7 +102,7 @@ func Scrobble(apiKey, secret, session string, opts ScrobbleOpts) error { return err } -func ArtistGetInfo(apiKey string, artist *model.Artist) (Artist, error) { +func ArtistGetInfo(apiKey string, artist *db.Artist) (Artist, error) { params := url.Values{} params.Add("method", "artist.getInfo") params.Add("api_key", apiKey) diff --git a/version/version.go b/version/version.go index 00aaef3..95f2abf 100644 --- a/version/version.go +++ b/version/version.go @@ -4,8 +4,10 @@ package version -const NAME = "gonic" -const NAME_UPPER = "GONIC" -const NAME_EMBED = "gonicembed" -const NAME_SCAN = "gonicscan" -const VERSION = "v0.6.3" +const ( + NAME = "gonic" + NAME_UPPER = "GONIC" + NAME_EMBED = "gonicembed" + NAME_SCAN = "gonicscan" + VERSION = "v0.6.3" +)