Index: finkwave/src/main/java/com/ukim/finki/develop/finkwave/controller/GlobalExceptionHandler.java
===================================================================
--- finkwave/src/main/java/com/ukim/finki/develop/finkwave/controller/GlobalExceptionHandler.java	(revision 2b08bed6a1ac91c0de26078bed3ee44d43611bd4)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/controller/GlobalExceptionHandler.java	(revision 2730163380202029196d71a92f0cbde3dfdd5b0a)
@@ -3,4 +3,5 @@
 import java.util.Map;
 
+import com.ukim.finki.develop.finkwave.exceptions.AlbumNotFoundException;
 import com.ukim.finki.develop.finkwave.exceptions.FollowException;
 import com.ukim.finki.develop.finkwave.exceptions.UserNotFoundException;
@@ -49,4 +50,11 @@
     }
 
+    @ExceptionHandler(AlbumNotFoundException.class)
+    public ResponseEntity<Map<String, String>> handleAlbumNotFound(AlbumNotFoundException ex) {
+        return ResponseEntity
+                .status(HttpStatus.BAD_REQUEST)
+                .body(Map.of("error", ex.getMessage()));
+    }
+
 
 
Index: finkwave/src/main/java/com/ukim/finki/develop/finkwave/controller/NonAdminUserController.java
===================================================================
--- finkwave/src/main/java/com/ukim/finki/develop/finkwave/controller/NonAdminUserController.java	(revision 2b08bed6a1ac91c0de26078bed3ee44d43611bd4)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/controller/NonAdminUserController.java	(revision 2730163380202029196d71a92f0cbde3dfdd5b0a)
@@ -35,15 +35,15 @@
     }
 
-    @GetMapping("/followers/{id}")
+    @GetMapping("/{id}/followers")
     public HttpEntity<List<NonAdminUserDto>>getFollowersForUser(@PathVariable Long id){
         return ResponseEntity.ok(followService.getFollowersForUser(id));
     }
 
-    @GetMapping("/following/{id}")
+    @GetMapping("/{id}/following")
     public HttpEntity<List<NonAdminUserDto>>getFollowingForUser(@PathVariable Long id){
         return ResponseEntity.ok(followService.getFollowingForUser(id));
     }
 
-    @PostMapping("/follow/{id}")
+    @PostMapping("/{id}/follow")
     public HttpEntity<NonAdminUserDto>followUser(@PathVariable Long id){
         followService.toggleFollow(id);
Index: finkwave/src/main/java/com/ukim/finki/develop/finkwave/controller/PlaylistController.java
===================================================================
--- finkwave/src/main/java/com/ukim/finki/develop/finkwave/controller/PlaylistController.java	(revision 2730163380202029196d71a92f0cbde3dfdd5b0a)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/controller/PlaylistController.java	(revision 2730163380202029196d71a92f0cbde3dfdd5b0a)
@@ -0,0 +1,25 @@
+package com.ukim.finki.develop.finkwave.controller;
+
+import com.ukim.finki.develop.finkwave.model.dto.PlaylistDto;
+import com.ukim.finki.develop.finkwave.service.PlaylistService;
+import lombok.AllArgsConstructor;
+import lombok.NoArgsConstructor;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@AllArgsConstructor
+@RequestMapping("/playlists")
+public class PlaylistController {
+    private final PlaylistService playlistService;
+
+    @GetMapping("/{id}")
+    public HttpEntity<PlaylistDto> getPlaylist(@PathVariable Long id){
+        return ResponseEntity.ok(playlistService.getPlaylist(id));
+    }
+
+}
Index: finkwave/src/main/java/com/ukim/finki/develop/finkwave/exceptions/AlbumNotFoundException.java
===================================================================
--- finkwave/src/main/java/com/ukim/finki/develop/finkwave/exceptions/AlbumNotFoundException.java	(revision 2730163380202029196d71a92f0cbde3dfdd5b0a)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/exceptions/AlbumNotFoundException.java	(revision 2730163380202029196d71a92f0cbde3dfdd5b0a)
@@ -0,0 +1,7 @@
+package com.ukim.finki.develop.finkwave.exceptions;
+
+public class AlbumNotFoundException extends RuntimeException {
+    public AlbumNotFoundException(Long id) {
+        super(String.format("Cannot find album with id: %d", id));
+    }
+}
Index: finkwave/src/main/java/com/ukim/finki/develop/finkwave/exceptions/PlaylistNotFoundException.java
===================================================================
--- finkwave/src/main/java/com/ukim/finki/develop/finkwave/exceptions/PlaylistNotFoundException.java	(revision 2730163380202029196d71a92f0cbde3dfdd5b0a)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/exceptions/PlaylistNotFoundException.java	(revision 2730163380202029196d71a92f0cbde3dfdd5b0a)
@@ -0,0 +1,7 @@
+package com.ukim.finki.develop.finkwave.exceptions;
+
+public class PlaylistNotFoundException extends RuntimeException {
+    public PlaylistNotFoundException(Long id) {
+        super(String.format("Cannot find playlist with id: %d",id));
+    }
+}
Index: finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/ArtistContributionDto.java
===================================================================
--- finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/ArtistContributionDto.java	(revision 2b08bed6a1ac91c0de26078bed3ee44d43611bd4)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/ArtistContributionDto.java	(revision 2730163380202029196d71a92f0cbde3dfdd5b0a)
@@ -14,3 +14,4 @@
     private String role;
     private String entityType;
+    private Boolean isLikedByCurrentUser;
 }
Index: finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/PlaylistDto.java
===================================================================
--- finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/PlaylistDto.java	(revision 2b08bed6a1ac91c0de26078bed3ee44d43611bd4)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/PlaylistDto.java	(revision 2730163380202029196d71a92f0cbde3dfdd5b0a)
@@ -4,4 +4,6 @@
 import lombok.Getter;
 import lombok.Setter;
+
+import java.util.List;
 
 @AllArgsConstructor
@@ -14,3 +16,5 @@
     private String creatorName;
 
