diff --git a/src/libs/services/database/impl/TrackList.cpp b/src/libs/services/database/impl/TrackList.cpp index d7d67739..a212f13c 100644 --- a/src/libs/services/database/impl/TrackList.cpp +++ b/src/libs/services/database/impl/TrackList.cpp @@ -576,6 +576,12 @@ TrackList::getDuration() const return query.resultValue(); } +void +TrackList::setLastModifiedDateTime(const Wt::WDateTime& dateTime) +{ + _lastModifiedDateTime = Utils::normalizeDateTime(dateTime); +} + std::vector TrackList::getTopArtists(const std::vector& clusterIds, std::optional linkType, std::optional range, bool& moreResults) const { diff --git a/src/libs/services/database/include/services/database/Object.hpp b/src/libs/services/database/include/services/database/Object.hpp index e4ea5342..1287349e 100644 --- a/src/libs/services/database/include/services/database/Object.hpp +++ b/src/libs/services/database/include/services/database/Object.hpp @@ -41,7 +41,8 @@ namespace Database auto modify() { return _obj.modify(); } void remove() { - _obj.modify()->onPreRemove(); + if (_obj->hasOnPreRemove()) + _obj.modify()->onPreRemove(); _obj.remove(); } @@ -67,9 +68,13 @@ namespace Database protected: template friend class ObjectPtr; - virtual void onPostCreated() {} + + virtual bool hasOnPreRemove() const { return false; } virtual void onPreRemove() {} + virtual bool hasOnPostCreated() const { return false; } + virtual void onPostCreated() {} + // Can get raw dbo ptr only from Objects template static diff --git a/src/libs/services/database/include/services/database/Session.hpp b/src/libs/services/database/include/services/database/Session.hpp index 0766404f..d12b6cfb 100644 --- a/src/libs/services/database/include/services/database/Session.hpp +++ b/src/libs/services/database/include/services/database/Session.hpp @@ -80,7 +80,9 @@ namespace Database typename Object::pointer res {Object::create(*this, std::forward(args)...)}; getDboSession().flush(); - res.modify()->onPostCreated(); + if (res->hasOnPostCreated()) + res.modify()->onPostCreated(); + return res; } diff --git a/src/libs/services/database/include/services/database/TrackList.hpp b/src/libs/services/database/include/services/database/TrackList.hpp index 419278db..f6865bec 100644 --- a/src/libs/services/database/include/services/database/TrackList.hpp +++ b/src/libs/services/database/include/services/database/TrackList.hpp @@ -85,7 +85,6 @@ class TrackList : public Object void setName(const std::string& name) { _name = name; } void setIsPublic(bool isPublic) { _isPublic = isPublic; } void clear() { _entries.clear(); } - void setLastModifiedDateTime(const Wt::WDateTime& dateTime) { _lastModifiedDateTime = dateTime; } // Get tracks, ordered by position bool isEmpty() const; @@ -106,6 +105,8 @@ class TrackList : public Object std::vector getTrackIds() const; std::chrono::milliseconds getDuration() const; + void setLastModifiedDateTime(const Wt::WDateTime& dateTime); + // Get clusters, order by occurence std::vector> getClusters() const; std::vector>> getClusterGroups(const std::vector>& clusterTypes, std::size_t size) const; @@ -148,7 +149,10 @@ class TrackListEntry : public Object public: TrackListEntry() = default; + bool hasOnPostCreated() const override { return true; } void onPostCreated() override; + + bool hasOnPreRemove() const override { return true; } void onPreRemove() override; // find utility diff --git a/src/libs/services/database/test/TrackList.cpp b/src/libs/services/database/test/TrackList.cpp index 243caab3..4bf8aa5f 100644 --- a/src/libs/services/database/test/TrackList.cpp +++ b/src/libs/services/database/test/TrackList.cpp @@ -93,22 +93,8 @@ TEST_F(DatabaseFixture, TrackList_SortMethod) { auto transaction {session.createUniqueTransaction()}; - session.create(track.get(), trackList1.get()); - } - - { - auto transaction {session.createSharedTransaction()}; - - const auto trackLists {TrackList::find(session, TrackList::FindParameters {}.setSortMethod(TrackListSortMethod::LastModifiedDesc))}; - ASSERT_EQ(trackLists.results.size(), 2); - EXPECT_EQ(trackLists.results[0], trackList1.getId()); - EXPECT_EQ(trackLists.results[1], trackList2.getId()); - } - - { - auto transaction {session.createUniqueTransaction()}; - - session.create(track.get(), trackList2.get()); + trackList1.get().modify()->setLastModifiedDateTime(Wt::WDateTime {Wt::WDate {1900,1,1}}); + trackList2.get().modify()->setLastModifiedDateTime(Wt::WDateTime {Wt::WDate {1900,1,2}}); } { @@ -119,6 +105,22 @@ TEST_F(DatabaseFixture, TrackList_SortMethod) EXPECT_EQ(trackLists.results[0], trackList2.getId()); EXPECT_EQ(trackLists.results[1], trackList1.getId()); } + + { + auto transaction {session.createUniqueTransaction()}; + + trackList1.get().modify()->setLastModifiedDateTime(Wt::WDateTime {Wt::WDate {1900,1,2}}); + trackList2.get().modify()->setLastModifiedDateTime(Wt::WDateTime {Wt::WDate {1900,1,1}}); + } + + { + auto transaction {session.createSharedTransaction()}; + + const auto trackLists {TrackList::find(session, TrackList::FindParameters {}.setSortMethod(TrackListSortMethod::LastModifiedDesc))}; + ASSERT_EQ(trackLists.results.size(), 2); + EXPECT_EQ(trackLists.results[0], trackList1.getId()); + EXPECT_EQ(trackLists.results[1], trackList2.getId()); + } } TEST_F(DatabaseFixture, SingleTrackListMultipleTrack)