user_room_controller.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. from flask import request
  2. from flask_restx import Resource, Namespace, fields
  3. from app.service.user_room_service import UserRoomService
  4. from app.utils.jwt_utils import token_required
  5. from app.utils.logger import Logger, log_request_info
  6. from app import db
  7. api = Namespace('user_room', description='用户账号与房间ID映射管理')
  8. user_room_model = api.model('UserRoom', {
  9. 'id': fields.Integer(readOnly=True, description='记录ID'),
  10. 'user_account': fields.String(required=True, description='用户账号'),
  11. 'room_id': fields.String(required=True, description='房间ID')
  12. })
  13. user_room_input_model = api.model('UserRoomInput', {
  14. 'user_account': fields.String(required=True, description='用户账号'),
  15. 'room_id': fields.String(required=True, description='房间ID')
  16. })
  17. @api.route('/')
  18. class UserRoomListResource(Resource):
  19. @token_required
  20. @api.marshal_list_with(user_room_model)
  21. @log_request_info
  22. def get(self):
  23. """获取所有映射"""
  24. Logger.info("获取用户房间映射列表")
  25. service = UserRoomService(db.session)
  26. records = service.list_all()
  27. Logger.info("用户房间映射列表获取成功", {
  28. 'record_count': len(records)
  29. })
  30. return [r.to_dict() for r in records]
  31. @token_required
  32. @api.expect(user_room_input_model, validate=True)
  33. @api.marshal_with(user_room_model, code=201)
  34. @log_request_info
  35. def post(self):
  36. """创建新映射"""
  37. data = request.get_json()
  38. service = UserRoomService(db.session)
  39. Logger.info("创建用户房间映射", {
  40. 'user_account': data.get('user_account'),
  41. 'room_id': data.get('room_id')
  42. })
  43. try:
  44. new_record = service.create(user_account=data['user_account'], room_id=data['room_id'])
  45. Logger.info("用户房间映射创建成功", {
  46. 'record_id': new_record.id,
  47. 'user_account': new_record.user_account,
  48. 'room_id': new_record.room_id
  49. })
  50. return new_record.to_dict(), 201
  51. except ValueError as e:
  52. Logger.warning("用户房间映射创建失败", {
  53. 'user_account': data.get('user_account'),
  54. 'room_id': data.get('room_id'),
  55. 'error': str(e)
  56. })
  57. api.abort(400, str(e))
  58. @api.route('/<int:record_id>')
  59. class UserRoomResource(Resource):
  60. @token_required
  61. @api.marshal_with(user_room_model)
  62. @api.response(404, 'Record not found')
  63. def get(self, record_id: int):
  64. """根据ID获取映射"""
  65. service = UserRoomService(db.session)
  66. try:
  67. record = service.get_by_id(record_id)
  68. return record.to_dict()
  69. except ValueError as e:
  70. api.abort(404, str(e))
  71. @token_required
  72. @api.expect(api.model('UserRoomUpdate', {
  73. 'user_account': fields.String(description='用户账号'),
  74. 'room_id': fields.String(description='房间ID')
  75. }))
  76. @api.marshal_with(user_room_model)
  77. @api.response(404, 'Record not found')
  78. def put(self, record_id: int):
  79. """更新映射"""
  80. data = request.get_json()
  81. service = UserRoomService(db.session)
  82. try:
  83. updated = service.update(
  84. record_id=record_id,
  85. user_account=data.get('user_account'),
  86. room_id=data.get('room_id')
  87. )
  88. return updated.to_dict()
  89. except ValueError as e:
  90. # 可能是未找到或唯一冲突等
  91. api.abort(400 if 'exists' in str(e) else 404, str(e))
  92. @token_required
  93. @api.response(204, 'Record deleted')
  94. @api.response(404, 'Record not found')
  95. def delete(self, record_id: int):
  96. """删除映射"""
  97. service = UserRoomService(db.session)
  98. try:
  99. service.delete(record_id)
  100. return '', 204
  101. except ValueError as e:
  102. api.abort(404, str(e))
  103. @api.route('/by-user/<string:user_account>')
  104. class UserRoomByUserResource(Resource):
  105. @token_required
  106. @api.marshal_list_with(api.model('UserRoomDetails', {
  107. 'id': fields.Integer(description='记录ID'),
  108. 'user_account': fields.String(description='用户账号'),
  109. 'room_name': fields.String(description='房间名称'),
  110. 'room_url': fields.String(description='房间URL'),
  111. 'room_id': fields.String(description='房间ID')
  112. }))
  113. def get(self, user_account: str):
  114. """根据用户账号返回房间映射详情列表(用户账号、房间名、房间URL)"""
  115. service = UserRoomService(db.session)
  116. results = service.list_details_by_user_account(user_account)
  117. return results