File size: 3,025 Bytes
d2726bc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
from fastapi import (
    APIRouter,
    Depends,
    HTTPException,
    status,
    Security,
)
from models.music import Album, BaseAlbum
from db.supabase_service import get_supabase
from typing import Annotated, List, Tuple
from supabase import Client
from utils.auth import get_id
from fastapi.encoders import jsonable_encoder
from utils.exceptions import BAD_REQUEST

router = APIRouter(tags=["Album"], prefix="/album")


@router.post("", description="Create album")
async def create_album(
    supabase: Annotated[Client, Depends(get_supabase)],
    user_id: Annotated[str, Security(get_id)],
    album: BaseAlbum,
):
    try:
        supabase.table("albums").insert(
            {"name": album.name, "description": album.description, "user_id": user_id}
        ).execute()
        return {"detail": "Album created"}
    except:
        raise BAD_REQUEST


# delete album
@router.delete("", description="Delete album")
async def delete_album(
    supabase: Annotated[Client, Depends(get_supabase)],
    user_id: Annotated[str, Security(get_id)],
    album_id: int,
):
    try:
        supabase.table("albums").delete().eq("id", album_id).execute()
        return {"detail": "Album deleted"}
    except:
        raise BAD_REQUEST


# get list of all album
@router.get("/all", description="Get list of all album", response_model=List[Album])
async def get_all_album(
    supabase: Annotated[Client, Depends(get_supabase)],
    user_id: Annotated[str, Security(get_id)],
) -> List[Album]:
    try:
        res = supabase.table("albums").select("*").execute().dict()["data"]
        return res
    except:
        raise BAD_REQUEST


# modify album
@router.patch("", description="Modify album")
async def modify_album(
    supabase: Annotated[Client, Depends(get_supabase)],
    user_id: Annotated[str, Security(get_id)],
    album: Album,
    songs: List[int],
):
    try:
        if album.user_id != user_id:
            raise HTTPException(
                status_code=status.HTTP_400_BAD_REQUEST,
                detail="You are not the owner of this album",
            )
        supabase.table("albums").update(
            jsonable_encoder(album, exclude={"id", "user_id", "created_at"})
        ).eq("id", album.id).execute()
        supabase.table("songs").update({"album_id": None}).eq(
            "album_id", album.id
        ).execute()
        supabase.table("songs").update({"album_id": album.id}).in_(
            "id", songs
        ).execute()
        return {"detail": "Album modified"}
    except:
        raise BAD_REQUEST


# get album and its songs
@router.get("", description="Get album and its songs")
async def get_album(
    supabase: Annotated[Client, Depends(get_supabase)],
    user_id: Annotated[str, Security(get_id)],
    album_id: int,
):
    try:
        res = (
            supabase.table("albums")
            .select("*, songs(*)")
            .eq("id", album_id)
            .execute()
            .dict()["data"][0]
        )
        return res
    except:
        raise BAD_REQUEST