item.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. """Item API routes."""
  2. from flask_restx import Namespace, Resource, fields
  3. from app.services.item_service import ItemService
  4. from app.utils.auth_decorator import require_auth
  5. item_ns = Namespace('items', description='物品管理接口')
  6. # API models for Swagger documentation
  7. item_model = item_ns.model('Item', {
  8. 'id': fields.Integer(readonly=True, description='物品ID'),
  9. 'name': fields.String(required=True, description='物品名称'),
  10. 'unit_price': fields.Float(required=True, description='单价'),
  11. 'created_at': fields.String(readonly=True, description='创建时间'),
  12. 'updated_at': fields.String(readonly=True, description='更新时间')
  13. })
  14. item_input = item_ns.model('ItemInput', {
  15. 'name': fields.String(required=True, description='物品名称'),
  16. 'unit_price': fields.Float(required=True, description='单价')
  17. })
  18. item_update = item_ns.model('ItemUpdate', {
  19. 'id': fields.Integer(required=True, description='物品ID'),
  20. 'name': fields.String(description='物品名称'),
  21. 'unit_price': fields.Float(description='单价')
  22. })
  23. item_delete = item_ns.model('ItemDelete', {
  24. 'id': fields.Integer(required=True, description='物品ID')
  25. })
  26. # Response models
  27. success_response = item_ns.model('SuccessResponse', {
  28. 'success': fields.Boolean(description='操作是否成功'),
  29. 'data': fields.Raw(description='返回数据'),
  30. 'message': fields.String(description='消息')
  31. })
  32. error_response = item_ns.model('ErrorResponse', {
  33. 'success': fields.Boolean(description='操作是否成功'),
  34. 'error': fields.String(description='错误信息'),
  35. 'code': fields.String(description='错误代码')
  36. })
  37. @item_ns.route('')
  38. class ItemList(Resource):
  39. """Resource for listing all items."""
  40. @item_ns.doc('list_items')
  41. @item_ns.response(200, 'Success', success_response)
  42. @require_auth
  43. def get(self):
  44. """获取所有物品列表"""
  45. items = ItemService.get_all()
  46. return {
  47. 'success': True,
  48. 'data': items,
  49. 'message': 'Items retrieved successfully'
  50. }, 200
  51. @item_ns.route('/<int:id>')
  52. @item_ns.param('id', '物品ID')
  53. class ItemDetail(Resource):
  54. """Resource for getting a single item."""
  55. @item_ns.doc('get_item')
  56. @item_ns.response(200, 'Success', success_response)
  57. @item_ns.response(404, 'Item not found', error_response)
  58. @require_auth
  59. def get(self, id):
  60. """根据ID获取物品信息"""
  61. item, error = ItemService.get_by_id(id)
  62. if error:
  63. return {
  64. 'success': False,
  65. 'error': error,
  66. 'code': 'NOT_FOUND'
  67. }, 404
  68. return {
  69. 'success': True,
  70. 'data': item,
  71. 'message': 'Item retrieved successfully'
  72. }, 200
  73. @item_ns.route('/create')
  74. class ItemCreate(Resource):
  75. """Resource for creating an item."""
  76. @item_ns.doc('create_item')
  77. @item_ns.expect(item_input)
  78. @item_ns.response(200, 'Success', success_response)
  79. @item_ns.response(400, 'Validation error', error_response)
  80. @require_auth
  81. def post(self):
  82. """创建新物品"""
  83. data = item_ns.payload
  84. name = data.get('name', '')
  85. unit_price = data.get('unit_price')
  86. item, error = ItemService.create(name, unit_price)
  87. if error:
  88. return {
  89. 'success': False,
  90. 'error': error,
  91. 'code': 'VALIDATION_ERROR'
  92. }, 400
  93. return {
  94. 'success': True,
  95. 'data': item,
  96. 'message': 'Item created successfully'
  97. }, 200
  98. @item_ns.route('/update')
  99. class ItemUpdate(Resource):
  100. """Resource for updating an item."""
  101. @item_ns.doc('update_item')
  102. @item_ns.expect(item_update)
  103. @item_ns.response(200, 'Success', success_response)
  104. @item_ns.response(400, 'Validation error', error_response)
  105. @item_ns.response(404, 'Item not found', error_response)
  106. @require_auth
  107. def post(self):
  108. """更新物品信息"""
  109. data = item_ns.payload
  110. item_id = data.get('id')
  111. name = data.get('name')
  112. unit_price = data.get('unit_price')
  113. if not item_id:
  114. return {
  115. 'success': False,
  116. 'error': 'Item ID is required',
  117. 'code': 'VALIDATION_ERROR'
  118. }, 400
  119. item, error = ItemService.update(item_id, name, unit_price)
  120. if error:
  121. if 'not found' in error.lower():
  122. return {
  123. 'success': False,
  124. 'error': error,
  125. 'code': 'NOT_FOUND'
  126. }, 404
  127. return {
  128. 'success': False,
  129. 'error': error,
  130. 'code': 'VALIDATION_ERROR'
  131. }, 400
  132. return {
  133. 'success': True,
  134. 'data': item,
  135. 'message': 'Item updated successfully'
  136. }, 200
  137. @item_ns.route('/delete')
  138. class ItemDelete(Resource):
  139. """Resource for deleting an item."""
  140. @item_ns.doc('delete_item')
  141. @item_ns.expect(item_delete)
  142. @item_ns.response(200, 'Success', success_response)
  143. @item_ns.response(404, 'Item not found', error_response)
  144. @require_auth
  145. def post(self):
  146. """删除物品"""
  147. data = item_ns.payload
  148. item_id = data.get('id')
  149. if not item_id:
  150. return {
  151. 'success': False,
  152. 'error': 'Item ID is required',
  153. 'code': 'VALIDATION_ERROR'
  154. }, 400
  155. success, error = ItemService.delete(item_id)
  156. if error:
  157. return {
  158. 'success': False,
  159. 'error': error,
  160. 'code': 'NOT_FOUND'
  161. }, 404
  162. return {
  163. 'success': True,
  164. 'data': None,
  165. 'message': 'Item deleted successfully'
  166. }, 200