98 lines
3.2 KiB
Python
98 lines
3.2 KiB
Python
"""
|
|
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/<gpu_id>')
|
|
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/<gpu_id>', 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/<gpu_id>', 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/<gpu_id>/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']})
|