180 lines
5.5 KiB
Python
180 lines
5.5 KiB
Python
"""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/<ticket_id>', 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/<ticket_id>/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/<ticket_id>/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
|