""" GPU CRUD API """ import uuid from datetime import datetime from flask import Blueprint, request, jsonify from config import GPUS_FILE from utils import load_data, save_data, parse_date_to_timestamp gpus_bp = Blueprint('api_gpus', __name__) def _safe_sort_key(x, key): val = x.get(key) if val is None: return 0 if key in ['memory_gb', 'cuda_cores', 'tensor_cores', 'views'] else '' return val @gpus_bp.route('/api/gpus') def api_gpus(): gpus = load_data(GPUS_FILE) hide_hidden = request.args.get('all', '0') == '0' if hide_hidden: gpus = [g for g in gpus if g.get('visible', True)] keyword = request.args.get('q', '').strip().lower() if keyword: gpus = [g for g in gpus if keyword in g.get('name', '').lower() or keyword in g.get('manufacturer', '').lower()] sort_by = request.args.get('sort', 'default') reverse = request.args.get('order', 'desc') == 'desc' if sort_by == 'default': gpus = sorted(gpus, key=lambda x: ( not x.get('is_pinned', False), -(parse_date_to_timestamp(x.get('publish_date', '')) or parse_date_to_timestamp(x.get('created_at', '')) or 0) )) elif sort_by in ['name', 'memory_gb', 'price_usd', 'created_at', 'publish_date', 'views', 'updated_at', 'release_year']: gpus = sorted(gpus, key=lambda x: _safe_sort_key(x, sort_by), reverse=reverse) return jsonify(gpus) @gpus_bp.route('/api/gpus/') def api_gpu_detail(gpu_id): gpus = load_data(GPUS_FILE) gpu = next((g for g in gpus if g['id'] == gpu_id), None) if not gpu: return jsonify({'error': 'GPU not found'}), 404 return jsonify(gpu) @gpus_bp.route('/api/gpus', methods=['POST']) def api_create_gpu(): data = request.get_json() gpus = load_data(GPUS_FILE) data['id'] = uuid.uuid4().hex[:12] data['created_at'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S') data['visible'] = data.get('visible', True) data['publish_date'] = data.get('publish_date', '') data['views'] = data.get('views', 0) data['is_pinned'] = data.get('is_pinned', False) gpus.append(data) save_data(GPUS_FILE, gpus) return jsonify(data) @gpus_bp.route('/api/gpus/', methods=['PUT']) def api_update_gpu(gpu_id): data = request.get_json() gpus = load_data(GPUS_FILE) gpu = next((g for g in gpus if g['id'] == gpu_id), None) if not gpu: return jsonify({'error': 'GPU not found'}), 404 gpu.update(data) gpu['updated_at'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S') save_data(GPUS_FILE, gpus) return jsonify(gpu) @gpus_bp.route('/api/gpus/', methods=['DELETE']) def api_delete_gpu(gpu_id): gpus = load_data(GPUS_FILE) gpus = [g for g in gpus if g['id'] != gpu_id] save_data(GPUS_FILE, gpus) return jsonify({'success': True}) @gpus_bp.route('/api/gpus//visible', methods=['POST']) def api_toggle_gpu_visible(gpu_id): gpus = load_data(GPUS_FILE) gpu = next((g for g in gpus if g['id'] == gpu_id), None) if not gpu: return jsonify({'error': 'GPU not found'}), 404 gpu['visible'] = not gpu.get('visible', True) save_data(GPUS_FILE, gpus) return jsonify({'success': True, 'visible': gpu['visible']})