Files
baiyue-logistics-chat/logistics_chat/routes/customer.py
T

69 lines
2.3 KiB
Python

"""Public, visitor-bound customer login endpoints. No staff privileges."""
from flask import Blueprint, current_app, jsonify, request
from werkzeug.exceptions import RequestEntityTooLarge
from .. import customer_service, customer_order_service
from ..order_data import OrderDataUnavailable
bp = Blueprint('customer', __name__)
@bp.get('/api/customer/session')
def session():
return customer_service.session_status()
@bp.post('/api/customer/login')
def login():
request.max_content_length = 2048
try:
return customer_service.login(request.get_json(silent=True), current_app.extensions['customer_login_attempts'],
current_app.extensions['customer_login_lock'])
except RequestEntityTooLarge:
return {'ok':False,'error':'登录信息过长。'}, 413
@bp.post('/api/customer/logout')
def logout():
return customer_service.logout()
@bp.after_request
def private_response(response):
response.headers['Cache-Control'] = 'no-store'
return response
def order_request(action):
if not customer_service.current_customer_id():
return {'ok': False, 'error': 'customer_login_required'}, 401
try:
return action()
except OrderDataUnavailable:
return {'ok': False, 'error': '订单暂时无法加载,请稍后重试。'}, 503
@bp.get('/api/customer/orders')
def orders():
def browse():
status = request.args.get('status', 'all')
if status not in customer_order_service.FILTERS:
return {'ok': False, 'error': '订单状态筛选无效。'}, 400
before = request.args.get('before')
if before is not None:
if not before.isascii() or not before.isdigit() or len(before) > 19 or not 0 < int(before) <= 9223372036854775807:
return {'ok': False, 'error': '分页参数无效。'}, 400
before = int(before)
return customer_order_service.list_orders(before, status)
return order_request(browse)
@bp.get('/api/customer/orders/<int:order_id>')
def order(order_id):
def detail():
card = customer_order_service.order_detail(order_id)
if card is None:
return {'ok': False, 'error': '订单不存在或当前账号无权查看。'}, 404
return jsonify({'ok': True, 'card': card})
return order_request(detail)