diff --git a/model/base.go b/model/base.go index f808b7e..ee61124 100644 --- a/model/base.go +++ b/model/base.go @@ -10,5 +10,5 @@ type CrudBase struct { } type IDBase struct { - ID *int `gorm:"primary_key"` + ID int `gorm:"primary_key"` } diff --git a/model/model.go b/model/model.go index b694e48..2c1613d 100644 --- a/model/model.go +++ b/model/model.go @@ -2,10 +2,6 @@ package model import "time" -// q: why in tarnation are all the foreign keys pointers to ints? -// a: so they will be true sqlite null values instead of go zero -// values when we save a row without that value -// // q: what in tarnation are the `IsNew`s for? // a: it's a bit of a hack - but we set a models IsNew to true if // we just filled it in for the first time, so when it comes @@ -18,14 +14,14 @@ type Album struct { IDBase CrudBase AlbumArtist AlbumArtist - AlbumArtistID *int `gorm:"index" sql:"type:int REFERENCES album_artists(id) ON DELETE CASCADE"` - Title string `gorm:"not null;index"` + AlbumArtistID int `gorm:"index" sql:"default: null; type:int REFERENCES album_artists(id) ON DELETE CASCADE"` + Title string `gorm:"not null; index"` // an Album having a `Path` is a little weird when browsing by tags // (for the most part - the library's folder structure is treated as // if it were flat), but this solves the "American Football problem" // https://en.wikipedia.org/wiki/American_Football_(band)#Discography - Path string `gorm:"not null;unique_index"` - CoverID *int `sql:"type:int REFERENCES covers(id)"` + Path string `gorm:"not null; unique_index"` + CoverID int `sql:"default: null; type:int REFERENCES covers(id)"` Cover Cover Year int Tracks []Track @@ -36,7 +32,7 @@ type Album struct { type AlbumArtist struct { IDBase CrudBase - Name string `gorm:"not null;unique_index"` + Name string `gorm:"not null; unique_index"` Albums []Album } @@ -45,9 +41,9 @@ type Track struct { IDBase CrudBase Album Album - AlbumID *int `gorm:"index" sql:"type:int REFERENCES albums(id) ON DELETE CASCADE"` + AlbumID int `gorm:"index" sql:"default: null; type:int REFERENCES albums(id) ON DELETE CASCADE"` AlbumArtist AlbumArtist - AlbumArtistID *int `gorm:"index" sql:"type:int REFERENCES album_artists(id) ON DELETE CASCADE"` + AlbumArtistID int `gorm:"index" sql:"default: null; type:int REFERENCES album_artists(id) ON DELETE CASCADE"` Artist string Bitrate int Codec string @@ -62,8 +58,8 @@ type Track struct { ContentType string Size int Folder Folder - FolderID *int `gorm:"not null;index" sql:"type:int REFERENCES folders(id) ON DELETE CASCADE"` - Path string `gorm:"not null;unique_index"` + FolderID int `gorm:"not null; index" sql:"default: null; type:int REFERENCES folders(id) ON DELETE CASCADE"` + Path string `gorm:"not null; unique_index"` } // Cover represents the covers table @@ -71,7 +67,7 @@ type Cover struct { IDBase CrudBase Image []byte - Path string `gorm:"not null;unique_index"` + Path string `gorm:"not null; unique_index"` IsNew bool `gorm:"-"` } @@ -79,7 +75,7 @@ type Cover struct { type User struct { IDBase CrudBase - Name string `gorm:"not null;unique_index"` + Name string `gorm:"not null; unique_index"` Password string LastFMSession string IsAdmin bool @@ -88,7 +84,7 @@ type User struct { // Setting represents the settings table type Setting struct { CrudBase - Key string `gorm:"primary_key;auto_increment:false"` + Key string `gorm:"primary_key; auto_increment:false"` Value string } @@ -96,11 +92,11 @@ type Setting struct { type Play struct { IDBase User User - UserID *int `gorm:"not null;index" sql:"type:int REFERENCES users(id) ON DELETE CASCADE"` + UserID int `gorm:"not null; index" sql:"default: null; type:int REFERENCES users(id) ON DELETE CASCADE"` Album Album - AlbumID *int `gorm:"not null;index" sql:"type:int REFERENCES albums(id) ON DELETE CASCADE"` + AlbumID int `gorm:"not null; index" sql:"default: null; type:int REFERENCES albums(id) ON DELETE CASCADE"` Folder Folder - FolderID *int `gorm:"not null;index" sql:"type:int REFERENCES folders(id) ON DELETE CASCADE"` + FolderID int `gorm:"not null; index" sql:"default: null; type:int REFERENCES folders(id) ON DELETE CASCADE"` Time time.Time Count int } @@ -110,11 +106,11 @@ type Folder struct { IDBase CrudBase Name string - Path string `gorm:"not null;unique_index"` + Path string `gorm:"not null; unique_index"` Parent *Folder - ParentID *int `sql:"type:int REFERENCES folders(id) ON DELETE CASCADE"` - CoverID *int `sql:"type:int REFERENCES covers(id)"` - HasTracks bool `gorm:"not null;index"` + ParentID int `sql:"default: null; type:int REFERENCES folders(id) ON DELETE CASCADE"` + CoverID int `sql:"default: null; type:int REFERENCES covers(id)"` + HasTracks bool `gorm:"not null; index"` Cover Cover IsNew bool `gorm:"-"` } diff --git a/scanner/folder_stack.go b/scanner/folder_stack.go index d8ca6c2..d58585d 100644 --- a/scanner/folder_stack.go +++ b/scanner/folder_stack.go @@ -26,10 +26,10 @@ func (s *folderStack) Peek() model.Folder { return (*s)[l-1] } -func (s *folderStack) PeekID() *int { +func (s *folderStack) PeekID() int { l := len(*s) if l == 0 { - return nil + return 0 } return (*s)[l-1].ID } diff --git a/server/handler/handler.go b/server/handler/handler.go index d58e7cf..4505cfd 100644 --- a/server/handler/handler.go +++ b/server/handler/handler.go @@ -38,6 +38,12 @@ func (c *Controller) SetSetting(key, value string) { func (c *Controller) GetUserFromName(name string) *model.User { var user model.User - c.DB.Where("name = ?", name).First(&user) + err := c.DB. + Where("name = ?", name). + First(&user). + Error + if gorm.IsRecordNotFoundError(err) { + return nil + } return &user } diff --git a/server/handler/handler_admin.go b/server/handler/handler_admin.go index ed824aa..bfdf2b2 100644 --- a/server/handler/handler_admin.go +++ b/server/handler/handler_admin.go @@ -26,7 +26,7 @@ func (c *Controller) ServeLoginDo(w http.ResponseWriter, r *http.Request) { return } user := c.GetUserFromName(username) - if !(username == user.Name && password == user.Password) { + if user == nil || password != user.Password { session.AddFlash("invalid username / password") session.Save(r, w) http.Redirect(w, r, r.Header.Get("Referer"), http.StatusSeeOther) diff --git a/server/handler/handler_sub_by_folder.go b/server/handler/handler_sub_by_folder.go index 95a4dce..c0c32cb 100644 --- a/server/handler/handler_sub_by_folder.go +++ b/server/handler/handler_sub_by_folder.go @@ -29,7 +29,7 @@ func (c *Controller) GetIndexes(w http.ResponseWriter, r *http.Request) { indexes = append(indexes, index) } index.Artists = append(index.Artists, &subsonic.Artist{ - ID: *folder.ID, + ID: folder.ID, Name: folder.Name, }) } @@ -58,11 +58,11 @@ func (c *Controller) GetMusicDirectory(w http.ResponseWriter, r *http.Request) { Find(&folders) for _, folder := range folders { childrenObj = append(childrenObj, &subsonic.Child{ - Parent: *cFolder.ID, - ID: *folder.ID, + Parent: cFolder.ID, + ID: folder.ID, Title: folder.Name, IsDir: true, - CoverID: *folder.CoverID, + CoverID: folder.CoverID, }) } // @@ -80,14 +80,14 @@ func (c *Controller) GetMusicDirectory(w http.ResponseWriter, r *http.Request) { track.Suffix = "mp3" } childrenObj = append(childrenObj, &subsonic.Child{ - ID: *track.ID, + ID: track.ID, Album: track.Album.Title, Artist: track.Artist, ContentType: track.ContentType, - CoverID: *cFolder.CoverID, + CoverID: cFolder.CoverID, Duration: 0, IsDir: false, - Parent: *cFolder.ID, + Parent: cFolder.ID, Path: track.Path, Size: track.Size, Suffix: track.Suffix, @@ -100,8 +100,8 @@ func (c *Controller) GetMusicDirectory(w http.ResponseWriter, r *http.Request) { // respond section sub := subsonic.NewResponse() sub.Directory = &subsonic.Directory{ - ID: *cFolder.ID, - Parent: *cFolder.ParentID, + ID: cFolder.ID, + Parent: cFolder.ParentID, Name: cFolder.Name, Children: childrenObj, } @@ -162,11 +162,11 @@ func (c *Controller) GetAlbumList(w http.ResponseWriter, r *http.Request) { listObj := []*subsonic.Album{} for _, folder := range folders { listObj = append(listObj, &subsonic.Album{ - ID: *folder.ID, + ID: folder.ID, Title: folder.Name, Album: folder.Name, - CoverID: *folder.CoverID, - ParentID: *folder.ParentID, + CoverID: folder.CoverID, + ParentID: folder.ParentID, IsDir: true, Artist: folder.Parent.Name, }) diff --git a/server/handler/handler_sub_by_tags.go b/server/handler/handler_sub_by_tags.go index a34ee9e..8a5599e 100644 --- a/server/handler/handler_sub_by_tags.go +++ b/server/handler/handler_sub_by_tags.go @@ -27,7 +27,7 @@ func (c *Controller) GetArtists(w http.ResponseWriter, r *http.Request) { indexes.List = append(indexes.List, index) } index.Artists = append(index.Artists, &subsonic.Artist{ - ID: *artist.ID, + ID: artist.ID, Name: artist.Name, }) } @@ -49,17 +49,17 @@ func (c *Controller) GetArtist(w http.ResponseWriter, r *http.Request) { albumsObj := []*subsonic.Album{} for _, album := range artist.Albums { albumsObj = append(albumsObj, &subsonic.Album{ - ID: *album.ID, + ID: album.ID, Name: album.Title, Created: album.CreatedAt, Artist: artist.Name, - ArtistID: *artist.ID, - CoverID: *album.CoverID, + ArtistID: artist.ID, + CoverID: album.CoverID, }) } sub := subsonic.NewResponse() sub.Artist = &subsonic.Artist{ - ID: *artist.ID, + ID: artist.ID, Name: artist.Name, Albums: albumsObj, } @@ -80,7 +80,7 @@ func (c *Controller) GetAlbum(w http.ResponseWriter, r *http.Request) { tracksObj := []*subsonic.Track{} for _, track := range album.Tracks { tracksObj = append(tracksObj, &subsonic.Track{ - ID: *track.ID, + ID: track.ID, Title: track.Title, Artist: track.Artist, // track artist TrackNo: track.TrackNumber, @@ -90,17 +90,17 @@ func (c *Controller) GetAlbum(w http.ResponseWriter, r *http.Request) { Created: track.CreatedAt, Size: track.Size, Album: album.Title, - AlbumID: *album.ID, - ArtistID: *album.AlbumArtist.ID, // album artist - CoverID: *album.CoverID, + AlbumID: album.ID, + ArtistID: album.AlbumArtist.ID, // album artist + CoverID: album.CoverID, Type: "music", }) } sub := subsonic.NewResponse() sub.Album = &subsonic.Album{ - ID: *album.ID, + ID: album.ID, Name: album.Title, - CoverID: *album.CoverID, + CoverID: album.CoverID, Created: album.CreatedAt, Artist: album.AlbumArtist.Name, Tracks: tracksObj, @@ -164,12 +164,12 @@ func (c *Controller) GetAlbumListTwo(w http.ResponseWriter, r *http.Request) { listObj := []*subsonic.Album{} for _, album := range albums { listObj = append(listObj, &subsonic.Album{ - ID: *album.ID, + ID: album.ID, Name: album.Title, Created: album.CreatedAt, - CoverID: *album.CoverID, + CoverID: album.CoverID, Artist: album.AlbumArtist.Name, - ArtistID: *album.AlbumArtist.ID, + ArtistID: album.AlbumArtist.ID, }) } sub := subsonic.NewResponse() diff --git a/server/handler/middleware_admin.go b/server/handler/middleware_admin.go index aebe808..25bf3b0 100644 --- a/server/handler/middleware_admin.go +++ b/server/handler/middleware_admin.go @@ -30,7 +30,7 @@ func (c *Controller) WithUserSession(next http.HandlerFunc) http.HandlerFunc { } // take username from sesion and add the user row to the context user := c.GetUserFromName(username) - if *user.ID == 0 { + if user == nil { // the username in the client's session no longer relates to a // user in the database (maybe the user was deleted) session.Options.MaxAge = -1 diff --git a/server/handler/middleware_sub.go b/server/handler/middleware_sub.go index 1bb5ac7..65a97e6 100644 --- a/server/handler/middleware_sub.go +++ b/server/handler/middleware_sub.go @@ -61,7 +61,7 @@ func (c *Controller) WithValidSubsonicArgs(next http.HandlerFunc) http.HandlerFu return } user := c.GetUserFromName(username) - if *user.ID == 0 { + if user == nil { // the user does not exist respondError(w, r, 40, "invalid username") return