Changeset 890e036
- Timestamp:
- 02/09/26 21:45:41 (5 months ago)
- Branches:
- main
- Children:
- 0808ef2
- Parents:
- 03a8d87 (diff), 27660af (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Files:
-
- 5 added
- 13 edited
-
finkwave/.gitignore (modified) (1 diff)
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/controller/SongController.java (modified) (2 diffs)
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/controller/TestController.java (modified) (2 diffs)
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/controller/UserController.java (modified) (2 diffs)
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/MusicalEntitesByArtistDto.java (added)
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/UserResponseDto.java (modified) (2 diffs)
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/UserSearchResultDto.java (added)
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/SongRepository.java (modified) (4 diffs)
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/UserRepository.java (modified) (2 diffs)
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/AuthService.java (modified) (1 diff)
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/SongService.java (modified) (1 diff)
-
finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/UserService.java (modified) (2 diffs)
-
frontend/src/App.tsx (modified) (3 diffs)
-
frontend/src/pages/MySongs.tsx (added)
-
frontend/src/pages/Nav.tsx (modified) (2 diffs)
-
frontend/src/pages/PublishSong.tsx (added)
-
frontend/src/utils/consts.ts (added)
-
frontend/src/utils/types.ts (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
finkwave/.gitignore
r03a8d87 r890e036 32 32 ### VS Code ### 33 33 .vscode/ 34 application .properties34 application*.properties 35 35 36 36 uploads/profile-pictures/* -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/controller/SongController.java
r03a8d87 r890e036 1 1 package com.ukim.finki.develop.finkwave.controller; 2 2 3 import com.ukim.finki.develop.finkwave.model.dto.BasicSongDto; 4 import com.ukim.finki.develop.finkwave.model.dto.MusicalEntityDto; 5 import com.ukim.finki.develop.finkwave.model.dto.SongDetailsDto; 6 import com.ukim.finki.develop.finkwave.model.dto.SongDto; 3 import com.ukim.finki.develop.finkwave.model.dto.*; 7 4 import com.ukim.finki.develop.finkwave.repository.SongRepository; 8 5 import com.ukim.finki.develop.finkwave.service.AuthService; … … 42 39 return ResponseEntity.ok(songService.getSongDetails(songId)); 43 40 } 41 42 @GetMapping("/catalog") 43 public HttpEntity<List<MusicalEntitesByArtistDto>> getArtistCatalog(){ 44 List<MusicalEntitesByArtistDto> artistCatalog = songService.getArtistCatalog(); 45 return ResponseEntity.ok(artistCatalog); 46 } 44 47 } -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/controller/TestController.java
r03a8d87 r890e036 1 1 package com.ukim.finki.develop.finkwave.controller; 2 2 3 import com.ukim.finki.develop.finkwave.model.MusicalEntity;4 import com.ukim.finki.develop.finkwave.model.User;5 import com.ukim.finki.develop.finkwave.model.dto.MusicalEntityDto;6 3 import com.ukim.finki.develop.finkwave.model.dto.SongDto; 4 import com.ukim.finki.develop.finkwave.model.dto.UserSearchResultDto; 7 5 import com.ukim.finki.develop.finkwave.repository.SongRepository; 8 6 import com.ukim.finki.develop.finkwave.repository.UserRepository; 9 7 import lombok.AllArgsConstructor; 10 import lombok.Getter;11 8 import org.springframework.http.HttpEntity; 12 9 import org.springframework.http.ResponseEntity; … … 28 25 29 26 @GetMapping("/search/u/{searchTerm}") 30 public HttpEntity<List<User >> searchUsersTest(@PathVariable String searchTerm){31 return ResponseEntity.ok(userRepository.searchListeners(searchTerm ));27 public HttpEntity<List<UserSearchResultDto>> searchUsersTest(@PathVariable String searchTerm){ 28 return ResponseEntity.ok(userRepository.searchListeners(searchTerm, 10)); 32 29 } 33 30 @GetMapping("/search/a/{searchTerm}") 34 public HttpEntity<List<User >> searchArtistsTest(@PathVariable String searchTerm){35 return ResponseEntity.ok(userRepository.searchArtists(searchTerm ));31 public HttpEntity<List<UserSearchResultDto>> searchArtistsTest(@PathVariable String searchTerm){ 32 return ResponseEntity.ok(userRepository.searchArtists(searchTerm, 10)); 36 33 } 37 34 } -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/controller/UserController.java
r03a8d87 r890e036 2 2 3 3 import com.ukim.finki.develop.finkwave.model.User; 4 import com.ukim.finki.develop.finkwave.model.dto.UserSearchResultDto; 4 5 import com.ukim.finki.develop.finkwave.model.enums.UserType; 5 6 import com.ukim.finki.develop.finkwave.service.UserService; … … 24 25 25 26 @GetMapping("/search") 26 public HttpEntity<List<User >> searchArtists(27 public HttpEntity<List<UserSearchResultDto>> searchArtists( 27 28 @RequestParam(name = "type") UserType userType, 28 @RequestParam(name = "q") String searchTerm){ 29 return ResponseEntity.ok(usersService.search(userType, searchTerm)); 29 @RequestParam(name = "q") String searchTerm, 30 @RequestParam(name = "limit", defaultValue = "10") Integer limit) 31 { 32 return ResponseEntity.ok(usersService.search(userType, searchTerm, limit)); 30 33 } 31 34 } -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/UserResponseDto.java
r03a8d87 r890e036 1 1 package com.ukim.finki.develop.finkwave.model.dto; 2 2 3 import com.ukim.finki.develop.finkwave.model.Role;4 3 import jakarta.annotation.Nullable; 5 4 import lombok.Builder; … … 10 9 String username, 11 10 @Nullable String profilePhoto, 12 Role role){ 13 } 11 Boolean isAdmin, 12 @Nullable Boolean isArtist 13 ){} -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/SongRepository.java
r03a8d87 r890e036 1 1 package com.ukim.finki.develop.finkwave.repository; 2 2 3 import com.ukim.finki.develop.finkwave.model.dto.BasicSongDto; 4 import com.ukim.finki.develop.finkwave.model.dto.MusicalEntityDto; 5 import com.ukim.finki.develop.finkwave.model.dto.SongDto; 3 import java.util.List; 4 6 5 import org.springframework.data.jpa.repository.JpaRepository; 7 6 import org.springframework.data.jpa.repository.Query; … … 10 9 11 10 import com.ukim.finki.develop.finkwave.model.Song; 12 13 import java.util.List; 11 import com.ukim.finki.develop.finkwave.model.dto.BasicSongDto; 12 import com.ukim.finki.develop.finkwave.model.dto.MusicalEntitesByArtistDto; 13 import com.ukim.finki.develop.finkwave.model.dto.MusicalEntityDto; 14 import com.ukim.finki.develop.finkwave.model.dto.SongDto; 14 15 15 16 @Repository … … 119 120 JOIN songs s on s.id = l.song_id 120 121 JOIN users u ON u.user_id = me.released_by 121 WHERE l.listener_id = 2122 WHERE l.listener_id = :userId 122 123 ORDER BY l.song_id, l.timestamp DESC 123 124 ) t … … 155 156 """) 156 157 SongDto getSongById(@Param("songId") Long songId, @Param("userId") Long userId); 158 159 @Query(""" 160 SELECT new com.ukim.finki.develop.finkwave.model.dto.MusicalEntitesByArtistDto( 161 me.id, 162 me.title, 163 me.genre, 164 (CASE WHEN EXISTS (SELECT 1 from Song s where me.id = s.id and s.album is null) THEN 'SONG' ELSE 'ALBUM' END), 165 me.cover, 166 me.releaseDate 167 ) 168 FROM MusicalEntity me 169 WHERE me.releasedBy.id = :artistId 170 ORDER BY me.releaseDate DESC 171 """) 172 List<MusicalEntitesByArtistDto> getMusicalEntitiesReleasedByArtist(@Param("artistId")Long artistId); 157 173 } -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/UserRepository.java
r03a8d87 r890e036 2 2 3 3 import com.ukim.finki.develop.finkwave.model.User; 4 import com.ukim.finki.develop.finkwave.model.dto.UserSearchResultDto; 4 5 import org.springframework.data.jpa.repository.JpaRepository; 5 6 import org.springframework.data.jpa.repository.Query; 7 import org.springframework.data.repository.query.Param; 6 8 import org.springframework.stereotype.Repository; 7 9 … … 14 16 15 17 16 @Query( """17 SELECT u from Useru18 WHERE (u.full Name ILIKE '%' || :searchTerm || '%' or u.username ILIKE '%' || :searchTerm || '%')18 @Query(value = """ 19 SELECT u.full_name, u.username, u.profile_photo from users u 20 WHERE (u.full_name ILIKE '%' || :searchTerm || '%' or u.username ILIKE '%' || :searchTerm || '%') 19 21 and u.listener = true and u.artist = false 20 """) 21 List<User> searchListeners(String searchTerm); 22 LIMIT :limit 23 """, nativeQuery = true) 24 List<UserSearchResultDto> searchListeners(@Param("searchTerm") String searchTerm, @Param("limit") Integer limit); 22 25 23 @Query(""" 24 SELECT u from User u 25 WHERE (u.fullName ILIKE '%' || :searchTerm || '%' or u.username ILIKE '%' || :searchTerm || '%') 26 and u.artist = true 27 """) 28 List<User> searchArtists(String searchTerm); 26 @Query(value = """ 27 SELECT u.full_name, u.username, u.profile_photo from users u 28 WHERE (u.full_name ILIKE '%' || :searchTerm || '%' or u.username ILIKE '%' || :searchTerm || '%') and u.artist = true 29 LIMIT :limit 30 """, nativeQuery = true) 31 List<UserSearchResultDto> searchArtists(@Param("searchTerm") String searchTerm, @Param("limit") Integer limit); 32 33 29 34 } -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/AuthService.java
r03a8d87 r890e036 209 209 .username(user.getUsername()) 210 210 .profilePhoto(user.getProfilePhoto()) 211 .role(user.getRole()) 211 .isAdmin(user.getRole().equals(Role.ADMIN)) 212 .isArtist(user.isArtist()) 212 213 .build(); 213 214 } -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/SongService.java
r03a8d87 r890e036 54 54 return songDetailsMapper.toSongDetailsDto(songDto, contributionsBySongId, reviewsForSongId); 55 55 } 56 57 public List<MusicalEntitesByArtistDto> getArtistCatalog(){ 58 Long userId = authService.getCurrentUserID(); 59 return songRepository.getMusicalEntitiesReleasedByArtist(userId); 60 } 56 61 } -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/UserService.java
r03a8d87 r890e036 2 2 3 3 import com.ukim.finki.develop.finkwave.model.User; 4 import com.ukim.finki.develop.finkwave.model.dto.UserSearchResultDto; 4 5 import com.ukim.finki.develop.finkwave.model.enums.UserType; 5 6 import com.ukim.finki.develop.finkwave.repository.UserRepository; … … 18 19 } 19 20 20 // todo: add dto-s 21 22 public List<User> search(UserType userType, String searchTerm){ 23 21 public List<UserSearchResultDto> search(UserType userType, String searchTerm, int limit){ 24 22 return switch (userType) { 25 case ARTIST -> usersRepository.searchArtists(searchTerm );26 case LISTENER -> usersRepository.searchListeners(searchTerm );23 case ARTIST -> usersRepository.searchArtists(searchTerm, limit); 24 case LISTENER -> usersRepository.searchListeners(searchTerm, limit); 27 25 case null -> throw new IllegalArgumentException("Invalid userType"); 28 26 }; -
frontend/src/App.tsx
r03a8d87 r890e036 17 17 import Login from "./pages/Login"; 18 18 import MusicalCollection from "./pages/MusicalCollection"; 19 import MySongs from "./pages/MySongs"; 19 20 import Nav from "./pages/Nav"; 21 import PublishSong from "./pages/PublishSong"; 20 22 import Register from "./pages/Register"; 21 23 import SongDetail from "./pages/SongDetail"; … … 28 30 // show sidebar only if user is logged in and is on the landing page 29 31 const isLandingPage = location.pathname === "/"; 30 const [isSidebarOpen, setIsSidebarOpen] = useState(!!user && isLandingPage); 32 const [isSidebarOpen, setIsSidebarOpen] = useState( 33 !!user && isLandingPage && !user?.isArtist && !user?.isAdmin, 34 ); 31 35 32 36 // Open sidebar when user logs in and navigates to landing page 33 37 useEffect(() => { 34 if (user && isLandingPage ) {38 if (user && isLandingPage && !user.isArtist && !user.isAdmin) { 35 39 setIsSidebarOpen(true); 36 40 } … … 104 108 }, 105 109 { 110 path: "/my-songs", 111 element: <MySongs />, 112 }, 113 { 114 path: "/publish", 115 element: <PublishSong />, 116 }, 117 { 106 118 path: "/songs/:id", 107 119 element: <SongDetail />, -
frontend/src/pages/Nav.tsx
r03a8d87 r890e036 22 22 setUser(undefined); 23 23 setIsDropdownOpen(false); 24 toast.success("Logout successful!"); 24 window.location.href = "/"; 25 // toast.success("Logout successful!"); 25 26 } catch (error) { 26 27 console.error("Logout failed:", error); … … 81 82 {!isAuthLoading && ( 82 83 <div className="flex items-center space-x-3"> 84 {user?.isArtist && ( 85 <Link 86 to="/my-songs" 87 className="text-white hover:text-[#1db954] px-4 py-2 text-sm font-medium transition-colors" 88 > 89 My Songs 90 </Link> 91 )} 83 92 {user ? ( 84 93 <div className="relative" ref={dropdownRef}> -
frontend/src/utils/types.ts
r03a8d87 r890e036 4 4 email?: string; 5 5 profilePhoto?: string | null; 6 role?: "ADMIN" | "NONADMIN"; 6 isAdmin: boolean; 7 isArtist: boolean; 7 8 } 8 9 … … 107 108 songCount: number; 108 109 } 110 111 export interface CatalogItem { 112 id: number; 113 title: string; 114 genre: string; 115 cover: string | null; 116 type: "SONG" | "ALBUM"; 117 releaseDate: string; 118 } 119 120 export interface Contributor { 121 username: string; 122 fullName: string; 123 role: string; 124 } 125 126 export interface ArtistSearchResult { 127 username: string; 128 fullName: string; 129 profilePhoto?: string; 130 } 131 132 export interface SongEntry { 133 title: string; 134 link: string; 135 contributors: Contributor[]; 136 }
Note:
See TracChangeset
for help on using the changeset viewer.