+    private List<MusicalEntityDto>songsInPlaylist;
+
 }
Index: finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/ArtistContributionRepository.java
===================================================================
--- finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/ArtistContributionRepository.java	(revision 2b08bed6a1ac91c0de26078bed3ee44d43611bd4)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/ArtistContributionRepository.java	(revision 2730163380202029196d71a92f0cbde3dfdd5b0a)
@@ -17,12 +17,14 @@
             "ac.musicalEntity.title," +
             "ac.musicalEntity.genre," +
-            "ac.role, "+
-        "CASE WHEN s.id IS NOT NULL THEN 'SONG' "+
-        "WHEN a.id IS NOT NULL THEN 'ALBUM' "+
-        "ELSE 'Unknown' END) "+
-        "FROM ArtistContribution ac "+
-        "LEFT JOIN Song s  ON s.musicalEntities.id=ac.musicalEntity.id "+
-        "LEFT JOIN Album a ON a.musicalEntities.id=ac.musicalEntity.id "+
-        "WHERE ac.artist.id=:artistId")
-    List<ArtistContributionDto>findContributionsByArtistId(@Param("artistId")Long artistId);
+            "ac.role, " +
+            "CASE WHEN s.id IS NOT NULL THEN 'SONG' " +
+            "WHEN a.id IS NOT NULL THEN 'ALBUM' " +
+            "ELSE 'Unknown' END," +
+            "(CASE WHEN l.id IS NOT NULL THEN true ELSE false END)) " +
+            "FROM ArtistContribution ac " +
+            "LEFT JOIN Song s  ON s.musicalEntities.id=ac.musicalEntity.id " +
+            "LEFT JOIN Album a ON a.musicalEntities.id=ac.musicalEntity.id " +
+            "LEFT JOIN Like l ON l.musicalEntity.id=ac.musicalEntity.id AND l.listener.id=:currentUserId " +
+            "WHERE ac.artist.id=:artistId")
+    List<ArtistContributionDto>findContributionsByArtistId(@Param("currentUserId")Long currentUserId,@Param("artistId")Long artistId);
 }
Index: finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/FollowRepository.java
===================================================================
--- finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/FollowRepository.java	(revision 2b08bed6a1ac91c0de26078bed3ee44d43611bd4)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/FollowRepository.java	(revision 2730163380202029196d71a92f0cbde3dfdd5b0a)
@@ -25,7 +25,18 @@
     boolean isFollowing(@Param("currentUserId") Long currentUSerId,@Param("selectedUserId")Long selectedUserId);
 
-    List<Follow>getFollowsByFollowee_Id(Long id);
 
     List<Follow>getFollowsByFollower_Id(Long id);
 
+    @Query("SELECT f FROM Follow f " +
+            "JOIN FETCH f.follower nu " +
+            "JOIN FETCH nu.user " +
+            "WHERE f.followee.id = :id")
+    List<Follow> findFollowersWithProfile(@Param("id") Long id);
+
+    @Query("SELECT f FROM Follow f " +
+            "JOIN FETCH f.followee nu " +
+            "JOIN FETCH nu.user " +
+            "WHERE f.follower.id = :id")
+    List<Follow> findFollowingWithProfile(@Param("id") Long id);
+
 }
Index: finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/NonAdminUserRepository.java
===================================================================
--- finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/NonAdminUserRepository.java	(revision 2b08bed6a1ac91c0de26078bed3ee44d43611bd4)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/NonAdminUserRepository.java	(revision 2730163380202029196d71a92f0cbde3dfdd5b0a)
@@ -16,6 +16,6 @@
 
     @Query("SELECT u FROM NonAdminUser u " +
-            "WHERE LOWER(u.user.fullName) LIKE LOWER(CONCAT('%', :name, '%') )"+
-            "OR  LOWER(u.user.username) LIKE LOWER(CONCAT('%', :name, '%' )) ")
+            "WHERE u.user.fullName ILIKE CONCAT('%', :name, '%' ) "+
+            "OR  u.user.username ILIKE CONCAT('%', :name, '%' ) ")
     List<NonAdminUser> searchByName(String name);
 
Index: finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/SongRepository.java
===================================================================
--- finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/SongRepository.java	(revision 2b08bed6a1ac91c0de26078bed3ee44d43611bd4)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/SongRepository.java	(revision 2730163380202029196d71a92f0cbde3dfdd5b0a)
@@ -15,18 +15,37 @@
 
 
-    @Query("SELECT NEW com.ukim.finki.develop.finkwave.model.dto.MusicalEntityDto( "+
+    @Query("SELECT NEW com.ukim.finki.develop.finkwave.model.dto.MusicalEntityDto(" +
             "s.id, " +
             "me.title, " +
             "me.genre, " +
-            "'SONG'," +
+            "'SONG', " +
             "u.fullName, " +
-            "(CASE WHEN l.id IS NOT NULL THEN true ELSE false END)) "+
-            "FROM Song s "+
-            "JOIN MusicalEntity  me on me.id=s.musicalEntities.id "+
-            "JOIN User u on u.id=me.releasedBy.id "+
-            "LEFT JOIN Like  l on l.musicalEntity.id=s.id AND l.listener.id=:currentUserId "+
-            "WHERE s.album.id=:albumId"
-
+            "(CASE WHEN :currentUserId IS NOT NULL AND l.id IS NOT NULL THEN true ELSE false END)) " +
+            "FROM Song s " +
+            "JOIN s.musicalEntities me " +
+            "JOIN me.releasedBy a " +
+            "JOIN a.nonAdminUser nau " +
+            "JOIN nau.user u "+
+            "LEFT JOIN Like l ON l.musicalEntity.id = s.id AND l.listener.id = :currentUserId " +
+            "WHERE s.album.id = :albumId"
     )
     List<MusicalEntityDto>findSongsByAlbum(@Param("albumId") Long albumId, @Param("currentUserId")Long currentUserId);
+
+
+    @Query("SELECT NEW com.ukim.finki.develop.finkwave.model.dto.MusicalEntityDto(" +
+            "s.id, " +
+            "me.title, " +
+            "me.genre, " +
+            "'SONG', " +
+            "u.fullName, " +
+            "(CASE WHEN :currentUserId IS NOT NULL AND l.id IS NOT NULL THEN true ELSE false END)) " +
+            "FROM Song s "+
+            "JOIN s.musicalEntities me "+
+            "JOIN me.releasedBy a "+
+            "JOIN a.nonAdminUser nau "+
+            "JOIN nau.user u "+
+            "JOIN PlaylistSong ps ON ps.song.id=s.id "+
+            "LEFT JOIN Like l ON l.musicalEntity.id=s.id AND l.listener.id=:currentUserId "+
+            "WHERE ps.playlist.id=:playlistId")
+    List<MusicalEntityDto>findSongsByPlaylistId(@Param("playlistId")Long playlistId, @Param("currentUserId")Long currentUserId);
 }
