From 5a1e9f96f75efcaffbdb43d4363608f170429758 Mon Sep 17 00:00:00 2001 From: Deluan Date: Thu, 29 May 2025 20:47:00 -0400 Subject: [PATCH] feat(playlists): implement event refresh Signed-off-by: Deluan --- server/subsonic/media_annotation_test.go | 38 ++++++++++++++++++++++++ tests/mock_playlist_repo.go | 20 +++++++++++-- ui/src/layout/PlaylistsSubMenu.jsx | 3 +- 3 files changed, 58 insertions(+), 3 deletions(-) diff --git a/server/subsonic/media_annotation_test.go b/server/subsonic/media_annotation_test.go index 1611250d9..84642c8c9 100644 --- a/server/subsonic/media_annotation_test.go +++ b/server/subsonic/media_annotation_test.go @@ -30,6 +30,44 @@ var _ = Describe("MediaAnnotationController", func() { router = New(ds, nil, nil, nil, nil, nil, nil, eventBroker, nil, playTracker, nil, nil) }) + Describe("Star", func() { + It("should send refresh resource event when starring a playlist", func() { + mockPlaylistRepo := &tests.MockPlaylistRepo{ + Entity: &model.Playlist{ID: "pls-1", Name: "Test Playlist"}, + } + ds.(*tests.MockDataStore).MockedPlaylist = mockPlaylistRepo + + r := newGetRequest("id=pls-1") + _, err := router.Star(r) + + Expect(err).ToNot(HaveOccurred()) + Expect(eventBroker.Events).To(HaveLen(1)) + + event := eventBroker.Events[0].(*events.RefreshResource) + data := event.Data(event) + Expect(data).To(ContainSubstring("playlist")) + Expect(data).To(ContainSubstring("pls-1")) + }) + + It("should send refresh resource event when unstarring a playlist", func() { + mockPlaylistRepo := &tests.MockPlaylistRepo{ + Entity: &model.Playlist{ID: "pls-1", Name: "Test Playlist"}, + } + ds.(*tests.MockDataStore).MockedPlaylist = mockPlaylistRepo + + r := newGetRequest("id=pls-1") + _, err := router.Unstar(r) + + Expect(err).ToNot(HaveOccurred()) + Expect(eventBroker.Events).To(HaveLen(1)) + + event := eventBroker.Events[0].(*events.RefreshResource) + data := event.Data(event) + Expect(data).To(ContainSubstring("playlist")) + Expect(data).To(ContainSubstring("pls-1")) + }) + }) + Describe("Scrobble", func() { It("submit all scrobbles with only the id", func() { submissionTime := time.Now() diff --git a/tests/mock_playlist_repo.go b/tests/mock_playlist_repo.go index 60dc98be9..38f7245a3 100644 --- a/tests/mock_playlist_repo.go +++ b/tests/mock_playlist_repo.go @@ -8,8 +8,9 @@ import ( type MockPlaylistRepo struct { model.PlaylistRepository - Entity *model.Playlist - Error error + Entity *model.Playlist + Error error + SetStarWasCalled bool } func (m *MockPlaylistRepo) Get(_ string) (*model.Playlist, error) { @@ -31,3 +32,18 @@ func (m *MockPlaylistRepo) Count(_ ...rest.QueryOptions) (int64, error) { } return 1, nil } + +func (m *MockPlaylistRepo) Exists(_ string) (bool, error) { + if m.Error != nil { + return false, m.Error + } + return m.Entity != nil, nil +} + +func (m *MockPlaylistRepo) SetStar(starred bool, itemIDs ...string) error { + if m.Error != nil { + return m.Error + } + m.SetStarWasCalled = true + return nil +} diff --git a/ui/src/layout/PlaylistsSubMenu.jsx b/ui/src/layout/PlaylistsSubMenu.jsx index 56e25d190..1d4996909 100644 --- a/ui/src/layout/PlaylistsSubMenu.jsx +++ b/ui/src/layout/PlaylistsSubMenu.jsx @@ -12,7 +12,7 @@ import QueueMusicOutlinedIcon from '@material-ui/icons/QueueMusicOutlined' import { BiCog } from 'react-icons/bi' import { useDrop } from 'react-dnd' import SubMenu from './SubMenu' -import { canChangeTracks } from '../common' +import { canChangeTracks, useResourceRefresh } from '../common' import { DraggableTypes } from '../consts' import config from '../config' @@ -51,6 +51,7 @@ const PlaylistMenuItemLink = ({ pls, sidebarIsOpen }) => { const PlaylistsSubMenu = ({ state, setState, sidebarIsOpen, dense }) => { const history = useHistory() + useResourceRefresh('playlist') const { data, loaded } = useQueryWithStore({ type: 'getList', resource: 'playlist',