Changeset 8ccb07e


Ignore:
Timestamp:
02/07/26 21:16:37 (5 months ago)
Author:
Filip Gavrilovski <filipgavrilovski28@…>
Branches:
main
Children:
799f27d
Parents:
8675f75
Message:

clickable items now take the user to the respective pages; added artist username and album id to dto-s

Files:
14 edited

Legend:

Unmodified
Added
Removed
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/AlbumDto.java

    r8675f75 r8ccb07e  
    1212    private List<MusicalEntityDto>songs;
    1313
    14     public AlbumDto(Long id, String title, String genre, String type, String releasedBy, Boolean isLikedByCurrentUser) {
    15         super(id, title, genre, type, releasedBy, isLikedByCurrentUser);
     14    public AlbumDto(Long id, String title, String genre, String type, String releasedBy, String artistUsername, Boolean isLikedByCurrentUser) {
     15        super(id, title, genre, type, releasedBy, artistUsername, isLikedByCurrentUser);
    1616    }
    1717
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/BasicSongDto.java

    r8675f75 r8ccb07e  
    77    String title,
    88    String artist,
     9    String artistUsername,
    910    String link,
    1011    @Nullable String cover
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/MusicalEntityDto.java

    r8675f75 r8ccb07e  
    11package com.ukim.finki.develop.finkwave.model.dto;
    22
    3 import jakarta.annotation.Nullable;
    43import lombok.AllArgsConstructor;
    54import lombok.Getter;
     
    1716    private String type;
    1817    private String releasedBy;
     18    private String artistUsername;
    1919    private String cover;
    2020    private Boolean isLikedByCurrentUser;
    2121    private String album;
     22    private Long albumId;
    2223
    23     public MusicalEntityDto(Long id, String title, String genre, String type, String releasedBy, Boolean isLikedByCurrentUser) {
     24    public MusicalEntityDto(Long id, String title, String genre, String type, String releasedBy, String artistUsername, Boolean isLikedByCurrentUser) {
    2425        this.id = id;
    2526        this.title = title;
     
    2728        this.type = type;
    2829        this.releasedBy = releasedBy;
     30        this.artistUsername = artistUsername;
    2931        this.isLikedByCurrentUser = isLikedByCurrentUser;
    3032    }
    3133
    32     public MusicalEntityDto(Long id, String title, String genre, String type, String releasedBy, String cover, Boolean isLikedByCurrentUser) {
     34    public MusicalEntityDto(Long id, String title, String genre, String type, String releasedBy, String releasedByUsername, String cover, Boolean isLikedByCurrentUser) {
    3335        this.id = id;
    3436        this.title = title;
     
    3638        this.type = type;
    3739        this.releasedBy = releasedBy;
     40        this.artistUsername = artistUsername;
    3841        this.cover = cover;
    3942        this.isLikedByCurrentUser = isLikedByCurrentUser;
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/SongDetailsDto.java

    r8675f75 r8ccb07e  
    1414    private List<ReviewDto> reviews;
    1515
    16     public SongDetailsDto(Long id, String title, String genre, String type, String releasedBy, String cover, Boolean isLikedByCurrentUser, String album, String link, List<ArtistContributionSummaryDto> contributions, List<ReviewDto> reviews) {
    17         super(id, title, genre, type, releasedBy, cover, isLikedByCurrentUser, album, link);
     16    public SongDetailsDto(Long id, String title, String genre, String type, String releasedBy, String artistUsername, String cover, Boolean isLikedByCurrentUser, String album, Long albumId, String link, List<ReviewDto> reviews, List<ArtistContributionSummaryDto> contributions) {
     17        super(id, title, genre, type, releasedBy, artistUsername, cover, isLikedByCurrentUser, album, albumId, link);
     18        this.reviews = reviews;
    1819        this.contributions = contributions;
    19         this.reviews = reviews;
    2020    }
    2121
    22     public SongDetailsDto(Long id, String title, String genre, String type, String releasedBy, Boolean isLikedByCurrentUser, String link, List<ArtistContributionSummaryDto> contributions, List<ReviewDto> reviews) {
    23         super(id, title, genre, type, releasedBy, isLikedByCurrentUser, link);
     22    public SongDetailsDto(Long id, String title, String genre, String type, String releasedBy, String artistUsername, Boolean isLikedByCurrentUser, String link, List<ReviewDto> reviews, List<ArtistContributionSummaryDto> contributions) {
     23        super(id, title, genre, type, releasedBy, artistUsername, isLikedByCurrentUser, link);
     24        this.reviews = reviews;
    2425        this.contributions = contributions;
    25         this.reviews = reviews;
    2626    }
    2727
    28     public SongDetailsDto(Long id, String title, String genre, String type, String releasedBy, String cover, Boolean isLikedByCurrentUser, String link, List<ArtistContributionSummaryDto> contributions, List<ReviewDto> reviews) {
    29         super(id, title, genre, type, releasedBy, cover, isLikedByCurrentUser, link);
     28    public SongDetailsDto(Long id, String title, String genre, String type, String releasedBy, String artistUsername, String cover, Boolean isLikedByCurrentUser, String link, List<ReviewDto> reviews, List<ArtistContributionSummaryDto> contributions) {
     29        super(id, title, genre, type, releasedBy, artistUsername, cover, isLikedByCurrentUser, link);
     30        this.reviews = reviews;
    3031        this.contributions = contributions;
    31         this.reviews = reviews;
    3232    }
    33 
    3433}
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/model/dto/SongDto.java

    r8675f75 r8ccb07e  
    1313    // todo: clean up constructors
    1414
    15     public SongDto(Long id, String title, String genre, String type, String releasedBy, String cover, Boolean isLikedByCurrentUser, String album, String link) {
    16         super(id, title, genre, type, releasedBy, cover, isLikedByCurrentUser, album);
     15
     16    public SongDto(Long id, String title, String genre, String type, String releasedBy, String artistUsername, String cover, Boolean isLikedByCurrentUser, String album, Long albumId, String link) {
     17        super(id, title, genre, type, releasedBy, artistUsername, cover, isLikedByCurrentUser, album, albumId);
    1718        this.link = link;
    1819    }
    1920
    20     public SongDto(Long id, String title, String genre, String type, String releasedBy, Boolean isLikedByCurrentUser, String link) {
    21         super(id, title, genre, type, releasedBy, isLikedByCurrentUser);
     21    public SongDto(Long id, String title, String genre, String type, String releasedBy, String artistUsername, Boolean isLikedByCurrentUser, String link) {
     22        super(id, title, genre, type, releasedBy, artistUsername, isLikedByCurrentUser);
    2223        this.link = link;
    2324    }
    2425
    25     public SongDto(Long id, String title, String genre, String type, String releasedBy, String cover, Boolean isLikedByCurrentUser, String link) {
    26         super(id, title, genre, type, releasedBy, cover, isLikedByCurrentUser);
     26    public SongDto(Long id, String title, String genre, String type, String releasedBy, String artistUsername, String cover, Boolean isLikedByCurrentUser, String link) {
     27        super(id, title, genre, type, releasedBy, artistUsername, cover, isLikedByCurrentUser);
    2728        this.link = link;
    2829    }
    29 
    3030}
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/AlbumRepository.java

    r8675f75 r8ccb07e  
    1818    @Query("""
    1919        SELECT NEW com.ukim.finki.develop.finkwave.model.dto.MusicalEntityDto(
    20             a.id, me.title, me.genre, 'ALBUM', u.fullName, me.cover, FALSE )
     20            a.id, me.title, me.genre, 'ALBUM', u.fullName, u.username, me.cover, FALSE )
    2121        FROM Album a
    2222        JOIN a.musicalEntities me
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/LikeRepository.java

    r8675f75 r8ccb07e  
    2323                 ELSE 'UNKNOWN' END),
    2424            u.fullName,
     25            u.username,
    2526            (CASE WHEN currentUserLike.id IS NOT NULL THEN true ELSE false END))
    2627        FROM Like l
     
    4041        SELECT CASE WHEN COUNT (l)>0 THEN true ELSE false END
    4142        FROM MusicalEntity me
    42         JOIN Like  l on l.musicalEntity.id=me.id
     43        JOIN Like l on l.musicalEntity.id=me.id
    4344        WHERE l.listener.id=:userId
    4445        """)
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/repository/SongRepository.java

    r8675f75 r8ccb07e  
    1919    @Query("""
    2020        SELECT NEW com.ukim.finki.develop.finkwave.model.dto.MusicalEntityDto(
    21             s.id, me.title, me.genre, 'SONG', u.fullName, me.cover,
     21            s.id, me.title, me.genre, 'SONG', u.fullName, u.username, me.cover,
    2222            (CASE WHEN :currentUserId IS NOT NULL AND l.id IS NOT NULL THEN true ELSE false END)
    2323        )
     
    3535    @Query("""
    3636        SELECT NEW com.ukim.finki.develop.finkwave.model.dto.MusicalEntityDto(
    37             s.id, me.title, me.genre, 'SONG', u.fullName, me.cover,
     37            s.id, me.title, me.genre, 'SONG', u.fullName, u.username, me.cover,
    3838            (CASE WHEN :currentUserId IS NOT NULL AND l.id IS NOT NULL THEN true ELSE false END))
    3939        FROM Song s
     
    5555            'SONG',
    5656            s.musicalEntities.releasedBy.nonAdminUser.user.fullName,
     57            s.musicalEntities.releasedBy.nonAdminUser.user.username,
    5758            s.musicalEntities.cover,
    5859            (EXISTS (SELECT 1 FROM Like l WHERE l.musicalEntity.id = s.id AND l.listener.id = :currentUserId)),
    5960            s.album.musicalEntities.title,
     61            s.album.musicalEntities.id,
    6062            s.link
    6163        )
    6264        FROM Song s
    63         GROUP BY s.id, s.musicalEntities.title, s.musicalEntities.genre,
    64             s.musicalEntities.releasedBy.nonAdminUser.user.fullName, s.musicalEntities.cover, s.album.musicalEntities.title
     65        GROUP BY
     66            s.id,
     67            s.musicalEntities.title,
     68            s.musicalEntities.genre,
     69            s.musicalEntities.releasedBy.nonAdminUser.user.fullName,
     70            s.musicalEntities.releasedBy.nonAdminUser.user.username,
     71            s.musicalEntities.cover,
     72            s.album.musicalEntities.title,
     73            s.album.musicalEntities.id
    6574        ORDER BY count(*) desc
    6675    """)
     
    7584            'SONG',
    7685            s.musicalEntities.releasedBy.nonAdminUser.user.fullName,
     86            s.musicalEntities.releasedBy.nonAdminUser.user.username,
    7787            s.musicalEntities.cover,
    7888            (EXISTS (SELECT 1 FROM Like l WHERE l.musicalEntity.id = s.id AND l.listener.id = :currentUserId)),
     
    90100            me.title,
    91101            u.full_name,
     102            u.username,
    92103            s.link,
    93104            me.cover
     
    109120            'SONG',
    110121            u.fullName,
     122            u.username,
    111123            me.cover,
    112124            (EXISTS (
     
    116128            )),
    117129            albumMe.title,
     130            albumMe.id,
    118131            s.link
    119132        )
  • finkwave/src/main/java/com/ukim/finki/develop/finkwave/service/AlbumService.java

    r8675f75 r8ccb07e  
    3434                "ALBUM",
    3535                album.getMusicalEntities().getReleasedBy().getNonAdminUser().getUser().getFullName(),
     36                album.getMusicalEntities().getReleasedBy().getNonAdminUser().getUser().getUsername(),
    3637                likeRepository.isLikedByUser(currentUserId));
    3738        List<MusicalEntityDto>songsFromAlbum=songRepository.findSongsByAlbum(id,currentUserId);
  • frontend/src/components/Sidebar.tsx

    r8675f75 r8ccb07e  
    9797                                                        <div
    9898                                                                key={song.id}
    99                                                                 onClick={() => navigate(`/songs/${song.id}`)}
    10099                                                                className="flex items-center gap-3 p-2 rounded-lg hover:bg-white/5 cursor-pointer transition-colors group relative"
    101100                                                        >
     
    109108                                                                />
    110109                                                                <div className="flex-1 min-w-0">
    111                                                                         <p className="text-sm font-medium text-white truncate">
     110                                                                        <p
     111                                                                                onClick={() => navigate(`/songs/${song.id}`)}
     112                                                                                className="text-sm font-medium text-white truncate hover:underline cursor-pointer"
     113                                                                        >
    112114                                                                                {song.title}
    113115                                                                        </p>
    114                                                                         <p className="text-xs text-gray-400 truncate">
    115                                                                                 {song.artist}
    116                                                                         </p>
     116                                                                        <div className="flex items-center gap-1 text-xs text-gray-400">
     117                                                                                <span
     118                                                                                        onClick={(e) => {
     119                                                                                                e.stopPropagation();
     120                                                                                                if (song.artistUsername) {
     121                                                                                                        navigate(`/users/${song.artistUsername}`);
     122                                                                                                }
     123                                                                                        }}
     124                                                                                        className={`truncate ${
     125                                                                                                song.artistUsername
     126                                                                                                        ? "hover:underline cursor-pointer hover:text-white"
     127                                                                                                        : ""
     128                                                                                        }`}
     129                                                                                >
     130                                                                                        {song.artist}
     131                                                                                </span>
     132                                                                                {song.album && (
     133                                                                                        <>
     134                                                                                                <span>•</span>
     135                                                                                                <span
     136                                                                                                        onClick={(e) => {
     137                                                                                                                e.stopPropagation();
     138                                                                                                                if (song.albumId) {
     139                                                                                                                        navigate(`/collection/album/${song.albumId}`);
     140                                                                                                                }
     141                                                                                                        }}
     142                                                                                                        className={`truncate ${
     143                                                                                                                song.albumId
     144                                                                                                                        ? "hover:underline cursor-pointer hover:text-white"
     145                                                                                                                        : ""
     146                                                                                                        }`}
     147                                                                                                >
     148                                                                                                        {song.album}
     149                                                                                                </span>
     150                                                                                        </>
     151                                                                                )}
     152                                                                        </div>
    117153                                                                </div>
    118154                                                                {song.link && (
  • frontend/src/components/search/AlbumResult.tsx

    r8675f75 r8ccb07e  
     1import { useNavigate } from "react-router-dom";
    12import type { Album } from "../../utils/types";
    23
     
    67
    78const AlbumResult = ({ album }: AlbumResultProps) => {
     9        const navigate = useNavigate();
     10
    811        return (
    9                 <div className="flex items-center gap-4 p-3 rounded-lg hover:bg-white/5 cursor-pointer transition-colors group">
     12                <div
     13                        onClick={() => navigate(`/collection/album/${album.id}`)}
     14                        className="flex items-center gap-4 p-3 rounded-lg hover:bg-white/5 cursor-pointer transition-colors group"
     15                >
    1016                        <img
    1117                                src={album.cover || "/favicon.png"}
  • frontend/src/components/search/UserResult.tsx

    r8675f75 r8ccb07e  
     1import { useNavigate } from "react-router-dom";
    12import { baseURL } from "../../api/axiosInstance";
    23import type { BaseNonAdminUser } from "../../utils/types";
     
    89
    910const UserResult = ({ user, label }: UserResultProps) => {
     11        const navigate = useNavigate();
     12
    1013        return (
    11                 <div className="flex items-center gap-4 p-3 rounded-lg hover:bg-white/5 cursor-pointer transition-colors group">
     14                <div
     15                        onClick={() => navigate(`/users/${user.username}`)}
     16                        className="flex items-center gap-4 p-3 rounded-lg hover:bg-white/5 cursor-pointer transition-colors group"
     17                >
    1218                        {user.profilePhoto ? (
    1319                                <img
  • frontend/src/pages/LandingPage.tsx

    r8675f75 r8ccb07e  
    417417                                                                                                                {song.title}
    418418                                                                                                        </h3>
    419                                                                                                         <p className="text-sm text-gray-400 mb-3 overflow-hidden text-ellipsis whitespace-nowrap">
    420                                                                                                                 {song.album}
    421                                                                                                         </p>
    422                                                                                                         <p className="text-sm text-gray-400 mb-3 overflow-hidden text-ellipsis whitespace-nowrap">
     419                                                                                                        {song.album && (
     420                                                                                                                <p
     421                                                                                                                        onClick={(e) => {
     422                                                                                                                                e.stopPropagation();
     423                                                                                                                                if (song.albumId) {
     424                                                                                                                                        navigate(`/collection/album/${song.albumId}`);
     425                                                                                                                                }
     426                                                                                                                        }}
     427                                                                                                                        className={`text-sm text-gray-400 mb-3 overflow-hidden text-ellipsis whitespace-nowrap ${
     428                                                                                                                                song.albumId
     429                                                                                                                                        ? "hover:underline cursor-pointer hover:text-white"
     430                                                                                                                                        : ""
     431                                                                                                                        }`}
     432                                                                                                                >
     433                                                                                                                        {song.album}
     434                                                                                                                </p>
     435                                                                                                        )}
     436                                                                                                        <p
     437                                                                                                                onClick={(e) => {
     438                                                                                                                        e.stopPropagation();
     439                                                                                                                        if (song.artistUsername) {
     440                                                                                                                                navigate(`/users/${song.artistUsername}`);
     441                                                                                                                        }
     442                                                                                                                }}
     443                                                                                                                className={`text-sm text-gray-400 mb-3 overflow-hidden text-ellipsis whitespace-nowrap ${
     444                                                                                                                        song.artistUsername
     445                                                                                                                                ? "hover:underline cursor-pointer hover:text-white"
     446                                                                                                                                : ""
     447                                                                                                                }`}
     448                                                                                                        >
    423449                                                                                                                {song.releasedBy}
    424450                                                                                                        </p>
  • frontend/src/utils/types.ts

    r8675f75 r8ccb07e  
    2222        type: string;
    2323        releasedBy: string;
     24        artistUsername?: string;
    2425        cover?: string | null;
    2526        isLikedByCurrentUser?: boolean;
     
    2930        type: "SONG";
    3031        album?: string;
     32        albumId?: number;
    3133        link?: string;
    3234}
     
    9294        title: string;
    9395        artist: string;
     96        artistUsername?: string;
    9497        cover?: string;
    9598        link?: string;
     99        album?: string;
     100        albumId?: number;
    96101}
    97102
Note: See TracChangeset for help on using the changeset viewer.