import os import json import logging from datetime import datetime from flask import Flask, render_template, jsonify, request, send_from_directory # Configure logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) app = Flask(__name__) app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 # 16MB max upload app.config['JSON_AS_ASCII'] = False # Data storage DATA_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'valuations.json') def load_data(): if os.path.exists(DATA_FILE): try: with open(DATA_FILE, 'r', encoding='utf-8') as f: return json.load(f) except Exception as e: logger.error(f"Error loading data: {e}") return [] return [] def save_data(data): try: with open(DATA_FILE, 'w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False, indent=2) return True except Exception as e: logger.error(f"Error saving data: {e}") return False @app.route('/') def index(): return render_template('index.html') @app.route('/api/valuations', methods=['GET']) def get_valuations(): return jsonify(load_data()) @app.route('/api/valuations', methods=['POST']) def save_valuation(): try: new_item = request.json if not new_item: return jsonify({"error": "No data provided"}), 400 # Add metadata new_item['id'] = str(int(datetime.now().timestamp() * 1000)) new_item['created_at'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S') data = load_data() data.insert(0, new_item) # Newest first # Limit history to 50 items if len(data) > 50: data = data[:50] save_data(data) return jsonify({"success": True, "data": new_item}) except Exception as e: logger.error(f"Error saving valuation: {e}") return jsonify({"error": str(e)}), 500 @app.route('/api/valuations/', methods=['DELETE']) def delete_valuation(id): try: data = load_data() data = [item for item in data if item.get('id') != id] save_data(data) return jsonify({"success": True}) except Exception as e: logger.error(f"Error deleting valuation: {e}") return jsonify({"error": str(e)}), 500 @app.route('/health') def health(): return jsonify({"status": "healthy"}) @app.errorhandler(413) def request_entity_too_large(error): return jsonify({"error": "Request entity too large (max 16MB)"}), 413 @app.errorhandler(500) def internal_server_error(error): return jsonify({"error": "Internal Server Error"}), 500 if __name__ == '__main__': port = int(os.environ.get('PORT', 7860)) app.run(host='0.0.0.0', port=port)