Index: finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/AlbumService.java
===================================================================
--- finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/AlbumService.java	(revision 2b08bed6a1ac91c0de26078bed3ee44d43611bd4)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/AlbumService.java	(revision 2730163380202029196d71a92f0cbde3dfdd5b0a)
@@ -1,4 +1,5 @@
 package com.ukim.finki.develop.finkwave.service;
 
+import com.ukim.finki.develop.finkwave.exceptions.AlbumNotFoundException;
 import com.ukim.finki.develop.finkwave.model.Album;
 import com.ukim.finki.develop.finkwave.model.MusicalEntity;
@@ -23,9 +24,9 @@
     public MusicalEntityDto getAlbum(Long id){
         if (!albumRepository.existsById(id)){
-            throw new RuntimeException("Album not found");
+            throw new AlbumNotFoundException(id);
         }
         Long currentUserId=authService.getCurrentUserID();
 
-        Album album=albumRepository.findById(id).orElseThrow(()->new RuntimeException("Album not found"));
+        Album album=albumRepository.findById(id).orElseThrow(()->new AlbumNotFoundException(id));
         AlbumDto dto=new AlbumDto(album.getId(),
                 album.getMusicalEntities().getTitle(),
Index: finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/ArtistService.java
===================================================================
--- finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/ArtistService.java	(revision 2b08bed6a1ac91c0de26078bed3ee44d43611bd4)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/ArtistService.java	(revision 2730163380202029196d71a92f0cbde3dfdd5b0a)
@@ -16,9 +16,11 @@
 
     private final ArtistContributionRepository artistContributionRepository;
+    private final AuthService authService;
 
 
     @Transactional(readOnly=true)
     public List<ArtistContributionDto> getArtistContributions(Long artistId){
-        return artistContributionRepository.findContributionsByArtistId(artistId);
+        Long currentUserId=authService.getCurrentUserID();
+        return artistContributionRepository.findContributionsByArtistId(currentUserId,artistId);
     }
 
Index: finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/FollowService.java
===================================================================
--- finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/FollowService.java	(revision 2b08bed6a1ac91c0de26078bed3ee44d43611bd4)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/FollowService.java	(revision 2730163380202029196d71a92f0cbde3dfdd5b0a)
@@ -16,4 +16,5 @@
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Set;
 import java.util.stream.Collectors;
 
@@ -29,4 +30,11 @@
 
 
+    private boolean isFollowedByCurrentUser(Long currentUserId,Long otherUserId){
+        Set<Long> currentUserFollows = followRepository.getFollowsByFollower_Id(currentUserId)
+                .stream()
+                .map(f -> f.getFollowee().getId())
+                .collect(Collectors.toSet());
+        return currentUserFollows.contains(otherUserId);
+    }
 
     public List<NonAdminUserDto>getFollowersForUser(Long id){
@@ -34,11 +42,15 @@
             throw new FollowException("Cannot view for artist");
         }
-        List<Follow>followers=followRepository.getFollowsByFollowee_Id(id);
+        List<Follow> followers = followRepository.findFollowersWithProfile(id);
         Long currentUserId=authService.getCurrentUserID();
+
+
         return followers.stream()
-                .map(f->{
-                   NonAdminUserDto dto=mapper.toDto(f.getFollower(),null,null,null);
-                   dto.setIsFollowedByCurrentUser(followRepository.isFollowing(currentUserId,f.getFollower().getId()));
-                   return dto;
+                .map(f -> {
+                    NonAdminUser follower = f.getFollower();
+                    NonAdminUserDto dto = mapper.toDto(follower, null, null, null);
+
+                    dto.setIsFollowedByCurrentUser(isFollowedByCurrentUser(currentUserId,follower.getId()));
+                    return dto;
                 })
                 .toList();
@@ -49,10 +61,11 @@
             throw new FollowException("Cannot view for artist");
         }
-        List<Follow>followers=followRepository.getFollowsByFollower_Id(id);
+        List<Follow>followings=followRepository.getFollowsByFollower_Id(id);
         Long currentUserId=authService.getCurrentUserID();
-        return followers.stream()
+        return followings.stream()
                 .map(f->{
+                    NonAdminUser followee=f.getFollowee();
                     NonAdminUserDto dto=mapper.toDto(f.getFollowee(),null,null,null);
-                    dto.setIsFollowedByCurrentUser(followRepository.isFollowing(currentUserId,f.getFollowee().getId()));
+                    dto.setIsFollowedByCurrentUser(isFollowedByCurrentUser(currentUserId,followee.getId()));
                     return dto;
                 })
@@ -62,5 +75,5 @@
 
 
-    public boolean toggleFollow(Long id){
+    public void toggleFollow(Long id){
         Long currentUserId=authService.getCurrentUserID();
 
@@ -74,5 +87,5 @@
         if (followRepository.existsById(followId)){
             followRepository.deleteById(followId);
-            return false;
+
         }else{
             NonAdminUser follower = nonAdminUserRepository.findById(currentUserId)
@@ -82,5 +95,5 @@
 
             followRepository.save(new Follow(follower, followee));
-            return true;
+
         }
 
Index: finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/LikeService.java
===================================================================
--- finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/LikeService.java	(revision 2730163380202029196d71a92f0cbde3dfdd5b0a)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/LikeService.java	(revision 2730163380202029196d71a92f0cbde3dfdd5b0a)
@@ -0,0 +1,18 @@
+package com.ukim.finki.develop.finkwave.service;
+
+import com.ukim.finki.develop.finkwave.model.dto.MusicalEntityDto;
+import com.ukim.finki.develop.finkwave.repository.LikeRepository;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+@AllArgsConstructor
+public class LikeService {
+
+    private final LikeRepository likeRepository;
+    public List<MusicalEntityDto> findLikedEntitiesWithTypeByListenerId(Long listenerId){
+        return likeRepository.findLikedEntitiesWithTypeByListenerId(listenerId);
+    }
+}
Index: finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/ListenerService.java
===================================================================
--- finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/ListenerService.java	(revision 2b08bed6a1ac91c0de26078bed3ee44d43611bd4)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/ListenerService.java	(revision 2730163380202029196d71a92f0cbde3dfdd5b0a)
@@ -13,17 +13,18 @@
 @Service
 @AllArgsConstructor
+@Transactional(readOnly = true)
 public class ListenerService {
-    private final LikeRepository likeRepository;
-    private final PlaylistRepository playlistRepository;
-    @Transactional(readOnly = true)
+    private final LikeService likeService;
+    private final PlaylistService playlistService;
+
     public List<MusicalEntityDto> getLikedEntities(Long listenerId) {
-        return  likeRepository.findLikedEntitiesWithTypeByListenerId(listenerId);
+        return  likeService.findLikedEntitiesWithTypeByListenerId(listenerId);
 
 
     }
 
-    @Transactional(readOnly = true)
+
     public List<Playlist>getPlaylistsCreatedByUser(Long listenerId){
-        return playlistRepository.findByCreatorId(listenerId);
+        return playlistService.findByCreatorId(listenerId);
     }
 }
Index: finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/NonAdminUserService.java
===================================================================
--- finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/NonAdminUserService.java	(revision 2b08bed6a1ac91c0de26078bed3ee44d43611bd4)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/NonAdminUserService.java	(revision 2730163380202029196d71a92f0cbde3dfdd5b0a)
@@ -82,5 +82,6 @@
                         p.getName(),
                         p.getCover(),
-                        p.getCreatedBy().getNonAdminUser().getUser().getFullName()
+                        p.getCreatedBy().getNonAdminUser().getUser().getFullName(),
+                        null
                 )).toList();
 
Index: finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/PlaylistService.java
===================================================================
--- finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/PlaylistService.java	(revision 2730163380202029196d71a92f0cbde3dfdd5b0a)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/PlaylistService.java	(revision 2730163380202029196d71a92f0cbde3dfdd5b0a)
@@ -0,0 +1,42 @@
+package com.ukim.finki.develop.finkwave.service;
+
+import com.ukim.finki.develop.finkwave.exceptions.PlaylistNotFoundException;
+import com.ukim.finki.develop.finkwave.model.Playlist;
+import com.ukim.finki.develop.finkwave.model.dto.MusicalEntityDto;
+import com.ukim.finki.develop.finkwave.model.dto.PlaylistDto;
+import com.ukim.finki.develop.finkwave.repository.PlaylistRepository;
+import com.ukim.finki.develop.finkwave.repository.SongRepository;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+@Service
+@AllArgsConstructor
+@Transactional(readOnly = true)
+public class PlaylistService {
+    private final PlaylistRepository playlistRepository;
+    private final SongRepository songRepository;
+    private final AuthService authService;
+
+    public List<Playlist>findByCreatorId(Long id){
+        return playlistRepository.findByCreatorId(id);
+    }
+
+    public PlaylistDto getPlaylist(Long id){
+        Long currentUserId=authService.getCurrentUserID();
+        Playlist playlist = playlistRepository.findById(id).orElseThrow(()-> new PlaylistNotFoundException(id));
+        List<MusicalEntityDto>songsInPlaylist=songRepository.findSongsByPlaylistId(id,currentUserId);
+        return new PlaylistDto(
+                playlist.getId(),
+                playlist.getName(),
+                playlist.getCover(),
+                playlist.getCreatedBy().getNonAdminUser().getUser().getFullName(),
+                songsInPlaylist
+        );
+    }
+
+
+
+}
Index: frontend/src/App.tsx
===================================================================
--- frontend/src/App.tsx	(revision 2b08bed6a1ac91c0de26078bed3ee44d43611bd4)
+++ frontend/src/App.tsx	(revision 2730163380202029196d71a92f0cbde3dfdd5b0a)
@@ -7,5 +7,5 @@
 import Nav from "./pages/Nav";
 import Register from "./pages/Register";
-import UserDetailView from "./pages/UserDetailView";
+import UserDetail from "./pages/UserDetail";
 import MusicalCollection from "./pages/MusicalCollection";
 
@@ -52,5 +52,5 @@
       {
         path: "/users/:userId",
-        element: <UserDetailView />,
+        element: <UserDetail />,
       },
       {
Index: frontend/src/components/userProfile/ListenerView.tsx
===================================================================
--- frontend/src/components/userProfile/ListenerView.tsx	(revision 2b08bed6a1ac91c0de26078bed3ee44d43611bd4)
+++ frontend/src/components/userProfile/ListenerView.tsx	(revision 2730163380202029196d71a92f0cbde3dfdd5b0a)
@@ -20,5 +20,7 @@
           <div className="flex items-center gap-2 mb-6 pb-2 border-b-2 border-gray-200">
             <ListMusic className="w-6 h-6 text-gray-700" />
-            <h3 className="text-2xl font-bold text-gray-800">My Playlists</h3>
+            <h3 className="text-2xl font-bold text-gray-800">
+              Created Playlists
+            </h3>
             <span className="text-sm text-gray-400 ml-1">
               ({playlists.length})
@@ -31,5 +33,5 @@
                 key={playlist.id}
                 className="group cursor-pointer"
-                onClick={() => navigate(`/playlists/${playlist.id}`)}
+                onClick={() => navigate(`/collection/playlist/${playlist.id}`)}
               >
                 <div className="aspect-square rounded-md overflow-hidden bg-gray-100 mb-2 relative shadow-sm group-hover:shadow-lg transition-all">
@@ -105,5 +107,5 @@
                 key={album.id}
                 className="group cursor-pointer"
-                onClick={() => navigate(`/musical-entity/${album.id}`)}
+                onClick={() => navigate(`/collection/album/${album.id}`)}
               >
                 <div className="aspect-square rounded-lg overflow-hidden bg-gradient-to-br from-blue-100 to-indigo-100 mb-3 flex items-center justify-center shadow-sm group-hover:shadow-md transition-all">
Index: frontend/src/components/userProfile/UserListModal.tsx
===================================================================
--- frontend/src/components/userProfile/UserListModal.tsx	(revision 2b08bed6a1ac91c0de26078bed3ee44d43611bd4)
+++ frontend/src/components/userProfile/UserListModal.tsx	(revision 2730163380202029196d71a92f0cbde3dfdd5b0a)
@@ -25,5 +25,5 @@
           <button
             onClick={onClose}
-            className="text-gray-500 hover:text-black text-2xl"
+            className="text-gray-500 hover:text-black text-2xl cursor-pointer"
           >
             &times;
Index: frontend/src/pages/MusicalCollection.tsx
===================================================================
--- frontend/src/pages/MusicalCollection.tsx	(revision 2b08bed6a1ac91c0de26078bed3ee44d43611bd4)
+++ frontend/src/pages/MusicalCollection.tsx	(revision 2730163380202029196d71a92f0cbde3dfdd5b0a)
@@ -2,22 +2,14 @@
 import { useNavigate, useParams } from "react-router-dom";
 import axiosInstance from "../api/axiosInstance";
-
-interface Song {
+import type { Song, Album, Playlist } from "../utils/types";
+import { handleError } from "../utils/error";
+interface CollectionView {
   id: number;
   title: string;
-  genre: string;
-  type: "SONG";
-  releasedBy: string;
-  isLikedByCurrentUser?: boolean;
-}
-
-interface MusicalEntity {
-  id: number;
-  title: string;
-  genre: string;
+  genre?: string;
   type: string;
   releasedBy: string;
   isLikedByCurrentUser?: boolean;
-  songs?: Song[];
+  songs: Song[];
 }
 
@@ -25,7 +17,36 @@
   const { type, id } = useParams();
   const navigate = useNavigate();
-  const [collection, setCollection] = useState<MusicalEntity | null>(null);
+  const [collection, setCollection] = useState<CollectionView | null>(null);
   const [isLoading, setIsLoading] = useState(true);
   const [error, setError] = useState<string | null>(null);
+
+  const normalizeCollection = (
+    data: Album | Playlist,
+    type: string,
+  ): CollectionView => {
+    if (type === "album") {
+      const album = data as Album;
+      return {
+        id: album.id,
+        title: album.title,
+        genre: album.genre,
+        type: album.type,
+        releasedBy: album.releasedBy,
+        isLikedByCurrentUser: album.isLikedByCurrentUser,
+        songs: album.songs,
+      };
+    } else {
+      const playlist = data as Playlist;
+      return {
+        id: playlist.id,
+        title: playlist.name,
+        genre: undefined,
+        type: "PLAYLIST",
+        releasedBy: playlist.creatorName,
+        isLikedByCurrentUser: undefined,
+        songs: playlist.songsInPlaylist,
+      };
+    }
+  };
 
   useEffect(() => {
@@ -37,8 +58,9 @@
           type === "album" ? `/albums/${id}` : `/playlists/${id}`;
         const response = await axiosInstance.get(endpoint);
-        console.log(response.data);
-        setCollection(response.data);
+
+        const normalized = normalizeCollection(response.data, type!);
+        setCollection(normalized);
       } catch (err: any) {
-        setError(err.response?.data?.error || "Failed to load collection");
+        setError(handleError(err));
       } finally {
         setIsLoading(false);
@@ -67,5 +89,5 @@
       <button
         onClick={() => navigate(-1)}
-        className="mb-4 px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600 transition-colors duration-200"
+        className="mb-4 px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600 transition-colors duration-200 cursor-pointer"
       >
         ← Back
@@ -88,6 +110,10 @@
             <div className="flex items-center gap-3 text-gray-700 mb-4">
               <span className="font-semibold">{collection.releasedBy}</span>
-              <span>•</span>
-              <span className="text-gray-600">{collection.genre}</span>
+              {collection.genre && (
+                <>
+                  <span>•</span>
+                  <span className="text-gray-600">{collection.genre}</span>
+                </>
+              )}
               {collection.songs && (
                 <>
@@ -101,21 +127,25 @@
             </div>
 
-            <button
-              className="flex items-center gap-2 px-4 py-2 bg-gray-100 hover:bg-gray-200 rounded-lg transition-colors duration-200"
-              aria-label={collection.isLikedByCurrentUser ? "Unlike" : "Like"}
-            >
-              <svg
-                className="w-5 h-5"
-                fill={collection.isLikedByCurrentUser ? "#ef4444" : "none"}
-                stroke={collection.isLikedByCurrentUser ? "#ef4444" : "#6b7280"}
-                strokeWidth="2"
-                viewBox="0 0 24 24"
+            {type === "album" && (
+              <button
+                className="flex items-center gap-2 px-4 py-2 bg-gray-100 hover:bg-gray-200 rounded-lg transition-colors duration-200"
+                aria-label={collection.isLikedByCurrentUser ? "Unlike" : "Like"}
               >
-                <path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z" />
-              </svg>
-              <span className="text-sm font-medium text-gray-700">
-                {collection.isLikedByCurrentUser ? "Liked" : "Like"}
-              </span>
-            </button>
+                <svg
+                  className="w-5 h-5"
+                  fill={collection.isLikedByCurrentUser ? "#ef4444" : "none"}
+                  stroke={
+                    collection.isLikedByCurrentUser ? "#ef4444" : "#6b7280"
+                  }
+                  strokeWidth="2"
+                  viewBox="0 0 24 24"
+                >
+                  <path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z" />
+                </svg>
+                <span className="text-sm font-medium text-gray-700">
+                  {collection.isLikedByCurrentUser ? "Liked" : "Like"}
+                </span>
+              </button>
+            )}
           </div>
         </div>
Index: frontend/src/pages/UserDetail.tsx
===================================================================
--- frontend/src/pages/UserDetail.tsx	(revision 2730163380202029196d71a92f0cbde3dfdd5b0a)
+++ frontend/src/pages/UserDetail.tsx	(revision 2730163380202029196d71a92f0cbde3dfdd5b0a)
@@ -0,0 +1,233 @@
+import { useEffect, useState } from "react";
+import { useNavigate, useParams } from "react-router-dom";
+import axiosInstance from "../api/axiosInstance";
+import ArtistView from "../components/userProfile/ArtistView";
+import ListenerView from "../components/userProfile/ListenerView";
+import UserListModal from "../components/userProfile/UserListModal";
+import { handleError } from "../utils/error";
+import type {
+  MusicalEntity,
+  Playlist,
+  ArtistContribution,
+  BaseNonAdminUser,
+} from "../utils/types";
+
+interface Artist extends BaseNonAdminUser {
+  userType: "ARTIST";
+  contributions: ArtistContribution[];
+}
+interface Listener extends BaseNonAdminUser {
+  userType: "LISTENER";
+  likedEntities: MusicalEntity[];
+  createdPlaylists: Playlist[];
+}
+
+type UserProfile = Artist | Listener;
+
+const UserDetail = () => {
+  // user refers to the selected user NOT to the user from context
+  const baseURL = import.meta.env.VITE_API_BASE_URL;
+  const { userId } = useParams();
+  const navigate = useNavigate();
+  const [user, setUser] = useState<UserProfile | null>(null);
+  const [error, setError] = useState<string | null>(null);
+  const [showModal, setShowModal] = useState(false);
+  const [modalTitle, setModalTitle] = useState("");
+  const [modalUsers, setModalUsers] = useState<any[]>([]);
+  const [isLoadingModal, setIsLoadingModal] = useState(false);
+  const [isFollowing, setIsFollowing] = useState(false);
+
+  const handleFollow = async () => {
+    if (!user) return;
+
+    setIsFollowing(true);
+    try {
+      const response = await axiosInstance.post<UserProfile>(
+        `/users/${userId}/follow`,
+      );
+      setUser(response.data);
+    } catch (err: any) {
+      setError(handleError(err));
+    } finally {
+      setIsFollowing(false);
+    }
+  };
+
+  const displayFollowers = async () => {
+    setIsLoadingModal(true);
+    try {
+      const response = await axiosInstance.get(`/users/${userId}/followers`);
+      setModalUsers(response.data);
+      setModalTitle("Followers");
+      setShowModal(true);
+    } catch (err) {
+      setError(handleError(err));
+    } finally {
+      setIsLoadingModal(false);
+    }
+  };
+  const displayFollowing = async () => {
+    setIsLoadingModal(true);
+    try {
+      const response = await axiosInstance.get(`/users/${userId}/following`);
+      setModalUsers(response.data);
+      setModalTitle("Following");
+      setShowModal(true);
+    } catch (err: any) {
+      setError(handleError(err));
+    } finally {
+      setIsLoadingModal(false);
+    }
+  };
+
+  const handleFollowInModal = async (targetId: number) => {
+    try {
+      await axiosInstance.post(`/users/${targetId}/follow`);
+      setModalUsers((prevUsers) =>
+        prevUsers.map((u) => {
+          if (u.id === targetId) {
+            const isNowFollowing = !u.isFollowedByCurrentUser;
+            return {
+              ...u,
+              isFollowedByCurrentUser: isNowFollowing,
+            };
+          }
+          return u;
+        }),
+      );
+
+      // if (user && user.id === targetId) {
+      //   const response = await axiosInstance.get(`/users/${targetId}`);
+      //   setUser(response.data);
+      // }
+    } catch (err: any) {
+      setError(handleError(err));
+    }
+  };
+
+  useEffect(() => {
+    const fetchUser = async () => {
+      setError(null);
+      try {
+        const response = await axiosInstance.get(`/users/${userId}`);
+        setUser(response.data);
+      } catch (err: any) {
+        setError(handleError(err));
+      }
+    };
+    fetchUser();
+  }, [userId]);
+
+  if (error) {
+    return (
+      <div className="p-6 bg-red-50 border border-red-200 text-red-700 rounded-lg">
+        <h2 className="font-bold">Error</h2>
+        <p>{error}</p>
+      </div>
+    );
+  }
+
+  if (!user) return <div className="p-6">Loading...</div>;
+
+  return (
+    <div className="container mx-auto p-6">
+      {isLoadingModal && (
+        <div className="fixed inset-0 z-40 bg-black/30 backdrop-blur-sm flex items-center justify-center">
+          <div className="flex items-center gap-3">
+            <div className="w-6 h-6 border-3 border-blue-500 border-t-transparent rounded-full animate-spin"></div>
+          </div>
+        </div>
+      )}
+      <button
+        onClick={() => navigate(-1)}
+        className="mb-4 px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600 transition-colors duration-200 cursor-pointer"
+      >
+        ← Back
+      </button>
+
+      <div className="bg-white shadow-lg rounded-lg p-8">
+        <div className="flex items-start gap-6 mb-8">
+          <div className="shrink-0">
+            <div className="w-32 h-32 rounded-full bg-linear-to-br from-blue-400 to-purple-500 flex items-center justify-center text-white text-4xl font-bold shadow-lg overflow-hidden">
+              {user.profilePhoto ? (
+                <img
+                  src={`${baseURL}/${user.profilePhoto}`}
+                  alt={user.fullName}
+                  className="w-full h-full object-cover"
+                />
+              ) : (
+                user.fullName.charAt(0).toUpperCase()
+              )}
+            </div>
+          </div>
+
+          <div className="flex-1">
+            <h1 className="text-4xl font-bold mb-2">{user.fullName}</h1>
+            <span className="inline-block px-3 py-1 bg-blue-100 text-blue-800 rounded-full text-sm font-medium mb-4">
+              {user.userType}
+            </span>
+
+            <div className="flex gap-6 mb-4 text-gray-700">
+              <div
+                className={`flex flex-col ${user.userType == "LISTENER" ? "cursor-pointer" : "cursor-default"}`}
+                onClick={
+                  user.userType === "LISTENER" ? displayFollowers : undefined
+                }
+              >
+                <span className="text-2xl font-bold">{user.followers}</span>
+                <span className="text-sm text-gray-500">Followers</span>
+              </div>
+              <div
+                className={`flex flex-col ${user.userType == "LISTENER" ? "cursor-pointer" : "cursor-default"}`}
+                onClick={
+                  user.userType === "LISTENER" ? displayFollowing : undefined
+                }
+              >
+                <span className="text-2xl font-bold">{user.following}</span>
+                <span className="text-sm text-gray-500">Following</span>
+              </div>
+            </div>
+
+            <button
+              onClick={handleFollow}
+              disabled={isFollowing}
+              className={`
+                px-6 py-2 font-semibold rounded-lg shadow-md 
+                transition-colors duration-200
+                ${
+                  isFollowing
+                    ? "bg-gray-400 text-gray-200 cursor-not-allowed"
+                    : user.isFollowedByCurrentUser
+                      ? "bg-gray-200 text-gray-700 hover:bg-gray-300 cursor-pointer"
+                      : "bg-blue-500 text-white hover:bg-blue-600 cursor-pointer"
+                }
+              `}
+            >
+              {user.isFollowedByCurrentUser ? "Unfollow" : "Follow"}
+            </button>
+          </div>
+        </div>
+
+        {user.userType === "ARTIST" ? (
+          <ArtistView contributions={user.contributions} />
+        ) : (
+          <ListenerView
+            likedEntities={user.likedEntities}
+            playlists={user.createdPlaylists}
+          />
+        )}
+
+        {showModal && (
+          <UserListModal
+            title={modalTitle}
+            users={modalUsers}
+            onClose={() => setShowModal(false)}
+            onFollowToggle={handleFollowInModal}
+          />
+        )}
+      </div>
+    </div>
+  );
+};
+
+export default UserDetail;
Index: ontend/src/pages/UserDetailView.tsx
===================================================================
--- frontend/src/pages/UserDetailView.tsx	(revision 2b08bed6a1ac91c0de26078bed3ee44d43611bd4)
+++ 	(revision )
@@ -1,235 +1,0 @@
-import { useEffect, useState } from "react";
-import { useNavigate, useParams } from "react-router-dom";
-import axiosInstance from "../api/axiosInstance";
-import ArtistView from "../components/userProfile/ArtistView";
-import ListenerView from "../components/userProfile/ListenerView";
-import UserListModal from "../components/userProfile/UserListModal";
-import type {
-  MusicalEntity,
-  Playlist,
-  ArtistContribution,
-  BaseNonAdminUser,
-} from "../utils/types";
-
-interface Artist extends BaseNonAdminUser {
-  userType: "ARTIST";
-  contributions: ArtistContribution[];
-}
-interface Listener extends BaseNonAdminUser {
-  userType: "LISTENER";
-  likedEntities: MusicalEntity[];
-  createdPlaylists: Playlist[];
-}
-
-type UserProfile = Artist | Listener;
-
-const UserDetail = () => {
-  // user refers to the selected user NOT to the user from context
-  const baseURL = import.meta.env.VITE_API_BASE_URL;
-  const { userId } = useParams();
-  const navigate = useNavigate();
-  const [user, setUser] = useState<UserProfile | null>(null);
-  const [error, setError] = useState<string | null>(null);
-  const [showModal, setShowModal] = useState(false);
-  const [modalTitle, setModalTitle] = useState("");
-  const [modalUsers, setModalUsers] = useState<any[]>([]);
-  const [isLoadingModal, setIsLoadingModal] = useState(false);
-  const [isFollowing, setIsFollowing] = useState(false);
-
-  const handleFollow = async () => {
-    if (!user) return;
-
-    setIsFollowing(true);
-    try {
-      const response = await axiosInstance.post<UserProfile>(
-        `/users/follow/${userId}`,
-      );
-      setUser(response.data);
-    } catch (err: any) {
-      console.error(err.response?.data?.error);
-    } finally {
-      setIsFollowing(false);
-    }
-  };
-
-  const displayFollowers = async () => {
-    setIsLoadingModal(true);
-    try {
-      const response = await axiosInstance.get(`/users/followers/${userId}`);
-      setModalUsers(response.data);
-      setModalTitle("Followers");
-      setShowModal(true);
-    } catch (err) {
-      console.error("Failed to fetch followers");
-    } finally {
-      setIsLoadingModal(false);
-    }
-  };
-  const displayFollowing = async () => {
-    setIsLoadingModal(true);
-    try {
-      const response = await axiosInstance.get(`/users/following/${userId}`);
-      setModalUsers(response.data);
-      setModalTitle("Following");
-      setShowModal(true);
-    } catch (err) {
-      console.error("Failed to fetch following users");
-    } finally {
-      setIsLoadingModal(false);
-    }
-  };
-
-  const handleFollowInModal = async (targetId: number) => {
-    try {
-      await axiosInstance.post(`/users/follow/${targetId}`);
-      setModalUsers((prevUsers) =>
-        prevUsers.map((u) => {
-          if (u.id === targetId) {
-            const isNowFollowing = !u.isFollowedByCurrentUser;
-            return {
-              ...u,
-              isFollowedByCurrentUser: isNowFollowing,
-            };
-          }
-          return u;
-        }),
-      );
-
-      if (user && user.id === targetId) {
-        const response = await axiosInstance.get(`/users/${targetId}`);
-        setUser(response.data);
-      }
-    } catch (err) {
-      console.error("Failed to toggle follow in modal", err);
-    }
-  };
-
-  useEffect(() => {
-    const fetchUser = async () => {
-      setError(null);
-      try {
-        const response = await axiosInstance.get(`/users/${userId}`);
-        console.log(response.data);
-        setUser(response.data);
-      } catch (err: any) {
-        const errorMessage =
-          err.response?.data?.error || "Failed to fetch user";
-        setError(errorMessage);
-      }
-    };
-    fetchUser();
-  }, [userId]);
-
-  if (error) {
-    return (
-      <div className="p-6 bg-red-50 border border-red-200 text-red-700 rounded-lg">
-        <h2 className="font-bold">Error</h2>
-        <p>{error}</p>
-      </div>
-    );
-  }
-
-  if (!user) return <div className="p-6">Loading...</div>;
-
-  return (
-    <div className="container mx-auto p-6">
-      {isLoadingModal && (
-        <div className="fixed inset-0 z-40 bg-black/30 backdrop-blur-sm flex items-center justify-center">
-          <div className="flex items-center gap-3">
-            <div className="w-6 h-6 border-3 border-blue-500 border-t-transparent rounded-full animate-spin"></div>
-          </div>
-        </div>
-      )}
-      <button
-        onClick={() => navigate(-1)}
-        className="mb-4 px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600 transition-colors duration-200"
-      >
-        ← Back
-      </button>
-
-      <div className="bg-white shadow-lg rounded-lg p-8">
-        <div className="flex items-start gap-6 mb-8">
-          <div className="shrink-0">
-            <div className="w-32 h-32 rounded-full bg-linear-to-br from-blue-400 to-purple-500 flex items-center justify-center text-white text-4xl font-bold shadow-lg overflow-hidden">
-              {user.profilePhoto ? (
-                <img
-                  src={`${baseURL}/${user.profilePhoto}`}
-                  alt={user.fullName}
-                  className="w-full h-full object-cover"
-                />
-              ) : (
-                user.fullName.charAt(0).toUpperCase()
-              )}
-            </div>
-          </div>
-
-          <div className="flex-1">
-            <h1 className="text-4xl font-bold mb-2">{user.fullName}</h1>
-            <span className="inline-block px-3 py-1 bg-blue-100 text-blue-800 rounded-full text-sm font-medium mb-4">
-              {user.userType}
-            </span>
-
-            <div className="flex gap-6 mb-4 text-gray-700">
-              <div
-                className={`flex flex-col ${user.userType == "LISTENER" ? "cursor-pointer" : "cursor-default"}`}
-                onClick={
-                  user.userType === "LISTENER" ? displayFollowers : undefined
-                }
-              >
-                <span className="text-2xl font-bold">{user.followers}</span>
-                <span className="text-sm text-gray-500">Followers</span>
-              </div>
-              <div
-                className={`flex flex-col ${user.userType == "LISTENER" ? "cursor-pointer" : "cursor-default"}`}
-                onClick={
-                  user.userType === "LISTENER" ? displayFollowing : undefined
-                }
-              >
-                <span className="text-2xl font-bold">{user.following}</span>
-                <span className="text-sm text-gray-500">Following</span>
-              </div>
-            </div>
-
-            <button
-              onClick={handleFollow}
-              disabled={isFollowing}
-              className={`
-                px-6 py-2 font-semibold rounded-lg shadow-md 
-                transition-colors duration-200
-                ${
-                  isFollowing
-                    ? "bg-gray-400 text-gray-200 cursor-not-allowed"
-                    : user.isFollowedByCurrentUser
-                      ? "bg-gray-200 text-gray-700 hover:bg-gray-300 cursor-pointer"
-                      : "bg-blue-500 text-white hover:bg-blue-600 cursor-pointer"
-                }
-              `}
-            >
-              {user.isFollowedByCurrentUser ? "Unfollow" : "Follow"}
-            </button>
-          </div>
-        </div>
-
-        {user.userType === "ARTIST" ? (
-          <ArtistView contributions={user.contributions} />
-        ) : (
-          <ListenerView
-            likedEntities={user.likedEntities}
-            playlists={user.createdPlaylists}
-          />
-        )}
-
-        {showModal && (
-          <UserListModal
-            title={modalTitle}
-            users={modalUsers}
-            onClose={() => setShowModal(false)}
-            onFollowToggle={handleFollowInModal}
-          />
-        )}
-      </div>
-    </div>
-  );
-};
-
-export default UserDetail;
Index: frontend/src/utils/error.ts
===================================================================
--- frontend/src/utils/error.ts	(revision 2730163380202029196d71a92f0cbde3dfdd5b0a)
+++ frontend/src/utils/error.ts	(revision 2730163380202029196d71a92f0cbde3dfdd5b0a)
@@ -0,0 +1,4 @@
+export const handleError = (err: any) => {
+  const errorMessage = err.response?.data?.error || "Failed to fetch user";
+  return errorMessage;
+};
Index: frontend/src/utils/types.ts
===================================================================
--- frontend/src/utils/types.ts	(revision 2b08bed6a1ac91c0de26078bed3ee44d43611bd4)
+++ frontend/src/utils/types.ts	(revision 2730163380202029196d71a92f0cbde3dfdd5b0a)
@@ -13,5 +13,7 @@
   role: string;
   entityType: string;
+  isLikedByCurrentUser: boolean;
 }
+
 export interface MusicalEntity {
   id: number;
@@ -20,4 +22,14 @@
   type: string;
   releasedBy: string;
+  isLikedByCurrentUser?: boolean;
+}
+
+export interface Song extends MusicalEntity {
+  type: "SONG";
+}
+
+export interface Album extends MusicalEntity {
+  type: "ALBUM";
+  songs: Song[];
 }
 
@@ -27,4 +39,5 @@
   cover: string;
   creatorName: string;
+  songsInPlaylist: Song[];
 }
 
