"""Tickets API routes for AnchorHost.""" from flask import Blueprint, jsonify, request from ticket_service import add_ticket_message, create_ticket, get_all_tickets, get_ticket, get_ticket_stats, get_user_tickets, update_ticket_status from user_service import authenticate_user, get_bearer_token __all__ = ['add_ticket_message_api', 'create_ticket_api', 'get_ticket_api', 'get_ticket_stats_api', 'get_tickets_api', 'update_ticket_status_api'] bp = Blueprint("tickets", __name__) @bp.route('/api/tickets', methods=['GET']) def get_tickets_api(): """Get tickets API endpoint""" try: token = get_bearer_token() user = authenticate_user(token) if not user: return jsonify({'error': 'Unauthorized'}), 401 status_filter = request.args.get('status') priority_filter = request.args.get('priority') if user['role'] == 'admin': tickets = get_all_tickets(status_filter, priority_filter) else: include_closed = request.args.get('include_closed', 'false').lower() == 'true' tickets = get_user_tickets(user['id'], include_closed) return jsonify({ 'success': True, 'tickets': tickets }), 200 except Exception as e: return jsonify({'error': str(e)}), 500 @bp.route('/api/tickets', methods=['POST']) def create_ticket_api(): """Create ticket API endpoint""" try: token = get_bearer_token() user = authenticate_user(token) if not user: return jsonify({'error': 'Unauthorized'}), 401 data = request.get_json() subject = data.get('subject') description = data.get('description') priority = data.get('priority', 'medium') category = data.get('category', 'general') if not subject or not description: return jsonify({'error': 'Subject and description required'}), 400 ticket = create_ticket(user['id'], subject, description, priority, category) if ticket: return jsonify({ 'success': True, 'ticket': ticket }), 201 else: return jsonify({'error': 'Failed to create ticket'}), 500 except Exception as e: return jsonify({'error': str(e)}), 500 @bp.route('/api/tickets/', methods=['GET']) def get_ticket_api(ticket_id): """Get ticket details API endpoint""" try: token = get_bearer_token() user = authenticate_user(token) if not user: return jsonify({'error': 'Unauthorized'}), 401 ticket = get_ticket(ticket_id) if not ticket: return jsonify({'error': 'Ticket not found'}), 404 # Check access if user['role'] != 'admin' and ticket['user_id'] != user['id']: return jsonify({'error': 'Access denied'}), 403 return jsonify({ 'success': True, 'ticket': ticket }), 200 except Exception as e: return jsonify({'error': str(e)}), 500 @bp.route('/api/tickets//messages', methods=['POST']) def add_ticket_message_api(ticket_id): """Add message to ticket API endpoint""" try: token = get_bearer_token() user = authenticate_user(token) if not user: return jsonify({'error': 'Unauthorized'}), 401 data = request.get_json() message = data.get('message') if not message: return jsonify({'error': 'Message required'}), 400 # Verify ticket access ticket = get_ticket(ticket_id) if not ticket: return jsonify({'error': 'Ticket not found'}), 404 if user['role'] != 'admin' and ticket['user_id'] != user['id']: return jsonify({'error': 'Access denied'}), 403 is_admin = (user['role'] == 'admin') message_data = add_ticket_message(ticket_id, user['id'], message, is_admin) if message_data: return jsonify({ 'success': True, 'message': message_data }), 201 else: return jsonify({'error': 'Failed to send message'}), 500 except Exception as e: return jsonify({'error': str(e)}), 500 @bp.route('/api/tickets//status', methods=['PUT']) def update_ticket_status_api(ticket_id): """Update ticket status API endpoint""" try: token = get_bearer_token() user = authenticate_user(token) if not user or user['role'] != 'admin': return jsonify({'error': 'Admin access required'}), 403 data = request.get_json() status = data.get('status') if not status: return jsonify({'error': 'Status required'}), 400 success = update_ticket_status(ticket_id, status, user['id']) if success: return jsonify({ 'success': True, 'message': 'Ticket status updated' }), 200 else: return jsonify({'error': 'Failed to update ticket status'}), 500 except Exception as e: return jsonify({'error': str(e)}), 500 @bp.route('/api/tickets/stats', methods=['GET']) def get_ticket_stats_api(): """Get ticket statistics API endpoint""" try: token = get_bearer_token() user = authenticate_user(token) if not user: return jsonify({'error': 'Unauthorized'}), 401 stats = get_ticket_stats() return jsonify({ 'success': True, 'stats': stats }), 200 except Exception as e: return jsonify({'error': str(e)}), 500