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 0d9725cfa22ae513a665db5f34f5a086b3660f82)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/controller/NonAdminUserController.java	(revision efe76febc84767c79b12dc47ef59644804ce6f97)
@@ -1,4 +1,30 @@
 package com.ukim.finki.develop.finkwave.controller;
 
+import com.ukim.finki.develop.finkwave.model.NonAdminUser;
+import com.ukim.finki.develop.finkwave.model.dto.NonAdminUserDTO;
+import com.ukim.finki.develop.finkwave.service.NonAdminUserService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@CrossOrigin("*")
+@RequiredArgsConstructor
+@RequestMapping("/users")
 public class NonAdminUserController {
+
+    private final NonAdminUserService nonAdminUserService;
+
+    @GetMapping("/all")
+    public HttpEntity<List<NonAdminUserDTO>>getAllNonAdminUsers(){
+        return ResponseEntity.ok(nonAdminUserService.getAllUsers());
+    }
+
+    @GetMapping("/{id}")
+    public HttpEntity<NonAdminUserDTO>getById(@PathVariable Long id){
+        return ResponseEntity.ok(nonAdminUserService.getById(id));
+    }
 }
Index: finkwave/src/main/java/com/ukim/finki/develop/finkwave/controller/UserController.java
===================================================================
--- finkwave/src/main/java/com/ukim/finki/develop/finkwave/controller/UserController.java	(revision 0d9725cfa22ae513a665db5f34f5a086b3660f82)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/controller/UserController.java	(revision efe76febc84767c79b12dc47ef59644804ce6f97)
@@ -22,3 +22,5 @@
         return ResponseEntity.ok(usersService.getAll());
     }
+
+
 }
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 0d9725cfa22ae513a665db5f34f5a086b3660f82)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/ArtistContributionDTO.java	(revision efe76febc84767c79b12dc47ef59644804ce6f97)
@@ -1,4 +1,15 @@
 package com.ukim.finki.develop.finkwave.model.dto;
 
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+@AllArgsConstructor
 public class ArtistContributionDTO {
+    private String role;
+    private Long musicalEntityId;
+    private String title;
+    private String entityType;
 }
Index: finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/ArtistMusicalEntitiesDTO.java
===================================================================
--- finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/ArtistMusicalEntitiesDTO.java	(revision 0d9725cfa22ae513a665db5f34f5a086b3660f82)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/ArtistMusicalEntitiesDTO.java	(revision efe76febc84767c79b12dc47ef59644804ce6f97)
@@ -1,4 +1,17 @@
 package com.ukim.finki.develop.finkwave.model.dto;
 
+import com.ukim.finki.develop.finkwave.model.Album;
+import com.ukim.finki.develop.finkwave.model.Song;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+@Getter
+@Setter
+@AllArgsConstructor
 public class ArtistMusicalEntitiesDTO {
+    private List<Song> songs;
+    private List<Album> albums;
 }
Index: finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/ListenerLikesDTO.java
===================================================================
--- finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/ListenerLikesDTO.java	(revision 0d9725cfa22ae513a665db5f34f5a086b3660f82)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/ListenerLikesDTO.java	(revision efe76febc84767c79b12dc47ef59644804ce6f97)
@@ -1,4 +1,15 @@
 package com.ukim.finki.develop.finkwave.model.dto;
 
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+@AllArgsConstructor
 public class ListenerLikesDTO {
+    private Long entityId;
+    private String entityTitle;
+    private String entityGenre;
+    private String entityType;
 }
Index: finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/NonAdminUserDTO.java
===================================================================
--- finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/NonAdminUserDTO.java	(revision 0d9725cfa22ae513a665db5f34f5a086b3660f82)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/NonAdminUserDTO.java	(revision efe76febc84767c79b12dc47ef59644804ce6f97)
@@ -1,4 +1,25 @@
 package com.ukim.finki.develop.finkwave.model.dto;
 
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import java.util.List;
+
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
 public class NonAdminUserDTO {
+    private Long Id;
+    private String username;
+    private String fullName;
+    private String profilePhoto;
+    private Long followerCount;
+    private Long followingCount;
+    private String userType;
+    // is it best practice to have this empty in listeners?
+    private List<ArtistContributionDTO> contributions;
+    private List<ListenerLikesDTO> likedEntities;
 }
Index: finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/AlbumRepository.java
===================================================================
--- finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/AlbumRepository.java	(revision 0d9725cfa22ae513a665db5f34f5a086b3660f82)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/AlbumRepository.java	(revision efe76febc84767c79b12dc47ef59644804ce6f97)
@@ -6,5 +6,9 @@
 import com.ukim.finki.develop.finkwave.model.Album;
 
