Changeset 8a47b30


Ignore:
Timestamp:
02/07/26 18:36:59 (5 months ago)
Author:
Filip Gavrilovski <filipgavrilovski28@…>
Branches:
main
Children:
9c1dcc7
Parents:
dc30259
Message:

add endpoint for fetching aggregated song details and song detail view

Files:
8 added
9 edited

Legend:

Unmodified
Added
Removed
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/controller/SongController.java

    rdc30259 r8a47b30  
    33import com.ukim.finki.develop.finkwave.model.dto.BasicSongDto;
    44import com.ukim.finki.develop.finkwave.model.dto.MusicalEntityDto;
     5import com.ukim.finki.develop.finkwave.model.dto.SongDetailsDto;
    56import com.ukim.finki.develop.finkwave.repository.SongRepository;
    67import com.ukim.finki.develop.finkwave.service.AuthService;
    78import com.ukim.finki.develop.finkwave.service.SongService;
    89import lombok.AllArgsConstructor;
     10import org.springframework.data.repository.query.Param;
    911import org.springframework.http.HttpEntity;
    1012import org.springframework.http.ResponseEntity;
    11 import org.springframework.web.bind.annotation.GetMapping;
    12 import org.springframework.web.bind.annotation.RequestMapping;
    13 import org.springframework.web.bind.annotation.RequestParam;
    14 import org.springframework.web.bind.annotation.RestController;
     13import org.springframework.web.bind.annotation.*;
    1514
    1615import java.util.List;
     
    3736        return ResponseEntity.ok(songService.getRecentlyListened());
    3837    }
     38
     39    @GetMapping("/{songId}/details")
     40    public HttpEntity<SongDetailsDto> getSongById(@PathVariable Long songId){
     41        return ResponseEntity.ok(songService.getSongDetails(songId));
     42    }
    3943}
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/ArtistDto.java

    rdc30259 r8a47b30  
    99@Setter
    1010public class ArtistDto extends NonAdminUserDto {
    11 
    12 
    1311    private List<ArtistContributionDto> contributions;
    14 
    1512}
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/MusicalEntityDto.java

    rdc30259 r8a47b30  
    44import lombok.AllArgsConstructor;
    55import lombok.Getter;
     6import lombok.NoArgsConstructor;
    67import lombok.Setter;
    78
     
    910@Getter
    1011@Setter
     12@NoArgsConstructor
    1113public class MusicalEntityDto {
    1214    private Long id;
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/ArtistContributionRepository.java

    rdc30259 r8a47b30  
    22
    33import com.ukim.finki.develop.finkwave.model.dto.ArtistContributionDto;
     4import com.ukim.finki.develop.finkwave.model.dto.ArtistContributionSummaryDto;
    45import org.springframework.data.jpa.repository.JpaRepository;
    56import org.springframework.data.jpa.repository.Query;
     
    2829        """)
    2930    List<ArtistContributionDto>findContributionsByArtistId(@Param("currentUserId")Long currentUserId,@Param("artistId")Long artistId);
     31
     32
     33    @Query("""
     34    SELECT NEW com.ukim.finki.develop.finkwave.model.dto.ArtistContributionSummaryDto(
     35    ac.artist.nonAdminUser.user.fullName, ac.role
     36    )
     37    FROM ArtistContribution ac
     38    WHERE ac.id.musicalEntityId = :songId
     39    """)
     40    List<ArtistContributionSummaryDto> findContributionsBySongId(@Param("songId")Long songId);
    3041}
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/ReviewRepository.java

    rdc30259 r8a47b30  
    11package com.ukim.finki.develop.finkwave.repository;
    22
     3import com.ukim.finki.develop.finkwave.model.dto.ReviewDto;
    34import org.springframework.data.jpa.repository.JpaRepository;
     5import org.springframework.data.jpa.repository.Query;
     6import org.springframework.data.repository.query.Param;
    47import org.springframework.stereotype.Repository;
    58
     
    710import com.ukim.finki.develop.finkwave.model.ReviewId;
    811
     12import java.util.List;
     13
    914@Repository
    1015public interface ReviewRepository extends JpaRepository<Review, ReviewId> {
     16    @Query("""
     17        SELECT NEW com.ukim.finki.develop.finkwave.model.dto.ReviewDto(
     18        r.id,
     19        r.listener.nonAdminUser.user.fullName,
     20        r.grade,
     21        r.comment
     22        )
     23        FROM Review r
     24        WHERE r.id.musicalEntityId = :songId
     25    """)
     26    List<ReviewDto> getReviewsForSongId(@Param("songId") Long songId);
    1127}
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/SongRepository.java

    rdc30259 r8a47b30  
    33import com.ukim.finki.develop.finkwave.model.dto.BasicSongDto;
    44import 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;
    78import org.springframework.data.repository.query.Param;
     9import org.springframework.security.core.parameters.P;
    810import org.springframework.stereotype.Repository;
    911
     
    9698    """, nativeQuery = true)
    9799    List<BasicSongDto> getRecentlyListened(@Param("userId")Long userId);
     100
     101    @Query(value = """
     102        SELECT NEW com.ukim.finki.develop.finkwave.model.dto.SongDto(
     103            s.id,
     104            me.title,
     105            me.genre,
     106            'SONG',
     107            u.fullName,
     108            me.cover,
     109            (EXISTS (
     110                SELECT 1 FROM Like l
     111                WHERE l.musicalEntity.id = s.id
     112                  AND l.listener.id = :userId
     113            )),
     114            albumMe.title,
     115            s.link
     116        )
     117        FROM Song s
     118        JOIN s.musicalEntities me
     119        JOIN me.releasedBy a
     120        JOIN a.nonAdminUser nau
     121        JOIN nau.user u
     122        LEFT JOIN s.album album
     123        LEFT JOIN album.musicalEntities albumMe
     124        WHERE s.id = :songId
     125    """)
     126    SongDto getSongById(@Param("songId") Long songId, @Param("userId") Long userId);
    98127}
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/SongService.java

    rdc30259 r8a47b30  
    11package com.ukim.finki.develop.finkwave.service;
    22
    3 import com.ukim.finki.develop.finkwave.model.dto.BasicSongDto;
    4 import com.ukim.finki.develop.finkwave.model.dto.MusicalEntityDto;
     3import com.ukim.finki.develop.finkwave.model.dto.*;
    54import com.ukim.finki.develop.finkwave.repository.SongRepository;
     5import com.ukim.finki.develop.finkwave.service.mappers.SongDetailsMapper;
    66import lombok.AllArgsConstructor;
    77import org.springframework.stereotype.Service;
     
    1414    private final SongRepository songRepository;
    1515    private final AuthService authService;
     16    private final ArtistContributionService artistContributionService;
     17    private final ReviewService reviewService;
     18    private final SongDetailsMapper songDetailsMapper;
    1619
    1720    public List<MusicalEntityDto> getTopSongs(){
     
    3235        return songRepository.getRecentlyListened(userId);
    3336    }
     37
     38    public MusicalEntityDto getSongById(Long songId){
     39        Long userId = null;
     40        try {
     41            userId = authService.getCurrentUserID();
     42        } catch (Exception ignored) {}
     43        return songRepository.getSongById(songId, userId);
     44    }
     45
     46    public SongDetailsDto getSongDetails(Long songId){
     47        Long userId = null;
     48        try {
     49            userId = authService.getCurrentUserID();
     50        } catch (Exception ignored){}
     51        SongDto songDto = songRepository.getSongById(songId, userId);
     52        List<ArtistContributionSummaryDto> contributionsBySongId = artistContributionService.getContributionsBySongId(songId);
     53        List<ReviewDto> reviewsForSongId = reviewService.getReviewsForSongId(songId);
     54        return songDetailsMapper.toSongDetailsDto(songDto, contributionsBySongId, reviewsForSongId);
     55    }
    3456}
  • frontend/src/App.tsx

    rdc30259 r8a47b30  
    1717import Nav from "./pages/Nav";
    1818import Register from "./pages/Register";
     19import SongDetail from "./pages/SongDetail";
    1920import UserDetail from "./pages/UserDetail";
    2021
     
    99100                        },
    100101                        {
     102                                path: "/songs/:id",
     103                                element: <SongDetail />,
     104                        },
     105                        {
    101106                                path: "/collection/:type/:id",
    102107                                element: <MusicalCollection />,
  • frontend/src/utils/types.ts

    rdc30259 r8a47b30  
    6464}
    6565
     66export interface SongContribution {
     67        artistName: string;
     68        role: string;
     69}
     70
     71export interface SongReview {
     72        id: {
     73                listenerId: number;
     74                musicalEntityId: number;
     75        };
     76        author: string;
     77        grade: number;
     78        comment: string;
     79}
     80
     81export interface SongDetail extends MusicalEntity {
     82        type: "SONG";
     83        album?: string | null;
     84        link?: string | null;
     85        contributions: SongContribution[];
     86        reviews: SongReview[];
     87}
     88
    6689export interface BasicSong {
    6790        id: number;
Note: See TracChangeset for help on using the changeset viewer.