From 938bb67e0a62c95e1c967e6965e3ed2eee1984bb Mon Sep 17 00:00:00 2001 From: tanshu Date: Mon, 15 Jun 2020 21:40:12 +0530 Subject: [PATCH] All Masters Done!! --- barker/main.py | 13 + barker/models/master.py | 5 +- barker/routers/food_table.py | 160 ------------ barker/routers/modifier.py | 175 +++++++------ barker/routers/printer.py | 192 ++++++++------- barker/routers/section.py | 147 ++++++----- barker/routers/section_printer.py | 229 +++++++++--------- barker/routers/table.py | 200 +++++++++++++++ barker/schemas/master.py | 150 +----------- barker/schemas/menu_category.py | 40 +++ barker/schemas/modifier.py | 33 +++ barker/schemas/modifier_category.py | 37 +++ barker/schemas/printer.py | 33 +++ barker/schemas/product.py | 46 ++++ barker/schemas/sale_category.py | 33 +++ barker/schemas/section.py | 27 +++ barker/schemas/section_printer.py | 30 +++ barker/schemas/table.py | 35 +++ barker/schemas/tax.py | 37 +++ bookie/angular.json | 2 +- bookie/proxy.conf.json | 5 - bookie/src/app/core/printer.ts | 6 +- bookie/src/app/core/section-printer.ts | 13 +- bookie/src/app/modifiers/modifier.service.ts | 34 +-- bookie/src/app/printers/printer.service.ts | 21 +- .../section-printer-datasource.ts | 8 +- .../section-printer-resolver.service.ts | 4 +- .../section-printer.component.html | 4 +- .../section-printer.component.ts | 49 ++-- .../section-printer.service.ts | 40 +-- .../section-printers-routing.module.ts | 4 +- bookie/src/app/sections/section.service.ts | 21 +- bookie/src/app/tables/table.service.ts | 14 +- 33 files changed, 1082 insertions(+), 765 deletions(-) delete mode 100644 barker/routers/food_table.py create mode 100644 barker/routers/table.py create mode 100644 barker/schemas/menu_category.py create mode 100644 barker/schemas/modifier.py create mode 100644 barker/schemas/modifier_category.py create mode 100644 barker/schemas/printer.py create mode 100644 barker/schemas/product.py create mode 100644 barker/schemas/sale_category.py create mode 100644 barker/schemas/section.py create mode 100644 barker/schemas/section_printer.py create mode 100644 barker/schemas/table.py create mode 100644 barker/schemas/tax.py diff --git a/barker/main.py b/barker/main.py index 71f1f4a..dde7be9 100644 --- a/barker/main.py +++ b/barker/main.py @@ -23,13 +23,18 @@ from .routers import ( # lock_information, # maintenance, menu_category, + modifier, modifier_category, + printer, product, # rebase, # reset_stock, # recipe, login, sale_category, + section, + section_printer, + table, tax, # journal, # purchase, @@ -78,13 +83,21 @@ app.include_router(login.router, tags=["login"]) # app.include_router(cost_centre.router, prefix="/api/cost-centres", tags=["cost-centres"]) # app.include_router(employee.router, prefix="/api/employees", tags=["employees"]) # app.include_router(fingerprint.router, prefix="/api/fingerprint", tags=["employees"]) + +app.include_router(printer.router, prefix="/api/printers", tags=["printers"]) + app.include_router(menu_category.router, prefix="/api/menu-categories", tags=["products"]) app.include_router(product.router, prefix="/api/products", tags=["products"]) app.include_router(sale_category.router, prefix="/api/sale-categories", tags=["products"]) app.include_router(tax.router, prefix="/api/taxes", tags=["products"]) +app.include_router(modifier.router, prefix="/api/modifiers", tags=["modifiers"]) app.include_router(modifier_category.router, prefix="/api/modifier-categories", tags=["modifiers"]) +app.include_router(section.router, prefix="/api/sections", tags=["sections"]) +app.include_router(section_printer.router, prefix="/api/section-printers", tags=["section-printers"]) +app.include_router(table.router, prefix="/api/tables", tags=["tables"]) + app.include_router(client.router, prefix="/api/clients", tags=["clients"]) app.include_router(role.router, prefix="/api/roles", tags=["users"]) app.include_router(user.router, prefix="/api/users", tags=["users"]) diff --git a/barker/models/master.py b/barker/models/master.py index 3cddd54..266ef81 100644 --- a/barker/models/master.py +++ b/barker/models/master.py @@ -47,12 +47,13 @@ class FoodTable(Base): id = Column("id", UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) name = Column("name", Unicode(255), nullable=False, unique=True) - seats = Column("seats", Numeric, nullable=False) + seats = Column("seats", Integer, nullable=False) section_id = Column("section_id", UUID(as_uuid=True), ForeignKey("sections.id"), nullable=False) - section = relationship("Section", foreign_keys=section_id) is_active = Column("is_active", Boolean, nullable=False) sort_order = Column("sort_order", Integer, nullable=False) + section = relationship("Section", foreign_keys=section_id) + @property def __name__(self): return self.name diff --git a/barker/routers/food_table.py b/barker/routers/food_table.py deleted file mode 100644 index 1145057..0000000 --- a/barker/routers/food_table.py +++ /dev/null @@ -1,160 +0,0 @@ -import uuid -import transaction -from pyramid.view import view_config -from barker.models import FoodTable, Overview -from barker.models.validation_exception import ValidationError - - -@view_config( - request_method="POST", route_name="v1_tables_new", renderer="json", permission="Tables", trans=True, -) -def save(request): - json = request.json_body - - name = json.get("name", "").strip() - if name == "": - raise ValidationError("Name cannot be blank") - try: - seats = int(json.get("seats", 0)) - if seats < 0: - raise ValidationError("Seats must be an integer >= 0") - except ValueError: - raise ValidationError("Seats must be an integer >= 0") - section = json.get("section", None) - if section is None: - raise ValidationError("please choose a section") - section_id = uuid.UUID(section["id"]) - is_active = json.get("isActive", True) - item = FoodTable(name, seats, section_id, is_active) - request.dbsession.add(item) - transaction.commit() - return food_table_info(item.id, request.dbsession) - - -@view_config( - request_method="PUT", route_name="v1_tables_id", renderer="json", permission="Tables", trans=True, -) -def update(request): - item = request.dbsession.query(FoodTable).filter(FoodTable.id == uuid.UUID(request.matchdict["id"])).first() - json = request.json_body - item.name = json["name"].strip() - if item.name == "": - raise ValidationError("Name cannot be blank") - try: - item.seats = int(json.get("seats", 0)) - if item.seats < 0: - raise ValidationError("Seats must be an integer >= 0") - except ValueError: - raise ValidationError("Seats must be an integer >= 0") - item.section_id = uuid.UUID(json["section"]["id"]) - item.is_active = json.get("isActive", True) - transaction.commit() - return food_table_info(item.id, request.dbsession) - - -@view_config( - request_method="DELETE", route_name="v1_tables_id", renderer="json", permission="Tables", trans=True, -) -def delete(request): - item = request.dbsession.query(FoodTable).filter(FoodTable.id == uuid.UUID(request.matchdict["id"])).first() - request.dbsession.delete(item) - transaction.commit() - return {None, request.dbsession} - - -@view_config( - request_method="GET", route_name="v1_tables_id", renderer="json", permission="Authenticated", -) -def show_id(request): - id_ = uuid.UUID(request.matchdict["id"]) - return food_table_info(id_, request.dbsession) - - -@view_config(request_method="GET", route_name="v1_tables_new", renderer="json", request_param="v") -def show_voucher(request): - voucher_id = request.GET["v"] - voucher = request.dbsession.query(Overview).filter(Overview.voucher_id == voucher_id).first() - if voucher is not None: - return food_table_info(voucher.food_table, request.dbsession) - return {} - - -@view_config( - request_method="GET", route_name="v1_tables_new", renderer="json", permission="Tables", -) -def show_blank(request): - return food_table_info(None, request.dbsession) - - -@view_config( - request_method="GET", route_name="v1_tables_list", renderer="json", request_param="r", permission="Authenticated", -) -def show_running(request): - list_ = request.dbsession.query(FoodTable).filter(FoodTable.is_active == True).order_by(FoodTable.sort_order).all() - - food_tables = [] - for item in list_: - ft = { - "id": item.id, - "name": item.name, - "seats": item.seats, - "section": {"id": item.section_id, "name": item.section.name}, - "isActive": item.is_active, - "sortOrder": item.sort_order, - } - if item.status is not None: - ft["status"] = item.status.status - ft["voucherId"] = item.status.voucher_id - ft["pax"] = item.status.voucher.pax - ft["date"] = item.status.voucher.date.strftime("%d-%b-%Y %H:%M") - ft["amount"] = item.status.voucher.amount - if item.status.guest is not None: - ft["guest"] = item.status.guest.customer.name - food_tables.append(ft) - return food_tables - - -@view_config( - request_method="GET", route_name="v1_tables_list", renderer="json", permission="Authenticated", -) -def show_list(request): - return [ - { - "id": item.id, - "name": item.name, - "seats": item.seats, - "section": {"id": item.section_id, "name": item.section.name}, - "isActive": item.is_active, - "sortOrder": item.sort_order, - } - for item in request.dbsession.query(FoodTable).order_by(FoodTable.sort_order).all() - ] - - -@view_config( - request_method="POST", route_name="v1_tables_list", renderer="json", permission="Tables", -) -def sort_order(request): - json = request.json_body - for index, item in enumerate(json): - request.dbsession.query(FoodTable).filter(FoodTable.id == uuid.UUID(item["id"])).update( - {FoodTable.sort_order: index} - ) - return True - - -def food_table_info(item, dbsession): - if item is None: - return {"name": "", "seats": 0, "section": {}, "isActive": True, "sortOrder": 0} - if type(item) == uuid.UUID: - item = dbsession.query(FoodTable).filter(FoodTable.id == item).first() - return { - "id": item.id, - "name": item.name, - "seats": item.seats, - "section": {"id": item.section_id, "name": item.section.name}, - "isActive": item.is_active, - "status": "" if item.status is None else item.status.status, - "sortOrder": item.sort_order, - "voucherId": None if item.status is None else item.status.voucher_id, - } diff --git a/barker/routers/modifier.py b/barker/routers/modifier.py index f754adf..f6f92b4 100644 --- a/barker/routers/modifier.py +++ b/barker/routers/modifier.py @@ -1,100 +1,119 @@ import uuid -from decimal import Decimal, InvalidOperation +from typing import Optional -import transaction +from fastapi import APIRouter, HTTPException, status, Depends, Security +from sqlalchemy.exc import SQLAlchemyError +from sqlalchemy.orm import Session -from pyramid.view import view_config +from ..schemas.auth import UserToken +import barker.schemas.master as schemas +from ..core.security import get_current_active_user as get_user +from ..db.session import SessionLocal +from ..models.master import Modifier -from barker.models import Modifier -from barker.models.validation_exception import ValidationError +router = APIRouter() -@view_config( - request_method="POST", route_name="v1_modifiers_new", renderer="json", permission="Modifiers", trans=True, -) -def save(request): - json = request.json_body - - name = json.get("name", "").strip() - if name == "": - raise ValidationError("Name cannot be blank") - show_in_bill = json.get("showInBill", False) +# Dependency +def get_db(): try: - price = Decimal(json.get("price", 0)) - if price < 0: - raise ValidationError("Price must be a decimal >= 0") - except (ValueError, InvalidOperation): - raise ValidationError("Price must be a decimal >= 0") - modifier_category = json.get("modifierCategory", None) - if modifier_category is None: - raise ValidationError("please choose a modifier category") - modifier_category_id = uuid.UUID(modifier_category["id"]) - is_active = json.get("isActive", True) - - item = Modifier(name, show_in_bill, price, modifier_category_id, is_active) - request.dbsession.add(item) - transaction.commit() - return modifier_info(item.id, request.dbsession) + db = SessionLocal() + yield db + finally: + db.close() -@view_config( - request_method="PUT", route_name="v1_modifiers_id", renderer="json", permission="Modifiers", trans=True, -) -def update(request): - item = request.dbsession.query(Modifier).filter(Modifier.id == uuid.UUID(request.matchdict["id"])).first() - json = request.json_body - item.name = json["name"].strip() - if item.name == "": - raise ValidationError("Name cannot be blank") - item.show_in_bill = json["showInBill"] +@router.post("/", response_model=schemas.Modifier) +def save( + data: schemas.ModifierIn, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["modifiers"]), +): try: - item.price = Decimal(json["price"]) - if item.price < 0: - raise ValidationError("Price must be a decimal >= 0") - except (ValueError, InvalidOperation): - raise ValidationError("Price must be a decimal >= 0") - item.modifier_category_id = uuid.UUID(json["modifierCategory"]["id"]) - item.is_active = json["isActive"] - transaction.commit() - return modifier_info(item.id, request.dbsession) + item = Modifier( + name=data.name, + show_in_bill=data.show_in_bill, + price=data.price, + modifier_category_id=data.modifier_category.id_, + is_active=data.is_active, + ) + db.add(item) + db.commit() + return modifier_info(item) + except SQLAlchemyError as e: + db.rollback() + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e), + ) + except Exception: + db.rollback() + raise -@view_config( - request_method="DELETE", route_name="v1_modifiers_id", renderer="json", permission="Modifiers", trans=True, -) -def delete(request): - item = request.dbsession.query(Modifier).filter(Modifier.id == uuid.UUID(request.matchdict["id"])).first() - request.dbsession.delete(item) - transaction.commit() - return {} +@router.put("/{id_}", response_model=schemas.Modifier) +def update( + id_: uuid.UUID, + data: schemas.ModifierIn, + db: Session = Depends(get_db), + user: UserToken = Security(get_user, scopes=["modifiers"]), +): + try: + item: Modifier = db.query(Modifier).filter(Modifier.id == id_).first() + item.name = data.name + item.show_in_bill = data.show_in_bill + item.price = data.price + item.modifier_category_id = data.modifier_category.id_ + item.is_active = data.is_active + db.commit() + return modifier_info(item) + except SQLAlchemyError as e: + db.rollback() + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e), + ) + except Exception: + db.rollback() + raise -@view_config( - request_method="GET", route_name="v1_modifiers_new", renderer="json", permission="Authenticated", -) -def show_blank(request): - return modifier_info(None, request.dbsession) +@router.delete("/{id_}") +def delete( + id_: uuid.UUID, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["modifiers"]), +): + try: + item: Modifier = db.query(Modifier).filter(Modifier.id == id_).first() + db.delete(item) + db.commit() + return modifier_info(item) + except SQLAlchemyError as e: + db.rollback() + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e), + ) + except Exception: + db.rollback() + raise -@view_config( - request_method="GET", route_name="v1_modifiers_id", renderer="json", permission="Authenticated", -) -def show_id(request): - id_ = uuid.UUID(request.matchdict["id"]) - return modifier_info(id_, request.dbsession) +@router.get("/") +def show_blank( + db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["modifiers"]), +): + return modifier_info(None) -@view_config( - request_method="GET", route_name="v1_modifiers_list", renderer="json", permission="Authenticated", -) -def show_list(request): - return [ - modifier_info(item, request.dbsession) - for item in request.dbsession.query(Modifier).order_by(Modifier.name).all() - ] +@router.get("/list") +def show_list(db: Session = Depends(get_db), user: UserToken = Depends(get_user)): + return [modifier_info(item) for item in db.query(Modifier).order_by(Modifier.name).all()] -def modifier_info(item, dbsession): +@router.get("/{id_}") +def show_id( + id_: uuid.UUID, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["modifiers"]), +): + item: Modifier = db.query(Modifier).filter(Modifier.id == id_).first() + return modifier_info(item) + + +def modifier_info(item: Optional[Modifier]): if item is None: return { "name": "", @@ -103,8 +122,6 @@ def modifier_info(item, dbsession): "isActive": True, "modifierCategory": {}, } - if type(item) is uuid.UUID: - item = dbsession.query(Modifier).filter(Modifier.id == item).first() return { "id": item.id, "name": item.name, diff --git a/barker/routers/printer.py b/barker/routers/printer.py index 6ac1f52..0f3501e 100644 --- a/barker/routers/printer.py +++ b/barker/routers/printer.py @@ -1,94 +1,116 @@ import uuid -import transaction -from pyramid.view import view_config +from typing import Optional -from barker.models import Printer -from barker.models.validation_exception import ValidationError +from fastapi import APIRouter, HTTPException, status, Depends, Security +from sqlalchemy.exc import SQLAlchemyError +from sqlalchemy.orm import Session + +from ..schemas.auth import UserToken +import barker.schemas.master as schemas +from ..core.security import get_current_active_user as get_user +from ..db.session import SessionLocal +from ..models.master import SaleCategory, Printer + +router = APIRouter() -@view_config( - request_method="POST", route_name="v1_printers_new", renderer="json", permission="Printers", trans=True, -) -def save(request): - json = request.json_body - name = json.get("name", "").strip() - if name == "": - raise ValidationError("Name cannot be blank") - address = json.get("address", "").strip() - if address == "": - raise ValidationError("Address cannot be blank") - cut_code = json.get("cutCode", "") - item = Printer(name, address, cut_code) - request.dbsession.add(item) - transaction.commit() - return printer_info(item.id, request.dbsession) +# Dependency +def get_db(): + try: + db = SessionLocal() + yield db + finally: + db.close() -@view_config( - request_method="PUT", route_name="v1_printers_id", renderer="json", permission="Printers", trans=True, -) -def update(request): - json = request.json_body - item = request.dbsession.query(Printer).filter(Printer.id == uuid.UUID(request.matchdict["id"])).first() - item.name = json.get("name", "").strip() - if item.name == "": - raise ValidationError("Name cannot be blank") - item.address = json.get("address", "").strip() - if item.address == "": - raise ValidationError("Address cannot be blank") - item.cut_code = json.get("cutCode", "") - transaction.commit() - return printer_info(item.id, request.dbsession) - - -@view_config( - request_method="DELETE", route_name="v1_printers_id", renderer="json", permission="Printers", trans=True, -) -def delete(request): - item = request.dbsession.query(Printer).filter(Printer.id == uuid.UUID(request.matchdict["id"])).first() - if item.is_fixture: - raise ValidationError("{0} is a fixture and cannot be edited or deleted.".format(item.full_name)) - request.dbsession.delete(item) - transaction.commit() - return printer_info(None, request.dbsession) - - -@view_config( - request_method="GET", route_name="v1_printers_new", renderer="json", permission="Authenticated", -) -def show_blank(request): - return printer_info(None, request.dbsession) - - -@view_config( - request_method="GET", route_name="v1_printers_id", renderer="json", permission="Authenticated", -) -def show_id(request): - return printer_info(uuid.UUID(request.matchdict["id"]), request.dbsession) - - -@view_config( - request_method="GET", route_name="v1_printers_list", renderer="json", permission="Authenticated", -) -def show_list(request): - list_ = request.dbsession.query(Printer).order_by(Printer.name).all() - printers = [] - for item in list_: - printers.append( - {"id": item.id, "name": item.name, "address": item.address, "cutCode": item.cut_code,} +@router.post("/", response_model=schemas.Printer) +def save( + data: schemas.PrinterIn, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["printers"]), +): + try: + item = Printer(name=data.name, address=data.address, cut_code=data.cut_code) + db.add(item) + db.commit() + return printer_info(item) + except SQLAlchemyError as e: + db.rollback() + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e), ) - return printers + except Exception: + db.rollback() + raise -def printer_info(id_, dbsession): - if id_ is None: - printer = {"name": "", "address": "", "cutCode": ""} - else: - item = dbsession.query(Printer).filter(Printer.id == id_).first() - printer = { - "id": item.id, - "name": item.name, - "address": item.address, - "cutCode": item.cut_code, - } - return printer +@router.put("/{id_}", response_model=schemas.Printer) +def update( + id_: uuid.UUID, + data: schemas.PrinterIn, + db: Session = Depends(get_db), + user: UserToken = Security(get_user, scopes=["printers"]), +): + try: + item: Printer = db.query(Printer).filter(Printer.id == id_).first() + item.name = data.name + item.address = data.address + item.cut_code = data.cut_code + db.commit() + return printer_info(item) + except SQLAlchemyError as e: + db.rollback() + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e), + ) + except Exception: + db.rollback() + raise + + +@router.delete("/{id_}") +def delete( + id_: uuid.UUID, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["printers"]), +): + try: + item: Printer = db.query(Printer).filter(Printer.id == id_).first() + db.delete(item) + db.commit() + return printer_info(None) + except SQLAlchemyError as e: + db.rollback() + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e), + ) + except Exception: + db.rollback() + raise + + +@router.get("/") +def show_blank( + db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=[""]), +): + return printer_info(None) + + +@router.get("/list") +def show_list(db: Session = Depends(get_db), user: UserToken = Depends(get_user)): + return [printer_info(item) for item in db.query(Printer).order_by(Printer.name).all()] + + +@router.get("/{id_}") +def show_id( + id_: uuid.UUID, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["printers"]), +): + item: Printer = db.query(Printer).filter(Printer.id == id_).first() + return printer_info(item) + + +def printer_info(item: Optional[Printer]): + if item is None: + return {"name": "", "address": "", "cutCode": ""} + return { + "id": item.id, + "name": item.name, + "address": item.address, + "cutCode": item.cut_code, + } diff --git a/barker/routers/section.py b/barker/routers/section.py index cd94493..4ae2ec2 100644 --- a/barker/routers/section.py +++ b/barker/routers/section.py @@ -1,76 +1,109 @@ import uuid -import transaction -from pyramid.view import view_config +from typing import Optional -from barker.models import Section -from barker.models.validation_exception import ValidationError +from fastapi import APIRouter, HTTPException, status, Depends, Security +from sqlalchemy.exc import SQLAlchemyError +from sqlalchemy.orm import Session + +from ..schemas.auth import UserToken +import barker.schemas.master as schemas +from ..core.security import get_current_active_user as get_user +from ..db.session import SessionLocal +from ..models.master import Section + +router = APIRouter() -@view_config( - request_method="POST", route_name="v1_sections_new", renderer="json", permission="Sections", trans=True, -) -def save(request): - json = request.json_body - name = json.get("name", "").strip() - if name == "": - raise ValidationError("Name cannot be blank") - item = Section(name) - request.dbsession.add(item) - transaction.commit() - return section_info(item.id, request.dbsession) +# Dependency +def get_db(): + try: + db = SessionLocal() + yield db + finally: + db.close() -@view_config( - request_method="PUT", route_name="v1_sections_id", renderer="json", permission="Sections", trans=True, -) -def update(request): - json = request.json_body - item = request.dbsession.query(Section).filter(Section.id == uuid.UUID(request.matchdict["id"])).first() - item.name = json.get("name", "").strip() - if item.name == "": - raise ValidationError("Name cannot be blank") - transaction.commit() - return section_info(item.id, request.dbsession) +@router.post("/", response_model=schemas.Section) +def save( + data: schemas.SectionIn, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["sections"]), +): + try: + item = Section(name=data.name) + db.add(item) + db.commit() + return section_info(item) + except SQLAlchemyError as e: + db.rollback() + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e), + ) + except Exception: + db.rollback() + raise -@view_config( - request_method="DELETE", route_name="v1_sections_id", renderer="json", permission="Sections", trans=True, -) -def delete(request): - item = request.dbsession.query(Section).filter(Section.id == uuid.UUID(request.matchdict["id"])).first() - if item.is_fixture: - raise ValidationError("{0} is a fixture and cannot be edited or deleted.".format(item.full_name)) - request.dbsession.delete(item) - transaction.commit() - return section_info(None, request.dbsession) +@router.put("/{id_}", response_model=schemas.Section) +def update( + id_: uuid.UUID, + data: schemas.SectionIn, + db: Session = Depends(get_db), + user: UserToken = Security(get_user, scopes=["sections"]), +): + try: + item: Section = db.query(Section).filter(Section.id == id_).first() + item.name = data.name + db.commit() + return section_info(item) + except SQLAlchemyError as e: + db.rollback() + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e), + ) + except Exception: + db.rollback() + raise -@view_config( - request_method="GET", route_name="v1_sections_new", renderer="json", permission="Authenticated", -) -def show_blank(request): - return section_info(None, request.dbsession) +@router.delete("/{id_}") +def delete( + id_: uuid.UUID, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["sections"]), +): + try: + item: Section = db.query(Section).filter(Section.id == id_).first() + db.delete(item) + db.commit() + return section_info(None) + except SQLAlchemyError as e: + db.rollback() + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e), + ) + except Exception: + db.rollback() + raise -@view_config( - request_method="GET", route_name="v1_sections_id", renderer="json", permission="Authenticated", -) -def show_id(request): - return section_info(uuid.UUID(request.matchdict["id"]), request.dbsession) +@router.get("/") +def show_blank( + db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["sections"]), +): + return section_info(None) -@view_config( - request_method="GET", route_name="v1_sections_list", renderer="json", permission="Authenticated", -) -def show_list(request): - return [ - section_info(item, request.dbsession) for item in request.dbsession.query(Section).order_by(Section.name).all() - ] +@router.get("/list") +def show_list(db: Session = Depends(get_db), user: UserToken = Depends(get_user)): + return [section_info(item) for item in db.query(Section).order_by(Section.name).all()] -def section_info(item, dbsession): +@router.get("/{id_}") +def show_id( + id_: uuid.UUID, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["sections"]), +): + item: Section = db.query(Section).filter(Section.id == id_).first() + return section_info(item) + + +def section_info(item: Optional[Section]): if item is None: return {"name": ""} - if type(item) is uuid.UUID: - item = dbsession.query(Section).filter(Section.id == item).first() return {"id": item.id, "name": item.name} diff --git a/barker/routers/section_printer.py b/barker/routers/section_printer.py index 43eb053..b68c7d7 100644 --- a/barker/routers/section_printer.py +++ b/barker/routers/section_printer.py @@ -1,136 +1,145 @@ import uuid +from typing import Optional, List -import transaction -from pyramid.view import view_config +from fastapi import APIRouter, HTTPException, status, Depends, Security from sqlalchemy import and_ +from sqlalchemy.exc import SQLAlchemyError +from sqlalchemy.orm import Session from sqlalchemy.dialects.postgresql import insert as pg_insert -from zope.sqlalchemy import mark_changed -from barker.models import SectionPrinter, MenuCategory -from barker.models.validation_exception import ValidationError +from ..schemas.auth import UserToken +import barker.schemas.master as schemas +from ..core.security import get_current_active_user as get_user +from ..db.session import SessionLocal +from ..models.master import SectionPrinter, MenuCategory + +router = APIRouter() -@view_config( - request_method="POST", - route_name="v1_section_printers_id", - renderer="json", - permission="Section Printers", - trans=True, -) -def save(request): - json = request.json_body - section_id = uuid.UUID(request.matchdict["section_id"]) - current = [] - for mcs in json["menuCategories"]: - menu_category = mcs.get("menuCategory", None) - menu_category_id = ( - uuid.UUID(menu_category["id"]) if menu_category is not None and menu_category["id"] != "" else None - ) - printer = mcs.get("printer", None) - printer_id = ( - uuid.UUID(printer["id"]) - if printer is not None and "id" in printer and printer["id"] is not None and printer["id"] != "" - else None - ) - if menu_category_id is None and printer_id is None: - raise ValidationError("Please choose a default printer") - if printer_id is None: - continue - try: - copies = int(mcs.get("copies", 0)) - if copies < 1: - raise ValidationError("Copies must be an integer >= 1") - except ValueError: - raise ValidationError("Copies must be an integer >= 1") - stmt = ( - pg_insert(SectionPrinter.__table__) - .values( - id=uuid.uuid4(), - menu_category_id=menu_category_id, - section_id=section_id, - printer_id=printer_id, - copies=copies, +# Dependency +def get_db(): + try: + db = SessionLocal() + yield db + finally: + db.close() + + +@router.post("/{id_}", response_model=List[schemas.SectionPrinter]) +def save( + id_: uuid.UUID, + data: List[schemas.SectionPrinter], + db: Session = Depends(get_db), + user: UserToken = Security(get_user, scopes=["section-printers"]), +): + try: + current = [] + for mcs in data: + if mcs.menu_category.id_ is None and mcs.printer.id_ is None: + raise ValueError("Please choose a default printer") + if mcs.printer.id_ is None: + continue + stmt = ( + pg_insert(SectionPrinter.__table__) + .values( + id=uuid.uuid4(), + menu_category_id=mcs.menu_category.id_ if mcs.menu_category is not None else None, + section_id=id_, + printer_id=mcs.printer.id_, + copies=mcs.copies, + ) + .on_conflict_do_update( + index_elements=["menu_category_id", "section_id"], + set_=dict(printer_id=mcs.printer.id_, copies=mcs.copies), + ) ) - .on_conflict_do_update( - index_elements=["menu_category_id", "section_id"], set_=dict(printer_id=printer_id, copies=copies), + db.execute(stmt) + current.append(mcs.menu_category.id_) + db.execute( + SectionPrinter.__table__.delete( + and_( + SectionPrinter.section_id == id_, + ~SectionPrinter.menu_category_id.in_([x for x in current if x is not None]), + ) ) ) - request.dbsession.execute(stmt) - current.append(menu_category_id) - SectionPrinter.__table__.delete( - and_(SectionPrinter.section_id == section_id, ~SectionPrinter.menu_category_id.in_(current),) - ) - mark_changed(request.dbsession) - transaction.commit() + db.commit() - return {"id": section_id, "menuCategories": report(section_id, request.dbsession)} + return report(id_, db) + except SQLAlchemyError as e: + db.rollback() + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e), + ) + except Exception: + db.rollback() + raise -@view_config( - request_method="DELETE", - route_name="v1_section_printers_id", - renderer="json", - permission="Section Printers", - trans=True, -) -def delete(request): - section_id = uuid.UUID(request.matchdict["section_id"]) - SectionPrinter.__table__.delete(SectionPrinter.section_id == section_id) - mark_changed(request.dbsession) - transaction.commit() - return {"id": "", "menuCategories": report(section_id, request.dbsession)} +@router.delete("/{id_}") +def delete( + id_: uuid.UUID, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["section-printers"]), +): + try: + SectionPrinter.__table__.delete(SectionPrinter.section_id == id_) + db.commit() + return report(id_, db) + except SQLAlchemyError as e: + db.rollback() + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e), + ) + except Exception: + db.rollback() + raise -@view_config( - request_method="GET", route_name="v1_section_printers", renderer="json", permission="Authenticated", -) -@view_config( - request_method="GET", route_name="v1_section_printers_id", renderer="json", permission="Authenticated", -) -def show_id(request): - section_id = request.matchdict.get("section_id", None) - if section_id is not None: - section_id = uuid.UUID(section_id) - return {"id": section_id, "menuCategories": report(section_id, request.dbsession)} +@router.get("/") +def show_blank( + db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["section-printers"]), +): + return report(None, db) -@view_config( - request_method="GET", - route_name="v1_section_printers_id", - renderer="json", - request_param="m", - permission="Authenticated", -) -def show_details(request): - section_id = uuid.UUID(request.matchdict["section_id"]) - menu_category_id = request.GET.get("m", None) - if menu_category_id is not None: - menu_category_id = uuid.UUID(menu_category_id) - item = ( - request.dbsession.query(SectionPrinter) - .filter(SectionPrinter.section_id == section_id, SectionPrinter.menu_category_id == menu_category_id,) - .first() - ) - return section_printer_info(item, request.dbsession) +@router.get("/{id_}") +def show_id( + id_: uuid.UUID, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["section-printers"]), +): + return report(id_, db) -def report(section_id, dbsession): - menu_categories = ( - dbsession.query(MenuCategory.id, MenuCategory.name) - .filter(MenuCategory.is_active == True) - .order_by(MenuCategory.sort_order) - .all() - ) +# @view_config( +# request_method="GET", +# route_name="v1_section_printers_id", +# renderer="json", +# request_param="m", +# permission="Authenticated", +# ) +# def show_details(request): +# section_id = uuid.UUID(request.matchdict["section_id"]) +# menu_category_id = request.GET.get("m", None) +# if menu_category_id is not None: +# menu_category_id = uuid.UUID(menu_category_id) +# item = ( +# request.dbsession.query(SectionPrinter) +# .filter(SectionPrinter.section_id == section_id, SectionPrinter.menu_category_id == menu_category_id,) +# .first() +# ) +# return section_printer_info(item, request.dbsession) + + +def report(section_id: uuid.UUID, db: Session): + menu_categories = db.query(MenuCategory.id, MenuCategory.name).filter(MenuCategory.is_active == True).order_by(MenuCategory.sort_order).all() list_ = [] for item in [(None,)] + menu_categories: mc = ( - dbsession.query(SectionPrinter) - .filter(SectionPrinter.section_id == section_id, SectionPrinter.menu_category_id == item[0],) + db.query(SectionPrinter) + .filter(SectionPrinter.section_id == section_id, SectionPrinter.menu_category_id == item[0]) .first() ) list_.append( { - "menuCategory": {"id": "", "name": "Default"} if item[0] is None else {"id": item[0], "name": item[1]}, + "menuCategory": {} if item[0] is None else {"id": item[0], "name": item[1]}, "printer": {} if mc is None else {"id": mc.printer_id}, "copies": 0 if mc is None else mc.copies, } @@ -138,11 +147,11 @@ def report(section_id, dbsession): return list_ -def section_printer_info(item, dbsession): +def section_printer_info(item: Optional[SectionPrinter]): if item is None: return {"menuCategory": {}, "section": {}, "printer": {}, "copies": 0} - if type(item) is uuid.UUID: - item = dbsession.query(SectionPrinter).filter(SectionPrinter.id == item).first() + # if type(item) is uuid.UUID: + # item = db.query(SectionPrinter).filter(SectionPrinter.id == item).first() return { "id": item.id, "menuCategory": None diff --git a/barker/routers/table.py b/barker/routers/table.py new file mode 100644 index 0000000..b0c6b36 --- /dev/null +++ b/barker/routers/table.py @@ -0,0 +1,200 @@ +import uuid +from typing import Optional, List + +from fastapi import APIRouter, HTTPException, status, Depends, Security +from sqlalchemy.exc import SQLAlchemyError +from sqlalchemy.orm import Session + +from ..models import Overview +from ..schemas.auth import UserToken +import barker.schemas.master as schemas +from ..core.security import get_current_active_user as get_user +from ..db.session import SessionLocal +from ..models.master import FoodTable + +router = APIRouter() + + +# Dependency +def get_db(): + try: + db = SessionLocal() + yield db + finally: + db.close() + + +@router.post("/list", response_model=List[schemas.Table]) +def sort_order( + data: List[schemas.Table], db: Session = Depends(get_db), + user: UserToken = Security(get_user, scopes=["tables"]), +): + try: + for index, item in enumerate(data): + db.query(FoodTable).filter(FoodTable.id == item.id_).update( + {FoodTable.sort_order: index} + ) + db.commit() + return [ + { + "id": item.id, + "name": item.name, + "seats": item.seats, + "section": {"id": item.section_id, "name": item.section.name}, + "isActive": item.is_active, + "sortOrder": item.sort_order, + } + for item in db.query(FoodTable).order_by(FoodTable.sort_order).all() + ] + except SQLAlchemyError as e: + db.rollback() + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e), + ) + except Exception: + db.rollback() + raise + + +@router.post("/", response_model=schemas.Table) +def save( + data: schemas.TableIn, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["tables"]), +): + try: + item = FoodTable(name=data.name, seats=data.seats, section_id=data.section.id_, is_active=data.is_active) + db.add(item) + db.commit() + return food_table_info(item) + except SQLAlchemyError as e: + db.rollback() + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e), + ) + except Exception: + db.rollback() + raise + + +@router.put("/{id_}", response_model=schemas.Table) +def update( + id_: uuid.UUID, + data: schemas.TableIn, + db: Session = Depends(get_db), + user: UserToken = Security(get_user, scopes=["tables"]), +): + try: + item: FoodTable = db.query(FoodTable).filter(FoodTable.id == id_).first() + item.name = data.name + item.seats = data.seats + item.section_id = data.section.id_ + item.is_active = data.is_active + db.commit() + return food_table_info(item) + except SQLAlchemyError as e: + db.rollback() + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e), + ) + except Exception: + db.rollback() + raise + + +@router.delete("/{id_}") +def delete( + id_: uuid.UUID, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["tables"]), +): + try: + item: FoodTable = db.query(FoodTable).filter(FoodTable.id == id_).first() + db.delete(item) + db.commit() + return food_table_info(item) + except SQLAlchemyError as e: + db.rollback() + raise HTTPException( + status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, detail=str(e), + ) + except Exception: + db.rollback() + raise + + +@router.get("/") +def show_blank( + db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["tables"]), +): + return food_table_info(None) + + +@router.get("/list") +def show_list(db: Session = Depends(get_db), user: UserToken = Depends(get_user)): + return [ + { + "id": item.id, + "name": item.name, + "seats": item.seats, + "section": {"id": item.section_id, "name": item.section.name}, + "isActive": item.is_active, + "sortOrder": item.sort_order, + } + for item in db.query(FoodTable).order_by(FoodTable.sort_order).all() + ] + + +@router.get("/running") +def show_running(db: Session = Depends(get_db), user: UserToken = Depends(get_user)): + list_ = db.query(FoodTable).filter(FoodTable.is_active == True).order_by(FoodTable.sort_order).all() + + food_tables = [] + for item in list_: + ft = { + "id": item.id, + "name": item.name, + "seats": item.seats, + "section": {"id": item.section_id, "name": item.section.name}, + "isActive": item.is_active, + "sortOrder": item.sort_order, + } + if item.status is not None: + ft["status"] = item.status.status + ft["voucherId"] = item.status.voucher_id + ft["pax"] = item.status.voucher.pax + ft["date"] = item.status.voucher.date.strftime("%d-%b-%Y %H:%M") + ft["amount"] = item.status.voucher.amount + if item.status.guest is not None: + ft["guest"] = item.status.guest.customer.name + food_tables.append(ft) + return food_tables + + +@router.get("/from-voucher/{id_}") +def show_voucher( + id_: uuid.UUID, db: Session = Depends(get_db), user: UserToken = Security(get_user), +): + overview: Overview = db.query(Overview).filter(Overview.voucher_id == id_).first() + if overview is not None: + return food_table_info(overview.food_table) + return food_table_info(None) + + +@router.get("/{id_}") +def show_id( + id_: uuid.UUID, db: Session = Depends(get_db), user: UserToken = Security(get_user, scopes=["tables"]), +): + item: FoodTable = db.query(FoodTable).filter(FoodTable.id == id_).first() + return food_table_info(item) + + +def food_table_info(item: Optional[FoodTable]): + if item is None: + return {"name": "", "seats": 0, "section": {}, "isActive": True, "sortOrder": 0} + return { + "id": item.id, + "name": item.name, + "seats": item.seats, + "section": {"id": item.section_id, "name": item.section.name}, + "isActive": item.is_active, + "status": "" if item.status is None else item.status.status, + "sortOrder": item.sort_order, + "voucherId": None if item.status is None else item.status.voucher_id, + } diff --git a/barker/schemas/master.py b/barker/schemas/master.py index a105e8c..ebd27be 100644 --- a/barker/schemas/master.py +++ b/barker/schemas/master.py @@ -1,149 +1,21 @@ import uuid -from typing import Optional, List +from typing import Optional from datetime import date, datetime from decimal import Decimal from pydantic import BaseModel, Field, validator from barker.schemas import to_camel - - -class TaxIn(BaseModel): - name: str = Field(..., min_length=1) - rate: Decimal = Field(ge=0, multiple_of=0.0001, default=0, le=1) - - class Config: - fields = {"id_": "id"} - anystr_strip_whitespace = True - alias_generator = to_camel - - -class Tax(TaxIn): - id_: uuid.UUID - is_fixture: bool - - class Config: - fields = {"id_": "id"} - anystr_strip_whitespace = True - alias_generator = to_camel - - -class TaxLink(BaseModel): - id_: uuid.UUID = Field(...) - name: Optional[str] - - class Config: - fields = {"id_": "id"} - - -class SaleCategoryIn(BaseModel): - name: str = Field(..., min_length=1) - tax: TaxLink = Field(...) - - class Config: - fields = {"id_": "id"} - anystr_strip_whitespace = True - alias_generator = to_camel - - -class SaleCategory(SaleCategoryIn): - id_: uuid.UUID - - class Config: - fields = {"id_": "id"} - anystr_strip_whitespace = True - alias_generator = to_camel - - -class SaleCategoryLink(BaseModel): - id_: uuid.UUID = Field(...) - - class Config: - fields = {"id_": "id"} - - -class MenuCategoryIn(BaseModel): - name: str = Field(..., min_length=1) - discount_limit: Decimal = Field(ge=0, multiple_of=0.0001, default=0, le=1) - is_active: bool - - class Config: - fields = {"id_": "id"} - anystr_strip_whitespace = True - alias_generator = to_camel - - -class MenuCategory(MenuCategoryIn): - id_: uuid.UUID - is_fixture: bool - sort_order: int - - class Config: - fields = {"id_": "id"} - anystr_strip_whitespace = True - alias_generator = to_camel - - -class ProductLink(BaseModel): - id_: uuid.UUID = Field(...) - name: Optional[str] - enabled: Optional[bool] - - class Config: - fields = {"id_": "id"} - - -class MenuCategoryLink(BaseModel): - id_: uuid.UUID = Field(...) - products: Optional[List[ProductLink]] - - class Config: - fields = {"id_": "id"} - - -class ProductIn(BaseModel): - name: str = Field(..., min_length=1) - units: str - menu_category: MenuCategoryLink = Field(...) - sale_category: SaleCategoryLink = Field(...) - price: Decimal # = Field(ge=0, multiple_of=0.01, default=0) - has_happy_hour: bool - is_not_available: bool - quantity: Decimal = Field(ge=0, multiple_of=0.01, default=0) - is_active: bool - sort_order: int - - class Config: - fields = {"id_": "id"} - anystr_strip_whitespace = True - alias_generator = to_camel - - -class Product(ProductIn): - id_: uuid.UUID - - -class ModifierCategoryIn(BaseModel): - name: str = Field(..., min_length=1) - minimum: int = Field(ge=0) - maximum: Optional[int] = Field(ge=0) - is_active: bool - menu_categories: Optional[List[MenuCategoryLink]] - - class Config: - fields = {"id_": "id"} - anystr_strip_whitespace = True - alias_generator = to_camel - - -class ModifierCategory(ModifierCategoryIn): - id_: uuid.UUID - sort_order: int - - class Config: - fields = {"id_": "id"} - anystr_strip_whitespace = True - alias_generator = to_camel +from barker.schemas.tax import TaxLink, TaxIn, Tax # noqa: F401 +from barker.schemas.sale_category import SaleCategoryLink, SaleCategoryIn, SaleCategory # noqa: F401 +from barker.schemas.menu_category import MenuCategoryLink, MenuCategoryIn, MenuCategory # noqa: F401 +from barker.schemas.product import ProductLink, ProductIn, Product # noqa: F401 +from barker.schemas.modifier_category import ModifierCategoryLink, ModifierCategoryIn, ModifierCategory # noqa: F401 +from barker.schemas.modifier import ModifierLink, ModifierIn, Modifier # noqa: F401 +from barker.schemas.printer import PrinterLink, PrinterIn, Printer # noqa: F401 +from barker.schemas.section import SectionLink, SectionIn, Section # noqa: F401 +from barker.schemas.section_printer import SectionPrinter # noqa: F401 +from barker.schemas.table import TableLink, TableIn, Table # noqa: F401 class AccountBase(BaseModel): diff --git a/barker/schemas/menu_category.py b/barker/schemas/menu_category.py new file mode 100644 index 0000000..14157d3 --- /dev/null +++ b/barker/schemas/menu_category.py @@ -0,0 +1,40 @@ +import uuid +from typing import Optional, List +from decimal import Decimal + +from pydantic import BaseModel, Field + +from barker.schemas import to_camel +from barker.schemas.product import ProductLink + + +class MenuCategoryIn(BaseModel): + name: str = Field(..., min_length=1) + discount_limit: Decimal = Field(ge=0, multiple_of=0.0001, default=0, le=1) + is_active: bool + + class Config: + fields = {"id_": "id"} + anystr_strip_whitespace = True + alias_generator = to_camel + + +class MenuCategory(MenuCategoryIn): + id_: uuid.UUID + is_fixture: bool + sort_order: int + + class Config: + fields = {"id_": "id"} + anystr_strip_whitespace = True + alias_generator = to_camel + + +class MenuCategoryLink(BaseModel): + id_: uuid.UUID = Field(...) + products: Optional[List[ProductLink]] + + class Config: + fields = {"id_": "id"} + + diff --git a/barker/schemas/modifier.py b/barker/schemas/modifier.py new file mode 100644 index 0000000..3e96890 --- /dev/null +++ b/barker/schemas/modifier.py @@ -0,0 +1,33 @@ +import uuid +from typing import Optional +from decimal import Decimal + +from pydantic import BaseModel, Field + +from barker.schemas import to_camel +from barker.schemas.modifier_category import ModifierCategoryLink + + +class ModifierIn(BaseModel): + name: str = Field(..., min_length=1) + show_in_bill: bool + price: Decimal = Field(ge=0, multiple_of=0.01, default=0) + is_active: bool + modifier_category: ModifierCategoryLink + + class Config: + fields = {"id_": "id"} + anystr_strip_whitespace = True + alias_generator = to_camel + + +class Modifier(ModifierIn): + id_: uuid.UUID + + +class ModifierLink(BaseModel): + id_: uuid.UUID = Field(...) + name: Optional[str] + + class Config: + fields = {"id_": "id"} diff --git a/barker/schemas/modifier_category.py b/barker/schemas/modifier_category.py new file mode 100644 index 0000000..2ef6830 --- /dev/null +++ b/barker/schemas/modifier_category.py @@ -0,0 +1,37 @@ +import uuid +from typing import Optional, List + +from pydantic import BaseModel, Field + +from barker.schemas import to_camel +from barker.schemas.menu_category import MenuCategoryLink + + +class ModifierCategoryIn(BaseModel): + name: str = Field(..., min_length=1) + minimum: int = Field(ge=0) + maximum: Optional[int] = Field(ge=0) + is_active: bool + menu_categories: Optional[List[MenuCategoryLink]] + + class Config: + fields = {"id_": "id"} + anystr_strip_whitespace = True + alias_generator = to_camel + + +class ModifierCategory(ModifierCategoryIn): + id_: uuid.UUID + sort_order: int + + class Config: + fields = {"id_": "id"} + anystr_strip_whitespace = True + alias_generator = to_camel + + +class ModifierCategoryLink(BaseModel): + id_: uuid.UUID = Field(...) + + class Config: + fields = {"id_": "id"} diff --git a/barker/schemas/printer.py b/barker/schemas/printer.py new file mode 100644 index 0000000..775b12b --- /dev/null +++ b/barker/schemas/printer.py @@ -0,0 +1,33 @@ +import uuid +from typing import Optional + +from pydantic import BaseModel, Field + +from barker.schemas import to_camel + + +class PrinterIn(BaseModel): + name: str = Field(..., min_length=1) + address: str = Field(..., min_length=1) + cut_code: Optional[str] + + class Config: + fields = {"id_": "id"} + anystr_strip_whitespace = True + alias_generator = to_camel + + +class Printer(PrinterIn): + id_: uuid.UUID + + class Config: + fields = {"id_": "id"} + anystr_strip_whitespace = True + alias_generator = to_camel + + +class PrinterLink(BaseModel): + id_: uuid.UUID = Field(...) + + class Config: + fields = {"id_": "id"} diff --git a/barker/schemas/product.py b/barker/schemas/product.py new file mode 100644 index 0000000..dae2919 --- /dev/null +++ b/barker/schemas/product.py @@ -0,0 +1,46 @@ +import uuid +from typing import Optional, List +from decimal import Decimal +from pydantic import BaseModel, Field + +from barker.schemas import to_camel +from barker.schemas.sale_category import SaleCategoryLink + + +class ProductLink(BaseModel): + id_: uuid.UUID = Field(...) + name: Optional[str] + enabled: Optional[bool] + + class Config: + fields = {"id_": "id"} + + +class MenuCategoryLink(BaseModel): # Hack to prevent circular error + id_: uuid.UUID = Field(...) + products: Optional[List[ProductLink]] + + class Config: + fields = {"id_": "id"} + + +class ProductIn(BaseModel): + name: str = Field(..., min_length=1) + units: str + menu_category: MenuCategoryLink = Field(...) + sale_category: SaleCategoryLink = Field(...) + price: Decimal # = Field(ge=0, multiple_of=0.01, default=0) + has_happy_hour: bool + is_not_available: bool + quantity: Decimal = Field(ge=0, multiple_of=0.01, default=0) + is_active: bool + sort_order: int + + class Config: + fields = {"id_": "id"} + anystr_strip_whitespace = True + alias_generator = to_camel + + +class Product(ProductIn): + id_: uuid.UUID diff --git a/barker/schemas/sale_category.py b/barker/schemas/sale_category.py new file mode 100644 index 0000000..8e9d7fe --- /dev/null +++ b/barker/schemas/sale_category.py @@ -0,0 +1,33 @@ +import uuid +from pydantic import BaseModel, Field + +from barker.schemas import to_camel +from barker.schemas.tax import TaxLink + + +class SaleCategoryIn(BaseModel): + name: str = Field(..., min_length=1) + tax: TaxLink = Field(...) + + class Config: + fields = {"id_": "id"} + anystr_strip_whitespace = True + alias_generator = to_camel + + +class SaleCategory(SaleCategoryIn): + id_: uuid.UUID + + class Config: + fields = {"id_": "id"} + anystr_strip_whitespace = True + alias_generator = to_camel + + +class SaleCategoryLink(BaseModel): + id_: uuid.UUID = Field(...) + + class Config: + fields = {"id_": "id"} + + diff --git a/barker/schemas/section.py b/barker/schemas/section.py new file mode 100644 index 0000000..e1a445d --- /dev/null +++ b/barker/schemas/section.py @@ -0,0 +1,27 @@ +import uuid +from typing import Optional + +from pydantic import BaseModel, Field + +from barker.schemas import to_camel + + +class SectionIn(BaseModel): + name: str = Field(..., min_length=1) + + class Config: + fields = {"id_": "id"} + anystr_strip_whitespace = True + alias_generator = to_camel + + +class Section(SectionIn): + id_: uuid.UUID + + +class SectionLink(BaseModel): + id_: uuid.UUID = Field(...) + name: Optional[str] + + class Config: + fields = {"id_": "id"} diff --git a/barker/schemas/section_printer.py b/barker/schemas/section_printer.py new file mode 100644 index 0000000..b52fd5b --- /dev/null +++ b/barker/schemas/section_printer.py @@ -0,0 +1,30 @@ +import uuid +from typing import Optional + +from pydantic import BaseModel, Field + +from barker.schemas import to_camel + + +class MenuCategoryLink(BaseModel): + id_: Optional[uuid.UUID] + name: Optional[str] + + class Config: + fields = {"id_": "id"} + + +class PrinterLink(BaseModel): + id_: Optional[uuid.UUID] + + class Config: + fields = {"id_": "id"} + + +class SectionPrinter(BaseModel): + menu_category: MenuCategoryLink + printer: PrinterLink + copies: int = Field(ge=0) + + class Config: + alias_generator = to_camel diff --git a/barker/schemas/table.py b/barker/schemas/table.py new file mode 100644 index 0000000..e0f1150 --- /dev/null +++ b/barker/schemas/table.py @@ -0,0 +1,35 @@ +import uuid +from typing import Optional + +from pydantic import BaseModel, Field + +from barker.schemas import to_camel +from barker.schemas.section import SectionLink + + +class TableIn(BaseModel): + name: str = Field(..., min_length=1) + seats: int = Field(ge=0) + section: SectionLink + is_active: bool + sort_order: int + + class Config: + anystr_strip_whitespace = True + alias_generator = to_camel + + +class Table(TableIn): + id_: uuid.UUID + + class Config: + alias_generator = to_camel + + +class TableLink(BaseModel): + id_: uuid.UUID = Field(...) + name: Optional[str] + + class Config: + fields = {"id_": "id"} + alias_generator = to_camel diff --git a/barker/schemas/tax.py b/barker/schemas/tax.py new file mode 100644 index 0000000..f225966 --- /dev/null +++ b/barker/schemas/tax.py @@ -0,0 +1,37 @@ +import uuid +from typing import Optional +from decimal import Decimal + +from pydantic import BaseModel, Field + +from barker.schemas import to_camel + + +class TaxIn(BaseModel): + name: str = Field(..., min_length=1) + rate: Decimal = Field(ge=0, multiple_of=0.0001, default=0, le=1) + + class Config: + fields = {"id_": "id"} + anystr_strip_whitespace = True + alias_generator = to_camel + + +class Tax(TaxIn): + id_: uuid.UUID + is_fixture: bool + + class Config: + fields = {"id_": "id"} + anystr_strip_whitespace = True + alias_generator = to_camel + + +class TaxLink(BaseModel): + id_: uuid.UUID = Field(...) + name: Optional[str] + + class Config: + fields = {"id_": "id"} + + diff --git a/bookie/angular.json b/bookie/angular.json index c9234d8..1e3a823 100644 --- a/bookie/angular.json +++ b/bookie/angular.json @@ -14,7 +14,7 @@ "builder": "@angular-devkit/build-angular:browser", "options": { "aot": true, - "outputPath": "../barker/static", + "outputPath": "../frontend", "index": "src/index.html", "main": "src/main.ts", "polyfills": "src/polyfills.ts", diff --git a/bookie/proxy.conf.json b/bookie/proxy.conf.json index c53f320..59c3566 100644 --- a/bookie/proxy.conf.json +++ b/bookie/proxy.conf.json @@ -13,11 +13,6 @@ "target": "http://localhost:9995", "secure": false, "logLevel": "info" - }, - "/attendance-report": { - "target": "http://localhost:9995", - "secure": false, - "logLevel": "info" }, "/db-image": { "target": "http://localhost:9995", diff --git a/bookie/src/app/core/printer.ts b/bookie/src/app/core/printer.ts index 15a4c68..8406b7d 100644 --- a/bookie/src/app/core/printer.ts +++ b/bookie/src/app/core/printer.ts @@ -1,6 +1,6 @@ export class Printer { id: string; - name: string; - address: string; - cutCode: string; + name?: string; + address?: string; + cutCode?: string; } diff --git a/bookie/src/app/core/section-printer.ts b/bookie/src/app/core/section-printer.ts index 29d9fe8..909ec30 100644 --- a/bookie/src/app/core/section-printer.ts +++ b/bookie/src/app/core/section-printer.ts @@ -1,16 +1,7 @@ -import {MenuCategory} from './menu-category'; -import {Printer} from './printer'; +import { MenuCategory } from './menu-category'; +import { Printer } from './printer'; export class SectionPrinter { - id: string; - menuCategories: SectionPrinterItem[]; - - public constructor(init?: Partial) { - Object.assign(this, init); - } -} - -export class SectionPrinterItem { menuCategory: MenuCategory; printer: Printer; copies: number; diff --git a/bookie/src/app/modifiers/modifier.service.ts b/bookie/src/app/modifiers/modifier.service.ts index ee422bd..2f2ccc1 100644 --- a/bookie/src/app/modifiers/modifier.service.ts +++ b/bookie/src/app/modifiers/modifier.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { Observable } from 'rxjs/internal/Observable'; import { catchError } from 'rxjs/operators'; -import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; import { Modifier } from '../core/modifier'; import { ErrorLoggerService } from '../core/error-logger.service'; @@ -9,7 +9,7 @@ const httpOptions = { headers: new HttpHeaders({'Content-Type': 'application/json'}) }; -const url = '/v1/modifiers'; +const url = '/api/modifiers'; const serviceName = 'ModifierService'; @Injectable({providedIn: 'root'}) @@ -19,7 +19,7 @@ export class ModifierService { } get(id: string): Observable { - const getUrl: string = (id === null) ? `${url}/new` : `${url}/${id}`; + const getUrl: string = (id === null) ? url : `${url}/${id}`; return >this.http.get(getUrl) .pipe( catchError(this.log.handleError(serviceName, `get id=${id}`)) @@ -27,15 +27,14 @@ export class ModifierService { } list(): Observable { - const options = {params: new HttpParams().set('l', '')}; - return >this.http.get(url, options) + return >this.http.get(`${url}/list`) .pipe( catchError(this.log.handleError(serviceName, 'getList')) ); } save(modifier: Modifier): Observable { - return >this.http.post(`${url}/new`, modifier, httpOptions) + return >this.http.post(url, modifier, httpOptions) .pipe( catchError(this.log.handleError(serviceName, 'save')) ); @@ -48,13 +47,6 @@ export class ModifierService { ); } - updateSortOrder(list: Modifier[]): Observable { - return >this.http.post(url, list, httpOptions) - .pipe( - catchError(this.log.handleError(serviceName, 'updateSortOrder')) - ); - } - saveOrUpdate(modifier: Modifier): Observable { if (!modifier.id) { return this.save(modifier); @@ -69,20 +61,4 @@ export class ModifierService { catchError(this.log.handleError(serviceName, 'delete')) ); } - - autocomplete(term: string): Observable { - const options = {params: new HttpParams().set('t', term)}; - return >this.http.get(url, options) - .pipe( - catchError(this.log.handleError(serviceName, 'autocomplete')) - ); - } - - balance(id: string, date: string): Observable { - const options = {params: new HttpParams().set('b', 'true').set('d', date)}; - return >this.http.get(`${url}/${id}`, options) - .pipe( - catchError(this.log.handleError(serviceName, 'balance')) - ); - } } diff --git a/bookie/src/app/printers/printer.service.ts b/bookie/src/app/printers/printer.service.ts index bf2455e..1f4014b 100644 --- a/bookie/src/app/printers/printer.service.ts +++ b/bookie/src/app/printers/printer.service.ts @@ -1,14 +1,14 @@ -import {Injectable} from '@angular/core'; -import {HttpClient, HttpHeaders, HttpParams} from '@angular/common/http'; -import {ErrorLoggerService} from '../core/error-logger.service'; -import {catchError} from 'rxjs/operators'; -import {Observable} from 'rxjs/internal/Observable'; -import {Printer} from '../core/printer'; +import { Injectable } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { ErrorLoggerService } from '../core/error-logger.service'; +import { catchError } from 'rxjs/operators'; +import { Observable } from 'rxjs/internal/Observable'; +import { Printer } from '../core/printer'; const httpOptions = { headers: new HttpHeaders({'Content-Type': 'application/json'}) }; -const url = '/v1/printers'; +const url = '/api/printers'; const serviceName = 'PrinterService'; @Injectable({ @@ -19,7 +19,7 @@ export class PrinterService { } get(id: string): Observable { - const getUrl: string = (id === null) ? `${url}/new` : `${url}/${id}`; + const getUrl: string = (id === null) ? url : `${url}/${id}`; return >this.http.get(getUrl) .pipe( catchError(this.log.handleError(serviceName, `get id=${id}`)) @@ -27,15 +27,14 @@ export class PrinterService { } list(): Observable { - const options = {params: new HttpParams().set('l', '')}; - return >this.http.get(url, options) + return >this.http.get(`${url}/list`) .pipe( catchError(this.log.handleError(serviceName, 'list')) ); } save(printer: Printer): Observable { - return >this.http.post(`${url}/new`, printer, httpOptions) + return >this.http.post(url, printer, httpOptions) .pipe( catchError(this.log.handleError(serviceName, 'save')) ); diff --git a/bookie/src/app/section-printers/section-printer-datasource.ts b/bookie/src/app/section-printers/section-printer-datasource.ts index 0646e93..7fe8fa3 100644 --- a/bookie/src/app/section-printers/section-printer-datasource.ts +++ b/bookie/src/app/section-printers/section-printer-datasource.ts @@ -1,15 +1,15 @@ import { DataSource } from '@angular/cdk/collections'; import { Observable } from 'rxjs'; -import { SectionPrinterItem } from '../core/section-printer'; +import { SectionPrinter } from '../core/section-printer'; -export class SectionPrinterDataSource extends DataSource { +export class SectionPrinterDataSource extends DataSource { - constructor(private data: Observable) { + constructor(private data: Observable) { super(); } - connect(): Observable { + connect(): Observable { return this.data; } diff --git a/bookie/src/app/section-printers/section-printer-resolver.service.ts b/bookie/src/app/section-printers/section-printer-resolver.service.ts index 6325061..60c068f 100644 --- a/bookie/src/app/section-printers/section-printer-resolver.service.ts +++ b/bookie/src/app/section-printers/section-printer-resolver.service.ts @@ -7,12 +7,12 @@ import { SectionPrinterService } from './section-printer.service'; @Injectable({ providedIn: 'root' }) -export class SectionPrinterResolver implements Resolve { +export class SectionPrinterResolver implements Resolve { constructor(private ser: SectionPrinterService, private router: Router) { } - resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { + resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable { const id = route.paramMap.get('id'); return this.ser.get(id); } diff --git a/bookie/src/app/section-printers/section-printer.component.html b/bookie/src/app/section-printers/section-printer.component.html index 5c5bcdc..a446c50 100644 --- a/bookie/src/app/section-printers/section-printer.component.html +++ b/bookie/src/app/section-printers/section-printer.component.html @@ -22,7 +22,7 @@ Menu Category - {{row.menuCategory.name}} + {{row.menuCategory?.name || 'Default'}} @@ -59,7 +59,7 @@ - + diff --git a/bookie/src/app/section-printers/section-printer.component.ts b/bookie/src/app/section-printers/section-printer.component.ts index f0f3a25..a44f925 100644 --- a/bookie/src/app/section-printers/section-printer.component.ts +++ b/bookie/src/app/section-printers/section-printer.component.ts @@ -1,8 +1,8 @@ import { Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { ActivatedRoute, Router} from '@angular/router'; +import { ActivatedRoute, Router } from '@angular/router'; import { MatDialog } from '@angular/material/dialog'; import { FormArray, FormBuilder, FormGroup } from '@angular/forms'; -import { BehaviorSubject, Observable } from 'rxjs'; +import { BehaviorSubject } from 'rxjs'; import { map } from 'rxjs/operators'; import { SectionPrinter } from '../core/section-printer'; import { ToasterService } from '../core/toaster.service'; @@ -21,11 +21,11 @@ export class SectionPrinterComponent implements OnInit { @ViewChild('section', {static: true}) sectionElement: ElementRef; form: FormGroup; dataSource: SectionPrinterDataSource; - public itemObservable = new BehaviorSubject(new SectionPrinter()); - item: SectionPrinter; + public listObservable = new BehaviorSubject([]); + list: SectionPrinter[]; sections: Section[]; printers: Printer[]; - + sectionId: string; displayedColumns = ['menuCategory', 'printer', 'copies']; constructor( @@ -37,6 +37,7 @@ export class SectionPrinterComponent implements OnInit { private ser: SectionPrinterService ) { this.createForm(); + route.params.pipe(map(p => p.id)).subscribe(x => this.sectionId = x); } createForm() { @@ -48,23 +49,23 @@ export class SectionPrinterComponent implements OnInit { ngOnInit() { this.route.data - .subscribe((data: { item: SectionPrinter, sections: Section[], printers: Printer[] }) => { + .subscribe((data: { list: SectionPrinter[], sections: Section[], printers: Printer[] }) => { this.sections = data.sections; this.printers = data.printers; - this.showItem(data.item); - this.dataSource = new SectionPrinterDataSource(this.itemObservable.pipe(map(p => p.menuCategories))); - this.itemObservable.next(this.item); + this.showItem(data.list); + this.dataSource = new SectionPrinterDataSource(this.listObservable); + this.listObservable.next(this.list); }); } - showItem(item: SectionPrinter) { - this.item = item; - this.form.get('section').setValue(this.item.id); + showItem(list: SectionPrinter[]) { + this.list = list; + this.form.get('section').setValue(this.sectionId); this.form.setControl('menuCategories', this.fb.array( - this.item.menuCategories.map( + this.list.map( x => this.fb.group({ - menuCategory: x.menuCategory.name, - printer: x.printer.id, + menuCategory: (x.menuCategory?.name || 'Default'), + printer: x.printer?.id, copies: '' + x.copies }) ) @@ -73,10 +74,11 @@ export class SectionPrinterComponent implements OnInit { save() { - this.ser.save(this.getItem()) + this.ser.save(this.sectionId, this.getItem()) .subscribe( - (result) => { + (result: SectionPrinter[]) => { this.toaster.show('Success', ''); + this.showItem(result); }, (error) => { this.toaster.show('Danger', error.error); @@ -85,7 +87,7 @@ export class SectionPrinterComponent implements OnInit { } delete() { - this.ser.delete(this.item.id) + this.ser.delete(this.sectionId) .subscribe( (result) => { this.toaster.show('Success', ''); @@ -109,20 +111,19 @@ export class SectionPrinterComponent implements OnInit { }); } - getItem(): SectionPrinter { + getItem(): SectionPrinter[] { const formModel = this.form.value; - this.item.id = formModel.section; + this.sectionId = formModel.section; const array = this.form.get('menuCategories') as FormArray; - this.item.menuCategories.forEach((item, index) => { + this.list.forEach((item, index) => { const cont = array.controls[index].value; - item.printer.id = cont.printer; + item.printer = {id: cont.printer}; item.copies = +cont.copies; }); - return this.item; + return this.list; } show(val: any) { this.router.navigate(['/section-printers', val.value]); } - } diff --git a/bookie/src/app/section-printers/section-printer.service.ts b/bookie/src/app/section-printers/section-printer.service.ts index 1cc8ea1..34d771e 100644 --- a/bookie/src/app/section-printers/section-printer.service.ts +++ b/bookie/src/app/section-printers/section-printer.service.ts @@ -1,14 +1,14 @@ -import {Injectable} from '@angular/core'; -import {HttpClient, HttpHeaders, HttpParams} from '@angular/common/http'; -import {ErrorLoggerService} from '../core/error-logger.service'; -import {catchError} from 'rxjs/operators'; -import {Observable} from 'rxjs/internal/Observable'; -import {SectionPrinter, SectionPrinterItem} from '../core/section-printer'; +import { Injectable } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { ErrorLoggerService } from '../core/error-logger.service'; +import { catchError } from 'rxjs/operators'; +import { Observable } from 'rxjs/internal/Observable'; +import { SectionPrinter } from '../core/section-printer'; const httpOptions = { headers: new HttpHeaders({'Content-Type': 'application/json'}) }; -const url = '/v1/section-printers'; +const url = '/api/section-printers'; const serviceName = 'SectionPrinterService'; @Injectable({ @@ -18,31 +18,31 @@ export class SectionPrinterService { constructor(private http: HttpClient, private log: ErrorLoggerService) { } - get(id: string): Observable { + get(id: string): Observable { const getUrl: string = (id === null) ? `${url}` : `${url}/${id}`; - return >this.http.get(getUrl) + return >this.http.get(getUrl) .pipe( catchError(this.log.handleError(serviceName, `get id=${id}`)) ); } - item(id: string, menuCategoryId: string): Observable { - const options = {params: new HttpParams().set('m', menuCategoryId)}; - return >this.http.get(`${url}/${id}`, options) - .pipe( - catchError(this.log.handleError(serviceName, 'list')) - ); - } + // item(id: string, menuCategoryId: string): Observable { + // const options = {params: new HttpParams().set('m', menuCategoryId)}; + // return >this.http.get(`${url}/${id}`, options) + // .pipe( + // catchError(this.log.handleError(serviceName, 'list')) + // ); + // } - save(item: SectionPrinter): Observable { - return >this.http.post(`${url}/${item.id}`, item, httpOptions) + save(sectionId: string, list: SectionPrinter[]): Observable { + return >this.http.post(`${url}/${sectionId}`, list, httpOptions) .pipe( catchError(this.log.handleError(serviceName, 'save')) ); } - delete(id: string): Observable { - return >this.http.delete(`${url}/${id}`, httpOptions) + delete(id: string): Observable { + return >this.http.delete(`${url}/${id}`, httpOptions) .pipe( catchError(this.log.handleError(serviceName, 'delete')) ); diff --git a/bookie/src/app/section-printers/section-printers-routing.module.ts b/bookie/src/app/section-printers/section-printers-routing.module.ts index 35aef7b..be6e2a9 100644 --- a/bookie/src/app/section-printers/section-printers-routing.module.ts +++ b/bookie/src/app/section-printers/section-printers-routing.module.ts @@ -16,7 +16,7 @@ const sectionPrinterRoutes: Routes = [ permission: 'Section Printers' }, resolve: { - item: SectionPrinterResolver, + list: SectionPrinterResolver, sections: SectionListResolver, printers: PrinterListResolver } @@ -29,7 +29,7 @@ const sectionPrinterRoutes: Routes = [ permission: 'Section Printers' }, resolve: { - item: SectionPrinterResolver, + list: SectionPrinterResolver, sections: SectionListResolver, printers: PrinterListResolver } diff --git a/bookie/src/app/sections/section.service.ts b/bookie/src/app/sections/section.service.ts index e3120b3..4c77093 100644 --- a/bookie/src/app/sections/section.service.ts +++ b/bookie/src/app/sections/section.service.ts @@ -1,14 +1,14 @@ -import {Injectable} from '@angular/core'; -import {HttpClient, HttpHeaders, HttpParams} from '@angular/common/http'; -import {ErrorLoggerService} from '../core/error-logger.service'; -import {catchError} from 'rxjs/operators'; -import {Observable} from 'rxjs/internal/Observable'; -import {Section} from '../core/section'; +import { Injectable } from '@angular/core'; +import { HttpClient, HttpHeaders } from '@angular/common/http'; +import { ErrorLoggerService } from '../core/error-logger.service'; +import { catchError } from 'rxjs/operators'; +import { Observable } from 'rxjs/internal/Observable'; +import { Section } from '../core/section'; const httpOptions = { headers: new HttpHeaders({'Content-Type': 'application/json'}) }; -const url = '/v1/sections'; +const url = '/api/sections'; const serviceName = 'SectionService'; @Injectable({ @@ -19,7 +19,7 @@ export class SectionService { } get(id: string): Observable
{ - const getUrl: string = (id === null) ? `${url}/new` : `${url}/${id}`; + const getUrl: string = (id === null) ? url : `${url}/${id}`; return >this.http.get
(getUrl) .pipe( catchError(this.log.handleError(serviceName, `get id=${id}`)) @@ -27,15 +27,14 @@ export class SectionService { } list(): Observable { - const options = {params: new HttpParams().set('l', '')}; - return >this.http.get(url, options) + return >this.http.get(`${url}/list`) .pipe( catchError(this.log.handleError(serviceName, 'list')) ); } save(section: Section): Observable
{ - return >this.http.post
(`${url}/new`, section, httpOptions) + return >this.http.post
(url, section, httpOptions) .pipe( catchError(this.log.handleError(serviceName, 'save')) ); diff --git a/bookie/src/app/tables/table.service.ts b/bookie/src/app/tables/table.service.ts index 7f4c61f..1f09fdc 100644 --- a/bookie/src/app/tables/table.service.ts +++ b/bookie/src/app/tables/table.service.ts @@ -8,7 +8,7 @@ import { Table } from '../core/table'; const httpOptions = { headers: new HttpHeaders({'Content-Type': 'application/json'}) }; -const url = '/v1/tables'; +const url = '/api/tables'; const serviceName = 'TableService'; @Injectable({ @@ -19,7 +19,7 @@ export class TableService { } get(id: string): Observable { - const getUrl: string = (id === null) ? `${url}/new` : `${url}/${id}`; + const getUrl: string = (id === null) ? url : `${url}/${id}`; return >this.http.get
(getUrl) .pipe( catchError(this.log.handleError(serviceName, `get id=${id}`)) @@ -27,23 +27,21 @@ export class TableService { } list(): Observable { - const options = {params: new HttpParams().set('l', '')}; - return >this.http.get(url, options) + return >this.http.get(`${url}/list`) .pipe( catchError(this.log.handleError(serviceName, 'list')) ); } running(): Observable { - const options = {params: new HttpParams().set('r', '')}; - return >this.http.get(url, options) + return >this.http.get(`${url}/running`) .pipe( catchError(this.log.handleError(serviceName, 'running')) ); } save(tables: Table): Observable
{ - return >this.http.post
(`${url}/new`, tables, httpOptions) + return >this.http.post
(url, tables, httpOptions) .pipe( catchError(this.log.handleError(serviceName, 'save')) ); @@ -57,7 +55,7 @@ export class TableService { } updateSortOrder(list: Table[]): Observable { - return >this.http.post(url, list, httpOptions) + return >this.http.post(`${url}/list`, list, httpOptions) .pipe( catchError(this.log.handleError(serviceName, 'updateSortOrder')) );