"""Operating Systems API endpoints - Full CRUD.""" from flask import Blueprint, request from flask_jwt_extended import jwt_required from shopdb.extensions import db from shopdb.core.models import OperatingSystem from shopdb.utils.responses import ( success_response, error_response, paginated_response, ErrorCodes ) from shopdb.utils.pagination import get_pagination_params, paginate_query operatingsystems_bp = Blueprint('operatingsystems', __name__) @operatingsystems_bp.route('', methods=['GET']) @jwt_required(optional=True) def list_operatingsystems(): """List all operating systems.""" page, per_page = get_pagination_params(request) query = OperatingSystem.query if request.args.get('active', 'true').lower() != 'false': query = query.filter(OperatingSystem.isactive == True) if search := request.args.get('search'): query = query.filter(OperatingSystem.osname.ilike(f'%{search}%')) query = query.order_by(OperatingSystem.osname) items, total = paginate_query(query, page, per_page) data = [os.to_dict() for os in items] return paginated_response(data, page, per_page, total) @operatingsystems_bp.route('/', methods=['GET']) @jwt_required(optional=True) def get_operatingsystem(os_id: int): """Get a single operating system.""" os = OperatingSystem.query.get(os_id) if not os: return error_response( ErrorCodes.NOT_FOUND, f'Operating system with ID {os_id} not found', http_code=404 ) return success_response(os.to_dict()) @operatingsystems_bp.route('', methods=['POST']) @jwt_required() def create_operatingsystem(): """Create a new operating system.""" data = request.get_json() if not data or not data.get('osname'): return error_response(ErrorCodes.VALIDATION_ERROR, 'osname is required') existing = OperatingSystem.query.filter_by( osname=data['osname'], osversion=data.get('osversion') ).first() if existing: return error_response( ErrorCodes.CONFLICT, f"Operating system '{data['osname']} {data.get('osversion', '')}' already exists", http_code=409 ) os = OperatingSystem( osname=data['osname'], osversion=data.get('osversion'), architecture=data.get('architecture'), endoflife=data.get('endoflife') ) db.session.add(os) db.session.commit() return success_response(os.to_dict(), message='Operating system created', http_code=201) @operatingsystems_bp.route('/', methods=['PUT']) @jwt_required() def update_operatingsystem(os_id: int): """Update an operating system.""" os = OperatingSystem.query.get(os_id) if not os: return error_response( ErrorCodes.NOT_FOUND, f'Operating system with ID {os_id} not found', http_code=404 ) data = request.get_json() if not data: return error_response(ErrorCodes.VALIDATION_ERROR, 'No data provided') for key in ['osname', 'osversion', 'architecture', 'endoflife', 'isactive']: if key in data: setattr(os, key, data[key]) db.session.commit() return success_response(os.to_dict(), message='Operating system updated') @operatingsystems_bp.route('/', methods=['DELETE']) @jwt_required() def delete_operatingsystem(os_id: int): """Delete (deactivate) an operating system.""" os = OperatingSystem.query.get(os_id) if not os: return error_response( ErrorCodes.NOT_FOUND, f'Operating system with ID {os_id} not found', http_code=404 ) os.isactive = False db.session.commit() return success_response(message='Operating system deleted')