Skip to content

Commit 0a8c537

Browse files
committed
Add Total Track Length property in response json in album routes
1 parent aa03f4f commit 0a8c537

File tree

2 files changed

+70
-47
lines changed

2 files changed

+70
-47
lines changed

controllers/albumController.js

Lines changed: 12 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
const Album = require("../models/Album");
22
const Song = require("../models/Song");
3-
const { isAdmin } = require("../utils");
3+
const {
4+
isAdmin,
5+
calculateTotalDuration,
6+
cleanUpSongsData,
7+
enhanceAlbumWithSongsData,
8+
} = require("../utils");
49
const errorHandler = require("../middlewares/errorMiddleware");
5-
const cleanUpSongs = (songs, album) => {
6-
return songs
7-
.filter((song) => song !== null)
8-
.map(({ albumId, ...songWithoutAlbumId }) => ({
9-
...songWithoutAlbumId,
10-
album: album.title,
11-
}));
12-
};
1310

1411
const getAlbum = async (req, res) => {
1512
try {
@@ -23,15 +20,7 @@ const getAlbum = async (req, res) => {
2320
return res.status(404).send("Album not found");
2421
}
2522

26-
const songPromises = album.tracks.map((songId) =>
27-
Song.findById(songId.toString()).select("-__v").select("-_id").lean()
28-
);
29-
const songs = await Promise.all(songPromises);
30-
31-
album.tracks = cleanUpSongs(songs, album);
32-
album.songs = album.tracks.length;
33-
34-
res.json(album);
23+
res.json(await enhanceAlbumWithSongsData(album));
3524
} catch (error) {
3625
errorHandler(res, error);
3726
}
@@ -41,14 +30,8 @@ const getAllAlbums = async (req, res) => {
4130
try {
4231
const albums = await Album.find({}).lean().select("-__v").select("-_id");
4332

44-
for (const album of albums) {
45-
const songPromises = album.tracks.map((songId) =>
46-
Song.findById(songId.toString()).select("-__v").select("-_id").lean()
47-
);
48-
const songs = await Promise.all(songPromises);
49-
50-
album.tracks = cleanUpSongs(songs, album);
51-
album.songs = album.tracks.length;
33+
for (let album of albums) {
34+
album = await enhanceAlbumWithSongsData(album);
5235
}
5336

5437
return res.json(albums);
@@ -66,19 +49,13 @@ const searchAlbum = async (req, res) => {
6649
.select("-__v -_id")
6750
.lean();
6851

69-
for (const album of albums) {
70-
const songPromises = album.tracks.map((songId) =>
71-
Song.findById(songId.toString()).select("-__v").select("-_id").lean()
72-
);
73-
const songs = await Promise.all(songPromises);
74-
75-
album.tracks = cleanUpSongs(songs, album);
76-
album.songs = album.tracks.length;
52+
for (let album of albums) {
53+
album = await enhanceAlbumWithSongsData(album);
7754
}
7855

7956
res.json(albums);
8057
} catch (error) {
81-
console.error("Error searching songs:", error.message);
58+
console.error("Error searching albums:", error.message);
8259
res.status(500).json({ error: "Internal Server Error" });
8360
}
8461
};

utils/index.js

Lines changed: 58 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,18 @@
11
const Album = require("../models/Album");
2+
const Song = require("../models/Song");
3+
4+
const enhanceAlbumWithSongsData = async (album) => {
5+
const songPromises = album.tracks.map((songId) =>
6+
Song.findById(songId.toString()).select("-__v").select("-_id").lean()
7+
);
8+
const songs = await Promise.all(songPromises);
9+
10+
album.tracks = cleanUpSongsData(songs, album);
11+
album.trackLength = calculateTotalDuration(album.tracks);
12+
album.songCount = album.tracks.length;
13+
return album;
14+
};
15+
216
const isAdmin = (usernameToCheck, passwordToCheck) => {
317
const USER = [
418
{
@@ -20,17 +34,6 @@ const isAdmin = (usernameToCheck, passwordToCheck) => {
2034
return false;
2135
};
2236

23-
const getAlbumName = async (albumId) => {
24-
try {
25-
const album = await Album.findById(albumId).select("title").lean();
26-
27-
return album ? album.title : null;
28-
} catch (error) {
29-
console.error("Error fetching album name:", error.message);
30-
return null;
31-
}
32-
};
33-
3437
const getAlbumDetails = async (albumId) => {
3538
try {
3639
const album = await Album.findById(albumId).select("-__v -_id").lean();
@@ -47,4 +50,47 @@ const getAlbumDetails = async (albumId) => {
4750
return null;
4851
}
4952
};
50-
module.exports = { isAdmin, getAlbumName, getAlbumDetails };
53+
54+
const durationToSeconds = (duration) => {
55+
const [minutes, seconds] = duration.split(" ").map((part) => {
56+
if (part.includes("m")) {
57+
return parseInt(part.replace("m", ""), 10) * 60;
58+
} else {
59+
return parseInt(part.replace("s", ""), 10);
60+
}
61+
});
62+
return minutes + seconds;
63+
};
64+
const calculateTotalDuration = (tracks) => {
65+
const totalSeconds = tracks.reduce((sum, track) => {
66+
return sum + durationToSeconds(track.duration);
67+
}, 0);
68+
69+
const hours = Math.floor(totalSeconds / 3600);
70+
const minutes = Math.floor((totalSeconds % 3600) / 60);
71+
const seconds = totalSeconds % 60;
72+
73+
if (hours > 0) {
74+
return `${hours}h ${minutes}m ${seconds}s`;
75+
} else {
76+
return `${minutes}m ${seconds}s`;
77+
}
78+
};
79+
80+
// Helper function to clean up songs data
81+
const cleanUpSongsData = (songs, album) => {
82+
return songs
83+
.filter((song) => song !== null)
84+
.map(({ albumId, ...songWithoutAlbumId }) => ({
85+
...songWithoutAlbumId,
86+
album: album.title,
87+
}));
88+
};
89+
90+
module.exports = {
91+
isAdmin,
92+
getAlbumDetails,
93+
calculateTotalDuration,
94+
cleanUpSongsData,
95+
enhanceAlbumWithSongsData,
96+
};

0 commit comments

Comments
 (0)