+import java.util.List;
+
 @Repository
 public interface AlbumRepository extends JpaRepository<Album, Long> {
+
+    List<Album>findAllByIdIn(List<Long>ids);
 }
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 0d9725cfa22ae513a665db5f34f5a086b3660f82)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/ArtistContributionRepository.java	(revision efe76febc84767c79b12dc47ef59644804ce6f97)
@@ -7,5 +7,9 @@
 import com.ukim.finki.develop.finkwave.model.ArtistContributionId;
 
+import java.util.List;
+
 @Repository
 public interface ArtistContributionRepository extends JpaRepository<ArtistContribution, ArtistContributionId> {
+
+    List<ArtistContribution>findAllByArtist_Id(Long id);
 }
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 0d9725cfa22ae513a665db5f34f5a086b3660f82)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/FollowRepository.java	(revision efe76febc84767c79b12dc47ef59644804ce6f97)
@@ -9,3 +9,10 @@
 @Repository
 public interface FollowRepository extends JpaRepository<Follow, FollowId> {
+
+    // count how many followers the user has
+    long countByFolloweeId(Long userId);
+
+    //count how many users does this user follow
+    long countByFollowerId(Long userId);
+
 }
Index: finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/LikeRepository.java
===================================================================
--- finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/LikeRepository.java	(revision 0d9725cfa22ae513a665db5f34f5a086b3660f82)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/LikeRepository.java	(revision efe76febc84767c79b12dc47ef59644804ce6f97)
@@ -7,5 +7,8 @@
 import com.ukim.finki.develop.finkwave.model.LikeId;
 
+import java.util.List;
+
 @Repository
 public interface LikeRepository extends JpaRepository<Like, LikeId> {
+    List<Like>getLikesByListener_Id(Long id);
 }
Index: finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/MusicalEntityRepository.java
===================================================================
--- finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/MusicalEntityRepository.java	(revision 0d9725cfa22ae513a665db5f34f5a086b3660f82)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/MusicalEntityRepository.java	(revision efe76febc84767c79b12dc47ef59644804ce6f97)
@@ -6,5 +6,9 @@
 import com.ukim.finki.develop.finkwave.model.MusicalEntity;
 
+import java.util.List;
+
 @Repository
 public interface MusicalEntityRepository extends JpaRepository<MusicalEntity, Long> {
+
+    List<MusicalEntity>findAllByReleasedBy_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 0d9725cfa22ae513a665db5f34f5a086b3660f82)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/NonAdminUserRepository.java	(revision efe76febc84767c79b12dc47ef59644804ce6f97)
@@ -1,10 +1,20 @@
 package com.ukim.finki.develop.finkwave.repository;
 
+import com.ukim.finki.develop.finkwave.model.dto.NonAdminUserDTO;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
 import org.springframework.stereotype.Repository;
 
 import com.ukim.finki.develop.finkwave.model.NonAdminUser;
 
+import java.util.List;
+
 @Repository
 public interface NonAdminUserRepository extends JpaRepository<NonAdminUser, Long> {
+
+    @Query("SELECT n FROM NonAdminUser n JOIN FETCH n.user")
+    List<NonAdminUser> findAllWithUser();
+
+
+
 }
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 0d9725cfa22ae513a665db5f34f5a086b3660f82)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/SongRepository.java	(revision efe76febc84767c79b12dc47ef59644804ce6f97)
@@ -6,5 +6,9 @@
 import com.ukim.finki.develop.finkwave.model.Song;
 
+import java.util.List;
+
 @Repository
 public interface SongRepository extends JpaRepository<Song, Long> {
+
+    List<Song>findAllByIdIn(List<Long>ids);
 }
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 0d9725cfa22ae513a665db5f34f5a086b3660f82)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/ArtistService.java	(revision efe76febc84767c79b12dc47ef59644804ce6f97)
@@ -1,4 +1,40 @@
 package com.ukim.finki.develop.finkwave.service;
 
