""" TSCM Case Management Routes Handles /cases/* endpoints. """ from __future__ import annotations import logging from flask import jsonify, request from routes.tscm import tscm_bp logger = logging.getLogger('intercept.tscm') @tscm_bp.route('/cases', methods=['GET']) def list_cases(): """List all TSCM cases.""" from utils.database import get_all_tscm_cases status = request.args.get('status') limit = request.args.get('limit', 50, type=int) cases = get_all_tscm_cases(status=status, limit=limit) return jsonify({ 'status': 'success', 'count': len(cases), 'cases': cases }) @tscm_bp.route('/cases', methods=['POST']) def create_case(): """Create a new TSCM case.""" from utils.database import create_tscm_case data = request.get_json() or {} name = data.get('name') if not name: return jsonify({'status': 'error', 'message': 'name is required'}), 400 case_id = create_tscm_case( name=name, description=data.get('description'), location=data.get('location'), priority=data.get('priority', 'normal'), created_by=data.get('created_by'), metadata=data.get('metadata') ) return jsonify({ 'status': 'success', 'message': 'Case created', 'case_id': case_id }) @tscm_bp.route('/cases/', methods=['GET']) def get_case(case_id: int): """Get a TSCM case with all linked sweeps, threats, and notes.""" from utils.database import get_tscm_case case = get_tscm_case(case_id) if not case: return jsonify({'status': 'error', 'message': 'Case not found'}), 404 return jsonify({ 'status': 'success', 'case': case }) @tscm_bp.route('/cases/', methods=['PUT']) def update_case(case_id: int): """Update a TSCM case.""" from utils.database import update_tscm_case data = request.get_json() or {} success = update_tscm_case( case_id=case_id, status=data.get('status'), priority=data.get('priority'), assigned_to=data.get('assigned_to'), notes=data.get('notes') ) if not success: return jsonify({'status': 'error', 'message': 'Case not found'}), 404 return jsonify({ 'status': 'success', 'message': 'Case updated' }) @tscm_bp.route('/cases//sweeps/', methods=['POST']) def link_sweep_to_case(case_id: int, sweep_id: int): """Link a sweep to a case.""" from utils.database import add_sweep_to_case success = add_sweep_to_case(case_id, sweep_id) return jsonify({ 'status': 'success' if success else 'error', 'message': 'Sweep linked to case' if success else 'Already linked or not found' }) @tscm_bp.route('/cases//threats/', methods=['POST']) def link_threat_to_case(case_id: int, threat_id: int): """Link a threat to a case.""" from utils.database import add_threat_to_case success = add_threat_to_case(case_id, threat_id) return jsonify({ 'status': 'success' if success else 'error', 'message': 'Threat linked to case' if success else 'Already linked or not found' }) @tscm_bp.route('/cases//notes', methods=['POST']) def add_note_to_case(case_id: int): """Add a note to a case.""" from utils.database import add_case_note data = request.get_json() or {} content = data.get('content') if not content: return jsonify({'status': 'error', 'message': 'content is required'}), 400 note_id = add_case_note( case_id=case_id, content=content, note_type=data.get('note_type', 'general'), created_by=data.get('created_by') ) return jsonify({ 'status': 'success', 'message': 'Note added', 'note_id': note_id })