feat: Phase 1 - 核心功能实现
This commit is contained in:
91
app/routes/messages.py
Normal file
91
app/routes/messages.py
Normal file
@@ -0,0 +1,91 @@
|
||||
"""
|
||||
消息路由
|
||||
"""
|
||||
from flask import Blueprint, request, jsonify
|
||||
from flask_jwt_extended import jwt_required, get_jwt_identity
|
||||
from datetime import datetime
|
||||
from app.models import db, Message, Session
|
||||
|
||||
messages_bp = Blueprint('messages', __name__)
|
||||
|
||||
|
||||
@messages_bp.route('/', methods=['POST'])
|
||||
@jwt_required()
|
||||
def send_message():
|
||||
"""发送消息 (HTTP 方式)"""
|
||||
user_id = get_jwt_identity()
|
||||
data = request.get_json()
|
||||
|
||||
session_id = data.get('session_id')
|
||||
content = data.get('content')
|
||||
message_type = data.get('type', 'text')
|
||||
reply_to = data.get('reply_to')
|
||||
|
||||
if not all([session_id, content]):
|
||||
return jsonify({'error': 'Missing required fields'}), 400
|
||||
|
||||
# 验证会话
|
||||
session = Session.query.filter_by(id=session_id, user_id=user_id).first()
|
||||
if not session:
|
||||
return jsonify({'error': 'Session not found'}), 404
|
||||
|
||||
# 创建消息
|
||||
message = Message(
|
||||
session_id=session_id,
|
||||
sender_type='user',
|
||||
sender_id=user_id,
|
||||
message_type=message_type,
|
||||
content=content,
|
||||
reply_to=reply_to,
|
||||
status='sent',
|
||||
ack_status='pending'
|
||||
)
|
||||
|
||||
db.session.add(message)
|
||||
|
||||
# 更新会话
|
||||
session.message_count += 1
|
||||
session.last_active_at = datetime.utcnow()
|
||||
|
||||
db.session.commit()
|
||||
|
||||
return jsonify({'message': message.to_dict()}), 201
|
||||
|
||||
|
||||
@messages_bp.route('/<message_id>', methods=['GET'])
|
||||
@jwt_required()
|
||||
def get_message(message_id):
|
||||
"""获取单条消息"""
|
||||
message = Message.query.get(message_id)
|
||||
if not message:
|
||||
return jsonify({'error': 'Message not found'}), 404
|
||||
|
||||
return jsonify({'message': message.to_dict()}), 200
|
||||
|
||||
|
||||
@messages_bp.route('/<message_id>/ack', methods=['PUT'])
|
||||
def acknowledge_message(message_id):
|
||||
"""确认消息已送达"""
|
||||
message = Message.query.get(message_id)
|
||||
if not message:
|
||||
return jsonify({'error': 'Message not found'}), 404
|
||||
|
||||
message.ack_status = 'acknowledged'
|
||||
message.delivered_at = datetime.utcnow()
|
||||
db.session.commit()
|
||||
|
||||
return jsonify({'message': message.to_dict()}), 200
|
||||
|
||||
|
||||
@messages_bp.route('/<message_id>/read', methods=['PUT'])
|
||||
@jwt_required()
|
||||
def mark_message_read(message_id):
|
||||
"""标记消息已读"""
|
||||
message = Message.query.get(message_id)
|
||||
if not message:
|
||||
return jsonify({'error': 'Message not found'}), 404
|
||||
|
||||
message.status = 'read'
|
||||
db.session.commit()
|
||||
|
||||
return jsonify({'message': message.to_dict()}), 200
|
||||
Reference in New Issue
Block a user