lovelace_url_controller.py 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. from flask import request
  2. from flask_restx import Resource, Namespace, fields
  3. from app.service.lovelace_url_service import LovelaceURLService
  4. from app.utils.jwt_utils import token_required
  5. from app import db
  6. api = Namespace('lovelace', description='Home Assistant Lovelace URL 管理')
  7. lovelace_model = api.model('LovelaceURL', {
  8. 'id': fields.Integer(readOnly=True, description='记录ID'),
  9. 'room_name': fields.String(required=True, description='房间名称'),
  10. 'url': fields.String(required=True, description='Lovelace 卡片或视图 URL')
  11. })
  12. lovelace_input_model = api.model('LovelaceURLInput', {
  13. 'room_name': fields.String(required=True, description='房间名称'),
  14. 'url': fields.String(required=True, description='Lovelace 卡片或视图 URL')
  15. })
  16. @api.route('/')
  17. class LovelaceListResource(Resource):
  18. @token_required
  19. @api.marshal_list_with(lovelace_model)
  20. def get(self):
  21. """获取所有 Lovelace URL 记录"""
  22. service = LovelaceURLService(db.session)
  23. records = service.list_all()
  24. return [r.to_dict() for r in records]
  25. @token_required
  26. @api.expect(lovelace_input_model, validate=True)
  27. @api.marshal_with(lovelace_model, code=201)
  28. def post(self):
  29. """创建新的 Lovelace URL 记录"""
  30. data = request.get_json()
  31. service = LovelaceURLService(db.session)
  32. try:
  33. new_record = service.create(room_name=data['room_name'], url=data['url'])
  34. return new_record.to_dict(), 201
  35. except ValueError as e:
  36. api.abort(400, str(e))
  37. @api.route('/<int:record_id>')
  38. class LovelaceResource(Resource):
  39. @token_required
  40. @api.marshal_with(lovelace_model)
  41. @api.response(404, 'Record not found')
  42. def get(self, record_id: int):
  43. """根据 ID 获取记录"""
  44. service = LovelaceURLService(db.session)
  45. try:
  46. record = service.get_by_id(record_id)
  47. return record.to_dict()
  48. except ValueError as e:
  49. api.abort(404, str(e))
  50. @token_required
  51. @api.expect(api.model('LovelaceURLUpdate', {
  52. 'room_name': fields.String(description='房间名称'),
  53. 'url': fields.String(description='Lovelace 卡片或视图 URL')
  54. }))
  55. @api.marshal_with(lovelace_model)
  56. @api.response(404, 'Record not found')
  57. def put(self, record_id: int):
  58. """更新记录"""
  59. data = request.get_json()
  60. service = LovelaceURLService(db.session)
  61. try:
  62. updated = service.update(
  63. record_id=record_id,
  64. room_name=data.get('room_name'),
  65. url=data.get('url')
  66. )
  67. return updated.to_dict()
  68. except ValueError as e:
  69. api.abort(404, str(e))
  70. @token_required
  71. @api.response(204, 'Record deleted')
  72. @api.response(404, 'Record not found')
  73. def delete(self, record_id: int):
  74. """删除记录"""
  75. service = LovelaceURLService(db.session)
  76. try:
  77. service.delete(record_id)
  78. return '', 204
  79. except ValueError as e:
  80. api.abort(404, str(e))