[PROJECT] AIRBNB CLONING #5

김기현·2022년 3월 26일
0

project_airbnb

목록 보기
5/6
post-thumbnail

Wishlist API

해당 방을 저장하기를 하면 원하는 이름의 위시리스트를 만들고 해당 폴더 안에 저장할 수 있습니다. 그렇기에 모델링을 할 때 wishlist라는 테이블에 이름과 사용자의 테이블이 필요했고, 방과 위시리스트를 잇는 wishlistroom이라는 중간테이블이 필요했습니다.

users/urls

from django.urls import path
from users.views import KakaoSignIn, WishlistView

urlpatterns = [
    path("/login/kakao", KakaoSignIn.as_view()),
    path("/wishlist", WishlistView.as_view()),
]

users/views

import json, jwt, requests, datetime

from django.views     import View
from django.http      import JsonResponse

from rooms.models import Room
from users.models import User, Wishlist, WishlistRoom
from core.utils   import login_decorator
from my_settings  import SECRET_KEY, ALGORITHM

class WishlistView(View):
    @login_decorator
    def post(self, request):
        try:
            data      = json.loads(request.body)
            room_id   = data['room_id']
            list_id   = data['list_id']
            list_name = data['list_name']
            
            rooms = Room.objects.get(id=room_id)
            user = request.user

            if not Wishlist.objects.filter(id=list_id, user=user).exists():
                wishlist = Wishlist.objects.create(
                    user = user,
                    name = list_name
                )
            else:
                wishlist = Wishlist.objects.get(id=list_id, user=user)
                
            WishlistRoom.objects.create(
                room     = rooms,
                wishlist = wishlist
            )
            return  JsonResponse({'message' : 'LIKED'}, status = 201)
            
        except KeyError:
            return JsonResponse({'message' : 'KEY_ERROR'}, status = 400)        
        except Room.DoesNotExist:
            return JsonResponse({'message' : 'ROOM_DOES_NOT_EXIST'}, status = 400)

body에 room_id, list_id, list_name의 항목을 담아 json으로 실어보냅니다.

userlogin_decorator의 request.user로 받아 사용하며 해당 방에게 wishlist를 저장해야 하므로 id=room_id로 지정하였습니다.

만약 Wishlist에 객체가 없다면 생성을 하고 그렇지 않다면 get을 합니다. 그러면서 중간테이블인 wishlistroom을 동시에 생성하도록 하는 로직입니다.

에러가 생길 경우를 대비해 적절한 예외처리를 해주었습니다.

profile
피자, 코드, 커피를 사랑하는 피코커

0개의 댓글