Changes in / [890e036:03a8d87]
- Files:
-
- 5 deleted
- 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 (deleted)
-
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 (deleted)
-
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 (deleted)
-
frontend/src/pages/Nav.tsx (modified) (2 diffs)
-
frontend/src/pages/PublishSong.tsx (deleted)
-
frontend/src/utils/consts.ts (deleted)
-
frontend/src/utils/types.ts (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
finkwave/.gitignore
r890e036 r03a8d87 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
r890e036 r03a8d87 1 1 package com.ukim.finki.develop.finkwave.controller; 2 2 3 import com.ukim.finki.develop.finkwave.model.dto.*; 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; 4 7 import com.ukim.finki.develop.finkwave.repository.SongRepository; 5 8 import com.ukim.finki.develop.finkwave.service.AuthService; … … 39 42 return ResponseEntity.ok(songService.getSongDetails(songId)); 40 43 } 41 42 @GetMapping("/catalog")43 public HttpEntity<List<MusicalEntitesByArtistDto>> getArtistCatalog(){44 List<MusicalEntitesByArtistDto> artistCatalog = songService.getArtistCatalog();45 return ResponseEntity.ok(artistCatalog);46 }47 44 } -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/controller/TestController.java
r890e036 r03a8d87 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; 3 6 import com.ukim.finki.develop.finkwave.model.dto.SongDto; 4 import com.ukim.finki.develop.finkwave.model.dto.UserSearchResultDto;5 7 import com.ukim.finki.develop.finkwave.repository.SongRepository; 6 8 import com.ukim.finki.develop.finkwave.repository.UserRepository; 7 9 import lombok.AllArgsConstructor; 10 import lombok.Getter; 8 11 import org.springframework.http.HttpEntity; 9 12 import org.springframework.http.ResponseEntity; … … 25 28 26 29 @GetMapping("/search/u/{searchTerm}") 27 public HttpEntity<List<User SearchResultDto>> searchUsersTest(@PathVariable String searchTerm){28 return ResponseEntity.ok(userRepository.searchListeners(searchTerm , 10));30 public HttpEntity<List<User>> searchUsersTest(@PathVariable String searchTerm){ 31 return ResponseEntity.ok(userRepository.searchListeners(searchTerm)); 29 32 } 30 33 @GetMapping("/search/a/{searchTerm}") 31 public HttpEntity<List<User SearchResultDto>> searchArtistsTest(@PathVariable String searchTerm){32 return ResponseEntity.ok(userRepository.searchArtists(searchTerm , 10));34 public HttpEntity<List<User>> searchArtistsTest(@PathVariable String searchTerm){ 35 return ResponseEntity.ok(userRepository.searchArtists(searchTerm)); 33 36 } 34 37 } -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/controller/UserController.java
r890e036 r03a8d87 2 2 3 3 import com.ukim.finki.develop.finkwave.model.User; 4 import com.ukim.finki.develop.finkwave.model.dto.UserSearchResultDto;5 4 import com.ukim.finki.develop.finkwave.model.enums.UserType; 6 5 import com.ukim.finki.develop.finkwave.service.UserService; … … 25 24 26 25 @GetMapping("/search") 27 public HttpEntity<List<User SearchResultDto>> searchArtists(26 public HttpEntity<List<User>> searchArtists( 28 27 @RequestParam(name = "type") UserType userType, 29 @RequestParam(name = "q") String searchTerm, 30 @RequestParam(name = "limit", defaultValue = "10") Integer limit) 31 { 32 return ResponseEntity.ok(usersService.search(userType, searchTerm, limit)); 28 @RequestParam(name = "q") String searchTerm){ 29 return ResponseEntity.ok(usersService.search(userType, searchTerm)); 33 30 } 34 31 } -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/UserResponseDto.java
r890e036 r03a8d87 1 1 package com.ukim.finki.develop.finkwave.model.dto; 2 2 3 import com.ukim.finki.develop.finkwave.model.Role; 3 4 import jakarta.annotation.Nullable; 4 5 import lombok.Builder; … … 9 10 String username, 10 11 @Nullable String profilePhoto, 11 Boolean isAdmin, 12 @Nullable Boolean isArtist 13 ){} 12 Role role){ 13 } -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/SongRepository.java
r890e036 r03a8d87 1 1 package com.ukim.finki.develop.finkwave.repository; 2 2 3 import java.util.List; 4 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; 5 6 import org.springframework.data.jpa.repository.JpaRepository; 6 7 import org.springframework.data.jpa.repository.Query; … … 9 10 10 11 import com.ukim.finki.develop.finkwave.model.Song; 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; 12 13 import java.util.List; 15 14 16 15 @Repository … … 120 119 JOIN songs s on s.id = l.song_id 121 120 JOIN users u ON u.user_id = me.released_by 122 WHERE l.listener_id = :userId121 WHERE l.listener_id = 2 123 122 ORDER BY l.song_id, l.timestamp DESC 124 123 ) t … … 156 155 """) 157 156 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.releaseDate167 )168 FROM MusicalEntity me169 WHERE me.releasedBy.id = :artistId170 ORDER BY me.releaseDate DESC171 """)172 List<MusicalEntitesByArtistDto> getMusicalEntitiesReleasedByArtist(@Param("artistId")Long artistId);173 157 } -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/UserRepository.java
r890e036 r03a8d87 2 2 3 3 import com.ukim.finki.develop.finkwave.model.User; 4 import com.ukim.finki.develop.finkwave.model.dto.UserSearchResultDto;5 4 import org.springframework.data.jpa.repository.JpaRepository; 6 5 import org.springframework.data.jpa.repository.Query; 7 import org.springframework.data.repository.query.Param;8 6 import org.springframework.stereotype.Repository; 9 7 … … 16 14 17 15 18 @Query( value ="""19 SELECT u .full_name, u.username, u.profile_photo from usersu20 WHERE (u.full _name ILIKE '%' || :searchTerm || '%' or u.username ILIKE '%' || :searchTerm || '%')16 @Query(""" 17 SELECT u from User u 18 WHERE (u.fullName ILIKE '%' || :searchTerm || '%' or u.username ILIKE '%' || :searchTerm || '%') 21 19 and u.listener = true and u.artist = false 22 LIMIT :limit 23 """, nativeQuery = true) 24 List<UserSearchResultDto> searchListeners(@Param("searchTerm") String searchTerm, @Param("limit") Integer limit); 20 """) 21 List<User> searchListeners(String searchTerm); 25 22 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 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); 34 29 } -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/AuthService.java
r890e036 r03a8d87 209 209 .username(user.getUsername()) 210 210 .profilePhoto(user.getProfilePhoto()) 211 .isAdmin(user.getRole().equals(Role.ADMIN)) 212 .isArtist(user.isArtist()) 211 .role(user.getRole()) 213 212 .build(); 214 213 } -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/SongService.java
r890e036 r03a8d87 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 }61 56 } -
finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/UserService.java
r890e036 r03a8d87 2 2 3 3 import com.ukim.finki.develop.finkwave.model.User; 4 import com.ukim.finki.develop.finkwave.model.dto.UserSearchResultDto;5 4 import com.ukim.finki.develop.finkwave.model.enums.UserType; 6 5 import com.ukim.finki.develop.finkwave.repository.UserRepository; … … 19 18 } 20 19 21 public List<UserSearchResultDto> search(UserType userType, String searchTerm, int limit){ 20 // todo: add dto-s 21 22 public List<User> search(UserType userType, String searchTerm){ 23 22 24 return switch (userType) { 23 case ARTIST -> usersRepository.searchArtists(searchTerm , limit);24 case LISTENER -> usersRepository.searchListeners(searchTerm , limit);25 case ARTIST -> usersRepository.searchArtists(searchTerm); 26 case LISTENER -> usersRepository.searchListeners(searchTerm); 25 27 case null -> throw new IllegalArgumentException("Invalid userType"); 26 28 }; -
frontend/src/App.tsx
r890e036 r03a8d87 17 17 import Login from "./pages/Login"; 18 18 import MusicalCollection from "./pages/MusicalCollection"; 19 import MySongs from "./pages/MySongs";20 19 import Nav from "./pages/Nav"; 21 import PublishSong from "./pages/PublishSong";22 20 import Register from "./pages/Register"; 23 21 import SongDetail from "./pages/SongDetail"; … … 30 28 // show sidebar only if user is logged in and is on the landing page 31 29 const isLandingPage = location.pathname === "/"; 32 const [isSidebarOpen, setIsSidebarOpen] = useState( 33 !!user && isLandingPage && !user?.isArtist && !user?.isAdmin, 34 ); 30 const [isSidebarOpen, setIsSidebarOpen] = useState(!!user && isLandingPage); 35 31 36 32 // Open sidebar when user logs in and navigates to landing page 37 33 useEffect(() => { 38 if (user && isLandingPage && !user.isArtist && !user.isAdmin) {34 if (user && isLandingPage) { 39 35 setIsSidebarOpen(true); 40 36 } … … 108 104 }, 109 105 { 110 path: "/my-songs",111 element: <MySongs />,112 },113 {114 path: "/publish",115 element: <PublishSong />,116 },117 {118 106 path: "/songs/:id", 119 107 element: <SongDetail />, -
frontend/src/pages/Nav.tsx
r890e036 r03a8d87 22 22 setUser(undefined); 23 23 setIsDropdownOpen(false); 24 window.location.href = "/"; 25 // toast.success("Logout successful!"); 24 toast.success("Logout successful!"); 26 25 } catch (error) { 27 26 console.error("Logout failed:", error); … … 82 81 {!isAuthLoading && ( 83 82 <div className="flex items-center space-x-3"> 84 {user?.isArtist && (85 <Link86 to="/my-songs"87 className="text-white hover:text-[#1db954] px-4 py-2 text-sm font-medium transition-colors"88 >89 My Songs90 </Link>91 )}92 83 {user ? ( 93 84 <div className="relative" ref={dropdownRef}> -
frontend/src/utils/types.ts
r890e036 r03a8d87 4 4 email?: string; 5 5 profilePhoto?: string | null; 6 isAdmin: boolean; 7 isArtist: boolean; 6 role?: "ADMIN" | "NONADMIN"; 8 7 } 9 8 … … 108 107 songCount: number; 109 108 } 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.
