dxania/Store_Manager_APIs

View on GitHub
app/routes/sales_routes.py

Summary

Maintainability
B
6 hrs
Test Coverage
from flask import request, jsonify, Response
import re

from app import app

from app.exception_handler import InvalidUsage

from app.models.sales_models import Sales

#instance of the Sales class
# sales_object = Sales()


@app.errorhandler(InvalidUsage)
def handle_invalid_usage(error):
    """Error handling and exception raising"""
    response = jsonify(error.to_dict())
    response.status_code = error.status_code
    return response

 
@app.route('/api/v1/sales', methods = ['GET'])
def get_sales():
    """Retrieve all sales function 
    wrapped around theGET /sales endpoint
    """
    all_sales = Sales.get_all_sales()
    if all_sales:
        return all_sales, 200
    else:
        raise InvalidUsage('No sales added yet', status_code=404)


@app.route('/api/v1/sales/<int:sales_id>', methods = ['GET'])
def get_sale(sales_id):
    """Retrieve a particular sale record 
    function wrapped around the Get 
    /sales/<int:sales_id> endpoint
    """
    #use Sales instance to call get_sale function
    a_single_sale = Sales.get_sale(sales_id)
    if a_single_sale:
        return a_single_sale, 200
    else:
        raise InvalidUsage('There is no sale record matching that ID', status_code=404)


@app.route('/api/v1/sales', methods =['POST'])
def create_sale():
    """Create a product function 
    wrapped around the Post /sales 
    endpoint
    """
    #store the request data in user_input variable
    user_input = request.get_json(force=True)

    #validate user input
    attendant_name = user_input.get("attendant_name")
    if not attendant_name or attendant_name.isspace():
        raise InvalidUsage('Attendant Name is required', status_code=400)
    charset = re.compile('[A-Za-z]')
    checkmatch = charset.match(attendant_name)
    if not checkmatch:
        raise InvalidUsage('Attendant Name must be letters', status_code=400)

    no_of_pdts = user_input.get("no_of_products")
    if not no_of_pdts:
        raise InvalidUsage('Number of products is required', status_code=400)
    
    if not isinstance(no_of_pdts, int):
        raise InvalidUsage('Number of products must be a number', status_code=400)

    ttl_profit = user_input.get("total_profit")
    if not ttl_profit:
        raise InvalidUsage('Total profit is required', status_code=400)

    if not isinstance(ttl_profit, int):
        raise InvalidUsage('Total profit must be a number', status_code=400)

    #auto generate the sales ID
    sales_id = len(Sales.sales) + 1
        
    sale_object = Sales(sales_id, attendant_name, no_of_pdts, ttl_profit)
    sale = sale_object.create_sale()
    if Sales.sales:
        return sale, 201
    else:
        raise InvalidUsage('Insertion failed', status_code=400)