From ca22da355d61dbead5be746fdc6bd54df46bc6f5 Mon Sep 17 00:00:00 2001 From: "ethan.chen" Date: Mon, 19 May 2025 17:36:33 +0800 Subject: [PATCH] feat: enhance media API with structured responses and error handling; add pagination support --- app.py | 228 +++++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 158 insertions(+), 70 deletions(-) diff --git a/app.py b/app.py index 63f1e0b..7284c4a 100644 --- a/app.py +++ b/app.py @@ -30,83 +30,171 @@ with app.app_context(): db.create_all() # API 路由 -@app.route('/api/media', methods=['GET']) +@app.route('/api/media/list', methods=['GET']) def get_all_media(): - media_list = Media.query.all() - return jsonify([{ - 'id': media.id, - 'title': media.title, - 'type': media.type, - 'status': media.status, - 'rating': media.rating, - 'notes': media.notes, - 'platform': media.platform, - 'date': media.date.isoformat() if media.date else None, - 'created_at': media.created_at.isoformat(), - 'updated_at': media.updated_at.isoformat() - } for media in media_list]) + try: + media_list = Media.query.all() + return jsonify({ + "code": 0, + "data": [{ + 'id': media.id, + 'title': media.title, + 'type': media.type, + 'status': media.status, + 'rating': media.rating, + 'notes': media.notes, + 'platform': media.platform, + 'date': media.date.isoformat() if media.date else None, + 'created_at': media.created_at.isoformat(), + 'updated_at': media.updated_at.isoformat() + } for media in media_list], + "message": "Success" + }) + except Exception as e: + return jsonify({"code": 1, "data": {}, "message": str(e)}), 500 -@app.route('/api/media', methods=['POST']) +@app.route('/api/media/create', methods=['POST']) def create_media(): - data = request.json - new_media = Media( - title=data['title'], - type=data['type'], - status=data['status'], - rating=data.get('rating'), - notes=data.get('notes'), - platform=data.get('platform'), - date=datetime.strptime(data['date'], '%Y-%m-%d').date() if data.get('date') else None - ) - db.session.add(new_media) - db.session.commit() - return jsonify({ - 'id': new_media.id, - 'title': new_media.title, - 'type': new_media.type, - 'status': new_media.status, - 'rating': new_media.rating, - 'notes': new_media.notes, - 'platform': new_media.platform, - 'date': new_media.date.isoformat() if new_media.date else None, - 'created_at': new_media.created_at.isoformat(), - 'updated_at': new_media.updated_at.isoformat() - }), 201 + try: + data = request.json + new_media = Media( + title=data['title'], + type=data['type'], + status=data['status'], + rating=data.get('rating'), + notes=data.get('notes'), + platform=data.get('platform'), + date=datetime.strptime(data['date'], '%Y-%m-%d').date() if data.get('date') else None + ) + db.session.add(new_media) + db.session.commit() + return jsonify({ + "code": 0, + "data": { + 'id': new_media.id, + 'title': new_media.title, + 'type': new_media.type, + 'status': new_media.status, + 'rating': new_media.rating, + 'notes': new_media.notes, + 'platform': new_media.platform, + 'date': new_media.date.isoformat() if new_media.date else None, + 'created_at': new_media.created_at.isoformat(), + 'updated_at': new_media.updated_at.isoformat() + }, + "message": "Created successfully" + }), 201 + except Exception as e: + db.session.rollback() + return jsonify({"code": 2, "data": {}, "message": str(e)}), 500 -@app.route('/api/media/', methods=['PUT']) +@app.route('/api/media/updateById/', methods=['PUT']) def update_media(media_id): - media = Media.query.get_or_404(media_id) - data = request.json - - media.title = data.get('title', media.title) - media.type = data.get('type', media.type) - media.status = data.get('status', media.status) - media.rating = data.get('rating', media.rating) - media.notes = data.get('notes', media.notes) - media.platform = data.get('platform', media.platform) - if data.get('date'): - media.date = datetime.strptime(data['date'], '%Y-%m-%d').date() - - db.session.commit() - return jsonify({ - 'id': media.id, - 'title': media.title, - 'type': media.type, - 'status': media.status, - 'rating': media.rating, - 'notes': media.notes, - 'platform': media.platform, - 'date': media.date.isoformat() if media.date else None, - 'created_at': media.created_at.isoformat(), - 'updated_at': media.updated_at.isoformat() - }) + try: + media = Media.query.get_or_404(media_id) + data = request.json + + media.title = data.get('title', media.title) + media.type = data.get('type', media.type) + media.status = data.get('status', media.status) + media.rating = data.get('rating', media.rating) + media.notes = data.get('notes', media.notes) + media.platform = data.get('platform', media.platform) + if data.get('date'): + media.date = datetime.strptime(data['date'], '%Y-%m-%d').date() + + db.session.commit() + return jsonify({ + "code": 0, + "data": { + 'id': media.id, + 'title': media.title, + 'type': media.type, + 'status': media.status, + 'rating': media.rating, + 'notes': media.notes, + 'platform': media.platform, + 'date': media.date.isoformat() if media.date else None, + 'created_at': media.created_at.isoformat(), + 'updated_at': media.updated_at.isoformat() + }, + "message": "Updated successfully" + }) + except Exception as e: + db.session.rollback() + return jsonify({"code": 2, "data": {}, "message": str(e)}), 500 -@app.route('/api/media/', methods=['DELETE']) +@app.route('/api/media/deleteById/', methods=['DELETE']) def delete_media(media_id): - media = Media.query.get_or_404(media_id) - db.session.delete(media) - db.session.commit() - return '', 204 + try: + media = Media.query.get_or_404(media_id) + db.session.delete(media) + db.session.commit() + return jsonify({"code": 0, "data": {}, "message": "Deleted successfully"}), 204 + except Exception as e: + db.session.rollback() + return jsonify({"code": 2, "data": {}, "message": str(e)}), 500 + +@app.route('/api/media/page', methods=['GET']) +def get_media_page(): + try: + type = request.args.get('type') + current_page = int(request.args.get('currentPage', 1)) + page_size = int(request.args.get('pageSize', 10)) + title = request.args.get('title', '') + start_date = request.args.get('startDate') + end_date = request.args.get('endDate') + sort_by = request.args.get('sortBy', 'date') + sort_type = request.args.get('sortType', 'desc') + + if not type: + return jsonify({"code": 1, "data": {}, "message": "Type is required"}), 400 + + query = Media.query.filter(Media.type == type) + if title: + query = query.filter(Media.title.like(f'%{title}%')) + if start_date: + query = query.filter(Media.date >= datetime.strptime(start_date, '%Y-%m-%d').date()) + if end_date: + query = query.filter(Media.date <= datetime.strptime(end_date, '%Y-%m-%d').date()) + + if sort_by == 'date': + if sort_type == 'asc': + query = query.order_by(Media.date.asc()) + else: + query = query.order_by(Media.date.desc()) + elif sort_by == 'score': + if sort_type == 'asc': + query = query.order_by(Media.rating.asc()) + else: + query = query.order_by(Media.rating.desc()) + + pagination = query.paginate(page=current_page, per_page=page_size, error_out=False) + media_list = pagination.items + + return jsonify({ + "code": 0, + "data": { + "list": [{ + 'id': media.id, + 'title': media.title, + 'type': media.type, + 'status': media.status, + 'rating': media.rating, + 'notes': media.notes, + 'platform': media.platform, + 'date': media.date.isoformat() if media.date else None, + 'created_at': media.created_at.isoformat(), + 'updated_at': media.updated_at.isoformat() + } for media in media_list], + "total": pagination.total, + "currentPage": current_page, + "pageSize": page_size + }, + "message": "Success" + }) + except Exception as e: + return jsonify({"code": 1, "data": {}, "message": str(e)}), 500 if __name__ == '__main__': app.run(debug=True) \ No newline at end of file