1
Fork 0
photoview/api/graphql/models/album.go

57 lines
1.4 KiB
Go
Raw Normal View History

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 {
Model
Title string `gorm:"not null"`
ParentAlbumID *int `gorm:"index"`
ParentAlbum *Album `gorm:"constraint:OnDelete:SET NULL;"`
2020-12-22 01:14:43 +01:00
// OwnerID int `gorm:"not null"`
// Owner User
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"`
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
// 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) {
return GetChildrenFromAlbums(db, filter, []int{a.ID})
}
func GetChildrenFromAlbums(db *gorm.DB, filter func(*gorm.DB) *gorm.DB, albumIDs []int) (children []*Album, err error) {
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 (
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
)
?
`, albumIDs, query).Find(&children).Error
2020-12-31 00:37:11 +01:00
return children, err
}