Files
anchorhost-backend/routes/tickets.py
T
wfalkowski c177d7981d
Build and publish Docker image / build-and-publish (push) Successful in 2m45s
Refactor backend and add registry build workflow
2026-10-20 16:44:49 +00:00

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