Update album oldest and newest properly when manually updating dates of photos

This commit is contained in:
gokcedilek 2023-12-04 21:35:19 -08:00
parent 296397abe9
commit 429c799ecc
3 changed files with 34 additions and 11 deletions

View file

@ -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(

View file

@ -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 {

View file

@ -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)