more abstraction for reusability

This commit is contained in:
Kaushik Narayan R 2025-01-09 16:11:09 -07:00
parent 3561fd89a7
commit 9b02d5a35f

View File

@ -121,7 +121,7 @@ const updateUser = async (req, res) => {
});
if (delNum !== deleted.length) {
res.status(500).send({ message: "Internal Server Error" });
logger.warn("Could not remove all old playlists", { error: new Error("Playlists.destroy failed?") });
logger.error("Could not remove all old playlists", { error: new Error("Playlists.destroy failed?") });
return;
}
}
@ -370,6 +370,54 @@ const removeLink = async (req, res) => {
}
}
/**
*
* @param {typedefs.Req} req
* @param {typedefs.Res} res
* @param {string} playlistID
*/
const _getPlaylistTracks = async (req, res, playlistID) => {
let initialFields = ["tracks(next,items(is_local,track(uri)))"];
let mainFields = ["next", "items(is_local,track(uri))"];
const respData = await getPlaylistDetailsFirstPage(req, res, initialFields.join(), playlistID);
if (res.headersSent) return;
let pl = {};
// varying fields again smh
if (respData.tracks.next) {
pl.next = new URL(respData.tracks.next);
pl.next.searchParams.set("fields", mainFields.join());
pl.next = pl.next.href;
}
pl.tracks = respData.tracks.items.map((playlist_item) => {
return {
is_local: playlist_item.is_local,
uri: playlist_item.track.uri
}
});
// keep getting batches of 50 till exhausted
while (pl.next) {
const nextData = await getPlaylistDetailsNextPage(req, res, pl.next);
if (res.headersSent) return;
pl.tracks.push(
...nextData.items.map((playlist_item) => {
return {
is_local: playlist_item.is_local,
uri: playlist_item.track.uri
}
})
);
pl.next = nextData.next;
}
delete pl.next;
return pl;
}
/**
* Add tracks to the link-head playlist,
* that are present in the link-tail playlist but not in the link-head playlist,
@ -396,80 +444,8 @@ const _populateSingleLinkCore = async (req, res, link) => {
try {
const fromPl = link.from, toPl = link.to;
let initialFields = ["tracks(next,items(is_local,track(uri)))"];
let mainFields = ["next", "items(is_local,track(uri))"];
const fromData = await getPlaylistDetailsFirstPage(req, res, initialFields.join(), fromPl.id);
if (res.headersSent) return;
let fromPlaylist = {};
// varying fields again smh
if (fromData.tracks.next) {
fromPlaylist.next = new URL(fromData.tracks.next);
fromPlaylist.next.searchParams.set("fields", mainFields.join());
fromPlaylist.next = fromPlaylist.next.href;
}
fromPlaylist.tracks = fromData.tracks.items.map((playlist_item) => {
return {
is_local: playlist_item.is_local,
uri: playlist_item.track.uri
}
});
// keep getting batches of 50 till exhausted
while (fromPlaylist.next) {
const nextData = await getPlaylistDetailsNextPage(req, res, fromPlaylist.next);
if (res.headersSent) return;
fromPlaylist.tracks.push(
...nextData.items.map((playlist_item) => {
return {
is_local: playlist_item.is_local,
uri: playlist_item.track.uri
}
})
);
fromPlaylist.next = nextData.next;
}
delete fromPlaylist.next;
const toData = await getPlaylistDetailsFirstPage(req, res, initialFields.join(), toPl.id);
if (res.headersSent) return;
let toPlaylist = {};
// varying fields again smh
if (toData.tracks.next) {
toPlaylist.next = new URL(toData.tracks.next);
toPlaylist.next.searchParams.set("fields", mainFields.join());
toPlaylist.next = toPlaylist.next.href;
}
toPlaylist.tracks = toData.tracks.items.map((playlist_item) => {
return {
is_local: playlist_item.is_local,
uri: playlist_item.track.uri
}
});
// keep getting batches of 50 till exhausted
while (toPlaylist.next) {
const nextData = await getPlaylistDetailsNextPage(req, res, toPlaylist.next);
if (res.headersSent) return;
toPlaylist.tracks.push(
...nextData.items.map((playlist_item) => {
return {
is_local: playlist_item.is_local,
uri: playlist_item.track.uri
}
})
);
toPlaylist.next = nextData.next;
}
delete toPlaylist.next;
const fromPlaylist = await _getPlaylistTracks(req, res, fromPl.id);
const toPlaylist = await _getPlaylistTracks(req, res, toPl.id);
const fromTrackURIs = fromPlaylist.tracks.map(track => track.uri);
let toTrackURIs = toPlaylist.tracks.
@ -540,12 +516,13 @@ const populateSingleLink = async (req, res) => {
const result = await _populateSingleLinkCore(req, res, { from: fromPl, to: toPl });
if (result) {
const { toAddNum, localNum } = result;
let logMsg;
logMsg = result.toAddNum > 0 ? "Added " + result.toAddNum + " tracks" : "No tracks to add";
logMsg += result.localNum > 0 ? ", but could not add " + result.localNum + " local files" : ".";
logMsg = toAddNum > 0 ? "Added " + toAddNum + " tracks" : "No tracks to add";
logMsg += localNum > 0 ? ", but could not add " + localNum + " local files" : ".";
res.status(200).send({ message: logMsg });
logger.debug(logMsg);
logger.debug(logMsg, { toAddNum, localNum });
}
return;
} catch (error) {
@ -578,82 +555,8 @@ const _pruneSingleLinkCore = async (req, res, link) => {
try {
const fromPl = link.from, toPl = link.to;
let initialFields = ["snapshot_id", "tracks(next,items(is_local,track(uri)))"];
let mainFields = ["next", "items(is_local,track(uri))"];
const fromData = await getPlaylistDetailsFirstPage(req, res, initialFields.join(), fromPl.id);
if (res.headersSent) return;
let fromPlaylist = {};
// varying fields again smh
fromPlaylist.snapshot_id = fromData.snapshot_id;
if (fromData.tracks.next) {
fromPlaylist.next = new URL(fromData.tracks.next);
fromPlaylist.next.searchParams.set("fields", mainFields.join());
fromPlaylist.next = fromPlaylist.next.href;
}
fromPlaylist.tracks = fromData.tracks.items.map((playlist_item) => {
return {
is_local: playlist_item.is_local,
uri: playlist_item.track.uri
}
});
// keep getting batches of 50 till exhausted
while (fromPlaylist.next) {
const nextData = await getPlaylistDetailsNextPage(req, res, fromPlaylist.next);
if (res.headersSent) return;
fromPlaylist.tracks.push(
...nextData.items.map((playlist_item) => {
return {
is_local: playlist_item.is_local,
uri: playlist_item.track.uri
}
})
);
fromPlaylist.next = nextData.next;
}
delete fromPlaylist.next;
const toData = await getPlaylistDetailsFirstPage(req, res, initialFields.join(), toPl.id);
if (res.headersSent) return;
let toPlaylist = {};
// varying fields again smh
toPlaylist.snapshot_id = toData.snapshot_id;
if (toData.tracks.next) {
toPlaylist.next = new URL(toData.tracks.next);
toPlaylist.next.searchParams.set("fields", mainFields.join());
toPlaylist.next = toPlaylist.next.href;
}
toPlaylist.tracks = toData.tracks.items.map((playlist_item) => {
return {
is_local: playlist_item.is_local,
uri: playlist_item.track.uri
}
});
// keep getting batches of 50 till exhausted
while (toPlaylist.next) {
const nextData = await getPlaylistDetailsNextPage(req, res, toPlaylist.next);
if (res.headersSent) return;
toPlaylist.tracks.push(
...nextData.items.map((playlist_item) => {
return {
is_local: playlist_item.is_local,
uri: playlist_item.track.uri
}
})
);
toPlaylist.next = nextData.next;
}
delete toPlaylist.next;
const fromPlaylist = await _getPlaylistTracks(req, res, fromPl.id);
const toPlaylist = await _getPlaylistTracks(req, res, toPl.id);
const fromTrackURIs = fromPlaylist.tracks.map(track => track.uri);
let indexedToTrackURIs = toPlaylist.tracks;
@ -729,8 +632,9 @@ const pruneSingleLink = async (req, res) => {
const result = await _pruneSingleLinkCore(req, res, { from: fromPl, to: toPl });
if (result) {
res.status(200).send({ message: `Removed ${result.toDelNum} tracks.` });
logger.debug(`Pruned ${result.toDelNum} tracks`);
const { toDelNum } = result;
res.status(200).send({ message: `Removed ${toDelNum} tracks.` });
logger.debug(`Pruned ${toDelNum} tracks`, { toDelNum });
}
return;
} catch (error) {