You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

58 lines
1.7 KiB
Python

import typing
import logbook
from apistar import http, Route, App
from apistar_jwt import authentication_required, JWTUser
from sqlalchemy.orm import Session
from cookie_api.models import Cookie
from cookie_api.schema import CookieSchema
from cookie_api.util import MetaJSONResponse
logger = logbook.Logger(__name__)
def get_cookies(session: Session) -> typing.List[CookieSchema]:
cookies = session.query(Cookie).all()
logger.debug('Cookies collection hit')
return MetaJSONResponse([CookieSchema(cookie) for cookie in cookies])
def get_cookie(session: Session, id) -> CookieSchema:
cookie = session.query(Cookie).filter_by(id=id).one_or_none()
if cookie is None:
msg = {"error": "404 Not Found"}
return MetaJSONResponse(msg, 404)
return MetaJSONResponse(CookieSchema(cookie))
@authentication_required
def create_cookie(session: Session, cookie_data: CookieSchema, app: App, user: JWTUser):
cookie = Cookie(**cookie_data)
session.add(cookie)
session.commit()
headers = {'Location': app.reverse_url('get_cookie', id=cookie.id)}
return MetaJSONResponse(CookieSchema(cookie), 201, headers)
@authentication_required
def delete_cookie(session: Session, id: int, user: JWTUser):
cookie = session.query(Cookie).filter_by(id=id).one_or_none()
if cookie is None:
msg = {"error": "404 Not Found"}
return MetaJSONResponse(msg, 204)
logger.debug("Deleting cookie {} {}".format(cookie.id, cookie.name))
session.delete(cookie)
session.commit()
return MetaJSONResponse({}, 204)
cookie_routes = [
Route('/cookies', 'GET', get_cookies),
Route('/cookies', 'POST', create_cookie),
Route('/cookies/{id}', 'GET', get_cookie),
Route('/cookies/{id}', 'DELETE', delete_cookie)
]