Changeset 98992cf
- Timestamp:
- 01/30/26 00:08:04 (5 months ago)
- Branches:
- main
- Children:
- 2b08bed
- Parents:
- 6de2873
- Files:
-
- 2 added
- 1 deleted
- 12 edited
- 6 moved
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/controller/NonAdminUserController.java (modified) (2 diffs)
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/ArtistContributionDto.java (moved) (moved from finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/ArtistContributionDTO.java ) (1 diff)
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/ArtistDto.java (added)
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/ArtistMusicalEntitiesDto.java (moved) (moved from finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/ArtistMusicalEntitiesDTO.java ) (2 diffs)
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/ListenerDto.java (added)
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/ListenerLikesDto.java (moved) (moved from finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/ListenerLikesDTO.java ) (1 diff)
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/MusicalEntityDto.java (moved) (moved from finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/MusicalEntityDTO.java ) (1 diff)
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/NonAdminUserDto.java (moved) (moved from finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/NonAdminUserDTO.java ) (3 diffs)
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/PlaylistDto.java (moved) (moved from finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/PlaylistDTO.java ) (1 diff)
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/ArtistContributionRepository.java (modified) (2 diffs)
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/LikeRepository.java (modified) (2 diffs)
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/NonAdminUserRepository.java (modified) (1 diff)
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/ArtistService.java (modified) (2 diffs)
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/ListenerService.java (modified) (2 diffs)
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/MusicalEntityService.java (deleted)
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/NonAdminUserService.java (modified) (8 diffs)
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/mappers/NonAdminUserMapper.java (modified) (2 diffs)
-
frontend/src/components/userProfile/ArtistView.tsx (modified) (1 diff)
-
frontend/src/components/userProfile/ListenerView.tsx (modified) (6 diffs)
-
frontend/src/pages/UserDetailView.tsx (modified) (6 diffs)
-
frontend/src/utils/types.ts (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/controller/NonAdminUserController.java
r6de2873 r98992cf 1 1 package com.ukim.finki.develop.finkwave.controller; 2 2 3 import com.ukim.finki.develop.finkwave.model.dto.NonAdminUserD TO;3 import com.ukim.finki.develop.finkwave.model.dto.NonAdminUserDto; 4 4 import com.ukim.finki.develop.finkwave.service.FollowService; 5 5 import com.ukim.finki.develop.finkwave.service.NonAdminUserService; … … 21 21 22 22 @GetMapping("/all") 23 public HttpEntity<List<NonAdminUserD TO>>getAllNonAdminUsers(){23 public HttpEntity<List<NonAdminUserDto>>getAllNonAdminUsers(){ 24 24 return ResponseEntity.ok(nonAdminUserService.getAllUsers()); 25 25 } 26 26 27 27 @GetMapping("/{id}") 28 public HttpEntity<NonAdminUserD TO>getById(@PathVariable Long id){28 public HttpEntity<NonAdminUserDto>getById(@PathVariable Long id){ 29 29 return ResponseEntity.ok(nonAdminUserService.getById(id)); 30 30 } 31 31 32 32 @GetMapping("/search") 33 public HttpEntity<List<NonAdminUserD TO>>searchUsers(@RequestParam String name){33 public HttpEntity<List<NonAdminUserDto>>searchUsers(@RequestParam String name){ 34 34 return ResponseEntity.ok(nonAdminUserService.searchUsers(name)); 35 35 } 36 36 37 37 @PostMapping("/follow/{id}") 38 public HttpEntity<NonAdminUserD TO>followUser(@PathVariable Long id){38 public HttpEntity<NonAdminUserDto>followUser(@PathVariable Long id){ 39 39 followService.toggleFollow(id); 40 40 -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/ArtistContributionDto.java
r6de2873 r98992cf 8 8 @Setter 9 9 @AllArgsConstructor 10 public class ArtistContributionD TO{10 public class ArtistContributionDto { 11 11 private Long musicalEntityId; 12 12 private String title; -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/ArtistMusicalEntitiesDto.java
r6de2873 r98992cf 1 1 package com.ukim.finki.develop.finkwave.model.dto; 2 2 3 import com.ukim.finki.develop.finkwave.model.Album;4 import com.ukim.finki.develop.finkwave.model.Song;5 3 import lombok.AllArgsConstructor; 6 4 import lombok.Getter; … … 14 12 @AllArgsConstructor 15 13 @NoArgsConstructor 16 public class ArtistMusicalEntitiesD TO{17 private List<ArtistContributionD TO> contributions;14 public class ArtistMusicalEntitiesDto { 15 private List<ArtistContributionDto> contributions; 18 16 } -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/ListenerLikesDto.java
r6de2873 r98992cf 10 10 @AllArgsConstructor 11 11 @NoArgsConstructor 12 public class ListenerLikesD TO{13 private List<MusicalEntityD TO> likedEntities;12 public class ListenerLikesDto { 13 private List<MusicalEntityDto> likedEntities; 14 14 15 15 -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/MusicalEntityDto.java
r6de2873 r98992cf 8 8 @Getter 9 9 @Setter 10 public class MusicalEntityD TO{10 public class MusicalEntityDto { 11 11 private Long id; 12 12 private String title; -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/NonAdminUserDto.java
r6de2873 r98992cf 1 1 package com.ukim.finki.develop.finkwave.model.dto; 2 2 3 import com.ukim.finki.develop.finkwave.model.Playlist;4 3 import lombok.Getter; 5 4 import lombok.Setter; 6 7 import java.util.List;8 5 9 6 … … 11 8 @Setter 12 9 13 public class NonAdminUserDTO{10 public class NonAdminUserDto { 14 11 private Long id; 15 12 private String username; … … 21 18 22 19 23 24 private ArtistMusicalEntitiesDTO musicalEntities;25 26 private ListenerLikesDTO likes;27 private List<PlaylistDTO>createdPlaylists;28 20 } -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/PlaylistDto.java
r6de2873 r98992cf 8 8 @Getter 9 9 @Setter 10 public class PlaylistD TO{10 public class PlaylistDto { 11 11 private Long id; 12 12 private String name; -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/ArtistContributionRepository.java
r6de2873 r98992cf 1 1 package com.ukim.finki.develop.finkwave.repository; 2 2 3 import com.ukim.finki.develop.finkwave.model.dto.ArtistContributionDto; 3 4 import org.springframework.data.jpa.repository.JpaRepository; 4 5 import org.springframework.data.jpa.repository.Query; … … 13 14 public interface ArtistContributionRepository extends JpaRepository<ArtistContribution, ArtistContributionId> { 14 15 15 @Query("SELECT ac.musicalEntity.id,ac.musicalEntity.title,ac.musicalEntity.genre,ac.role, "+ 16 @Query("SELECT NEW com.ukim.finki.develop.finkwave.model.dto.ArtistContributionDto( ac.musicalEntity.id," + 17 "ac.musicalEntity.title," + 18 "ac.musicalEntity.genre," + 19 "ac.role, "+ 16 20 "CASE WHEN s.id IS NOT NULL THEN 'SONG' "+ 17 21 "WHEN a.id IS NOT NULL THEN 'ALBUM' "+ 18 "ELSE 'Unknown' END "+22 "ELSE 'Unknown' END) "+ 19 23 "FROM ArtistContribution ac "+ 20 24 "LEFT JOIN Song s ON s.musicalEntities.id=ac.musicalEntity.id "+ 21 25 "LEFT JOIN Album a ON a.musicalEntities.id=ac.musicalEntity.id "+ 22 26 "WHERE ac.artist.id=:artistId") 23 List< Object[]>findContributionsByArtistId(@Param("artistId")Long artistId);27 List<ArtistContributionDto>findContributionsByArtistId(@Param("artistId")Long artistId); 24 28 } -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/LikeRepository.java
r6de2873 r98992cf 1 1 package com.ukim.finki.develop.finkwave.repository; 2 2 3 import com.ukim.finki.develop.finkwave.model.dto.MusicalEntityDto; 3 4 import org.springframework.data.jpa.repository.JpaRepository; 4 5 import org.springframework.data.jpa.repository.Query; … … 13 14 @Repository 14 15 public interface LikeRepository extends JpaRepository<Like, LikeId> { 15 @Query("SELECT l.musicalEntity.id, l.musicalEntity.title,l.musicalEntity.genre, " + 16 @Query("SELECT NEW com.ukim.finki.develop.finkwave.model.dto.MusicalEntityDto(l.musicalEntity.id, " + 17 "l.musicalEntity.title," + 18 "l.musicalEntity.genre, " + 16 19 "CASE WHEN s.id IS NOT NULL THEN 'SONG' " + 17 20 "WHEN a.id IS NOT NULL THEN 'ALBUM' " + 18 "ELSE 'UNKNOWN' END " +21 "ELSE 'UNKNOWN' END)" + 19 22 "FROM Like l " + 20 23 "LEFT JOIN Song s ON s.musicalEntities.id = l.musicalEntity.id " + 21 24 "LEFT JOIN Album a ON a.musicalEntities.id = l.musicalEntity.id " + 22 25 "WHERE l.listener.id = :listenerId") 23 List< Object[]> findLikedEntitiesWithTypeByListenerId(@Param("listenerId") Long listenerId);26 List<MusicalEntityDto> findLikedEntitiesWithTypeByListenerId(@Param("listenerId") Long listenerId); 24 27 } -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/NonAdminUserRepository.java
r6de2873 r98992cf 1 1 package com.ukim.finki.develop.finkwave.repository; 2 2 3 import com.ukim.finki.develop.finkwave.model.dto.NonAdminUserDTO;4 3 import org.springframework.data.jpa.repository.JpaRepository; 5 4 import org.springframework.data.jpa.repository.Query; -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/ArtistService.java
r6de2873 r98992cf 1 1 package com.ukim.finki.develop.finkwave.service; 2 2 3 import com.ukim.finki.develop.finkwave.model.dto.ArtistContributionD TO;3 import com.ukim.finki.develop.finkwave.model.dto.ArtistContributionDto; 4 4 import com.ukim.finki.develop.finkwave.repository.ArtistContributionRepository; 5 5 … … 19 19 20 20 @Transactional(readOnly=true) 21 public List<ArtistContributionDTO> getArtistContributions(Long artistId){ 22 List<Object[]>results=artistContributionRepository.findContributionsByArtistId(artistId); 23 24 return results.stream() 25 .map(row->new ArtistContributionDTO((Long)row[0], (String)row[1], (String)row[2],(String)row[3], (String)row[4])) 26 .collect(Collectors.toList()); 21 public List<ArtistContributionDto> getArtistContributions(Long artistId){ 22 return artistContributionRepository.findContributionsByArtistId(artistId); 27 23 } 28 24 -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/ListenerService.java
r6de2873 r98992cf 2 2 3 3 import com.ukim.finki.develop.finkwave.model.Playlist; 4 import com.ukim.finki.develop.finkwave.model.dto.ListenerLikesDTO; 5 import com.ukim.finki.develop.finkwave.model.dto.MusicalEntityDTO; 6 import com.ukim.finki.develop.finkwave.model.dto.PlaylistDTO; 4 import com.ukim.finki.develop.finkwave.model.dto.ListenerLikesDto; 5 import com.ukim.finki.develop.finkwave.model.dto.MusicalEntityDto; 7 6 import com.ukim.finki.develop.finkwave.repository.LikeRepository; 8 7 import com.ukim.finki.develop.finkwave.repository.PlaylistRepository; … … 18 17 private final PlaylistRepository playlistRepository; 19 18 @Transactional(readOnly = true) 20 public List enerLikesDTOgetLikedEntities(Long listenerId) {21 List<Object[]> results =likeRepository.findLikedEntitiesWithTypeByListenerId(listenerId);19 public List<MusicalEntityDto> getLikedEntities(Long listenerId) { 20 return likeRepository.findLikedEntitiesWithTypeByListenerId(listenerId); 22 21 23 List<MusicalEntityDTO>likedEntities=results.stream() 24 .map(row->new MusicalEntityDTO((Long)row[0], (String)row[1], (String)row[2],(String)row[3])) 25 .toList(); 26 27 ListenerLikesDTO dto=new ListenerLikesDTO(); 28 dto.setLikedEntities(likedEntities); 29 return dto; 22 30 23 } 31 24 -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/NonAdminUserService.java
r6de2873 r98992cf 7 7 import com.ukim.finki.develop.finkwave.service.mappers.NonAdminUserMapper; 8 8 import lombok.AllArgsConstructor; 9 import org.springframework.security.core.Authentication;10 import org.springframework.security.core.context.SecurityContextHolder;11 9 import org.springframework.stereotype.Service; 12 10 import org.springframework.transaction.annotation.Transactional; … … 27 25 28 26 @Transactional(readOnly = true) 29 public List<NonAdminUserD TO> getAllUsers() {27 public List<NonAdminUserDto> getAllUsers() { 30 28 return nonAdminUserRepository.findAllWithUser().stream() 31 29 .map(user -> { … … 33 31 Long followers = followRepository.countByFolloweeId(user.getId()); 34 32 Long following = followRepository.countByFollowerId(user.getId()); 35 return mapper.toD TO(user, type, followers, following);33 return mapper.toDto(user, type, followers, following); 36 34 }) 37 35 .collect(Collectors.toList()); … … 39 37 40 38 @Transactional(readOnly = true) 41 public NonAdminUserD TOgetById(Long id) {39 public NonAdminUserDto getById(Long id) { 42 40 Long followers=followRepository.countByFolloweeId(id); 43 41 Long following=followRepository.countByFollowerId(id); … … 48 46 isFollowedByCurrentUser = followRepository.isFollowing(currentUserId, id); 49 47 } 50 NonAdminUserD TOdto;48 NonAdminUserDto dto; 51 49 52 50 if (artistRepository.existsById(id)) { … … 65 63 } 66 64 67 private NonAdminUserD TO getArtistProfile(Long artistId, Long followers,Long following) {65 private NonAdminUserDto getArtistProfile(Long artistId, Long followers, Long following) { 68 66 Artist artist = artistRepository.findByIdWithUser(artistId) 69 67 .orElseThrow(()->new UserNotFoundException("Artist not found with id: " + artistId)); 70 68 71 69 72 ArtistMusicalEntitiesDTO entitiesDTO = new ArtistMusicalEntitiesDTO(); 73 entitiesDTO.setContributions(artistService.getArtistContributions(artistId)); 70 List<ArtistContributionDto>artistContributionDtos=artistService.getArtistContributions(artistId); 74 71 75 return mapper.toArtistDTO(artist, entitiesDTO,followers,following);72 return mapper.toArtistDTO(artist, artistContributionDtos,followers,following); 76 73 } 77 74 78 private NonAdminUserD TO getListenerProfile(Long listenerId, Long followers,Long following) {75 private NonAdminUserDto getListenerProfile(Long listenerId, Long followers, Long following) { 79 76 Listener listener = listenerRepository.findByIdWithUser(listenerId) 80 77 .orElseThrow(()->new UserNotFoundException("Listener not found with id: " + listenerId)); 81 78 82 79 83 List enerLikesDTO likesDTO =listenerService.getLikedEntities(listenerId);84 List<PlaylistD TO>playlists=listenerService.getPlaylistsCreatedByUser(listenerId).stream()85 .map(p->new PlaylistD TO(80 List<MusicalEntityDto>musicalEntityDtos=listenerService.getLikedEntities(listenerId); 81 List<PlaylistDto>playlists=listenerService.getPlaylistsCreatedByUser(listenerId).stream() 82 .map(p->new PlaylistDto( 86 83 p.getId(), 87 84 p.getName(), … … 90 87 )).toList(); 91 88 92 return mapper.toListenerDTO(listener, likesDTO,followers,following,playlists);89 return mapper.toListenerDTO(listener, musicalEntityDtos,followers,following,playlists); 93 90 } 94 91 95 92 96 public List<NonAdminUserD TO>searchUsers(String name){93 public List<NonAdminUserDto>searchUsers(String name){ 97 94 98 95 List<NonAdminUser>nonAdminUsers=nonAdminUserRepository.searchByName(name); … … 106 103 Long followers = followRepository.countByFolloweeId(user.getId()); 107 104 Long following = followRepository.countByFollowerId(user.getId()); 108 return mapper.toD TO(user, type, followers, following);105 return mapper.toDto(user, type, followers, following); 109 106 }) 110 107 .collect(Collectors.toList()); -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/mappers/NonAdminUserMapper.java
r6de2873 r98992cf 5 5 import com.ukim.finki.develop.finkwave.model.Listener; 6 6 7 import com.ukim.finki.develop.finkwave.model.Playlist; 8 import com.ukim.finki.develop.finkwave.model.dto.ArtistMusicalEntitiesDTO; 9 import com.ukim.finki.develop.finkwave.model.dto.ListenerLikesDTO; 10 import com.ukim.finki.develop.finkwave.model.dto.NonAdminUserDTO; 7 import com.ukim.finki.develop.finkwave.model.dto.*; 11 8 import com.ukim.finki.develop.finkwave.model.NonAdminUser; 12 import com.ukim.finki.develop.finkwave.model.dto.PlaylistDTO;13 9 import org.springframework.stereotype.Component; 14 10 … … 19 15 public class NonAdminUserMapper { 20 16 21 public NonAdminUserDTO toArtistDTO(Artist artist, ArtistMusicalEntitiesDTO entitiesDTO, Long followers, Long following) { 22 NonAdminUserDTO dto = createBaseDTO( 23 artist.getNonAdminUser(), 24 "ARTIST", 25 followers, 26 following 27 ); 28 dto.setMusicalEntities(entitiesDTO); 17 public NonAdminUserDto toArtistDTO(Artist artist, List<ArtistContributionDto> entitiesDTO, Long followers, Long following) { 18 ArtistDto dto=new ArtistDto(); 19 populateBaseClassFields(dto,artist.getNonAdminUser(),"ARTIST",followers,following); 20 dto.setContributions(entitiesDTO); 29 21 return dto; 30 22 } 31 23 32 public NonAdminUserDTO toListenerDTO(Listener listener, ListenerLikesDTO likesDTO, Long followers, Long following, List<PlaylistDTO>playlists) { 33 NonAdminUserDTO dto = createBaseDTO( 34 listener.getNonAdminUser(), 35 "LISTENER", 36 followers, 37 following 38 ); 39 dto.setLikes(likesDTO); 24 public NonAdminUserDto toListenerDTO(Listener listener, List<MusicalEntityDto> musicalEntityDtos, Long followers, Long following, List<PlaylistDto>playlists) { 25 ListenerDto dto=new ListenerDto(); 26 populateBaseClassFields(dto,listener.getNonAdminUser(),"LISTENER",followers,following); 27 dto.setLikedEntities(musicalEntityDtos); 40 28 dto.setCreatedPlaylists(playlists); 41 29 return dto; 42 30 } 43 31 44 public NonAdminUserDTO toDTO(NonAdminUser user, String type,Long followers,Long following) { 45 return createBaseDTO(user, type, followers, following); 32 public NonAdminUserDto toDto(NonAdminUser user,String type, Long followers,Long following){ 33 NonAdminUserDto dto=new NonAdminUserDto(); 34 populateBaseClassFields(dto,user,type,followers,following); 35 return dto; 46 36 } 47 37 48 private NonAdminUserDTO createBaseDTO(NonAdminUser user, String userType, Long followers, Long following) { 49 NonAdminUserDTO dto = new NonAdminUserDTO(); 38 private void populateBaseClassFields(NonAdminUserDto dto,NonAdminUser user,String type,Long followers,Long following){ 50 39 dto.setId(user.getId()); 51 40 dto.setUsername(user.getUser().getUsername()); 52 41 dto.setFullName(user.getUser().getFullName()); 53 dto.setUserType( userType);42 dto.setUserType(type); 54 43 dto.setFollowers(followers); 55 44 dto.setFollowing(following); 56 return dto;57 45 } 58 46 } -
frontend/src/components/userProfile/ArtistView.tsx
r6de2873 r98992cf 1 1 import { useNavigate } from "react-router-dom"; 2 2 import { Music, Disc3 } from "lucide-react"; 3 import type { ArtistContribution DTO} from "../../utils/types";3 import type { ArtistContribution } from "../../utils/types"; 4 4 5 5 interface ArtistViewProps { 6 contributions: ArtistContribution DTO[];6 contributions: ArtistContribution[]; 7 7 } 8 8 -
frontend/src/components/userProfile/ListenerView.tsx
r6de2873 r98992cf 1 1 import { useNavigate } from "react-router-dom"; 2 2 import { Heart, ListMusic, Music, Album } from "lucide-react"; 3 import type { Playlist, MusicalEntity DTO} from "../../utils/types";3 import type { Playlist, MusicalEntity } from "../../utils/types"; 4 4 5 5 interface ListenerViewProps { 6 likedEntities: MusicalEntity DTO[];7 playlists ?: Playlist[];6 likedEntities: MusicalEntity[] | []; 7 playlists: Playlist[] | []; 8 8 } 9 9 … … 11 11 const navigate = useNavigate(); 12 12 13 const likedSongs = likedEntities .filter((e) => e.type === "SONG");14 const likedAlbums = likedEntities .filter((e) => e.type === "ALBUM");13 const likedSongs = likedEntities?.filter((e) => e.type === "SONG"); 14 const likedAlbums = likedEntities?.filter((e) => e.type === "ALBUM"); 15 15 16 16 return ( … … 55 55 )} 56 56 57 {likedSongs .length > 0 && (57 {likedSongs && likedSongs.length > 0 && ( 58 58 <section> 59 59 <div className="flex items-center gap-2 mb-6 pb-2 border-b-2 border-gray-200"> … … 61 61 <h3 className="text-2xl font-bold text-gray-800">Liked Songs</h3> 62 62 <span className="text-sm text-gray-400 ml-1"> 63 ({likedSongs .length})63 ({likedSongs?.length}) 64 64 </span> 65 65 </div> … … 90 90 )} 91 91 92 {likedAlbums .length > 0 && (92 {likedAlbums && likedAlbums.length > 0 && ( 93 93 <section> 94 94 <div className="flex items-center gap-2 mb-6 pb-2 border-b-2 border-gray-200"> … … 120 120 )} 121 121 122 {likedEntities.length === 0 && (!playlists || playlists.length === 0) && ( 123 <div className="flex flex-col items-center justify-center py-16 text-gray-300"> 124 <p className="text-lg font-medium text-gray-400">Nothing here yet</p> 125 <p className="text-sm text-gray-400 mt-1"> 126 Start exploring music to build your collection 127 </p> 128 </div> 129 )} 122 {likedEntities && 123 likedEntities.length === 0 && 124 (!playlists || playlists.length === 0) && ( 125 <div className="flex flex-col items-center justify-center py-16 text-gray-300"> 126 <p className="text-lg font-medium text-gray-400"> 127 Nothing here yet 128 </p> 129 <p className="text-sm text-gray-400 mt-1"> 130 Start exploring music to build your collection 131 </p> 132 </div> 133 )} 130 134 </div> 131 135 ); -
frontend/src/pages/UserDetailView.tsx
r6de2873 r98992cf 5 5 import ListenerView from "../components/userProfile/ListenerView"; 6 6 import type { 7 ArtistContributionDTO, 8 MusicalEntityDTO, 7 MusicalEntity, 9 8 Playlist, 9 ArtistContribution, 10 10 } from "../utils/types"; 11 11 12 interface User {12 interface BaseUser { 13 13 id: number; 14 username: string;15 14 fullName: string; 16 15 userType: string; … … 18 17 following: number; 19 18 isFollowedByCurrentUser: boolean; 19 } 20 20 21 musicalEntities?: { 22 contributions: ArtistContributionDTO[]; 23 }; 21 interface Artist extends BaseUser { 22 userType: "ARTIST"; 23 contributions: ArtistContribution[]; 24 } 25 interface Listener extends BaseUser { 26 userType: "LISTENER"; 27 likedEntities: MusicalEntity[]; 28 createdPlaylists: Playlist[]; 29 } 24 30 25 likes?: { 26 likedEntities: MusicalEntityDTO[]; 27 }; 28 29 createdPlaylists?: Playlist[]; 30 } 31 type UserProfile = Artist | Listener; 31 32 32 33 const UserDetail = () => { … … 34 35 const { userId } = useParams(); 35 36 const navigate = useNavigate(); 36 const [user, setUser] = useState<User | null>(null);37 const [user, setUser] = useState<UserProfile | null>(null); 37 38 const [error, setError] = useState<string | null>(null); 38 39 const [isFollowing, setIsFollowing] = useState(false); … … 43 44 setIsFollowing(true); 44 45 try { 45 const response = await axiosInstance.post<User >(46 const response = await axiosInstance.post<UserProfile>( 46 47 `/users/follow/${userId}`, 47 48 ); 48 setUser(response.data);49 49 } catch (err: any) { 50 50 console.error(err.response?.data?.error); … … 59 59 try { 60 60 const response = await axiosInstance.get(`/users/${userId}`); 61 console.log(response.data); 61 62 62 63 setUser(response.data); … … 135 136 </div> 136 137 137 {user.userType === "ARTIST" && user.musicalEntities?.contributions && ( 138 <ArtistView contributions={user.musicalEntities.contributions} /> 139 )} 140 141 {user.userType === "LISTENER" && user.likes?.likedEntities && ( 138 {user.userType === "ARTIST" ? ( 139 <ArtistView contributions={user.contributions} /> 140 ) : ( 142 141 <ListenerView 143 likedEntities={user.like s.likedEntities}142 likedEntities={user.likedEntities} 144 143 playlists={user.createdPlaylists} 145 144 /> -
frontend/src/utils/types.ts
r6de2873 r98992cf 1 1 export interface User { 2 username: string;3 fullName: string;4 email?: string;5 profilePhoto?: string | null;6 role?: "ADMIN" | "NONADMIN";2 username: string; 3 fullName: string; 4 email?: string; 5 profilePhoto?: string | null; 6 role?: "ADMIN" | "NONADMIN"; 7 7 } 8 8 9 export interface ArtistContribution DTO{10 musicalEntityId: number;11 title: string;12 genre: string;13 role: string;14 entityType: string;9 export interface ArtistContribution { 10 musicalEntityId: number; 11 title: string; 12 genre: string; 13 role: string; 14 entityType: string; 15 15 } 16 export interface MusicalEntity DTO{17 id: number;18 title: string;19 genre: string;20 type: string;16 export interface MusicalEntity { 17 id: number; 18 title: string; 19 genre: string; 20 type: string; 21 21 } 22 22 23 23 export interface Playlist { 24 id: number;25 name: string;26 cover: string;27 creatorName: string;24 id: number; 25 name: string; 26 cover: string; 27 creatorName: string; 28 28 }
Note:
See TracChangeset
for help on using the changeset viewer.