+import com.ukim.finki.develop.finkwave.model.ArtistContribution;
+import com.ukim.finki.develop.finkwave.model.Song;
+import com.ukim.finki.develop.finkwave.model.dto.ArtistContributionDTO;
+import com.ukim.finki.develop.finkwave.model.dto.ArtistMusicalEntitiesDTO;
+import com.ukim.finki.develop.finkwave.repository.ArtistContributionRepository;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+@AllArgsConstructor
 public class ArtistService {
+
+    private final MusicalEntityService musicalEntityService;
+    private final ArtistContributionRepository contributionRepository;
+
+
+    public List<ArtistContributionDTO> getArtistContributions(Long id){
+
+        ArtistMusicalEntitiesDTO artistMusicalEntities=musicalEntityService.getArtistMusicalEntities(id);
+        List<ArtistContribution>contributions=contributionRepository.findAllByArtist_Id(id);
+        return contributions.stream().map(c -> {
+            boolean isSong = artistMusicalEntities.getSongs().stream()
+                    .anyMatch(s -> s.getId().equals(c.getMusicalEntity().getId()));
+
+            return new ArtistContributionDTO(
+                    c.getRole(),
+                    c.getMusicalEntity().getId(),
+                    c.getMusicalEntity().getTitle(),
+                    isSong ? "Song" : "Album"
+            );
+        }).collect(Collectors.toList());
+    }
+
 }
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 0d9725cfa22ae513a665db5f34f5a086b3660f82)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/ListenerService.java	(revision efe76febc84767c79b12dc47ef59644804ce6f97)
@@ -1,4 +1,38 @@
 package com.ukim.finki.develop.finkwave.service;
 
+import com.ukim.finki.develop.finkwave.model.Album;
+import com.ukim.finki.develop.finkwave.model.Like;
+import com.ukim.finki.develop.finkwave.model.MusicalEntity;
+import com.ukim.finki.develop.finkwave.model.Song;
+import com.ukim.finki.develop.finkwave.model.dto.ArtistMusicalEntitiesDTO;
+import com.ukim.finki.develop.finkwave.model.dto.ListenerLikesDTO;
+import com.ukim.finki.develop.finkwave.repository.AlbumRepository;
+import com.ukim.finki.develop.finkwave.repository.LikeRepository;
+import com.ukim.finki.develop.finkwave.repository.SongRepository;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+@AllArgsConstructor
 public class ListenerService {
+    private final LikeRepository likeRepository;
+    private final MusicalEntityService musicalEntityService;
+
+    public List<ListenerLikesDTO>getLikedEntities(Long listenerId){
+        List<Like>likes=likeRepository.getLikesByListener_Id(listenerId);
+
+
+        return likes.stream().map(l -> new ListenerLikesDTO(
+                l.getMusicalEntity().getId(),
+                l.getMusicalEntity().getTitle(),
+                l.getMusicalEntity().getGenre(),
+                musicalEntityService.getEntityType(l.getMusicalEntity().getId())
+        )).toList();
+    }
+
+
 }
Index: finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/MusicalEntityService.java
===================================================================
--- finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/MusicalEntityService.java	(revision 0d9725cfa22ae513a665db5f34f5a086b3660f82)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/MusicalEntityService.java	(revision efe76febc84767c79b12dc47ef59644804ce6f97)
@@ -1,4 +1,49 @@
 package com.ukim.finki.develop.finkwave.service;
 
+import com.ukim.finki.develop.finkwave.model.Album;
+import com.ukim.finki.develop.finkwave.model.MusicalEntity;
+import com.ukim.finki.develop.finkwave.model.Song;
+import com.ukim.finki.develop.finkwave.model.dto.ArtistMusicalEntitiesDTO;
+import com.ukim.finki.develop.finkwave.repository.AlbumRepository;
+import com.ukim.finki.develop.finkwave.repository.MusicalEntityRepository;
+import com.ukim.finki.develop.finkwave.repository.SongRepository;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+@AllArgsConstructor
 public class MusicalEntityService {
+
+    private final MusicalEntityRepository musicalEntityRepository;
+    private final SongRepository songRepository;
+    private final AlbumRepository albumRepository;
+
+    public ArtistMusicalEntitiesDTO getArtistMusicalEntities(Long artistId){
+        List<Long>entitiesIDs=musicalEntityRepository.findAllByReleasedBy_Id(artistId).stream()
+                .map(MusicalEntity::getId)
+                .toList();
+
+        if (entitiesIDs.isEmpty()) {
+            return new ArtistMusicalEntitiesDTO(Collections.emptyList(), Collections.emptyList());
+        }
+
+        // bulk fetching
+        List<Song> songs = songRepository.findAllByIdIn(entitiesIDs);
+
+        List<Album> albums = albumRepository.findAllByIdIn(entitiesIDs);
+
+        return new ArtistMusicalEntitiesDTO(songs, albums);
+    }
+
+    public String getEntityType(Long id) {
+        if (songRepository.existsById(id)) return "Song";
+        if (albumRepository.existsById(id)) return "Album";
+        return "Unknown";
+    }
+
 }
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 0d9725cfa22ae513a665db5f34f5a086b3660f82)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/NonAdminUserService.java	(revision efe76febc84767c79b12dc47ef59644804ce6f97)
@@ -1,4 +1,64 @@
 package com.ukim.finki.develop.finkwave.service;
 
