Compare commits
4 Commits
1aca8888d2
...
a45efa6433
Author | SHA1 | Date | |
---|---|---|---|
a45efa6433 | |||
a7a1ea72f1 | |||
e069dedcda | |||
eb57a10bbe |
@ -5,11 +5,12 @@ app = Flask(__name__)
|
|||||||
jwt_manager = JWTManager(app)
|
jwt_manager = JWTManager(app)
|
||||||
|
|
||||||
def create_app():
|
def create_app():
|
||||||
from app.api import bp, bp_errors, bp_product, bp_user
|
from app.api import bp, bp_errors, bp_product, bp_user, bp_cart
|
||||||
app.register_blueprint(bp)
|
app.register_blueprint(bp)
|
||||||
app.register_blueprint(bp_errors)
|
app.register_blueprint(bp_errors)
|
||||||
app.register_blueprint(bp_product)
|
app.register_blueprint(bp_product)
|
||||||
app.register_blueprint(bp_user)
|
app.register_blueprint(bp_user)
|
||||||
|
app.register_blueprint(bp_cart)
|
||||||
|
|
||||||
from app.config import FlaskTesting, FlaskProduction
|
from app.config import FlaskTesting, FlaskProduction
|
||||||
app.config.from_object(FlaskTesting)
|
app.config.from_object(FlaskTesting)
|
||||||
|
@ -4,5 +4,6 @@ bp_errors = Blueprint('errors', __name__)
|
|||||||
bp = Blueprint('api', __name__)
|
bp = Blueprint('api', __name__)
|
||||||
bp_product = Blueprint('product', __name__, url_prefix="/product")
|
bp_product = Blueprint('product', __name__, url_prefix="/product")
|
||||||
bp_user = Blueprint('user', __name__, url_prefix="/user")
|
bp_user = Blueprint('user', __name__, url_prefix="/user")
|
||||||
|
bp_cart = Blueprint('cart', __name__, url_prefix="/cart")
|
||||||
|
|
||||||
from . import routes
|
from . import routes
|
@ -1 +1 @@
|
|||||||
from . import main_routes,error_routes, product_routes, user_routes
|
from app.api.routes import main_routes, error_routes, product_routes, user_routes, cart_routes
|
16
app/api/routes/cart_routes.py
Normal file
16
app/api/routes/cart_routes.py
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
from flask import jsonify, abort, request
|
||||||
|
from flask_jwt_extended import jwt_required, get_jwt_identity
|
||||||
|
|
||||||
|
from app.api import bp_cart
|
||||||
|
|
||||||
|
from app.services.cart_service import CartService
|
||||||
|
|
||||||
|
@bp_cart.route('add/<int:product_id>', methods=['PUT'])
|
||||||
|
@jwt_required()
|
||||||
|
def add_to_cart(product_id: int):
|
||||||
|
user_id = get_jwt_identity()
|
||||||
|
count = request.args.get('count', default=1, type=int)
|
||||||
|
|
||||||
|
result, status_code = CartService.add_to_cart(user_id, product_id, count)
|
||||||
|
|
||||||
|
return result, status_code
|
@ -1,4 +1,4 @@
|
|||||||
from .. import bp_errors
|
from app.api import bp_errors
|
||||||
|
|
||||||
@bp_errors.app_errorhandler(400)
|
@bp_errors.app_errorhandler(400)
|
||||||
def bad_request(e):
|
def bad_request(e):
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
from flask import jsonify, abort
|
from flask import jsonify, abort
|
||||||
|
|
||||||
from .. import bp
|
from app.api import bp
|
||||||
|
|
||||||
@bp.route('/')
|
@bp.route('/')
|
||||||
def hello():
|
def hello():
|
||||||
|
@ -5,58 +5,14 @@ from app.api import bp_product
|
|||||||
from app.services.product_service import ProductService
|
from app.services.product_service import ProductService
|
||||||
|
|
||||||
@bp_product.route('/<int:id>', methods=['GET'])
|
@bp_product.route('/<int:id>', methods=['GET'])
|
||||||
def all_product_info(id: int):
|
def get_product_info(id: int):
|
||||||
result = ProductService.get_all_info(id)
|
fields = ['name', 'price', 'image', 'image_name', 'seller']
|
||||||
|
|
||||||
if result is not None:
|
fields_param = request.args.get('fields')
|
||||||
return jsonify(result)
|
requested_fields = []
|
||||||
else:
|
|
||||||
abort(404)
|
|
||||||
|
|
||||||
@bp_product.route('/<int:id>/name', methods=['GET'])
|
return abort(501)
|
||||||
def get_name(id: int):
|
|
||||||
result = ProductService.get_name(id)
|
|
||||||
|
|
||||||
if result is not None:
|
|
||||||
return jsonify({"name": result})
|
|
||||||
else:
|
|
||||||
return abort(404)
|
|
||||||
|
|
||||||
@bp_product.route('/<int:id>/manufacturer', methods=['GET'])
|
|
||||||
def get_manufacturer(id: int):
|
|
||||||
result = ProductService.get_manufacturer(id)
|
|
||||||
|
|
||||||
if result is not None:
|
|
||||||
return jsonify({"name": result})
|
|
||||||
else:
|
|
||||||
return abort(404)
|
|
||||||
|
|
||||||
@bp_product.route('/<int:id>/price', methods=['GET'])
|
|
||||||
def get_price(id: int):
|
|
||||||
result = ProductService.get_price(id)
|
|
||||||
|
|
||||||
if result is not None:
|
|
||||||
return jsonify({"price": result})
|
|
||||||
else:
|
|
||||||
return abort(404)
|
|
||||||
|
|
||||||
@bp_product.route('/<int:id>/image', methods=['GET'])
|
|
||||||
def get_image(id: int):
|
|
||||||
result = ProductService.get_image(id)
|
|
||||||
|
|
||||||
if result is not None:
|
|
||||||
return jsonify({"image": result})
|
|
||||||
else:
|
|
||||||
return abort(404)
|
|
||||||
|
|
||||||
@bp_product.route('/<int:id>/image_name', methods=['GET'])
|
|
||||||
def get_image_name(id: int):
|
|
||||||
result = ProductService.get_image_name(id)
|
|
||||||
|
|
||||||
if result is not None:
|
|
||||||
return jsonify({"image_name": result})
|
|
||||||
else:
|
|
||||||
return abort(404)
|
|
||||||
|
|
||||||
@bp_product.route('/create', methods=['POST'])
|
@bp_product.route('/create', methods=['POST'])
|
||||||
def create_product_listing():
|
def create_product_listing():
|
||||||
|
30
app/services/cart_service.py
Normal file
30
app/services/cart_service.py
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
from mysql.connector import Error
|
||||||
|
from typing import Tuple, Union
|
||||||
|
|
||||||
|
from app.extensions import db_cursor, db_connection
|
||||||
|
|
||||||
|
class CartService:
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def add_to_cart(user_id: str, product_id: int, count: int) -> Tuple[Union[dict, str], int]:
|
||||||
|
try:
|
||||||
|
with db_connection.cursor() as cursor:
|
||||||
|
db_connection.begin()
|
||||||
|
|
||||||
|
db_cursor.execute("select * from cart_item where cart_id = %s and product_id = %s", (user_id, product_id))
|
||||||
|
|
||||||
|
if db_cursor.rowcount != 0:
|
||||||
|
db_cursor.execute("update cart_item set count = count + %s where cart_id = %s and product_id = %s", (count, user_id, product_id))
|
||||||
|
else:
|
||||||
|
db_cursor.execute("insert into cart_item(cart_id, product_id, count) values (%s, %s, %s)", (user_id, product_id, count))
|
||||||
|
|
||||||
|
db_connection.commit()
|
||||||
|
|
||||||
|
return {"Success": "Successfully added to cart"}, 200
|
||||||
|
|
||||||
|
except Error as e:
|
||||||
|
return {"Failed": f"Failed to add item to cart. {e}"}
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def show_cart(user_id: str):
|
||||||
|
return None
|
@ -1,44 +1,70 @@
|
|||||||
import base64
|
import base64
|
||||||
|
|
||||||
from ..extensions import db_cursor as cursor
|
from flask import abort
|
||||||
|
from mysql.connector import Error
|
||||||
|
|
||||||
|
from app.extensions import db_connection
|
||||||
|
|
||||||
class ProductService:
|
class ProductService:
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_name(product_id: int):
|
def get_name(product_id: int):
|
||||||
cursor.execute(f"select name from product where product.id = {product_id}")
|
db_cursor.execute(f"select name from product where product.id = {product_id}")
|
||||||
result = cursor.fetchone()
|
|
||||||
|
if db_cursor.rowcount != 1:
|
||||||
|
return abort(404)
|
||||||
|
|
||||||
|
result = db_cursor.fetchone()
|
||||||
return result['name']
|
return result['name']
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_manufacturer(product_id: int):
|
def get_manufacturer(product_id: int):
|
||||||
cursor.execute(f"select user.displayname as seller from product inner join user on product.seller_id = user.id where product.id = {product_id}")
|
db_cursor.execute(f"select user.displayname as seller from product inner join user on product.seller_id = user.id where product.id = {product_id}")
|
||||||
result = cursor.fetchone()
|
|
||||||
|
if db_cursor.rowcount != 1:
|
||||||
|
return abort(404)
|
||||||
|
|
||||||
|
result = db_cursor.fetchone()
|
||||||
return result['seller']
|
return result['seller']
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_price(product_id: int):
|
def get_price(product_id: int):
|
||||||
cursor.execute(f"select price_pc from product where product.id = {product_id}")
|
db_cursor.execute(f"select price_pc from product where product.id = {product_id}")
|
||||||
result = cursor['price_pc']
|
|
||||||
return result[0]
|
if db_cursor.rowcount != 1:
|
||||||
|
return abort(404)
|
||||||
|
|
||||||
|
result = db_cursor.fetchone()
|
||||||
|
return result['price_pc']
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_image(product_id: int):
|
def get_image(product_id: int):
|
||||||
cursor.execute(f"select image from product where product.id = {product_id}")
|
db_cursor.execute(f"select image from product where product.id = {product_id}")
|
||||||
result = cursor['image']
|
|
||||||
return base64.b64encode(result[0]).decode('utf-8')
|
if db_cursor.rowcount != 1:
|
||||||
|
return abort(404)
|
||||||
|
|
||||||
|
result = db_cursor.fetchone()
|
||||||
|
return base64.b64encode(result['image']).decode('utf-8')
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_image_name(product_id: int):
|
def get_image_name(product_id: int):
|
||||||
cursor.execute(f"select image_name from product where product.id = {product_id}")
|
db_cursor.execute(f"select image_name from product where product.id = {product_id}")
|
||||||
result = cursor['image_name']
|
|
||||||
return result[0]
|
if db_cursor.rowcount != 1:
|
||||||
|
return abort(404)
|
||||||
|
|
||||||
|
result = db_cursor.fetchone()
|
||||||
|
return result['image_name']
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def get_all_info(product_id: int):
|
def get_all_info(product_id: int):
|
||||||
cursor.execute(f"select name, user.displayname as seller, price_pc, image_name, image from product inner join user on product.seller_id = user.id where product.id = {product_id}")
|
db_cursor.execute(f"select name, user.displayname as seller, price_pc, image_name, image from product inner join user on product.seller_id = user.id where product.id = {product_id}")
|
||||||
result = cursor.fetchone()
|
|
||||||
|
|
||||||
|
if db_cursor.rowcount != 1:
|
||||||
|
return abort(404)
|
||||||
|
|
||||||
|
result = db_cursor.fetchone()
|
||||||
return {
|
return {
|
||||||
"name": result['name'],
|
"name": result['name'],
|
||||||
"seller": result['seller'],
|
"seller": result['seller'],
|
||||||
@ -48,5 +74,11 @@ class ProductService:
|
|||||||
}
|
}
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def create_listing():
|
def create_listing(name: str, seller_id: str, price: float, image_name: str, image):
|
||||||
print("asd")
|
try:
|
||||||
|
db_cursor.execute("insert into product(seller_id, name, price_pc, image, image_name) values (%s, %s, %s, %s, %s)", (seller_id, name, price, image, image_name))
|
||||||
|
db_connection.commit()
|
||||||
|
except Error as e:
|
||||||
|
return {"Failed": f"Failed to create product. {e}"}, 400
|
||||||
|
|
||||||
|
return {"Success", "Successfully created new product listing"}, 200
|
19
shop.sql
19
shop.sql
@ -18,8 +18,8 @@ create table user_role(
|
|||||||
role varchar(32) not null unique
|
role varchar(32) not null unique
|
||||||
);
|
);
|
||||||
|
|
||||||
insert into user_role(role) values ('normal')
|
insert into user_role(id, role) values (1, 'normal');
|
||||||
insert into user_role(role) values ('admin')
|
insert into user_role(id, role) values (2, 'admin');
|
||||||
|
|
||||||
create table user_statistics(
|
create table user_statistics(
|
||||||
id int primary key,
|
id int primary key,
|
||||||
@ -77,7 +77,6 @@ create table purchase_item(
|
|||||||
foreign key (product_id) references product(id)
|
foreign key (product_id) references product(id)
|
||||||
);
|
);
|
||||||
|
|
||||||
delimiter //
|
|
||||||
create trigger after_user_insert
|
create trigger after_user_insert
|
||||||
after insert
|
after insert
|
||||||
on user for each row
|
on user for each row
|
||||||
@ -85,10 +84,7 @@ begin
|
|||||||
insert into user_statistics(id) values (new.id);
|
insert into user_statistics(id) values (new.id);
|
||||||
insert into cart(id) values (new.id);
|
insert into cart(id) values (new.id);
|
||||||
end;
|
end;
|
||||||
//
|
|
||||||
delimiter;
|
|
||||||
|
|
||||||
delimiter //
|
|
||||||
create trigger after_user_delete
|
create trigger after_user_delete
|
||||||
after delete
|
after delete
|
||||||
on user for each row
|
on user for each row
|
||||||
@ -96,10 +92,7 @@ begin
|
|||||||
delete from user_statistics where id = old.id;
|
delete from user_statistics where id = old.id;
|
||||||
delete from cart where id = old.id;
|
delete from cart where id = old.id;
|
||||||
end;
|
end;
|
||||||
//
|
|
||||||
delimiter;
|
|
||||||
|
|
||||||
delimiter //
|
|
||||||
create trigger after_cart_insert
|
create trigger after_cart_insert
|
||||||
after insert
|
after insert
|
||||||
on cart_item for each row
|
on cart_item for each row
|
||||||
@ -112,10 +105,7 @@ begin
|
|||||||
)
|
)
|
||||||
where id = new.cart_id;
|
where id = new.cart_id;
|
||||||
end;
|
end;
|
||||||
//
|
|
||||||
delimiter;
|
|
||||||
|
|
||||||
delimiter //
|
|
||||||
create trigger after_cart_delete
|
create trigger after_cart_delete
|
||||||
after delete
|
after delete
|
||||||
on cart_item for each row
|
on cart_item for each row
|
||||||
@ -129,10 +119,7 @@ begin
|
|||||||
)
|
)
|
||||||
where id = old.cart_id;
|
where id = old.cart_id;
|
||||||
end;
|
end;
|
||||||
//
|
|
||||||
delimiter;
|
|
||||||
|
|
||||||
delimiter //
|
|
||||||
create trigger calculate_price_subtotal
|
create trigger calculate_price_subtotal
|
||||||
before insert on cart_item
|
before insert on cart_item
|
||||||
for each row
|
for each row
|
||||||
@ -143,5 +130,3 @@ begin
|
|||||||
where p.id = new.product_id
|
where p.id = new.product_id
|
||||||
);
|
);
|
||||||
end;
|
end;
|
||||||
//
|
|
||||||
delimiter;
|
|
Loading…
x
Reference in New Issue
Block a user