Update album oldest and newest properly when manually updating dates of photos
This commit is contained in:
parent
296397abe9
commit
429c799ecc
3 changed files with 34 additions and 11 deletions
|
@ -901,13 +901,13 @@ func (m *Album) RemovePhotos(UIDs []string) (removed PhotoAlbums) {
|
|||
photo.PhotoUID != "" {
|
||||
takenAt := photo.TakenAt
|
||||
if isOldest := takenAt.Equal(m.AlbumOldest); isOldest {
|
||||
if oldestPhoto, err := AlbumOldestOrNewest(m.AlbumUID, true); err == nil {
|
||||
if oldestPhoto, err := AlbumOldestOrNewest(m.AlbumUID, true, ""); err == nil {
|
||||
// update the oldest of the album
|
||||
updatedAlbumOldest = oldestPhoto.TakenAt
|
||||
}
|
||||
}
|
||||
if isNewest := takenAt.Equal(m.AlbumNewest); isNewest {
|
||||
if newestPhoto, err := AlbumOldestOrNewest(m.AlbumUID, false); err == nil {
|
||||
if newestPhoto, err := AlbumOldestOrNewest(m.AlbumUID, false, ""); err == nil {
|
||||
// update the newest of the album
|
||||
updatedAlbumNewest = newestPhoto.TakenAt
|
||||
}
|
||||
|
@ -935,7 +935,7 @@ func (m *Album) Links() Links {
|
|||
return FindLinks("", m.AlbumUID)
|
||||
}
|
||||
|
||||
func AlbumOldestOrNewest(albumUid string, isOldest bool) (Photo, error) {
|
||||
func AlbumOldestOrNewest(albumUid string, isOldest bool, exceptPhotoUid string) (Photo, error) {
|
||||
var photo Photo
|
||||
var orderDirection string
|
||||
if isOldest {
|
||||
|
@ -948,6 +948,7 @@ func AlbumOldestOrNewest(albumUid string, isOldest bool) (Photo, error) {
|
|||
"JOIN photos_albums ON photos.photo_uid = "+
|
||||
"photos_albums.photo_uid",
|
||||
).Joins("JOIN albums ON photos_albums.album_uid = albums.album_uid").
|
||||
Where("photos.photo_uid != ?", exceptPhotoUid).
|
||||
Where("albums.album_uid = ?", albumUid).
|
||||
Where("photos_albums.hidden = 0").
|
||||
Order(
|
||||
|
|
|
@ -155,6 +155,9 @@ func NewUserPhoto(stackable bool, userUid string) Photo {
|
|||
// SavePhotoForm saves a model in the database using form data.
|
||||
func SavePhotoForm(model Photo, form form.Photo) error {
|
||||
locChanged := model.PhotoLat != form.PhotoLat || model.PhotoLng != form.PhotoLng || model.PhotoCountry != form.PhotoCountry
|
||||
oldTakenAt := model.TakenAt
|
||||
oldTakenAtLocal := model.TakenAtLocal
|
||||
takenAtChanged := oldTakenAt != form.TakenAt || oldTakenAtLocal != form.TakenAtLocal
|
||||
|
||||
if err := deepcopier.Copy(&model).From(form); err != nil {
|
||||
return err
|
||||
|
@ -173,6 +176,10 @@ func SavePhotoForm(model Photo, form form.Photo) error {
|
|||
|
||||
model.UpdateDateFields()
|
||||
|
||||
if takenAtChanged {
|
||||
model.UpdateDateFieldsOfAlbums(oldTakenAt)
|
||||
}
|
||||
|
||||
details := model.GetDetails()
|
||||
|
||||
if form.Details.PhotoID == model.ID {
|
||||
|
|
|
@ -127,24 +127,39 @@ func (m *Photo) UpdateDateFields() {
|
|||
Where("photo_id = ? AND photo_taken_at <> ?", m.ID, m.TakenAtLocal).
|
||||
Updates(File{PhotoTakenAt: m.TakenAtLocal}).Error,
|
||||
)
|
||||
}
|
||||
|
||||
// update the oldest or newest date of the albums of this photo, if needed
|
||||
// UpdateDateFieldsOfAlbums updates the oldest or newest date of the albums the photo is in, if needed.
|
||||
func (m *Photo) UpdateDateFieldsOfAlbums(oldTakenAt time.Time) {
|
||||
if albums, err := AlbumsOfPhoto(m.PhotoUID); err == nil {
|
||||
for _, album := range albums {
|
||||
albumOldest := album.AlbumOldest
|
||||
albumNewest := album.AlbumNewest
|
||||
updatedAlbumOldest := albumOldest
|
||||
updatedAlbumNewest := albumNewest
|
||||
takenAt := m.TakenAt
|
||||
if before := takenAt.Before(albumOldest); before {
|
||||
albumOldest = takenAt
|
||||
} else if after := takenAt.After(albumNewest); after {
|
||||
albumNewest = takenAt
|
||||
if wasOldest := oldTakenAt.Equal(albumOldest); wasOldest {
|
||||
if oldestPhoto, err := AlbumOldestOrNewest(album.AlbumUID, true, m.PhotoUID); err == nil {
|
||||
// find the oldest of the album
|
||||
updatedAlbumOldest = oldestPhoto.TakenAt
|
||||
}
|
||||
}
|
||||
if wasNewest := oldTakenAt.Equal(albumNewest); wasNewest {
|
||||
if newestPhoto, err := AlbumOldestOrNewest(album.AlbumUID, false, m.PhotoUID); err == nil {
|
||||
// find the newest of the album
|
||||
updatedAlbumNewest = newestPhoto.TakenAt
|
||||
}
|
||||
}
|
||||
if before := takenAt.Before(updatedAlbumOldest); before {
|
||||
updatedAlbumOldest = takenAt
|
||||
} else if after := takenAt.After(updatedAlbumNewest); after {
|
||||
updatedAlbumNewest = takenAt
|
||||
}
|
||||
|
||||
// Refresh updated timestamp and album oldest/newest values.
|
||||
if !albumOldest.Equal(album.AlbumOldest) || !albumNewest.Equal(album.AlbumNewest) {
|
||||
if !updatedAlbumOldest.Equal(album.AlbumOldest) || !updatedAlbumNewest.Equal(album.AlbumNewest) {
|
||||
if err := UpdateAlbum(
|
||||
album.AlbumUID, Values{
|
||||
"albumOldest": albumOldest, "albumNewest": albumNewest,
|
||||
"albumOldest": updatedAlbumOldest, "albumNewest": updatedAlbumNewest,
|
||||
},
|
||||
); err != nil {
|
||||
log.Errorf("album: %s (update %s)", err.Error(), album)
|
||||
|
|
Loading…
Add table
Reference in a new issue