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.

99 lines
3.0 KiB
Python

from apistar import Include, Route, http, annotate
from apistar.backends import sqlalchemy_backend
from apistar.backends.sqlalchemy_backend import Session
from apistar.frameworks.wsgi import WSGIApp as App
from apistar.handlers import docs_urls, static_urls
from apistar.interfaces import Router, Injector, Auth
from apistar_jwt.authentication import JWTAuthentication
import logbook
from cookie_api.auth import auth_routes, auth_components
from cookie_api.commands import commands
from cookie_api.models import Cookie
from cookie_api.schema import CookieSchema
from cookie_api import logging
cookie_schema = CookieSchema()
logger = logbook.Logger('Cookies')
@annotate(authentication=[JWTAuthentication()])
def get_state(injector: Injector, auth: Auth):
state = injector.state
d = dict()
for k, v in state.items():
d[k] = str(v)
return d
def get_cookies(session: Session):
logger.info("Accessing the Cookies resource")
cookies = session.query(Cookie).all()
return cookie_schema.dump(cookies, many=True).data
def get_cookie(session: Session, id):
cookie = session.query(Cookie).filter_by(id=id).one_or_none()
if cookie is None:
logger.warn("Someone keeps requesting bad cookie locations")
msg = {"error": "404 Not Found"}
return http.Response(msg, status=404)
return cookie_schema.dump(cookie).data
def create_cookie(session: Session, json_data: http.RequestData, route: Router):
cookie_data = cookie_schema.load(json_data)
#cookie = Cookie(name=json_data['name'],
# recipe_url=json_data['recipe_url'],
# sku=json_data['sku'],
# qoh=json_data['qoh'],
# unit_cost=json_data['unit_cost'])
cookie = Cookie(**cookie_data)
session.add(cookie)
session.commit()
headers = {'Location': route.reverse_url('get_cookie', dict(id=cookie.id))}
return http.Response(cookie_schema.dump(cookie), status=201, headers=headers)
def delete_cookie(session: Session, id: int):
cookie = session.query(Cookie).filter_by(id=id).one_or_none()
if cookie is None:
msg = {"error": "404 Not Found"}
return http.Response(msg, status=404)
session.delete(cookie)
return {"message": "200 OK"}
routes = [
Route('/state', 'GET', get_state),
Route('/cookies', 'GET', get_cookies),
Route('/cookies', 'POST', create_cookie),
Route('/cookies/{id}', 'GET', get_cookie),
Include('/docs', docs_urls),
Include('/static', static_urls)
]
app_settings = {
"LOGGING": {
"LEVEL": "DEBUG"
}
}
routes = routes + auth_routes
commands = sqlalchemy_backend.commands + commands
components = sqlalchemy_backend.components + auth_components
def application_factory(settings={}):
"""Returns an instance of Cookie API"""
_settings = {**app_settings, **settings}
logging.global_init(_settings)
return App(settings=_settings,
commands=commands,
components=components,
routes=routes)