Changeset efe76fe


Ignore:
Timestamp:
01/26/26 09:48:20 (6 months ago)
Author:
Dimitar Arsov <dimitararsov04@…>
Branches:
main
Children:
fd81a18
Parents:
0d9725c
Message:

implement initial user profile page

Location:
finkwave/src/main/java/com/ukim/finki/develop/finkwave
Files:
18 edited

Legend:

Unmodified
Added
Removed
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/controller/NonAdminUserController.java

    r0d9725c refe76fe  
    11package com.ukim.finki.develop.finkwave.controller;
    22
     3import com.ukim.finki.develop.finkwave.model.NonAdminUser;
     4import com.ukim.finki.develop.finkwave.model.dto.NonAdminUserDTO;
     5import com.ukim.finki.develop.finkwave.service.NonAdminUserService;
     6import lombok.RequiredArgsConstructor;
     7import org.springframework.http.HttpEntity;
     8import org.springframework.http.ResponseEntity;
     9import org.springframework.web.bind.annotation.*;
     10
     11import java.util.List;
     12
     13@RestController
     14@CrossOrigin("*")
     15@RequiredArgsConstructor
     16@RequestMapping("/users")
    317public class NonAdminUserController {
     18
     19    private final NonAdminUserService nonAdminUserService;
     20
     21    @GetMapping("/all")
     22    public HttpEntity<List<NonAdminUserDTO>>getAllNonAdminUsers(){
     23        return ResponseEntity.ok(nonAdminUserService.getAllUsers());
     24    }
     25
     26    @GetMapping("/{id}")
     27    public HttpEntity<NonAdminUserDTO>getById(@PathVariable Long id){
     28        return ResponseEntity.ok(nonAdminUserService.getById(id));
     29    }
    430}
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/controller/UserController.java

    r0d9725c refe76fe  
    2222        return ResponseEntity.ok(usersService.getAll());
    2323    }
     24
     25
    2426}
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/ArtistContributionDTO.java

    r0d9725c refe76fe  
    11package com.ukim.finki.develop.finkwave.model.dto;
    22
     3import lombok.AllArgsConstructor;
     4import lombok.Getter;
     5import lombok.Setter;
     6
     7@Getter
     8@Setter
     9@AllArgsConstructor
    310public class ArtistContributionDTO {
     11    private String role;
     12    private Long musicalEntityId;
     13    private String title;
     14    private String entityType;
    415}
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/ArtistMusicalEntitiesDTO.java

    r0d9725c refe76fe  
    11package com.ukim.finki.develop.finkwave.model.dto;
    22
     3import com.ukim.finki.develop.finkwave.model.Album;
     4import com.ukim.finki.develop.finkwave.model.Song;
     5import lombok.AllArgsConstructor;
     6import lombok.Getter;
     7import lombok.Setter;
     8
     9import java.util.List;
     10
     11@Getter
     12@Setter
     13@AllArgsConstructor
    314public class ArtistMusicalEntitiesDTO {
     15    private List<Song> songs;
     16    private List<Album> albums;
    417}
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/ListenerLikesDTO.java

    r0d9725c refe76fe  
    11package com.ukim.finki.develop.finkwave.model.dto;
    22
     3import lombok.AllArgsConstructor;
     4import lombok.Getter;
     5import lombok.Setter;
     6
     7@Setter
     8@Getter
     9@AllArgsConstructor
    310public class ListenerLikesDTO {
     11    private Long entityId;
     12    private String entityTitle;
     13    private String entityGenre;
     14    private String entityType;
    415}
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/NonAdminUserDTO.java

    r0d9725c refe76fe  
    11package com.ukim.finki.develop.finkwave.model.dto;
    22
     3import lombok.AllArgsConstructor;
     4import lombok.Getter;
     5import lombok.NoArgsConstructor;
     6import lombok.Setter;
     7
     8import java.util.List;
     9
     10@Getter
     11@Setter
     12@AllArgsConstructor
     13@NoArgsConstructor
    314public class NonAdminUserDTO {
     15    private Long Id;
     16    private String username;
     17    private String fullName;
     18    private String profilePhoto;
     19    private Long followerCount;
     20    private Long followingCount;
     21    private String userType;
     22    // is it best practice to have this empty in listeners?
     23    private List<ArtistContributionDTO> contributions;
     24    private List<ListenerLikesDTO> likedEntities;
    425}
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/AlbumRepository.java

    r0d9725c refe76fe  
    66import com.ukim.finki.develop.finkwave.model.Album;
    77
     8import java.util.List;
     9
    810@Repository
    911public interface AlbumRepository extends JpaRepository<Album, Long> {
     12
     13    List<Album>findAllByIdIn(List<Long>ids);
    1014}
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/ArtistContributionRepository.java

    r0d9725c refe76fe  
    77import com.ukim.finki.develop.finkwave.model.ArtistContributionId;
    88
     9import java.util.List;
     10
    911@Repository
    1012public interface ArtistContributionRepository extends JpaRepository<ArtistContribution, ArtistContributionId> {
     13
     14    List<ArtistContribution>findAllByArtist_Id(Long id);
    1115}
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/FollowRepository.java

    r0d9725c refe76fe  
    99@Repository
    1010public interface FollowRepository extends JpaRepository<Follow, FollowId> {
     11
     12    // count how many followers the user has
     13    long countByFolloweeId(Long userId);
     14
     15    //count how many users does this user follow
     16    long countByFollowerId(Long userId);
     17
    1118}
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/LikeRepository.java

    r0d9725c refe76fe  
    77import com.ukim.finki.develop.finkwave.model.LikeId;
    88
     9import java.util.List;
     10
    911@Repository
    1012public interface LikeRepository extends JpaRepository<Like, LikeId> {
     13    List<Like>getLikesByListener_Id(Long id);
    1114}
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/MusicalEntityRepository.java

    r0d9725c refe76fe  
    66import com.ukim.finki.develop.finkwave.model.MusicalEntity;
    77
     8import java.util.List;
     9
    810@Repository
    911public interface MusicalEntityRepository extends JpaRepository<MusicalEntity, Long> {
     12
     13    List<MusicalEntity>findAllByReleasedBy_Id(Long id);
    1014}
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/NonAdminUserRepository.java

    r0d9725c refe76fe  
    11package com.ukim.finki.develop.finkwave.repository;
    22
     3import com.ukim.finki.develop.finkwave.model.dto.NonAdminUserDTO;
    34import org.springframework.data.jpa.repository.JpaRepository;
     5import org.springframework.data.jpa.repository.Query;
    46import org.springframework.stereotype.Repository;
    57
    68import com.ukim.finki.develop.finkwave.model.NonAdminUser;
    79
     10import java.util.List;
     11
    812@Repository
    913public interface NonAdminUserRepository extends JpaRepository<NonAdminUser, Long> {
     14
     15    @Query("SELECT n FROM NonAdminUser n JOIN FETCH n.user")
     16    List<NonAdminUser> findAllWithUser();
     17
     18
     19
    1020}
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/SongRepository.java

    r0d9725c refe76fe  
    66import com.ukim.finki.develop.finkwave.model.Song;
    77
     8import java.util.List;
     9
    810@Repository
    911public interface SongRepository extends JpaRepository<Song, Long> {
     12
     13    List<Song>findAllByIdIn(List<Long>ids);
    1014}
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/ArtistService.java

    r0d9725c refe76fe  
    11package com.ukim.finki.develop.finkwave.service;
    22
     3import com.ukim.finki.develop.finkwave.model.ArtistContribution;
     4import com.ukim.finki.develop.finkwave.model.Song;
     5import com.ukim.finki.develop.finkwave.model.dto.ArtistContributionDTO;
     6import com.ukim.finki.develop.finkwave.model.dto.ArtistMusicalEntitiesDTO;
     7import com.ukim.finki.develop.finkwave.repository.ArtistContributionRepository;
     8import lombok.AllArgsConstructor;
     9import org.springframework.stereotype.Service;
     10
     11import java.util.ArrayList;
     12import java.util.List;
     13import java.util.stream.Collectors;
     14
     15@Service
     16@AllArgsConstructor
    317public class ArtistService {
     18
     19    private final MusicalEntityService musicalEntityService;
     20    private final ArtistContributionRepository contributionRepository;
     21
     22
     23    public List<ArtistContributionDTO> getArtistContributions(Long id){
     24
     25        ArtistMusicalEntitiesDTO artistMusicalEntities=musicalEntityService.getArtistMusicalEntities(id);
     26        List<ArtistContribution>contributions=contributionRepository.findAllByArtist_Id(id);
     27        return contributions.stream().map(c -> {
     28            boolean isSong = artistMusicalEntities.getSongs().stream()
     29                    .anyMatch(s -> s.getId().equals(c.getMusicalEntity().getId()));
     30
     31            return new ArtistContributionDTO(
     32                    c.getRole(),
     33                    c.getMusicalEntity().getId(),
     34                    c.getMusicalEntity().getTitle(),
     35                    isSong ? "Song" : "Album"
     36            );
     37        }).collect(Collectors.toList());
     38    }
     39
    440}
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/ListenerService.java

    r0d9725c refe76fe  
    11package com.ukim.finki.develop.finkwave.service;
    22
     3import com.ukim.finki.develop.finkwave.model.Album;
     4import com.ukim.finki.develop.finkwave.model.Like;
     5import com.ukim.finki.develop.finkwave.model.MusicalEntity;
     6import com.ukim.finki.develop.finkwave.model.Song;
     7import com.ukim.finki.develop.finkwave.model.dto.ArtistMusicalEntitiesDTO;
     8import com.ukim.finki.develop.finkwave.model.dto.ListenerLikesDTO;
     9import com.ukim.finki.develop.finkwave.repository.AlbumRepository;
     10import com.ukim.finki.develop.finkwave.repository.LikeRepository;
     11import com.ukim.finki.develop.finkwave.repository.SongRepository;
     12import lombok.AllArgsConstructor;
     13import org.springframework.stereotype.Service;
     14
     15import java.util.ArrayList;
     16import java.util.List;
     17import java.util.stream.Collectors;
     18
     19@Service
     20@AllArgsConstructor
    321public class ListenerService {
     22    private final LikeRepository likeRepository;
     23    private final MusicalEntityService musicalEntityService;
     24
     25    public List<ListenerLikesDTO>getLikedEntities(Long listenerId){
     26        List<Like>likes=likeRepository.getLikesByListener_Id(listenerId);
     27
     28
     29        return likes.stream().map(l -> new ListenerLikesDTO(
     30                l.getMusicalEntity().getId(),
     31                l.getMusicalEntity().getTitle(),
     32                l.getMusicalEntity().getGenre(),
     33                musicalEntityService.getEntityType(l.getMusicalEntity().getId())
     34        )).toList();
     35    }
     36
     37
    438}
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/MusicalEntityService.java

    r0d9725c refe76fe  
    11package com.ukim.finki.develop.finkwave.service;
    22
     3import com.ukim.finki.develop.finkwave.model.Album;
     4import com.ukim.finki.develop.finkwave.model.MusicalEntity;
     5import com.ukim.finki.develop.finkwave.model.Song;
     6import com.ukim.finki.develop.finkwave.model.dto.ArtistMusicalEntitiesDTO;
     7import com.ukim.finki.develop.finkwave.repository.AlbumRepository;
     8import com.ukim.finki.develop.finkwave.repository.MusicalEntityRepository;
     9import com.ukim.finki.develop.finkwave.repository.SongRepository;
     10import lombok.AllArgsConstructor;
     11import org.springframework.stereotype.Service;
     12
     13import java.util.ArrayList;
     14import java.util.Collections;
     15import java.util.List;
     16import java.util.stream.Collectors;
     17
     18@Service
     19@AllArgsConstructor
    320public class MusicalEntityService {
     21
     22    private final MusicalEntityRepository musicalEntityRepository;
     23    private final SongRepository songRepository;
     24    private final AlbumRepository albumRepository;
     25
     26    public ArtistMusicalEntitiesDTO getArtistMusicalEntities(Long artistId){
     27        List<Long>entitiesIDs=musicalEntityRepository.findAllByReleasedBy_Id(artistId).stream()
     28                .map(MusicalEntity::getId)
     29                .toList();
     30
     31        if (entitiesIDs.isEmpty()) {
     32            return new ArtistMusicalEntitiesDTO(Collections.emptyList(), Collections.emptyList());
     33        }
     34
     35        // bulk fetching
     36        List<Song> songs = songRepository.findAllByIdIn(entitiesIDs);
     37
     38        List<Album> albums = albumRepository.findAllByIdIn(entitiesIDs);
     39
     40        return new ArtistMusicalEntitiesDTO(songs, albums);
     41    }
     42
     43    public String getEntityType(Long id) {
     44        if (songRepository.existsById(id)) return "Song";
     45        if (albumRepository.existsById(id)) return "Album";
     46        return "Unknown";
     47    }
     48
    449}
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/NonAdminUserService.java

    r0d9725c refe76fe  
    11package com.ukim.finki.develop.finkwave.service;
    22
     3import com.ukim.finki.develop.finkwave.model.Artist;
     4import com.ukim.finki.develop.finkwave.model.Listener;
     5import com.ukim.finki.develop.finkwave.model.NonAdminUser;
     6import com.ukim.finki.develop.finkwave.model.dto.ArtistContributionDTO;
     7import com.ukim.finki.develop.finkwave.model.dto.NonAdminUserDTO;
     8import com.ukim.finki.develop.finkwave.repository.ArtistRepository;
     9import com.ukim.finki.develop.finkwave.repository.FollowRepository;
     10import com.ukim.finki.develop.finkwave.repository.ListenerRepository;
     11import com.ukim.finki.develop.finkwave.repository.NonAdminUserRepository;
     12import com.ukim.finki.develop.finkwave.service.mappers.NonAdminUserMapper;
     13import lombok.AllArgsConstructor;
     14import org.springframework.stereotype.Service;
     15
     16import java.util.List;
     17import java.util.Optional;
     18import java.util.stream.Collectors;
     19
     20@Service
     21@AllArgsConstructor
    322public class NonAdminUserService {
     23    private final NonAdminUserRepository nonAdminUserRepository;
     24    private final ListenerRepository listenerRepository;
     25    private final ArtistRepository artistRepository;
     26    private final NonAdminUserMapper mapper;
     27    private final ArtistService artistService;
     28    private final ListenerService listenerService;
     29
     30    public List<NonAdminUserDTO> getAllUsers() {
     31        return nonAdminUserRepository.findAllWithUser().stream()
     32                .map(user -> {
     33                    String type = determineType(user.getId());
     34                    return mapper.toDTO(user, type);
     35                })
     36                .collect(Collectors.toList());
     37    }
     38
     39    public NonAdminUserDTO getById(Long id) {
     40        NonAdminUser userEntity = nonAdminUserRepository.findById(id)
     41                .orElseThrow(() -> new RuntimeException("User not found with id: " + id));
     42
     43        String type = determineType(id);
     44        NonAdminUserDTO dto = mapper.toDTO(userEntity, type);
     45        if (type.equals("Artist")){
     46            List<ArtistContributionDTO> workHistory = artistService.getArtistContributions(id);
     47            dto.setContributions(workHistory);
     48        }else if(type.equals("Listener")){
     49            dto.setLikedEntities(listenerService.getLikedEntities(id));
     50        }
     51
     52       return dto;
     53    }
     54
     55
     56    private String determineType(Long id) {
     57        if (artistRepository.existsById(id)) {
     58            return "Artist";
     59        } else if (listenerRepository.existsById(id)) {
     60            return "Listener";
     61        }
     62        return "Admin";
     63    }
    464}
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/mappers/NonAdminUserMapper.java

    r0d9725c refe76fe  
    11package com.ukim.finki.develop.finkwave.service.mappers;
    22
     3import com.ukim.finki.develop.finkwave.model.ArtistContribution;
     4import com.ukim.finki.develop.finkwave.model.MusicalEntity;
     5import com.ukim.finki.develop.finkwave.model.NonAdminUser;
     6import com.ukim.finki.develop.finkwave.model.dto.ArtistContributionDTO;
     7import com.ukim.finki.develop.finkwave.model.dto.NonAdminUserDTO;
     8import com.ukim.finki.develop.finkwave.repository.ArtistContributionRepository;
     9import com.ukim.finki.develop.finkwave.repository.FollowRepository;
     10import com.ukim.finki.develop.finkwave.repository.MusicalEntityRepository;
     11import lombok.AllArgsConstructor;
     12import org.springframework.stereotype.Component;
     13
     14import java.util.ArrayList;
     15import java.util.List;
     16
     17@Component
     18@AllArgsConstructor
    319public class NonAdminUserMapper {
     20    private final FollowRepository followRepository;
     21
     22
     23
     24    public NonAdminUserDTO toDTO(NonAdminUser entity, String type) {
     25        if (entity == null) return null;
     26
     27        return new NonAdminUserDTO(
     28                entity.getId(),
     29                entity.getUser().getUsername(),
     30                entity.getUser().getFullName(),
     31                entity.getUser().getProfilePhoto(),
     32                followRepository.countByFolloweeId(entity.getId()),
     33                followRepository.countByFollowerId(entity.getId()),
     34                type,
     35                new ArrayList<>(),
     36                new ArrayList<>()
     37        );
     38    }
    439}
Note: See TracChangeset for help on using the changeset viewer.