byceps/byceps

View on GitHub
byceps/services/ticketing/ticket_revocation_service.py

Summary

Maintainability
A
0 mins
Test Coverage
A
96%
"""
byceps.services.ticketing.ticket_revocation_service
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

:Copyright: 2014-2024 Jochen Kupperschmidt
:License: Revised BSD (see `LICENSE` file for details)
"""

from byceps.database import db
from byceps.services.user.models.user import UserID

from . import ticket_log_service, ticket_seat_management_service, ticket_service
from .dbmodels.log import DbTicketLogEntry
from .models.ticket import TicketID


def revoke_ticket(
    ticket_id: TicketID, initiator_id: UserID, *, reason: str | None = None
) -> None:
    """Revoke the ticket."""
    db_ticket = ticket_service.get_ticket(ticket_id)

    # Release seat.
    if db_ticket.occupied_seat_id:
        ticket_seat_management_service.release_seat(
            db_ticket.id, initiator_id
        ).unwrap()

    db_ticket.revoked = True

    db_log_entry = build_ticket_revoked_log_entry(
        db_ticket.id, initiator_id, reason
    )
    db.session.add(db_log_entry)

    db.session.commit()


def revoke_tickets(
    ticket_ids: set[TicketID],
    initiator_id: UserID,
    *,
    reason: str | None = None,
) -> None:
    """Revoke the tickets."""
    db_tickets = ticket_service.get_tickets(ticket_ids)

    # Release seats.
    for db_ticket in db_tickets:
        if db_ticket.occupied_seat_id:
            ticket_seat_management_service.release_seat(
                db_ticket.id, initiator_id
            ).unwrap()

    for db_ticket in db_tickets:
        db_ticket.revoked = True

        db_log_entry = build_ticket_revoked_log_entry(
            db_ticket.id, initiator_id, reason
        )
        db.session.add(db_log_entry)

    db.session.commit()


def build_ticket_revoked_log_entry(
    ticket_id: TicketID, initiator_id: UserID, reason: str | None = None
) -> DbTicketLogEntry:
    data = {
        'initiator_id': str(initiator_id),
    }

    if reason:
        data['reason'] = reason

    return ticket_log_service.build_db_entry('ticket-revoked', ticket_id, data)