CheckList / src /routes /travel.py
Lashtw's picture
Upload 20 files
db0210c verified
from flask import Blueprint, request, jsonify
from src.models.travel import db, TravelList, TravelItem
from datetime import datetime
travel_bp = Blueprint('travel', __name__)
@travel_bp.route('/travel-lists', methods=['POST'])
def create_travel_list():
"""建立新的旅遊清單"""
try:
data = request.get_json()
title = data.get('title', '我們的旅遊清單')
# 生成唯一代碼
code = TravelList.generate_code()
while TravelList.query.filter_by(code=code).first():
code = TravelList.generate_code()
travel_list = TravelList(code=code, title=title)
db.session.add(travel_list)
db.session.commit()
return jsonify({
'success': True,
'data': travel_list.to_dict(),
'message': '旅遊清單建立成功'
}), 201
except Exception as e:
db.session.rollback()
return jsonify({
'success': False,
'message': f'建立失敗: {str(e)}'
}), 500
@travel_bp.route('/travel-lists/<code>', methods=['GET'])
def get_travel_list(code):
"""根據代碼取得旅遊清單"""
try:
travel_list = TravelList.query.filter_by(code=code).first()
if not travel_list:
return jsonify({
'success': False,
'message': '找不到該代碼的旅遊清單'
}), 404
return jsonify({
'success': True,
'data': travel_list.to_dict()
}), 200
except Exception as e:
return jsonify({
'success': False,
'message': f'取得失敗: {str(e)}'
}), 500
@travel_bp.route('/travel-lists/<code>/items', methods=['POST'])
def add_travel_item(code):
"""新增旅遊項目"""
try:
travel_list = TravelList.query.filter_by(code=code).first()
if not travel_list:
return jsonify({
'success': False,
'message': '找不到該代碼的旅遊清單'
}), 404
data = request.get_json()
content = data.get('content', '').strip()
if not content:
return jsonify({
'success': False,
'message': '項目內容不能為空'
}), 400
# 取得最大order值
max_order = db.session.query(db.func.max(TravelItem.order)).filter_by(
travel_list_id=travel_list.id, completed=False
).scalar() or 0
travel_item = TravelItem(
travel_list_id=travel_list.id,
content=content,
order=max_order + 1
)
db.session.add(travel_item)
# 更新清單的更新時間
travel_list.updated_at = datetime.utcnow()
db.session.commit()
return jsonify({
'success': True,
'data': travel_item.to_dict(),
'message': '項目新增成功'
}), 201
except Exception as e:
db.session.rollback()
return jsonify({
'success': False,
'message': f'新增失敗: {str(e)}'
}), 500
@travel_bp.route('/travel-items/<int:item_id>', methods=['PUT'])
def update_travel_item(item_id):
"""更新旅遊項目"""
try:
travel_item = TravelItem.query.get(item_id)
if not travel_item:
return jsonify({
'success': False,
'message': '找不到該項目'
}), 404
data = request.get_json()
# 更新內容
if 'content' in data:
content = data['content'].strip()
if not content:
return jsonify({
'success': False,
'message': '項目內容不能為空'
}), 400
travel_item.content = content
# 更新完成狀態
if 'completed' in data:
if data['completed']:
travel_item.mark_completed()
else:
travel_item.mark_uncompleted()
# 更新清單的更新時間
travel_item.travel_list.updated_at = datetime.utcnow()
db.session.commit()
return jsonify({
'success': True,
'data': travel_item.to_dict(),
'message': '項目更新成功'
}), 200
except Exception as e:
db.session.rollback()
return jsonify({
'success': False,
'message': f'更新失敗: {str(e)}'
}), 500
@travel_bp.route('/travel-items/<int:item_id>', methods=['DELETE'])
def delete_travel_item(item_id):
"""刪除旅遊項目"""
try:
travel_item = TravelItem.query.get(item_id)
if not travel_item:
return jsonify({
'success': False,
'message': '找不到該項目'
}), 404
# 更新清單的更新時間
travel_item.travel_list.updated_at = datetime.utcnow()
db.session.delete(travel_item)
db.session.commit()
return jsonify({
'success': True,
'message': '項目刪除成功'
}), 200
except Exception as e:
db.session.rollback()
return jsonify({
'success': False,
'message': f'刪除失敗: {str(e)}'
}), 500
@travel_bp.route('/travel-lists/<code>/title', methods=['PUT'])
def update_travel_list_title(code):
"""更新旅遊清單標題"""
try:
travel_list = TravelList.query.filter_by(code=code).first()
if not travel_list:
return jsonify({
'success': False,
'message': '找不到該代碼的旅遊清單'
}), 404
data = request.get_json()
title = data.get('title', '').strip()
if not title:
return jsonify({
'success': False,
'message': '標題不能為空'
}), 400
travel_list.title = title
travel_list.updated_at = datetime.utcnow()
db.session.commit()
return jsonify({
'success': True,
'data': travel_list.to_dict(),
'message': '標題更新成功'
}), 200
except Exception as e:
db.session.rollback()
return jsonify({
'success': False,
'message': f'更新失敗: {str(e)}'
}), 500