Declarative programming
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)
return ticket
}Last updated