diff --git a/ordr3/repo.py b/ordr3/repo.py index c8148e9..2c8fd96 100644 --- a/ordr3/repo.py +++ b/ordr3/repo.py @@ -3,10 +3,17 @@ import abc from sqlalchemy import func +from sqlalchemy.orm.exc import NoResultFound from . import models +class RepoItemNotFound(StopIteration): + """ repo error for a not found item """ + + pass + + class AbstractOrderRepository(abc.ABC): """ Abstract base class for a datastore """ @@ -63,9 +70,14 @@ class SqlAlchemyRepository(AbstractOrderRepository): def get_order(self, reference): """ get an order from the database by primary key """ - return ( - self.session.query(models.OrderItem).filter_by(id=reference).one() - ) + try: + return ( + self.session.query(models.OrderItem) + .filter_by(id=reference) + .one() + ) + except NoResultFound as exc: + raise RepoItemNotFound from exc def list_orders(self): """ list orders orderd by date, descending """ @@ -81,21 +93,34 @@ class SqlAlchemyRepository(AbstractOrderRepository): def get_user(self, reference): """ get a user from the database by primary key """ - return self.session.query(models.User).filter_by(id=reference).one() + try: + return ( + self.session.query(models.User).filter_by(id=reference).one() + ) + except NoResultFound as exc: + raise RepoItemNotFound from exc def get_user_by_username(self, reference): """ get a user from the database by username """ - return ( - self.session.query(models.User).filter_by(username=reference).one() - ) + try: + return ( + self.session.query(models.User) + .filter_by(username=reference) + .one() + ) + except NoResultFound as exc: + raise RepoItemNotFound from exc def get_user_by_email(self, reference): """ get a user from the database by email """ - return ( - self.session.query(models.User) - .filter(func.lower(models.User.email) == func.lower(reference)) - .one() - ) + try: + return ( + self.session.query(models.User) + .filter(func.lower(models.User.email) == func.lower(reference)) + .one() + ) + except NoResultFound as exc: + raise RepoItemNotFound from exc def list_users(self): """ list users orderd by username """