Changes in / [890e036:03a8d87]


Ignore:
Files:
5 deleted
13 edited

Legend:

Unmodified
Added
Removed
  • finkwave/.gitignore

    r890e036 r03a8d87  
    3232### VS Code ###
    3333.vscode/
    34 application*.properties
     34application.properties
    3535
    3636uploads/profile-pictures/*
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/controller/SongController.java

    r890e036 r03a8d87  
    11package com.ukim.finki.develop.finkwave.controller;
    22
    3 import com.ukim.finki.develop.finkwave.model.dto.*;
     3import com.ukim.finki.develop.finkwave.model.dto.BasicSongDto;
     4import com.ukim.finki.develop.finkwave.model.dto.MusicalEntityDto;
     5import com.ukim.finki.develop.finkwave.model.dto.SongDetailsDto;
     6import com.ukim.finki.develop.finkwave.model.dto.SongDto;
    47import com.ukim.finki.develop.finkwave.repository.SongRepository;
    58import com.ukim.finki.develop.finkwave.service.AuthService;
     
    3942        return ResponseEntity.ok(songService.getSongDetails(songId));
    4043    }
    41 
    42     @GetMapping("/catalog")
    43     public HttpEntity<List<MusicalEntitesByArtistDto>> getArtistCatalog(){
    44         List<MusicalEntitesByArtistDto> artistCatalog = songService.getArtistCatalog();
    45         return ResponseEntity.ok(artistCatalog);
    46     }
    4744}
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/controller/TestController.java

    r890e036 r03a8d87  
    11package com.ukim.finki.develop.finkwave.controller;
    22
     3import com.ukim.finki.develop.finkwave.model.MusicalEntity;
     4import com.ukim.finki.develop.finkwave.model.User;
     5import com.ukim.finki.develop.finkwave.model.dto.MusicalEntityDto;
    36import com.ukim.finki.develop.finkwave.model.dto.SongDto;
    4 import com.ukim.finki.develop.finkwave.model.dto.UserSearchResultDto;
    57import com.ukim.finki.develop.finkwave.repository.SongRepository;
    68import com.ukim.finki.develop.finkwave.repository.UserRepository;
    79import lombok.AllArgsConstructor;
     10import lombok.Getter;
    811import org.springframework.http.HttpEntity;
    912import org.springframework.http.ResponseEntity;
     
    2528
    2629    @GetMapping("/search/u/{searchTerm}")
    27     public HttpEntity<List<UserSearchResultDto>> 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));
    2932    }
    3033    @GetMapping("/search/a/{searchTerm}")
    31     public HttpEntity<List<UserSearchResultDto>> 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));
    3336    }
    3437}
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/controller/UserController.java

    r890e036 r03a8d87  
    22
    33import com.ukim.finki.develop.finkwave.model.User;
    4 import com.ukim.finki.develop.finkwave.model.dto.UserSearchResultDto;
    54import com.ukim.finki.develop.finkwave.model.enums.UserType;
    65import com.ukim.finki.develop.finkwave.service.UserService;
     
    2524
    2625    @GetMapping("/search")
    27     public HttpEntity<List<UserSearchResultDto>> searchArtists(
     26    public HttpEntity<List<User>> searchArtists(
    2827            @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));
    3330    }
    3431}
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/UserResponseDto.java

    r890e036 r03a8d87  
    11package com.ukim.finki.develop.finkwave.model.dto;
    22
     3import com.ukim.finki.develop.finkwave.model.Role;
    34import jakarta.annotation.Nullable;
    45import lombok.Builder;
     
    910        String username,
    1011        @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  
    11package com.ukim.finki.develop.finkwave.repository;
    22
    3 import java.util.List;
    4 
     3import com.ukim.finki.develop.finkwave.model.dto.BasicSongDto;
     4import com.ukim.finki.develop.finkwave.model.dto.MusicalEntityDto;
     5import com.ukim.finki.develop.finkwave.model.dto.SongDto;
    56import org.springframework.data.jpa.repository.JpaRepository;
    67import org.springframework.data.jpa.repository.Query;
     
    910
    1011import 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
     13import java.util.List;
    1514
    1615@Repository
     
    120119                     JOIN songs s on s.id = l.song_id
    121120                     JOIN users u ON u.user_id = me.released_by
    122                      WHERE l.listener_id = :userId
     121                     WHERE l.listener_id = 2
    123122                 ORDER BY l.song_id, l.timestamp DESC
    124123             ) t
     
    156155    """)
    157156    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);
    173157}
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/UserRepository.java

    r890e036 r03a8d87  
    22
    33import com.ukim.finki.develop.finkwave.model.User;
    4 import com.ukim.finki.develop.finkwave.model.dto.UserSearchResultDto;
    54import org.springframework.data.jpa.repository.JpaRepository;
    65import org.springframework.data.jpa.repository.Query;
    7 import org.springframework.data.repository.query.Param;
    86import org.springframework.stereotype.Repository;
    97
     
    1614
    1715
    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 || '%')
     16    @Query("""
     17        SELECT u from User u
     18        WHERE (u.fullName ILIKE '%' || :searchTerm || '%' or u.username ILIKE '%' || :searchTerm || '%')
    2119            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);
    2522
    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);
    3429}
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/AuthService.java

    r890e036 r03a8d87  
    209209                .username(user.getUsername())
    210210                .profilePhoto(user.getProfilePhoto())
    211                 .isAdmin(user.getRole().equals(Role.ADMIN))
    212                 .isArtist(user.isArtist())
     211                .role(user.getRole())
    213212                .build();
    214213    }
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/SongService.java

    r890e036 r03a8d87  
    5454        return songDetailsMapper.toSongDetailsDto(songDto, contributionsBySongId, reviewsForSongId);
    5555    }
    56 
    57     public List<MusicalEntitesByArtistDto> getArtistCatalog(){
    58         Long userId = authService.getCurrentUserID();
    59         return songRepository.getMusicalEntitiesReleasedByArtist(userId);
    60     }
    6156}
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/UserService.java

    r890e036 r03a8d87  
    22
    33import com.ukim.finki.develop.finkwave.model.User;
    4 import com.ukim.finki.develop.finkwave.model.dto.UserSearchResultDto;
    54import com.ukim.finki.develop.finkwave.model.enums.UserType;
    65import com.ukim.finki.develop.finkwave.repository.UserRepository;
     
    1918    }
    2019
    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
    2224        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);
    2527            case null -> throw new IllegalArgumentException("Invalid userType");
    2628        };
  • frontend/src/App.tsx

    r890e036 r03a8d87  
    1717import Login from "./pages/Login";
    1818import MusicalCollection from "./pages/MusicalCollection";
    19 import MySongs from "./pages/MySongs";
    2019import Nav from "./pages/Nav";
    21 import PublishSong from "./pages/PublishSong";
    2220import Register from "./pages/Register";
    2321import SongDetail from "./pages/SongDetail";
     
    3028        // show sidebar only if user is logged in and is on the landing page
    3129        const isLandingPage = location.pathname === "/";
    32         const [isSidebarOpen, setIsSidebarOpen] = useState(
    33                 !!user && isLandingPage && !user?.isArtist && !user?.isAdmin,
    34         );
     30        const [isSidebarOpen, setIsSidebarOpen] = useState(!!user && isLandingPage);
    3531
    3632        // Open sidebar when user logs in and navigates to landing page
    3733        useEffect(() => {
    38                 if (user && isLandingPage && !user.isArtist && !user.isAdmin) {
     34                if (user && isLandingPage) {
    3935                        setIsSidebarOpen(true);
    4036                }
     
    108104                        },
    109105                        {
    110                                 path: "/my-songs",
    111                                 element: <MySongs />,
    112                         },
    113                         {
    114                                 path: "/publish",
    115                                 element: <PublishSong />,
    116                         },
    117                         {
    118106                                path: "/songs/:id",
    119107                                element: <SongDetail />,
  • frontend/src/pages/Nav.tsx

    r890e036 r03a8d87  
    2222                        setUser(undefined);
    2323                        setIsDropdownOpen(false);
    24                         window.location.href = "/";
    25                         // toast.success("Logout successful!");
     24                        toast.success("Logout successful!");
    2625                } catch (error) {
    2726                        console.error("Logout failed:", error);
     
    8281                                {!isAuthLoading && (
    8382                                        <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                                                 )}
    9283                                                {user ? (
    9384                                                        <div className="relative" ref={dropdownRef}>
  • frontend/src/utils/types.ts

    r890e036 r03a8d87  
    44        email?: string;
    55        profilePhoto?: string | null;
    6         isAdmin: boolean;
    7         isArtist: boolean;
     6        role?: "ADMIN" | "NONADMIN";
    87}
    98
     
    108107        songCount: number;
    109108}
    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.