"""Item API routes.""" from flask_restx import Namespace, Resource, fields from app.services.item_service import ItemService from app.utils.auth_decorator import require_auth item_ns = Namespace('items', description='物品管理接口') # API models for Swagger documentation item_model = item_ns.model('Item', { 'id': fields.Integer(readonly=True, description='物品ID'), 'name': fields.String(required=True, description='物品名称'), 'unit_price': fields.Float(required=True, description='单价'), 'created_at': fields.String(readonly=True, description='创建时间'), 'updated_at': fields.String(readonly=True, description='更新时间') }) item_input = item_ns.model('ItemInput', { 'name': fields.String(required=True, description='物品名称'), 'unit_price': fields.Float(required=True, description='单价') }) item_update = item_ns.model('ItemUpdate', { 'id': fields.Integer(required=True, description='物品ID'), 'name': fields.String(description='物品名称'), 'unit_price': fields.Float(description='单价') }) item_delete = item_ns.model('ItemDelete', { 'id': fields.Integer(required=True, description='物品ID') }) # Response models success_response = item_ns.model('SuccessResponse', { 'success': fields.Boolean(description='操作是否成功'), 'data': fields.Raw(description='返回数据'), 'message': fields.String(description='消息') }) error_response = item_ns.model('ErrorResponse', { 'success': fields.Boolean(description='操作是否成功'), 'error': fields.String(description='错误信息'), 'code': fields.String(description='错误代码') }) @item_ns.route('') class ItemList(Resource): """Resource for listing all items.""" @item_ns.doc('list_items') @item_ns.response(200, 'Success', success_response) @require_auth def get(self): """获取所有物品列表""" items = ItemService.get_all() return { 'success': True, 'data': items, 'message': 'Items retrieved successfully' }, 200 @item_ns.route('/') @item_ns.param('id', '物品ID') class ItemDetail(Resource): """Resource for getting a single item.""" @item_ns.doc('get_item') @item_ns.response(200, 'Success', success_response) @item_ns.response(404, 'Item not found', error_response) @require_auth def get(self, id): """根据ID获取物品信息""" item, error = ItemService.get_by_id(id) if error: return { 'success': False, 'error': error, 'code': 'NOT_FOUND' }, 404 return { 'success': True, 'data': item, 'message': 'Item retrieved successfully' }, 200 @item_ns.route('/create') class ItemCreate(Resource): """Resource for creating an item.""" @item_ns.doc('create_item') @item_ns.expect(item_input) @item_ns.response(200, 'Success', success_response) @item_ns.response(400, 'Validation error', error_response) @require_auth def post(self): """创建新物品""" data = item_ns.payload name = data.get('name', '') unit_price = data.get('unit_price') item, error = ItemService.create(name, unit_price) if error: return { 'success': False, 'error': error, 'code': 'VALIDATION_ERROR' }, 400 return { 'success': True, 'data': item, 'message': 'Item created successfully' }, 200 @item_ns.route('/update') class ItemUpdate(Resource): """Resource for updating an item.""" @item_ns.doc('update_item') @item_ns.expect(item_update) @item_ns.response(200, 'Success', success_response) @item_ns.response(400, 'Validation error', error_response) @item_ns.response(404, 'Item not found', error_response) @require_auth def post(self): """更新物品信息""" data = item_ns.payload item_id = data.get('id') name = data.get('name') unit_price = data.get('unit_price') if not item_id: return { 'success': False, 'error': 'Item ID is required', 'code': 'VALIDATION_ERROR' }, 400 item, error = ItemService.update(item_id, name, unit_price) if error: if 'not found' in error.lower(): return { 'success': False, 'error': error, 'code': 'NOT_FOUND' }, 404 return { 'success': False, 'error': error, 'code': 'VALIDATION_ERROR' }, 400 return { 'success': True, 'data': item, 'message': 'Item updated successfully' }, 200 @item_ns.route('/delete') class ItemDelete(Resource): """Resource for deleting an item.""" @item_ns.doc('delete_item') @item_ns.expect(item_delete) @item_ns.response(200, 'Success', success_response) @item_ns.response(404, 'Item not found', error_response) @require_auth def post(self): """删除物品""" data = item_ns.payload item_id = data.get('id') if not item_id: return { 'success': False, 'error': 'Item ID is required', 'code': 'VALIDATION_ERROR' }, 400 success, error = ItemService.delete(item_id) if error: return { 'success': False, 'error': error, 'code': 'NOT_FOUND' }, 404 return { 'success': True, 'data': None, 'message': 'Item deleted successfully' }, 200