| 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 |
| |
| |
| 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 |
|
|
|
|