Skip to content

Commit 447e02b

Browse files
committed
Use db for fetching all playlists
1 parent 36a96f0 commit 447e02b

File tree

6 files changed

+117
-9
lines changed

6 files changed

+117
-9
lines changed

backend/src/app.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from flask_cors import CORS
33
from src.controllers.database import database_controller
44
from src.controllers.spotify import spotify_controller
5+
from src.controllers.music_data import music_controller
56
from src.exceptions.Unauthorized import UnauthorizedException
67
from src.flask_config import Config
78
from src.musicbrainz import MusicbrainzClient
@@ -48,6 +49,7 @@ def handle_unauthorized_exception(_):
4849

4950
app.register_blueprint(auth_controller(spotify=spotify))
5051
app.register_blueprint(spotify_controller(spotify=spotify))
52+
app.register_blueprint(music_controller(spotify=spotify))
5153
app.register_blueprint(
5254
database_controller(spotify=spotify, musicbrainz=musicbrainz)
5355
)
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
from logging import Logger
2+
from flask import Blueprint, jsonify, make_response, request
3+
from src.database.crud.playlist import get_user_playlists
4+
from src.dataclasses.playback_info import PlaybackInfo
5+
from src.dataclasses.playback_request import StartPlaybackRequest
6+
from src.dataclasses.playlist import Playlist
7+
from src.spotify import SpotifyClient
8+
import sys
9+
10+
11+
def music_controller(spotify: SpotifyClient):
12+
music_controller = Blueprint(
13+
name="music_controller", import_name=__name__, url_prefix="/music"
14+
)
15+
16+
@music_controller.route("playlists")
17+
def index():
18+
user_id = request.cookies.get("user_id")
19+
limit = request.args.get("limit", type=int)
20+
offset = request.args.get("offset", type=int)
21+
search = request.args.get("search")
22+
sort_by = request.args.get("sort_by")
23+
desc = request.args.get("desc") == "True"
24+
return jsonify(
25+
get_user_playlists(
26+
user_id=user_id,
27+
limit=limit,
28+
offset=offset,
29+
search=search,
30+
sort_by=sort_by,
31+
desc=desc,
32+
as_dicts=True,
33+
)
34+
)
35+
36+
@music_controller.route("playlist/<id>", methods=["GET"])
37+
def get_playlist(id):
38+
access_token = request.cookies.get("spotify_access_token")
39+
playlist = spotify.get_playlist(access_token=access_token, id=id)
40+
return playlist.model_dump()
41+
42+
@music_controller.route("playlist/<id>", methods=["POST"])
43+
def post_edit_playlist(id):
44+
access_token = request.cookies.get("spotify_access_token")
45+
name = request.json.get("name")
46+
description = request.json.get("description")
47+
spotify.update_playlist(
48+
access_token=access_token,
49+
id=id,
50+
name=name,
51+
description=description,
52+
)
53+
return make_response("playlist updated", 204)
54+
55+
@music_controller.route("playlist/<id>/albums", methods=["GET"])
56+
def get_playlist_album_info(id):
57+
access_token = request.cookies.get("spotify_access_token")
58+
return [
59+
album.model_dump()
60+
for album in spotify.get_playlist_album_info(
61+
access_token=access_token, id=id
62+
)
63+
]
64+
65+
@music_controller.route("find_associated_playlists", methods=["POST"])
66+
def find_associated_playlists():
67+
access_token = request.cookies.get("spotify_access_token")
68+
user_id = request.cookies.get("user_id")
69+
playlist = Playlist.model_validate(request.json)
70+
associated_playlists = spotify.find_associated_playlists(
71+
user_id=user_id, access_token=access_token, playlist=playlist
72+
)
73+
return [
74+
associated_playlist.model_dump()
75+
for associated_playlist in associated_playlists
76+
]
77+
78+
return music_controller

backend/src/database/crud/playlist.py

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import List
1+
from typing import List, Optional
22
from src.database.crud.album import create_album_or_none
33
from src.database.models import DbAlbum, DbPlaylist, DbUser, PlaylistAlbumRelationship
44
from src.dataclasses.album import Album
@@ -46,8 +46,36 @@ def update_playlist(playlist: Playlist, albums: List[Album]):
4646
return playlist
4747

4848

49-
def get_user_playlists(user_id: str) -> List[DbPlaylist]:
50-
return DbPlaylist.select().where(DbPlaylist.user == user_id).execute()
49+
def get_user_playlists(
50+
user_id: str,
51+
limit: Optional[int] = None,
52+
offset: Optional[int] = None,
53+
search: Optional[str] = None,
54+
sort_by: Optional[str] = None,
55+
desc: bool = True,
56+
as_dicts: bool = False,
57+
) -> List[DbPlaylist]:
58+
query = DbPlaylist.select().where(DbPlaylist.user == user_id)
59+
60+
if search:
61+
query = query.where(DbPlaylist.name.contains(search))
62+
63+
if sort_by:
64+
sort_field = getattr(DbPlaylist, sort_by)
65+
if desc:
66+
query = query.order_by(sort_field.desc())
67+
else:
68+
query = query.order_by(sort_field.asc())
69+
70+
if limit is not None:
71+
query = query.limit(limit)
72+
if offset is not None:
73+
query = query.offset(offset)
74+
75+
if as_dicts:
76+
return list(query.dicts())
77+
else:
78+
return list(query.execute())
5179

5280

5381
def get_playlist_albums(playlist_id: str) -> List[DbAlbum]:

frontend/src/api/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ export const getPlaylists = async (
4343
offset: number,
4444
limit: number,
4545
): Promise<Playlist[]> => {
46-
const endpoint = `spotify/playlists?limit=${encodeURIComponent(
46+
const endpoint = `music/playlists?limit=${encodeURIComponent(
4747
limit,
4848
)}&offset=${encodeURIComponent(offset)}`;
4949
return jsonRequest(endpoint, RequestMethod.GET);
@@ -54,7 +54,7 @@ export const addPlaylist = async (playlist: Playlist): Promise<Playlist> => {
5454
};
5555

5656
export const getPlaylist = async (id: string): Promise<Playlist> => {
57-
return jsonRequest(`spotify/edit-playlist/${id}`, RequestMethod.GET);
57+
return jsonRequest(`music/playlist/${id}`, RequestMethod.GET);
5858
};
5959

6060
export const updatePlaylist = async (playlist: Playlist): Promise<Playlist> => {
@@ -76,7 +76,7 @@ export const getPlaylistAlbums = async (
7676
playlistId: string,
7777
): Promise<Album[]> => {
7878
return jsonRequest(
79-
`spotify/playlist/${playlistId}/albums`,
79+
`music/playlist/${playlistId}/albums`,
8080
RequestMethod.GET,
8181
);
8282
};

frontend/src/interfaces/Playlist.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export interface Playlist {
1818
};
1919
href: string;
2020
id: string;
21-
images: Image[];
21+
image_url: string;
2222
owner: User;
2323
public: false;
2424
snapshot_id: string;

frontend/src/playlistTable/PlaylistTable.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ const PlaylistTable: FC<IPlaylistTable> = ({ playlists }) => {
2929
id: "image",
3030
size: 20,
3131
cell: ({ row }) => {
32-
if (row.original.images?.[0]?.url) {
32+
if (row.original.image_url) {
3333
return (
34-
<img src={row.original.images[0].url} className="w-full"></img>
34+
<img src={row.original.image_url} className="w-full"></img>
3535
);
3636
}
3737
return <PlaylistIcon className="w-full h-full fill-primary-500" />;

0 commit comments

Comments
 (0)