Adding Multiple Attendees inside an Order in Open Event Android
Orders endpoint allows multiple attendees to be passed in the body of post request which essentially means that and an order may contain tickets for different attendees. This blog post will guide you on how multiple attendees under an Order is handled and implemented in Open Event Android. An attendee as the name implies gives us information about how many people are attending any particular event. Let’s say if a User selects two tickets with 3 and 7 quantity total 10 attendees will be generated and can be put inside one Order request. Whenever multiple tickets are selected by the user following function is called to create Attendee fun createAttendees(attendees: List<Attendee>, country: String?, paymentOption: String) { this.country = country this.paymentOption = paymentOption this.attendees?.clear() attendees.forEach { createAttendee(it, attendees.size) } } Create attendees accepts a list of attendees and calls the createAttendees for every attendee in the list. Actual attendee creation is handled in createAttendee. The above function also set up the country and payment option as provided by the user. fun createAttendee(attendee: Attendee, totalAttendee: Int) { compositeDisposable.add(attendeeService.postAttendee(attendee) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .doOnSubscribe { progress.value = true }.doFinally { progress.value = false }.subscribe({ attendees?.add(it) if (attendees != null && attendees?.size == totalAttendee) { loadTicketsAndCreateOrder() } message.value = "Attendee created successfully!" Timber.d("Success! %s", attendees?.toList().toString()) }, { message.value = "Unable to create Attendee!" Timber.d(it, "Failed") })) } Create an Attendee on the other hand deals with creating individual attendees on the server. It calls the service function attendeeService.postAttendee with attendee as the parameter if the post request made is succeeds the attendee returned from the API is added to the list of attendees, when the size of list of attendees become equal to the list of attendees that had to be generated loadTicketsAndCreateOrder is called which takes care of getting charges for user and creating an order. If the post request for the attendee is failed a message is displayed and a log is added to console with error details. fun loadTicketsAndCreateOrder() { if (this.tickets.value == null) { this.tickets.value = ArrayList() } this.tickets.value?.clear() attendees?.forEach { loadTicket(it.ticket?.id) } } Load tickets and create order also works in a similar way as of creating attendees as there are two functions in here also one of which takes a list of attendees and calls the other function which gets data for individual ticket items passes as the parameter. Here ticket details for every attendee are fetched using the loadTicket function which takes ticket id corresponding to an attendee (using it.tickets?.id) and returns the Ticket object. Given below is the implementation for loadTicket method. fun loadTicket(ticketId: Long?) { compositeDisposable.add(ticketService.getTicketDetails(ticketId) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe({ tickets.value?.add(it) Timber.d("Loaded tickets! %s", tickets.value?.toList().toString()) if (tickets.value?.size == attendees?.size) { createOrder() } }, { Timber.d(it, "Error loading Ticket!") })) } Load ticket uses the service method to fetch the ticket details using the passed ticket id and the returned ticket object is added to the list of ticket. When the size of the ticket becomes equal to the size of total no of attendees which means that…
