69 lines
2.3 KiB
Python
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)
|