From bf7f9942c54f6354bd68bc3ea01f2b2cc2b6436d Mon Sep 17 00:00:00 2001 From: zacaj Date: Thu, 6 Nov 2025 23:25:28 +0000 Subject: [PATCH 1/3] feat(model): add Rated At field - #4653 Signed-off-by: zacaj --- .../20251109010105_add_annotation_rating_date.sql | 7 +++++++ model/annotation.go | 1 + model/criteria/fields.go | 1 + persistence/playlist_repository.go | 1 + persistence/playlist_track_repository.go | 1 + persistence/sql_annotations.go | 4 +++- ui/src/common/LoveButton.jsx | 7 ++++++- ui/src/common/RatingField.jsx | 7 ++++++- 8 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 db/migrations/20251109010105_add_annotation_rating_date.sql diff --git a/db/migrations/20251109010105_add_annotation_rating_date.sql b/db/migrations/20251109010105_add_annotation_rating_date.sql new file mode 100644 index 000000000..9dac46a5e --- /dev/null +++ b/db/migrations/20251109010105_add_annotation_rating_date.sql @@ -0,0 +1,7 @@ +-- +goose Up +-- +goose StatementBegin +ALTER TABLE annotation ADD COLUMN rated_at datetime; +-- +goose StatementEnd + +-- +goose Down + \ No newline at end of file diff --git a/model/annotation.go b/model/annotation.go index 2ec72c1b7..fbff5f178 100644 --- a/model/annotation.go +++ b/model/annotation.go @@ -6,6 +6,7 @@ type Annotations struct { PlayCount int64 `structs:"play_count" json:"playCount,omitempty"` PlayDate *time.Time `structs:"play_date" json:"playDate,omitempty" ` Rating int `structs:"rating" json:"rating,omitempty" ` + RatedAt *time.Time `structs:"rated_at" json:"ratedAt,omitempty" ` Starred bool `structs:"starred" json:"starred,omitempty" ` StarredAt *time.Time `structs:"starred_at" json:"starredAt,omitempty"` } diff --git a/model/criteria/fields.go b/model/criteria/fields.go index 70719cd6f..5381ae597 100644 --- a/model/criteria/fields.go +++ b/model/criteria/fields.go @@ -44,6 +44,7 @@ var fieldMap = map[string]*mappedField{ "loved": {field: "COALESCE(annotation.starred, false)"}, "dateloved": {field: "annotation.starred_at"}, "lastplayed": {field: "annotation.play_date"}, + "daterated": {field: "annotation.rated_at"}, "playcount": {field: "COALESCE(annotation.play_count, 0)"}, "rating": {field: "COALESCE(annotation.rating, 0)"}, "mbz_album_id": {field: "media_file.mbz_album_id"}, diff --git a/persistence/playlist_repository.go b/persistence/playlist_repository.go index 046284e1f..a94f95a78 100644 --- a/persistence/playlist_repository.go +++ b/persistence/playlist_repository.go @@ -388,6 +388,7 @@ func (r *playlistRepository) loadTracks(sel SelectBuilder, id string) (model.Pla "coalesce(play_count, 0) as play_count", "play_date", "coalesce(rating, 0) as rating", + "rated_at", "f.*", "playlist_tracks.*", "library.path as library_path", diff --git a/persistence/playlist_track_repository.go b/persistence/playlist_track_repository.go index 01eec0d02..9b3234c92 100644 --- a/persistence/playlist_track_repository.go +++ b/persistence/playlist_track_repository.go @@ -97,6 +97,7 @@ func (r *playlistTrackRepository) Read(id string) (interface{}, error) { "coalesce(rating, 0) as rating", "starred_at", "play_date", + "rated_at", "f.*", "playlist_tracks.*", ). diff --git a/persistence/sql_annotations.go b/persistence/sql_annotations.go index 6691b553c..fc363c27a 100644 --- a/persistence/sql_annotations.go +++ b/persistence/sql_annotations.go @@ -28,6 +28,7 @@ func (r sqlRepository) withAnnotation(query SelectBuilder, idField string) Selec "coalesce(rating, 0) as rating", "starred_at", "play_date", + "rated_at", ) if conf.Server.AlbumPlayCountMode == consts.AlbumPlayCountModeNormalized && r.tableName == "album" { query = query.Columns( @@ -77,7 +78,8 @@ func (r sqlRepository) SetStar(starred bool, ids ...string) error { } func (r sqlRepository) SetRating(rating int, itemID string) error { - return r.annUpsert(map[string]interface{}{"rating": rating}, itemID) + ratedAt := time.Now() + return r.annUpsert(map[string]interface{}{"rating": rating, "rated_at": ratedAt}, itemID) } func (r sqlRepository) IncPlayCount(itemID string, ts time.Time) error { diff --git a/ui/src/common/LoveButton.jsx b/ui/src/common/LoveButton.jsx index f42d92ff4..f941a7402 100644 --- a/ui/src/common/LoveButton.jsx +++ b/ui/src/common/LoveButton.jsx @@ -46,8 +46,13 @@ export const LoveButton = ({