diff --git a/src/libs/services/auth/include/services/auth/IPasswordService.hpp b/src/libs/services/auth/include/services/auth/IPasswordService.hpp index d92c9386..9138e62c 100644 --- a/src/libs/services/auth/include/services/auth/IPasswordService.hpp +++ b/src/libs/services/auth/include/services/auth/IPasswordService.hpp @@ -37,7 +37,6 @@ namespace lms::db namespace lms::auth { - class IAuthTokenService; class IPasswordService diff --git a/src/libs/subsonic/impl/RequestContext.hpp b/src/libs/subsonic/impl/RequestContext.hpp index d751111c..03bf4ccc 100644 --- a/src/libs/subsonic/impl/RequestContext.hpp +++ b/src/libs/subsonic/impl/RequestContext.hpp @@ -23,13 +23,14 @@ #include -#include "database/UserId.hpp" +#include "database/Object.hpp" #include "ClientInfo.hpp" #include "ProtocolVersion.hpp" namespace lms::db { class Session; + class User; } namespace lms::api::subsonic @@ -38,7 +39,7 @@ namespace lms::api::subsonic { const Wt::Http::ParameterMap& parameters; db::Session& dbSession; - db::UserId userId; + const db::ObjectPtr user; ClientInfo clientInfo; ProtocolVersion serverProtocolVersion; bool enableOpenSubsonic{ true }; diff --git a/src/libs/subsonic/impl/SubsonicResource.cpp b/src/libs/subsonic/impl/SubsonicResource.cpp index b7330368..2e311628 100644 --- a/src/libs/subsonic/impl/SubsonicResource.cpp +++ b/src/libs/subsonic/impl/SubsonicResource.cpp @@ -135,13 +135,7 @@ namespace lms::api::subsonic void checkUserTypeIsAllowed(RequestContext& context, core::EnumSet allowedUserTypes) { - auto transaction{ context.dbSession.createReadTransaction() }; - - db::User::pointer currentUser{ db::User::find(context.dbSession, context.userId) }; - if (!currentUser) - throw RequestedDataNotFoundError{}; - - if (!allowedUserTypes.contains(currentUser->getType())) + if (!allowedUserTypes.contains(context.user->getType())) throw UserNotAuthorizedError{}; } @@ -421,7 +415,17 @@ namespace lms::api::subsonic bool enableOpenSubsonic{ _openSubsonicDisabledClients.find(clientInfo.name) == std::cend(_openSubsonicDisabledClients) }; bool enableDefaultCover{ _defaultCoverClients.find(clientInfo.name) != std::cend(_openSubsonicDisabledClients) }; - return { parameters, _db.getTLSSession(), userId, clientInfo, getServerProtocolVersion(clientInfo.name), enableOpenSubsonic, enableDefaultCover }; + db::User::pointer user; + { + db::Session& session{ _db.getTLSSession() }; + auto transaction{ session.createReadTransaction() }; + + user = db::User::find(session, userId); + if (!user) + throw UserNotAuthorizedError{}; + } + + return { parameters, _db.getTLSSession(), user, clientInfo, getServerProtocolVersion(clientInfo.name), enableOpenSubsonic, enableDefaultCover }; } db::UserId SubsonicResource::authenticateUser(const Wt::Http::Request& request, const ClientInfo& clientInfo) diff --git a/src/libs/subsonic/impl/SubsonicResource.hpp b/src/libs/subsonic/impl/SubsonicResource.hpp index 67db9936..33b99054 100644 --- a/src/libs/subsonic/impl/SubsonicResource.hpp +++ b/src/libs/subsonic/impl/SubsonicResource.hpp @@ -26,6 +26,7 @@ #include #include "database/Types.hpp" +#include "database/UserId.hpp" #include "ClientInfo.hpp" #include "RequestContext.hpp" diff --git a/src/libs/subsonic/impl/entrypoints/AlbumSongLists.cpp b/src/libs/subsonic/impl/entrypoints/AlbumSongLists.cpp index ec43f5d2..33495a61 100644 --- a/src/libs/subsonic/impl/entrypoints/AlbumSongLists.cpp +++ b/src/libs/subsonic/impl/entrypoints/AlbumSongLists.cpp @@ -60,10 +60,6 @@ namespace lms::api::subsonic auto transaction{ context.dbSession.createReadTransaction() }; - User::pointer user{ User::find(context.dbSession, context.userId) }; - if (!user) - throw UserNotAuthorizedError{}; - if (type == "alphabeticalByName") { Release::FindParameters params; @@ -117,7 +113,7 @@ namespace lms::api::subsonic else if (type == "frequent") { scrobbling::IScrobblingService::FindParameters params; - params.setUser(context.userId); + params.setUser(context.user->getId()); params.setRange(range); params.setMediaLibrary(mediaLibraryId); @@ -146,7 +142,7 @@ namespace lms::api::subsonic else if (type == "recent") { scrobbling::IScrobblingService::FindParameters params; - params.setUser(context.userId); + params.setUser(context.user->getId()); params.setRange(range); params.setMediaLibrary(mediaLibraryId); @@ -155,7 +151,7 @@ namespace lms::api::subsonic else if (type == "starred") { feedback::IFeedbackService::FindParameters params; - params.setUser(context.userId); + params.setUser(context.user->getId()); params.setRange(range); params.setMediaLibrary(mediaLibraryId); @@ -172,7 +168,7 @@ namespace lms::api::subsonic for (const ReleaseId releaseId : releases.results) { const Release::pointer release{ Release::find(context.dbSession, releaseId) }; - albumListNode.addArrayChild("album", createAlbumNode(context, release, user, id3)); + albumListNode.addArrayChild("album", createAlbumNode(context, release, context.user, id3)); } return response; @@ -185,10 +181,6 @@ namespace lms::api::subsonic auto transaction{ context.dbSession.createReadTransaction() }; - User::pointer user{ User::find(context.dbSession, context.userId) }; - if (!user) - throw UserNotAuthorizedError{}; - Response response{ Response::createOkResponse(context.serverProtocolVersion) }; Response::Node& starredNode{ response.createNode(id3 ? Response::Node::Key{ "starred2" } : Response::Node::Key{ "starred" }) }; @@ -196,29 +188,29 @@ namespace lms::api::subsonic { feedback::IFeedbackService::ArtistFindParameters artistFindParams; - artistFindParams.setUser(context.userId); + artistFindParams.setUser(context.user->getId()); artistFindParams.setSortMethod(ArtistSortMethod::SortName); for (const ArtistId artistId : feedbackService.findStarredArtists(artistFindParams).results) { if (auto artist{ Artist::find(context.dbSession, artistId) }) - starredNode.addArrayChild("artist", createArtistNode(context, artist, user, id3)); + starredNode.addArrayChild("artist", createArtistNode(context, artist, context.user, id3)); } } feedback::IFeedbackService::FindParameters findParameters; - findParameters.setUser(context.userId); + findParameters.setUser(context.user->getId()); findParameters.setMediaLibrary(mediaLibrary); for (const ReleaseId releaseId : feedbackService.findStarredReleases(findParameters).results) { if (auto release{ Release::find(context.dbSession, releaseId) }) - starredNode.addArrayChild("album", createAlbumNode(context, release, user, id3)); + starredNode.addArrayChild("album", createAlbumNode(context, release, context.user, id3)); } for (const TrackId trackId : feedbackService.findStarredTracks(findParameters).results) { if (auto track{ Track::find(context.dbSession, trackId) }) - starredNode.addArrayChild("song", createSongNode(context, track, user)); + starredNode.addArrayChild("song", createSongNode(context, track, context.user)); } return response; @@ -243,15 +235,11 @@ namespace lms::api::subsonic if (size > defaultMaxCountSize) throw ParameterValueTooHighGenericError{ "size", defaultMaxCountSize }; - auto transaction{ context.dbSession.createReadTransaction() }; - - User::pointer user{ User::find(context.dbSession, context.userId) }; - if (!user) - throw UserNotAuthorizedError{}; - Response response{ Response::createOkResponse(context.serverProtocolVersion) }; Response::Node& randomSongsNode{ response.createNode("randomSongs") }; + auto transaction{ context.dbSession.createReadTransaction() }; + Track::FindParameters params; params.setSortMethod(TrackSortMethod::Random); params.setRange(Range{ 0, size }); @@ -259,7 +247,7 @@ namespace lms::api::subsonic Track::find(context.dbSession, params, [&](const Track::pointer& track) { - randomSongsNode.addArrayChild("song", createSongNode(context, track, user)); + randomSongsNode.addArrayChild("song", createSongNode(context, track, context.user)); }); return response; @@ -288,10 +276,6 @@ namespace lms::api::subsonic if (!cluster) throw RequestedDataNotFoundError{}; - User::pointer user{ User::find(context.dbSession, context.userId) }; - if (!user) - throw UserNotAuthorizedError{}; - Response response{ Response::createOkResponse(context.serverProtocolVersion) }; Response::Node& songsByGenreNode{ response.createNode("songsByGenre") }; @@ -302,7 +286,7 @@ namespace lms::api::subsonic Track::find(context.dbSession, params, [&](const Track::pointer& track) { - songsByGenreNode.addArrayChild("song", createSongNode(context, track, user)); + songsByGenreNode.addArrayChild("song", createSongNode(context, track, context.user)); }); return response; diff --git a/src/libs/subsonic/impl/entrypoints/Bookmarks.cpp b/src/libs/subsonic/impl/entrypoints/Bookmarks.cpp index 91785a0e..98f1a644 100644 --- a/src/libs/subsonic/impl/entrypoints/Bookmarks.cpp +++ b/src/libs/subsonic/impl/entrypoints/Bookmarks.cpp @@ -36,11 +36,7 @@ namespace lms::api::subsonic { auto transaction{ context.dbSession.createReadTransaction() }; - User::pointer user{ User::find(context.dbSession, context.userId) }; - if (!user) - throw UserNotAuthorizedError{}; - - const auto bookmarkIds{ TrackBookmark::find(context.dbSession, user->getId()) }; + const auto bookmarkIds{ TrackBookmark::find(context.dbSession, context.user->getId()) }; Response response{ Response::createOkResponse(context.serverProtocolVersion) }; Response::Node& bookmarksNode{ response.createNode("bookmarks") }; @@ -49,7 +45,7 @@ namespace lms::api::subsonic { const TrackBookmark::pointer bookmark{ TrackBookmark::find(context.dbSession, bookmarkId) }; Response::Node bookmarkNode{ createBookmarkNode(bookmark) }; - bookmarkNode.addChild("entry", createSongNode(context, bookmark->getTrack(), user)); + bookmarkNode.addChild("entry", createSongNode(context, bookmark->getTrack(), context.user)); bookmarksNode.addArrayChild("bookmark", std::move(bookmarkNode)); } @@ -65,18 +61,14 @@ namespace lms::api::subsonic auto transaction{ context.dbSession.createWriteTransaction() }; - const User::pointer user{ User::find(context.dbSession, context.userId) }; - if (!user) - throw UserNotAuthorizedError{}; - const Track::pointer track{ Track::find(context.dbSession, trackId) }; if (!track) throw RequestedDataNotFoundError{}; // Replace any existing bookmark - auto bookmark{ TrackBookmark::find(context.dbSession, user->getId(), trackId) }; + auto bookmark{ TrackBookmark::find(context.dbSession, context.user->getId(), trackId) }; if (!bookmark) - bookmark = context.dbSession.create(user, track); + bookmark = context.dbSession.create(context.user, track); bookmark.modify()->setOffset(std::chrono::milliseconds{ position }); if (comment) @@ -92,7 +84,7 @@ namespace lms::api::subsonic auto transaction{ context.dbSession.createWriteTransaction() }; - auto bookmark{ TrackBookmark::find(context.dbSession, context.userId, trackId) }; + auto bookmark{ TrackBookmark::find(context.dbSession, context.user->getId(), trackId) }; if (!bookmark) throw RequestedDataNotFoundError{}; diff --git a/src/libs/subsonic/impl/entrypoints/Browsing.cpp b/src/libs/subsonic/impl/entrypoints/Browsing.cpp index 19d4777b..a1d37584 100644 --- a/src/libs/subsonic/impl/entrypoints/Browsing.cpp +++ b/src/libs/subsonic/impl/entrypoints/Browsing.cpp @@ -75,15 +75,11 @@ namespace lms::api::subsonic { auto transaction{ context.dbSession.createReadTransaction() }; - User::pointer user{ User::find(context.dbSession, context.userId) }; - if (!user) - throw UserNotAuthorizedError{}; - for (const ArtistId similarArtistId : similarArtistsId) { const Artist::pointer similarArtist{ Artist::find(context.dbSession, similarArtistId) }; if (similarArtist) - artistInfoNode.addArrayChild("similarArtist", createArtistNode(context, similarArtist, user, id3)); + artistInfoNode.addArrayChild("similarArtist", createArtistNode(context, similarArtist, context.user, id3)); } } @@ -105,12 +101,8 @@ namespace lms::api::subsonic { auto transaction{ context.dbSession.createReadTransaction() }; - User::pointer user{ User::find(context.dbSession, context.userId) }; - if (!user) - throw UserNotAuthorizedError{}; - parameters.setSortMethod(ArtistSortMethod::SortName); - switch (user->getSubsonicArtistListMode()) + switch (context.user->getSubsonicArtistListMode()) { case SubsonicArtistListMode::AllArtists: break; @@ -165,12 +157,9 @@ namespace lms::api::subsonic for (const ArtistId artistId : artistIds) { auto transaction{ context.dbSession.createReadTransaction() }; - User::pointer user{ User::find(context.dbSession, context.userId) }; - if (!user) - throw UserNotAuthorizedError{}; if (const Artist::pointer artist{ Artist::find(context.dbSession, artistId) }) - indexNode.addArrayChild("artist", createArtistNode(context, artist, user, id3)); + indexNode.addArrayChild("artist", createArtistNode(context, artist, context.user, id3)); } } @@ -265,16 +254,12 @@ namespace lms::api::subsonic auto transaction{ context.dbSession.createReadTransaction() }; - User::pointer user{ User::find(context.dbSession, context.userId) }; - if (!user) - throw UserNotAuthorizedError{}; - Response response{ Response::createOkResponse(context.serverProtocolVersion) }; Response::Node& similarSongsNode{ response.createNode(id3 ? Response::Node::Key{ "similarSongs2" } : Response::Node::Key{ "similarSongs" }) }; for (const TrackId trackId : tracks) { const Track::pointer track{ Track::find(context.dbSession, trackId) }; - similarSongsNode.addArrayChild("song", createSongNode(context, track, user)); + similarSongsNode.addArrayChild("song", createSongNode(context, track, context.user)); } return response; @@ -319,10 +304,6 @@ namespace lms::api::subsonic auto transaction{ context.dbSession.createReadTransaction() }; - User::pointer user{ User::find(context.dbSession, context.userId) }; - if (!user) - throw UserNotAuthorizedError{}; - if (root) { directoryNode.setAttribute("id", idToString(RootId{})); @@ -331,7 +312,7 @@ namespace lms::api::subsonic // TODO: this does not scale when a lot of artists are present Artist::find(context.dbSession, Artist::FindParameters{}.setSortMethod(ArtistSortMethod::SortName), [&](const Artist::pointer& artist) { - directoryNode.addArrayChild("child", createArtistNode(context, artist, user, false /* no id3 */)); + directoryNode.addArrayChild("child", createArtistNode(context, artist, context.user, false /* no id3 */)); }); } else if (artistId) @@ -346,7 +327,7 @@ namespace lms::api::subsonic Release::find(context.dbSession, Release::FindParameters{}.setArtist(*artistId), [&](const Release::pointer& release) { - directoryNode.addArrayChild("child", createAlbumNode(context, release, user, false /* no id3 */)); + directoryNode.addArrayChild("child", createAlbumNode(context, release, context.user, false /* no id3 */)); }); } else if (releaseId) @@ -361,7 +342,7 @@ namespace lms::api::subsonic Track::find(context.dbSession, Track::FindParameters{}.setRelease(*releaseId).setSortMethod(TrackSortMethod::Release), [&](const Track::pointer& track) { - directoryNode.addArrayChild("child", createSongNode(context, track, user)); + directoryNode.addArrayChild("child", createSongNode(context, track, context.user)); }); } else @@ -406,16 +387,12 @@ namespace lms::api::subsonic if (!artist) throw RequestedDataNotFoundError{}; - User::pointer user{ User::find(context.dbSession, context.userId) }; - if (!user) - throw UserNotAuthorizedError{}; - Response response{ Response::createOkResponse(context.serverProtocolVersion) }; - Response::Node artistNode{ createArtistNode(context, artist, user, true /* id3 */) }; + Response::Node artistNode{ createArtistNode(context, artist, context.user, true /* id3 */) }; const auto releases{ Release::find(context.dbSession, Release::FindParameters {}.setArtist(artist->getId())) }; for (const Release::pointer& release : releases.results) - artistNode.addArrayChild("album", createAlbumNode(context, release, user, true /* id3 */)); + artistNode.addArrayChild("album", createAlbumNode(context, release, context.user, true /* id3 */)); response.addNode("artist", std::move(artistNode)); @@ -433,16 +410,12 @@ namespace lms::api::subsonic if (!release) throw RequestedDataNotFoundError{}; - User::pointer user{ User::find(context.dbSession, context.userId) }; - if (!user) - throw UserNotAuthorizedError{}; - Response response{ Response::createOkResponse(context.serverProtocolVersion) }; - Response::Node albumNode{ createAlbumNode(context, release, user, true /* id3 */) }; + Response::Node albumNode{ createAlbumNode(context, release, context.user, true /* id3 */) }; - const auto tracks{ Track::find(context.dbSession, Track::FindParameters {}.setRelease(id).setSortMethod(TrackSortMethod::Release)) }; + const auto tracks{ Track::find(context.dbSession, Track::FindParameters{}.setRelease(id).setSortMethod(TrackSortMethod::Release)) }; for (const Track::pointer& track : tracks.results) - albumNode.addArrayChild("song", createSongNode(context, track, user)); + albumNode.addArrayChild("song", createSongNode(context, track, context.user)); response.addNode("album", std::move(albumNode)); @@ -460,12 +433,8 @@ namespace lms::api::subsonic if (!track) throw RequestedDataNotFoundError{}; - User::pointer user{ User::find(context.dbSession, context.userId) }; - if (!user) - throw UserNotAuthorizedError{}; - Response response{ Response::createOkResponse(context.serverProtocolVersion) }; - response.addNode("song", createSongNode(context, track, user)); + response.addNode("song", createSongNode(context, track, context.user)); return response; } @@ -504,15 +473,11 @@ namespace lms::api::subsonic if (artists.size() != 1) throw RequestedDataNotFoundError{}; - User::pointer user{ User::find(context.dbSession, context.userId) }; - if (!user) - throw UserNotAuthorizedError{}; - Response response{ Response::createOkResponse(context.serverProtocolVersion) }; Response::Node& topSongs{ response.createNode("topSongs") }; scrobbling::IScrobblingService::FindParameters params; - params.setUser(context.userId); + params.setUser(context.user->getId()); params.setRange(db::Range{ 0, count }); params.setArtist(artists.front()->getId()); @@ -520,7 +485,7 @@ namespace lms::api::subsonic for (const TrackId trackId : trackIds.results) { if (Track::pointer track{ Track::find(context.dbSession, trackId) }) - topSongs.addArrayChild("song", createSongNode(context, track, user)); + topSongs.addArrayChild("song", createSongNode(context, track, context.user)); } return response; diff --git a/src/libs/subsonic/impl/entrypoints/MediaAnnotation.cpp b/src/libs/subsonic/impl/entrypoints/MediaAnnotation.cpp index 17924076..27a537c1 100644 --- a/src/libs/subsonic/impl/entrypoints/MediaAnnotation.cpp +++ b/src/libs/subsonic/impl/entrypoints/MediaAnnotation.cpp @@ -24,6 +24,7 @@ #include "database/ArtistId.hpp" #include "database/ReleaseId.hpp" #include "database/TrackId.hpp" +#include "database/User.hpp" #include "services/feedback/IFeedbackService.hpp" #include "services/scrobbling/IScrobblingService.hpp" #include "core/Service.hpp" @@ -61,13 +62,13 @@ namespace lms::api::subsonic StarParameters params{ getStarParameters(context.parameters) }; for (const ArtistId id : params.artistIds) - core::Service::get()->star(context.userId, id); + core::Service::get()->star(context.user->getId(), id); for (const ReleaseId id : params.releaseIds) - core::Service::get()->star(context.userId, id); + core::Service::get()->star(context.user->getId(), id); for (const TrackId id : params.trackIds) - core::Service::get()->star(context.userId, id); + core::Service::get()->star(context.user->getId(), id); return Response::createOkResponse(context.serverProtocolVersion); } @@ -77,13 +78,13 @@ namespace lms::api::subsonic StarParameters params{ getStarParameters(context.parameters) }; for (const ArtistId id : params.artistIds) - core::Service::get()->unstar(context.userId, id); + core::Service::get()->unstar(context.user->getId(), id); for (const ReleaseId id : params.releaseIds) - core::Service::get()->unstar(context.userId, id); + core::Service::get()->unstar(context.user->getId(), id); for (const TrackId id : params.trackIds) - core::Service::get()->unstar(context.userId, id); + core::Service::get()->unstar(context.user->getId(), id); return Response::createOkResponse(context.serverProtocolVersion); } @@ -104,13 +105,13 @@ namespace lms::api::subsonic if (!submission) { - core::Service::get()->listenStarted({ context.userId, ids.front() }); + core::Service::get()->listenStarted({ context.user->getId(), ids.front() }); } else { if (times.empty()) { - core::Service::get()->listenFinished({ context.userId, ids.front() }); + core::Service::get()->listenFinished({ context.user->getId(), ids.front() }); } else { @@ -118,7 +119,7 @@ namespace lms::api::subsonic { const TrackId trackId{ ids[i] }; const unsigned long time{ times[i] }; - core::Service::get()->addTimedListen({ {context.userId, trackId}, Wt::WDateTime::fromTime_t(static_cast(time / 1000)) }); + core::Service::get()->addTimedListen({ {context.user->getId(), trackId}, Wt::WDateTime::fromTime_t(static_cast(time / 1000)) }); } } } diff --git a/src/libs/subsonic/impl/entrypoints/MediaRetrieval.cpp b/src/libs/subsonic/impl/entrypoints/MediaRetrieval.cpp index b0f9b5d3..843cbd0c 100644 --- a/src/libs/subsonic/impl/entrypoints/MediaRetrieval.cpp +++ b/src/libs/subsonic/impl/entrypoints/MediaRetrieval.cpp @@ -129,10 +129,6 @@ namespace lms::api::subsonic auto transaction{ context.dbSession.createReadTransaction() }; - const User::pointer user{ User::find(context.dbSession, context.userId) }; - if (!user) - throw UserNotAuthorizedError{}; - const auto track{ Track::find(context.dbSession, id) }; if (!track) throw RequestedDataNotFoundError{}; @@ -147,8 +143,8 @@ namespace lms::api::subsonic std::optional requestedFormat{ subsonicStreamFormatToAvOutputFormat(format) }; if (!requestedFormat) { - if (user->getSubsonicEnableTranscodingByDefault()) - requestedFormat = userTranscodeFormatToAvFormat(user->getSubsonicDefaultTranscodingOutputFormat()); + if (context.user->getSubsonicEnableTranscodingByDefault()) + requestedFormat = userTranscodeFormatToAvFormat(context.user->getSubsonicDefaultTranscodingOutputFormat()); } if (!requestedFormat && (maxBitRate == 0 || track->getBitrate() <= maxBitRate )) @@ -172,9 +168,9 @@ namespace lms::api::subsonic } if (!requestedFormat) - requestedFormat = userTranscodeFormatToAvFormat(user->getSubsonicDefaultTranscodingOutputFormat()); + requestedFormat = userTranscodeFormatToAvFormat(context.user->getSubsonicDefaultTranscodingOutputFormat()); if (!bitrate) - bitrate = std::min(user->getSubsonicDefaultTranscodingOutputBitrate(), maxBitRate); + bitrate = std::min(context.user->getSubsonicDefaultTranscodingOutputBitrate(), maxBitRate); av::transcoding::OutputParameters& outputParameters{ parameters.outputParameters.emplace() }; diff --git a/src/libs/subsonic/impl/entrypoints/Playlists.cpp b/src/libs/subsonic/impl/entrypoints/Playlists.cpp index d27e7be3..520e2d9e 100644 --- a/src/libs/subsonic/impl/entrypoints/Playlists.cpp +++ b/src/libs/subsonic/impl/entrypoints/Playlists.cpp @@ -40,7 +40,7 @@ namespace lms::api::subsonic Response::Node& playlistsNode{ response.createNode("playlists") }; TrackList::FindParameters params; - params.setUser(context.userId); + params.setUser(context.user->getId()); params.setType(TrackListType::Playlist); auto tracklistIds{ TrackList::find(context.dbSession, params) }; @@ -60,10 +60,6 @@ namespace lms::api::subsonic auto transaction{ context.dbSession.createReadTransaction() }; - User::pointer user{ User::find(context.dbSession, context.userId) }; - if (!user) - throw UserNotAuthorizedError{}; - TrackList::pointer tracklist{ TrackList::find(context.dbSession, trackListId) }; if (!tracklist) throw RequestedDataNotFoundError{}; @@ -73,7 +69,7 @@ namespace lms::api::subsonic auto entries{ tracklist->getEntries() }; for (const TrackListEntry::pointer& entry : entries.results) - playlistNode.addArrayChild("entry", createSongNode(context, entry->getTrack(), user)); + playlistNode.addArrayChild("entry", createSongNode(context, entry->getTrack(), context.user)); response.addNode("playlist", std::move(playlistNode)); @@ -93,16 +89,12 @@ namespace lms::api::subsonic auto transaction{ context.dbSession.createWriteTransaction() }; - User::pointer user{ User::find(context.dbSession, context.userId) }; - if (!user) - throw UserNotAuthorizedError{}; - TrackList::pointer tracklist; if (id) { tracklist = TrackList::find(context.dbSession, *id); if (!tracklist - || tracklist->getUser() != user + || tracklist->getUser() != context.user || tracklist->getType() != TrackListType::Playlist) { throw RequestedDataNotFoundError{}; @@ -113,7 +105,7 @@ namespace lms::api::subsonic } else { - tracklist = context.dbSession.create(*name, TrackListType::Playlist, false, user); + tracklist = context.dbSession.create(*name, TrackListType::Playlist, false, context.user); } for (const TrackId trackId : trackIds) @@ -130,7 +122,7 @@ namespace lms::api::subsonic auto entries{ tracklist->getEntries() }; for (const TrackListEntry::pointer& entry : entries.results) - playlistNode.addArrayChild("entry", createSongNode(context, entry->getTrack(), user)); + playlistNode.addArrayChild("entry", createSongNode(context, entry->getTrack(), context.user)); response.addNode("playlist", std::move(playlistNode)); @@ -151,13 +143,9 @@ namespace lms::api::subsonic auto transaction{ context.dbSession.createWriteTransaction() }; - User::pointer user{ User::find(context.dbSession, context.userId) }; - if (!user) - throw UserNotAuthorizedError{}; - TrackList::pointer tracklist{ TrackList::find(context.dbSession, id) }; if (!tracklist - || tracklist->getUser() != user + || tracklist->getUser() != context.user || tracklist->getType() != TrackListType::Playlist) { throw RequestedDataNotFoundError{}; @@ -200,13 +188,9 @@ namespace lms::api::subsonic auto transaction{ context.dbSession.createWriteTransaction() }; - User::pointer user{ User::find(context.dbSession, context.userId) }; - if (!user) - throw UserNotAuthorizedError{}; - TrackList::pointer tracklist{ TrackList::find(context.dbSession, id) }; if (!tracklist - || tracklist->getUser() != user + || tracklist->getUser() != context.user || tracklist->getType() != TrackListType::Playlist) { throw RequestedDataNotFoundError{}; diff --git a/src/libs/subsonic/impl/entrypoints/Searching.cpp b/src/libs/subsonic/impl/entrypoints/Searching.cpp index 6d672428..743be7ed 100644 --- a/src/libs/subsonic/impl/entrypoints/Searching.cpp +++ b/src/libs/subsonic/impl/entrypoints/Searching.cpp @@ -334,13 +334,9 @@ namespace lms::api::subsonic auto transaction{ context.dbSession.createReadTransaction() }; - User::pointer user{ User::find(context.dbSession, context.userId) }; - if (!user) - throw UserNotAuthorizedError{}; - - findRequestedArtists(context, id3, keywords, mediaLibrary, user, searchResultNode); - findRequestedAlbums(context, id3, keywords, mediaLibrary, user, searchResultNode); - findRequestedTracks(context, keywords, mediaLibrary, user, searchResultNode); + findRequestedArtists(context, id3, keywords, mediaLibrary, context.user, searchResultNode); + findRequestedAlbums(context, id3, keywords, mediaLibrary, context.user, searchResultNode); + findRequestedTracks(context, keywords, mediaLibrary, context.user, searchResultNode); return response; } diff --git a/src/libs/subsonic/impl/entrypoints/UserManagement.cpp b/src/libs/subsonic/impl/entrypoints/UserManagement.cpp index fb079ce4..e9576a78 100644 --- a/src/libs/subsonic/impl/entrypoints/UserManagement.cpp +++ b/src/libs/subsonic/impl/entrypoints/UserManagement.cpp @@ -15,11 +15,7 @@ namespace lms::api::subsonic namespace { void checkUserIsMySelfOrAdmin(RequestContext& context, const std::string& username) { - User::pointer currentUser{ User::find(context.dbSession, context.userId) }; - if (!currentUser) - throw RequestedDataNotFoundError{}; - - if (currentUser->getLoginName() != username && !currentUser->isAdmin()) + if (context.user->getLoginName() != username && !context.user->isAdmin()) throw UserNotAuthorizedError{}; } } @@ -44,17 +40,14 @@ namespace lms::api::subsonic Response handleGetUsersRequest(RequestContext& context) { - auto transaction{ context.dbSession.createReadTransaction() }; - Response response{ Response::createOkResponse(context.serverProtocolVersion) }; Response::Node& usersNode{ response.createNode("users") }; - const auto userIds{ User::find(context.dbSession, User::FindParameters {}) }; - for (const UserId userId : userIds.results) - { - const User::pointer user{ User::find(context.dbSession, userId) }; - usersNode.addArrayChild("user", createUserNode(user)); - } + auto transaction{ context.dbSession.createReadTransaction() }; + User::find(context.dbSession, User::FindParameters{}, [&](const User::pointer& user) + { + usersNode.addArrayChild("user", createUserNode(user)); + }); return response; } @@ -77,13 +70,13 @@ namespace lms::api::subsonic userId = user->getId(); } - auto removeCreatedUser{ [&]() - { - auto transaction {context.dbSession.createWriteTransaction()}; - User::pointer user {User::find(context.dbSession, userId)}; - if (user) - user.remove(); - } }; + auto removeCreatedUser{ [&] + { + auto transaction {context.dbSession.createWriteTransaction()}; + User::pointer user{ User::find(context.dbSession, userId) }; + if (user) + user.remove(); + } }; try { @@ -119,7 +112,7 @@ namespace lms::api::subsonic throw RequestedDataNotFoundError{}; // cannot delete ourself - if (user->getId() == context.userId) + if (user->getId() == context.user->getId()) throw UserNotAuthorizedError{}; user.remove();