Changeset 8ccb07e
- Timestamp:
- 02/07/26 21:16:37 (5 months ago)
- Branches:
- main
- Children:
- 799f27d
- Parents:
- 8675f75
- Files:
-
- 14 edited
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/AlbumDto.java (modified) (1 diff)
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/BasicSongDto.java (modified) (1 diff)
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/MusicalEntityDto.java (modified) (4 diffs)
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/SongDetailsDto.java (modified) (1 diff)
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/SongDto.java (modified) (1 diff)
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/AlbumRepository.java (modified) (1 diff)
-
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/SongRepository.java (modified) (7 diffs)
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/AlbumService.java (modified) (1 diff)
-
frontend/src/components/Sidebar.tsx (modified) (2 diffs)
-
frontend/src/components/search/AlbumResult.tsx (modified) (2 diffs)
-
frontend/src/components/search/UserResult.tsx (modified) (2 diffs)
-
frontend/src/pages/LandingPage.tsx (modified) (1 diff)
-
frontend/src/utils/types.ts (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/AlbumDto.java
r8675f75 r8ccb07e 12 12 private List<MusicalEntityDto>songs; 13 13 14 public AlbumDto(Long id, String title, String genre, String type, String releasedBy, Boolean isLikedByCurrentUser) {15 super(id, title, genre, type, releasedBy, isLikedByCurrentUser);14 public AlbumDto(Long id, String title, String genre, String type, String releasedBy, String artistUsername, Boolean isLikedByCurrentUser) { 15 super(id, title, genre, type, releasedBy, artistUsername, isLikedByCurrentUser); 16 16 } 17 17 -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/BasicSongDto.java
r8675f75 r8ccb07e 7 7 String title, 8 8 String artist, 9 String artistUsername, 9 10 String link, 10 11 @Nullable String cover -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/MusicalEntityDto.java
r8675f75 r8ccb07e 1 1 package com.ukim.finki.develop.finkwave.model.dto; 2 2 3 import jakarta.annotation.Nullable;4 3 import lombok.AllArgsConstructor; 5 4 import lombok.Getter; … … 17 16 private String type; 18 17 private String releasedBy; 18 private String artistUsername; 19 19 private String cover; 20 20 private Boolean isLikedByCurrentUser; 21 21 private String album; 22 private Long albumId; 22 23 23 public MusicalEntityDto(Long id, String title, String genre, String type, String releasedBy, Boolean isLikedByCurrentUser) {24 public MusicalEntityDto(Long id, String title, String genre, String type, String releasedBy, String artistUsername, Boolean isLikedByCurrentUser) { 24 25 this.id = id; 25 26 this.title = title; … … 27 28 this.type = type; 28 29 this.releasedBy = releasedBy; 30 this.artistUsername = artistUsername; 29 31 this.isLikedByCurrentUser = isLikedByCurrentUser; 30 32 } 31 33 32 public MusicalEntityDto(Long id, String title, String genre, String type, String releasedBy, String cover, Boolean isLikedByCurrentUser) {34 public MusicalEntityDto(Long id, String title, String genre, String type, String releasedBy, String releasedByUsername, String cover, Boolean isLikedByCurrentUser) { 33 35 this.id = id; 34 36 this.title = title; … … 36 38 this.type = type; 37 39 this.releasedBy = releasedBy; 40 this.artistUsername = artistUsername; 38 41 this.cover = cover; 39 42 this.isLikedByCurrentUser = isLikedByCurrentUser; -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/SongDetailsDto.java
r8675f75 r8ccb07e 14 14 private List<ReviewDto> reviews; 15 15 16 public SongDetailsDto(Long id, String title, String genre, String type, String releasedBy, String cover, Boolean isLikedByCurrentUser, String album, String link, List<ArtistContributionSummaryDto> contributions, List<ReviewDto> reviews) { 17 super(id, title, genre, type, releasedBy, cover, isLikedByCurrentUser, album, link); 16 public SongDetailsDto(Long id, String title, String genre, String type, String releasedBy, String artistUsername, String cover, Boolean isLikedByCurrentUser, String album, Long albumId, String link, List<ReviewDto> reviews, List<ArtistContributionSummaryDto> contributions) { 17 super(id, title, genre, type, releasedBy, artistUsername, cover, isLikedByCurrentUser, album, albumId, link); 18 this.reviews = reviews; 18 19 this.contributions = contributions; 19 this.reviews = reviews;20 20 } 21 21 22 public SongDetailsDto(Long id, String title, String genre, String type, String releasedBy, Boolean isLikedByCurrentUser, String link, List<ArtistContributionSummaryDto> contributions, List<ReviewDto> reviews) { 23 super(id, title, genre, type, releasedBy, isLikedByCurrentUser, link); 22 public SongDetailsDto(Long id, String title, String genre, String type, String releasedBy, String artistUsername, Boolean isLikedByCurrentUser, String link, List<ReviewDto> reviews, List<ArtistContributionSummaryDto> contributions) { 23 super(id, title, genre, type, releasedBy, artistUsername, isLikedByCurrentUser, link); 24 this.reviews = reviews; 24 25 this.contributions = contributions; 25 this.reviews = reviews;26 26 } 27 27 28 public SongDetailsDto(Long id, String title, String genre, String type, String releasedBy, String cover, Boolean isLikedByCurrentUser, String link, List<ArtistContributionSummaryDto> contributions, List<ReviewDto> reviews) { 29 super(id, title, genre, type, releasedBy, cover, isLikedByCurrentUser, link); 28 public SongDetailsDto(Long id, String title, String genre, String type, String releasedBy, String artistUsername, String cover, Boolean isLikedByCurrentUser, String link, List<ReviewDto> reviews, List<ArtistContributionSummaryDto> contributions) { 29 super(id, title, genre, type, releasedBy, artistUsername, cover, isLikedByCurrentUser, link); 30 this.reviews = reviews; 30 31 this.contributions = contributions; 31 this.reviews = reviews;32 32 } 33 34 33 } -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/SongDto.java
r8675f75 r8ccb07e 13 13 // todo: clean up constructors 14 14 15 public SongDto(Long id, String title, String genre, String type, String releasedBy, String cover, Boolean isLikedByCurrentUser, String album, String link) { 16 super(id, title, genre, type, releasedBy, cover, isLikedByCurrentUser, album); 15 16 public SongDto(Long id, String title, String genre, String type, String releasedBy, String artistUsername, String cover, Boolean isLikedByCurrentUser, String album, Long albumId, String link) { 17 super(id, title, genre, type, releasedBy, artistUsername, cover, isLikedByCurrentUser, album, albumId); 17 18 this.link = link; 18 19 } 19 20 20 public SongDto(Long id, String title, String genre, String type, String releasedBy, Boolean isLikedByCurrentUser, String link) {21 super(id, title, genre, type, releasedBy, isLikedByCurrentUser);21 public SongDto(Long id, String title, String genre, String type, String releasedBy, String artistUsername, Boolean isLikedByCurrentUser, String link) { 22 super(id, title, genre, type, releasedBy, artistUsername, isLikedByCurrentUser); 22 23 this.link = link; 23 24 } 24 25 25 public SongDto(Long id, String title, String genre, String type, String releasedBy, String cover, Boolean isLikedByCurrentUser, String link) {26 super(id, title, genre, type, releasedBy, cover, isLikedByCurrentUser);26 public SongDto(Long id, String title, String genre, String type, String releasedBy, String artistUsername, String cover, Boolean isLikedByCurrentUser, String link) { 27 super(id, title, genre, type, releasedBy, artistUsername, cover, isLikedByCurrentUser); 27 28 this.link = link; 28 29 } 29 30 30 } -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/AlbumRepository.java
r8675f75 r8ccb07e 18 18 @Query(""" 19 19 SELECT NEW com.ukim.finki.develop.finkwave.model.dto.MusicalEntityDto( 20 a.id, me.title, me.genre, 'ALBUM', u.fullName, me.cover, FALSE )20 a.id, me.title, me.genre, 'ALBUM', u.fullName, u.username, me.cover, FALSE ) 21 21 FROM Album a 22 22 JOIN a.musicalEntities me -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/LikeRepository.java
r8675f75 r8ccb07e 23 23 ELSE 'UNKNOWN' END), 24 24 u.fullName, 25 u.username, 25 26 (CASE WHEN currentUserLike.id IS NOT NULL THEN true ELSE false END)) 26 27 FROM Like l … … 40 41 SELECT CASE WHEN COUNT (l)>0 THEN true ELSE false END 41 42 FROM MusicalEntity me 42 JOIN Like l on l.musicalEntity.id=me.id43 JOIN Like l on l.musicalEntity.id=me.id 43 44 WHERE l.listener.id=:userId 44 45 """) -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/SongRepository.java
r8675f75 r8ccb07e 19 19 @Query(""" 20 20 SELECT NEW com.ukim.finki.develop.finkwave.model.dto.MusicalEntityDto( 21 s.id, me.title, me.genre, 'SONG', u.fullName, me.cover,21 s.id, me.title, me.genre, 'SONG', u.fullName, u.username, me.cover, 22 22 (CASE WHEN :currentUserId IS NOT NULL AND l.id IS NOT NULL THEN true ELSE false END) 23 23 ) … … 35 35 @Query(""" 36 36 SELECT NEW com.ukim.finki.develop.finkwave.model.dto.MusicalEntityDto( 37 s.id, me.title, me.genre, 'SONG', u.fullName, me.cover,37 s.id, me.title, me.genre, 'SONG', u.fullName, u.username, me.cover, 38 38 (CASE WHEN :currentUserId IS NOT NULL AND l.id IS NOT NULL THEN true ELSE false END)) 39 39 FROM Song s … … 55 55 'SONG', 56 56 s.musicalEntities.releasedBy.nonAdminUser.user.fullName, 57 s.musicalEntities.releasedBy.nonAdminUser.user.username, 57 58 s.musicalEntities.cover, 58 59 (EXISTS (SELECT 1 FROM Like l WHERE l.musicalEntity.id = s.id AND l.listener.id = :currentUserId)), 59 60 s.album.musicalEntities.title, 61 s.album.musicalEntities.id, 60 62 s.link 61 63 ) 62 64 FROM Song s 63 GROUP BY s.id, s.musicalEntities.title, s.musicalEntities.genre, 64 s.musicalEntities.releasedBy.nonAdminUser.user.fullName, s.musicalEntities.cover, s.album.musicalEntities.title 65 GROUP BY 66 s.id, 67 s.musicalEntities.title, 68 s.musicalEntities.genre, 69 s.musicalEntities.releasedBy.nonAdminUser.user.fullName, 70 s.musicalEntities.releasedBy.nonAdminUser.user.username, 71 s.musicalEntities.cover, 72 s.album.musicalEntities.title, 73 s.album.musicalEntities.id 65 74 ORDER BY count(*) desc 66 75 """) … … 75 84 'SONG', 76 85 s.musicalEntities.releasedBy.nonAdminUser.user.fullName, 86 s.musicalEntities.releasedBy.nonAdminUser.user.username, 77 87 s.musicalEntities.cover, 78 88 (EXISTS (SELECT 1 FROM Like l WHERE l.musicalEntity.id = s.id AND l.listener.id = :currentUserId)), … … 90 100 me.title, 91 101 u.full_name, 102 u.username, 92 103 s.link, 93 104 me.cover … … 109 120 'SONG', 110 121 u.fullName, 122 u.username, 111 123 me.cover, 112 124 (EXISTS ( … … 116 128 )), 117 129 albumMe.title, 130 albumMe.id, 118 131 s.link 119 132 ) -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/AlbumService.java
r8675f75 r8ccb07e 34 34 "ALBUM", 35 35 album.getMusicalEntities().getReleasedBy().getNonAdminUser().getUser().getFullName(), 36 album.getMusicalEntities().getReleasedBy().getNonAdminUser().getUser().getUsername(), 36 37 likeRepository.isLikedByUser(currentUserId)); 37 38 List<MusicalEntityDto>songsFromAlbum=songRepository.findSongsByAlbum(id,currentUserId); -
frontend/src/components/Sidebar.tsx
r8675f75 r8ccb07e 97 97 <div 98 98 key={song.id} 99 onClick={() => navigate(`/songs/${song.id}`)}100 99 className="flex items-center gap-3 p-2 rounded-lg hover:bg-white/5 cursor-pointer transition-colors group relative" 101 100 > … … 109 108 /> 110 109 <div className="flex-1 min-w-0"> 111 <p className="text-sm font-medium text-white truncate"> 110 <p 111 onClick={() => navigate(`/songs/${song.id}`)} 112 className="text-sm font-medium text-white truncate hover:underline cursor-pointer" 113 > 112 114 {song.title} 113 115 </p> 114 <p className="text-xs text-gray-400 truncate"> 115 {song.artist} 116 </p> 116 <div className="flex items-center gap-1 text-xs text-gray-400"> 117 <span 118 onClick={(e) => { 119 e.stopPropagation(); 120 if (song.artistUsername) { 121 navigate(`/users/${song.artistUsername}`); 122 } 123 }} 124 className={`truncate ${ 125 song.artistUsername 126 ? "hover:underline cursor-pointer hover:text-white" 127 : "" 128 }`} 129 > 130 {song.artist} 131 </span> 132 {song.album && ( 133 <> 134 <span>•</span> 135 <span 136 onClick={(e) => { 137 e.stopPropagation(); 138 if (song.albumId) { 139 navigate(`/collection/album/${song.albumId}`); 140 } 141 }} 142 className={`truncate ${ 143 song.albumId 144 ? "hover:underline cursor-pointer hover:text-white" 145 : "" 146 }`} 147 > 148 {song.album} 149 </span> 150 </> 151 )} 152 </div> 117 153 </div> 118 154 {song.link && ( -
frontend/src/components/search/AlbumResult.tsx
r8675f75 r8ccb07e 1 import { useNavigate } from "react-router-dom"; 1 2 import type { Album } from "../../utils/types"; 2 3 … … 6 7 7 8 const AlbumResult = ({ album }: AlbumResultProps) => { 9 const navigate = useNavigate(); 10 8 11 return ( 9 <div className="flex items-center gap-4 p-3 rounded-lg hover:bg-white/5 cursor-pointer transition-colors group"> 12 <div 13 onClick={() => navigate(`/collection/album/${album.id}`)} 14 className="flex items-center gap-4 p-3 rounded-lg hover:bg-white/5 cursor-pointer transition-colors group" 15 > 10 16 <img 11 17 src={album.cover || "/favicon.png"} -
frontend/src/components/search/UserResult.tsx
r8675f75 r8ccb07e 1 import { useNavigate } from "react-router-dom"; 1 2 import { baseURL } from "../../api/axiosInstance"; 2 3 import type { BaseNonAdminUser } from "../../utils/types"; … … 8 9 9 10 const UserResult = ({ user, label }: UserResultProps) => { 11 const navigate = useNavigate(); 12 10 13 return ( 11 <div className="flex items-center gap-4 p-3 rounded-lg hover:bg-white/5 cursor-pointer transition-colors group"> 14 <div 15 onClick={() => navigate(`/users/${user.username}`)} 16 className="flex items-center gap-4 p-3 rounded-lg hover:bg-white/5 cursor-pointer transition-colors group" 17 > 12 18 {user.profilePhoto ? ( 13 19 <img -
frontend/src/pages/LandingPage.tsx
r8675f75 r8ccb07e 417 417 {song.title} 418 418 </h3> 419 <p className="text-sm text-gray-400 mb-3 overflow-hidden text-ellipsis whitespace-nowrap"> 420 {song.album} 421 </p> 422 <p className="text-sm text-gray-400 mb-3 overflow-hidden text-ellipsis whitespace-nowrap"> 419 {song.album && ( 420 <p 421 onClick={(e) => { 422 e.stopPropagation(); 423 if (song.albumId) { 424 navigate(`/collection/album/${song.albumId}`); 425 } 426 }} 427 className={`text-sm text-gray-400 mb-3 overflow-hidden text-ellipsis whitespace-nowrap ${ 428 song.albumId 429 ? "hover:underline cursor-pointer hover:text-white" 430 : "" 431 }`} 432 > 433 {song.album} 434 </p> 435 )} 436 <p 437 onClick={(e) => { 438 e.stopPropagation(); 439 if (song.artistUsername) { 440 navigate(`/users/${song.artistUsername}`); 441 } 442 }} 443 className={`text-sm text-gray-400 mb-3 overflow-hidden text-ellipsis whitespace-nowrap ${ 444 song.artistUsername 445 ? "hover:underline cursor-pointer hover:text-white" 446 : "" 447 }`} 448 > 423 449 {song.releasedBy} 424 450 </p> -
frontend/src/utils/types.ts
r8675f75 r8ccb07e 22 22 type: string; 23 23 releasedBy: string; 24 artistUsername?: string; 24 25 cover?: string | null; 25 26 isLikedByCurrentUser?: boolean; … … 29 30 type: "SONG"; 30 31 album?: string; 32 albumId?: number; 31 33 link?: string; 32 34 } … … 92 94 title: string; 93 95 artist: string; 96 artistUsername?: string; 94 97 cover?: string; 95 98 link?: string; 99 album?: string; 100 albumId?: number; 96 101 } 97 102
Note:
See TracChangeset
for help on using the changeset viewer.
