const buyTicket = async ({repository: Repository}, {userId: UserId, concertId: ConcertId}): Promise<Ticket> => {
const [concert, user] = await Promise.all([
repository.getConcert(concertId),
repository.getUser(userId)
if (!ticketsAvailableFor(concert)) {
throw new TicketsNotAvailableError()
if (!hasFundsFor(user, concert)) {
throw new NotEnoughFundsError()
const ticket = new Ticket(concert, user)
await repository.recordTransaction(user, ticket)