"""Supplier API routes.""" from flask_restx import Namespace, Resource, fields from app.services.supplier_service import SupplierService from app.utils.auth_decorator import require_auth supplier_ns = Namespace('suppliers', description='供应商管理接口') # API models for Swagger documentation supplier_model = supplier_ns.model('Supplier', { 'id': fields.Integer(readonly=True, description='供应商ID'), 'name': fields.String(required=True, description='供应商名称'), 'created_at': fields.String(readonly=True, description='创建时间'), 'updated_at': fields.String(readonly=True, description='更新时间') }) supplier_input = supplier_ns.model('SupplierInput', { 'name': fields.String(required=True, description='供应商名称') }) supplier_update = supplier_ns.model('SupplierUpdate', { 'id': fields.Integer(required=True, description='供应商ID'), 'name': fields.String(description='供应商名称') }) supplier_delete = supplier_ns.model('SupplierDelete', { 'id': fields.Integer(required=True, description='供应商ID') }) # Response models success_response = supplier_ns.model('SuccessResponse', { 'success': fields.Boolean(description='操作是否成功'), 'data': fields.Raw(description='返回数据'), 'message': fields.String(description='消息') }) error_response = supplier_ns.model('ErrorResponse', { 'success': fields.Boolean(description='操作是否成功'), 'error': fields.String(description='错误信息'), 'code': fields.String(description='错误代码') }) @supplier_ns.route('') class SupplierList(Resource): """Resource for listing all suppliers.""" @supplier_ns.doc('list_suppliers') @supplier_ns.response(200, 'Success', success_response) @require_auth def get(self): """获取所有供应商列表""" suppliers = SupplierService.get_all() return { 'success': True, 'data': suppliers, 'message': 'Suppliers retrieved successfully' }, 200 @supplier_ns.route('/') @supplier_ns.param('id', '供应商ID') class SupplierDetail(Resource): """Resource for getting a single supplier.""" @supplier_ns.doc('get_supplier') @supplier_ns.response(200, 'Success', success_response) @supplier_ns.response(404, 'Supplier not found', error_response) @require_auth def get(self, id): """根据ID获取供应商信息""" supplier, error = SupplierService.get_by_id(id) if error: return { 'success': False, 'error': error, 'code': 'NOT_FOUND' }, 404 return { 'success': True, 'data': supplier, 'message': 'Supplier retrieved successfully' }, 200 @supplier_ns.route('/create') class SupplierCreate(Resource): """Resource for creating a supplier.""" @supplier_ns.doc('create_supplier') @supplier_ns.expect(supplier_input) @supplier_ns.response(200, 'Success', success_response) @supplier_ns.response(400, 'Validation error', error_response) @require_auth def post(self): """创建新供应商""" data = supplier_ns.payload name = data.get('name', '') supplier, error = SupplierService.create(name) if error: code = 'DUPLICATE_NAME' if '已存在' in error else 'VALIDATION_ERROR' return { 'success': False, 'error': error, 'code': code }, 400 return { 'success': True, 'data': supplier, 'message': 'Supplier created successfully' }, 200 @supplier_ns.route('/update') class SupplierUpdate(Resource): """Resource for updating a supplier.""" @supplier_ns.doc('update_supplier') @supplier_ns.expect(supplier_update) @supplier_ns.response(200, 'Success', success_response) @supplier_ns.response(400, 'Validation error', error_response) @supplier_ns.response(404, 'Supplier not found', error_response) @require_auth def post(self): """更新供应商信息""" data = supplier_ns.payload supplier_id = data.get('id') name = data.get('name') if not supplier_id: return { 'success': False, 'error': 'Supplier ID is required', 'code': 'VALIDATION_ERROR' }, 400 supplier, error = SupplierService.update(supplier_id, name) if error: if '未找到' in error: return { 'success': False, 'error': error, 'code': 'NOT_FOUND' }, 404 code = 'DUPLICATE_NAME' if '已存在' in error else 'VALIDATION_ERROR' return { 'success': False, 'error': error, 'code': code }, 400 return { 'success': True, 'data': supplier, 'message': 'Supplier updated successfully' }, 200 @supplier_ns.route('/delete') class SupplierDelete(Resource): """Resource for deleting a supplier.""" @supplier_ns.doc('delete_supplier') @supplier_ns.expect(supplier_delete) @supplier_ns.response(200, 'Success', success_response) @supplier_ns.response(400, 'Cannot delete', error_response) @supplier_ns.response(404, 'Supplier not found', error_response) @require_auth def post(self): """删除供应商""" data = supplier_ns.payload supplier_id = data.get('id') if not supplier_id: return { 'success': False, 'error': 'Supplier ID is required', 'code': 'VALIDATION_ERROR' }, 400 success, error = SupplierService.delete(supplier_id) if error: if '未找到' in error: return { 'success': False, 'error': error, 'code': 'NOT_FOUND' }, 404 return { 'success': False, 'error': error, 'code': 'FOREIGN_KEY_VIOLATION' }, 400 return { 'success': True, 'data': None, 'message': 'Supplier deleted successfully' }, 200