85 lines
3.3 KiB
Python
85 lines
3.3 KiB
Python
from __future__ import annotations
|
|
from typing import TYPE_CHECKING
|
|
|
|
if TYPE_CHECKING:
|
|
from core.essentials.observers.ConnectionObserver import ConnectionObserver
|
|
from core.observers.TicketObserver import TicketObserver
|
|
|
|
from core.services.prepare_tickets.ticket_prep_orchestrator import ticket_prep_orchestrator
|
|
from core.services.prepare_tickets.make_sure_pub_key_exists import make_sure_pub_key_exists
|
|
from core.services.helpers.get_how_many_profiles_were_ordered import (
|
|
get_how_many_profiles_were_ordered,
|
|
)
|
|
from core.observers.BaseObserver import BaseObserver
|
|
|
|
"""
|
|
Goal:
|
|
this is the controller for the view to speak with the high level "ticket_prep_orchestrator" service function,
|
|
which makes commitments, sends to the server, and then unblinds them, and preps the ticket JSONs.
|
|
|
|
Requires:
|
|
a temp billing ID
|
|
having paid already
|
|
|
|
Doesn't Require:
|
|
If it doesn't have the public key, then it checks the config file.
|
|
If it doesn't have a config file, then it uses the temp billing id to get the public key from the server.
|
|
"""
|
|
|
|
|
|
def prepare_tickets(
|
|
how_many_profiles: int,
|
|
ticket_observer: TicketObserver,
|
|
connection_observer: ConnectionObserver,
|
|
) -> dict:
|
|
|
|
# make sure it's a number:
|
|
if not isinstance(how_many_profiles, int):
|
|
ticket_observer.notify("failed_input", None)
|
|
return {"valid": False, "error_code": "failed_input"}
|
|
|
|
# make sure that "how_many_profiles" is actually the number of profiles ordered
|
|
# (which is based on locally saved data from the previous step):
|
|
how_many_ordered = get_how_many_profiles_were_ordered()
|
|
if how_many_profiles != how_many_ordered:
|
|
ticket_observer.notify("failed_input", None)
|
|
return {"valid": False, "error_code": "failed_input"}
|
|
|
|
# make sure this guy has a public key to verify against:
|
|
does_he_have_public_key = make_sure_pub_key_exists(connection_observer)
|
|
if does_he_have_public_key == False:
|
|
ticket_observer.notify("failed_input", None)
|
|
return {"valid": False, "error_code": "failed_input"}
|
|
|
|
notification = "Preparing Cryptography Locally"
|
|
ticket_observer.notify("preparing", subject=notification)
|
|
|
|
# ok now we have the pre-reqs, let's use this high level orchestrator,
|
|
prep_results = ticket_prep_orchestrator(
|
|
how_many_profiles, ticket_observer, connection_observer
|
|
)
|
|
|
|
# rest of this function is evaluating the results:
|
|
|
|
if prep_results == False or prep_results == None:
|
|
return {"valid": False, "message": "error"}
|
|
|
|
if "valid" not in prep_results:
|
|
return {"valid": False, "message": "error"}
|
|
|
|
if prep_results["valid"] == True:
|
|
notification = f"Done! All Tickets Ready!"
|
|
ticket_observer.notify("preparing", subject=notification)
|
|
return prep_results
|
|
|
|
if "how_many_failed" in prep_results:
|
|
how_many_failed = prep_results.get("how_many_failed", 0)
|
|
failed_validations = prep_results.get("failed_validations", None)
|
|
if failed_validations:
|
|
notification = f"Error with Ticket Preparation or Verification!"
|
|
ticket_observer.notify("preparing", subject=notification)
|
|
return prep_results
|
|
|
|
notification = f"Error with Ticket Preparation or Verification!"
|
|
ticket_observer.notify("preparing", subject=notification)
|
|
return prep_results
|