Changeset 8dd3e22


Ignore:
Timestamp:
02/09/26 20:44:24 (5 months ago)
Author:
Filip Gavrilovski <filipgavrilovski28@…>
Branches:
main
Children:
27660af
Parents:
c684a6d
Message:

add client side form for publishing new music with mock data and api calls

Files:
3 added
7 edited

Legend:

Unmodified
Added
Removed
  • finkwave/.gitignore

    rc684a6d r8dd3e22  
    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

    rc684a6d r8dd3e22  
    11package com.ukim.finki.develop.finkwave.controller;
    22
    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;
     3import com.ukim.finki.develop.finkwave.model.dto.*;
    74import com.ukim.finki.develop.finkwave.repository.SongRepository;
    85import com.ukim.finki.develop.finkwave.service.AuthService;
     
    4239        return ResponseEntity.ok(songService.getSongDetails(songId));
    4340    }
     41
     42    @GetMapping("/catalog")
     43    public HttpEntity<List<MusicalEntitesByArtistDto>> getArtistCatalog(){
     44        List<MusicalEntitesByArtistDto> artistCatalog = songService.getArtistCatalog();
     45        return ResponseEntity.ok(artistCatalog);
     46    }
    4447}
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/SongRepository.java

    rc684a6d r8dd3e22  
    33import java.util.List;
    44
     5import com.ukim.finki.develop.finkwave.model.dto.MusicalEntitesByArtistDto;
    56import org.springframework.data.jpa.repository.JpaRepository;
    67import org.springframework.data.jpa.repository.Query;
     
    155156    """)
    156157    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);
    157173}
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/SongService.java

    rc684a6d r8dd3e22  
    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    }
    5661}
  • frontend/src/App.tsx

    rc684a6d r8dd3e22  
    1717import Login from "./pages/Login";
    1818import MusicalCollection from "./pages/MusicalCollection";
     19import MySongs from "./pages/MySongs";
    1920import Nav from "./pages/Nav";
     21import PublishSong from "./pages/PublishSong";
    2022import Register from "./pages/Register";
    2123import SongDetail from "./pages/SongDetail";
     
    2830        // show sidebar only if user is logged in and is on the landing page
    2931        const isLandingPage = location.pathname === "/";
    30         const [isSidebarOpen, setIsSidebarOpen] = useState(!!user && isLandingPage);
     32        const [isSidebarOpen, setIsSidebarOpen] = useState(
     33                !!user && isLandingPage && !user?.isArtist && !user?.isAdmin,
     34        );
    3135
    3236        // Open sidebar when user logs in and navigates to landing page
    3337        useEffect(() => {
    34                 if (user && isLandingPage) {
     38                if (user && isLandingPage && !user.isArtist && !user.isAdmin) {
    3539                        setIsSidebarOpen(true);
    3640                }
     
    104108                        },
    105109                        {
     110                                path: "/my-songs",
     111                                element: <MySongs />,
     112                        },
     113                        {
     114                                path: "/publish",
     115                                element: <PublishSong />,
     116                        },
     117                        {
    106118                                path: "/songs/:id",
    107119                                element: <SongDetail />,
  • frontend/src/pages/Nav.tsx

    rc684a6d r8dd3e22  
    2222                        setUser(undefined);
    2323                        setIsDropdownOpen(false);
    24                         toast.success("Logout successful!");
     24                        window.location.href = "/";
     25                        // toast.success("Logout successful!");
    2526                } catch (error) {
    2627                        console.error("Logout failed:", error);
     
    8182                                {!isAuthLoading && (
    8283                                        <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                                                )}
    8392                                                {user ? (
    8493                                                        <div className="relative" ref={dropdownRef}>
  • frontend/src/utils/types.ts

    rc684a6d r8dd3e22  
    108108        songCount: number;
    109109}
     110
     111export interface CatalogItem {
     112        id: number;
     113        title: string;
     114        genre: string;
     115        cover: string | null;
     116        type: "SONG" | "ALBUM";
     117        releaseDate: string;
     118}
Note: See TracChangeset for help on using the changeset viewer.