+import com.ukim.finki.develop.finkwave.model.Artist;
+import com.ukim.finki.develop.finkwave.model.Listener;
+import com.ukim.finki.develop.finkwave.model.NonAdminUser;
+import com.ukim.finki.develop.finkwave.model.dto.ArtistContributionDTO;
+import com.ukim.finki.develop.finkwave.model.dto.NonAdminUserDTO;
+import com.ukim.finki.develop.finkwave.repository.ArtistRepository;
+import com.ukim.finki.develop.finkwave.repository.FollowRepository;
+import com.ukim.finki.develop.finkwave.repository.ListenerRepository;
+import com.ukim.finki.develop.finkwave.repository.NonAdminUserRepository;
+import com.ukim.finki.develop.finkwave.service.mappers.NonAdminUserMapper;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+@Service
+@AllArgsConstructor
 public class NonAdminUserService {
+    private final NonAdminUserRepository nonAdminUserRepository;
+    private final ListenerRepository listenerRepository;
+    private final ArtistRepository artistRepository;
+    private final NonAdminUserMapper mapper;
+    private final ArtistService artistService;
+    private final ListenerService listenerService;
+
+    public List<NonAdminUserDTO> getAllUsers() {
+        return nonAdminUserRepository.findAllWithUser().stream()
+                .map(user -> {
+                    String type = determineType(user.getId());
+                    return mapper.toDTO(user, type);
+                })
+                .collect(Collectors.toList());
+    }
+
+    public NonAdminUserDTO getById(Long id) {
+        NonAdminUser userEntity = nonAdminUserRepository.findById(id)
+                .orElseThrow(() -> new RuntimeException("User not found with id: " + id));
+
+        String type = determineType(id);
+        NonAdminUserDTO dto = mapper.toDTO(userEntity, type);
+        if (type.equals("Artist")){
+            List<ArtistContributionDTO> workHistory = artistService.getArtistContributions(id);
+            dto.setContributions(workHistory);
+        }else if(type.equals("Listener")){
+            dto.setLikedEntities(listenerService.getLikedEntities(id));
+        }
+
+       return dto;
+    }
+
+
+    private String determineType(Long id) {
+        if (artistRepository.existsById(id)) {
+            return "Artist";
+        } else if (listenerRepository.existsById(id)) {
+            return "Listener";
+        }
+        return "Admin";
+    }
 }
Index: finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/mappers/NonAdminUserMapper.java
===================================================================
--- finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/mappers/NonAdminUserMapper.java	(revision 0d9725cfa22ae513a665db5f34f5a086b3660f82)
+++ finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/mappers/NonAdminUserMapper.java	(revision efe76febc84767c79b12dc47ef59644804ce6f97)
@@ -1,4 +1,39 @@
 package com.ukim.finki.develop.finkwave.service.mappers;
 
+import com.ukim.finki.develop.finkwave.model.ArtistContribution;
+import com.ukim.finki.develop.finkwave.model.MusicalEntity;
+import com.ukim.finki.develop.finkwave.model.NonAdminUser;
+import com.ukim.finki.develop.finkwave.model.dto.ArtistContributionDTO;
+import com.ukim.finki.develop.finkwave.model.dto.NonAdminUserDTO;
+import com.ukim.finki.develop.finkwave.repository.ArtistContributionRepository;
+import com.ukim.finki.develop.finkwave.repository.FollowRepository;
+import com.ukim.finki.develop.finkwave.repository.MusicalEntityRepository;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Component
+@AllArgsConstructor
 public class NonAdminUserMapper {
+    private final FollowRepository followRepository;
+
+
+
+    public NonAdminUserDTO toDTO(NonAdminUser entity, String type) {
+        if (entity == null) return null;
+
+        return new NonAdminUserDTO(
+                entity.getId(),
+                entity.getUser().getUsername(),
+                entity.getUser().getFullName(),
+                entity.getUser().getProfilePhoto(),
+                followRepository.countByFolloweeId(entity.getId()),
+                followRepository.countByFollowerId(entity.getId()),
+                type,
+                new ArrayList<>(),
+                new ArrayList<>()
+        );
+    }
 }
