2020-02-05 16:14:21 +01:00
|
|
|
package models
|
|
|
|
|
|
|
|
import (
|
2020-11-25 23:06:47 +01:00
|
|
|
"crypto/md5"
|
|
|
|
"encoding/hex"
|
|
|
|
|
2020-11-23 19:59:01 +01:00
|
|
|
"gorm.io/gorm"
|
2020-02-05 16:14:21 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
type Album struct {
|
2020-11-28 21:29:31 +01:00
|
|
|
Model
|
2020-11-28 21:49:33 +01:00
|
|
|
Title string `gorm:"not null"`
|
2021-01-19 17:31:37 +01:00
|
|
|
ParentAlbumID *int `gorm:"index"`
|
2021-01-06 17:28:06 +01:00
|
|
|
ParentAlbum *Album `gorm:"constraint:OnDelete:SET NULL;"`
|
2020-12-22 01:14:43 +01:00
|
|
|
// OwnerID int `gorm:"not null"`
|
|
|
|
// Owner User
|
2021-04-26 20:37:29 +02:00
|
|
|
Owners []User `gorm:"many2many:user_albums;constraint:OnDelete:CASCADE;"`
|
2020-12-22 01:14:43 +01:00
|
|
|
Path string `gorm:"not null"`
|
|
|
|
PathHash string `gorm:"unique"`
|
2021-09-18 21:43:34 +02:00
|
|
|
CoverID *int
|
2020-02-05 16:14:21 +01:00
|
|
|
}
|
|
|
|
|
2020-03-07 16:19:27 +01:00
|
|
|
func (a *Album) FilePath() string {
|
|
|
|
return a.Path
|
|
|
|
}
|
2020-11-25 23:06:47 +01:00
|
|
|
|
|
|
|
func (a *Album) BeforeSave(tx *gorm.DB) (err error) {
|
|
|
|
hash := md5.Sum([]byte(a.Path))
|
|
|
|
a.PathHash = hex.EncodeToString(hash[:])
|
|
|
|
return nil
|
|
|
|
}
|
2020-12-31 00:37:11 +01:00
|
|
|
|
2021-03-03 15:55:55 +01:00
|
|
|
// GetChildren performs a recursive query to get all the children of the album.
|
|
|
|
// An optional filter can be provided that can be used to modify the query on the children.
|
|
|
|
func (a *Album) GetChildren(db *gorm.DB, filter func(*gorm.DB) *gorm.DB) (children []*Album, err error) {
|
2021-04-26 12:21:15 +02:00
|
|
|
return GetChildrenFromAlbums(db, filter, []int{a.ID})
|
|
|
|
}
|
|
|
|
|
|
|
|
func GetChildrenFromAlbums(db *gorm.DB, filter func(*gorm.DB) *gorm.DB, albumIDs []int) (children []*Album, err error) {
|
2021-03-03 15:55:55 +01:00
|
|
|
query := db.Model(&Album{}).Table("sub_albums")
|
|
|
|
|
|
|
|
if filter != nil {
|
|
|
|
query = filter(query)
|
|
|
|
}
|
|
|
|
|
2020-12-31 00:37:11 +01:00
|
|
|
err = db.Raw(`
|
|
|
|
WITH recursive sub_albums AS (
|
2021-04-26 12:21:15 +02:00
|
|
|
SELECT * FROM albums AS root WHERE id IN (?)
|
2020-12-31 00:37:11 +01:00
|
|
|
UNION ALL
|
|
|
|
SELECT child.* FROM albums AS child JOIN sub_albums ON child.parent_album_id = sub_albums.id
|
|
|
|
)
|
|
|
|
|
2021-03-03 15:55:55 +01:00
|
|
|
?
|
2021-04-26 12:21:15 +02:00
|
|
|
`, albumIDs, query).Find(&children).Error
|
2020-12-31 00:37:11 +01:00
|
|
|
|
|
|
|
return children, err
|
|
|
|
}
|
2021-08-30 21:36:45 +02:00
|
|
|
|
|
|
|
func (a *Album) GetParents(db *gorm.DB, filter func(*gorm.DB) *gorm.DB) (parents []*Album, err error) {
|
|
|
|
return GetParentsFromAlbums(db, filter, a.ID)
|
|
|
|
}
|
|
|
|
|
|
|
|
func GetParentsFromAlbums(db *gorm.DB, filter func(*gorm.DB) *gorm.DB, albumID int) (parents []*Album, err error) {
|
|
|
|
query := db.Model(&Album{}).Table("super_albums")
|
|
|
|
|
|
|
|
if filter != nil {
|
|
|
|
query = filter(query)
|
|
|
|
}
|
|
|
|
|
|
|
|
err = db.Raw(`
|
|
|
|
WITH recursive super_albums AS (
|
|
|
|
SELECT * FROM albums AS leaf WHERE id = ?
|
|
|
|
UNION ALL
|
|
|
|
SELECT parent.* from albums AS parent JOIN super_albums ON parent.id = super_albums.parent_album_id
|
|
|
|
)
|
|
|
|
|
|
|
|
?
|
|
|
|
`, albumID, query).Find(&parents).Error
|
|
|
|
|
|
|
|
return parents, err
|
|
|
|
}
|
2021-09-23 19:59:40 +02:00
|
|
|
|
|
|
|
func (a *Album) Thumbnail(db *gorm.DB) (*Media, error) {
|
|
|
|
var media Media
|
|
|
|
|
|
|
|
if a.CoverID == nil {
|
|
|
|
if err := db.Raw(`
|
|
|
|
WITH recursive sub_albums AS (
|
|
|
|
SELECT * FROM albums AS root WHERE id = ?
|
|
|
|
UNION ALL
|
|
|
|
SELECT child.* FROM albums AS child JOIN sub_albums ON child.parent_album_id = sub_albums.id
|
|
|
|
)
|
|
|
|
|
|
|
|
SELECT * FROM media WHERE media.album_id IN (
|
|
|
|
SELECT id FROM sub_albums
|
|
|
|
) AND media.id IN (
|
|
|
|
SELECT media_id FROM media_urls WHERE media_urls.media_id = media.id
|
2021-09-23 20:14:37 +02:00
|
|
|
) ORDER BY id LIMIT 1
|
2021-09-23 19:59:40 +02:00
|
|
|
`, a.ID).Find(&media).Error; err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if err := db.Where("id = ?", a.CoverID).Find(&media).Error; err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return &media, nil
|
|
|
|
}
|