CXFStubHubClient.java

package org.oxerr.stubhub.client.cxf.impl;

import java.util.List;
import java.util.UUID;

import org.apache.cxf.jaxrs.client.JAXRSClientFactory;
import org.oxerr.stubhub.client.StubHubClient;
import org.oxerr.stubhub.client.cxf.impl.filter.BearerAuthFilter;
import org.oxerr.stubhub.client.cxf.impl.inventory.CXFInventoryServce;
import org.oxerr.stubhub.client.cxf.resource.AccountResource;
import org.oxerr.stubhub.client.cxf.resource.CurrencyConversionOverrideResource;
import org.oxerr.stubhub.client.cxf.resource.DealResource;
import org.oxerr.stubhub.client.cxf.resource.EventResource;
import org.oxerr.stubhub.client.cxf.resource.HealthCheckResource;
import org.oxerr.stubhub.client.cxf.resource.HoldResource;
import org.oxerr.stubhub.client.cxf.resource.InventoryResource;

import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.jakarta.rs.json.JacksonJsonProvider;

public class CXFStubHubClient implements StubHubClient {

	private final String baseAddress;

	private final List<?> providers;

	private final AccountResource accountResource;

	private final CurrencyConversionOverrideResource currencyConversionOverrideResource;

	private final DealResource dealResource;

	private final EventResource eventResource;

	private final HealthCheckResource healthCheckResource;

	private final HoldResource holdResource;

	private final CXFInventoryServce inventoryService;

	public CXFStubHubClient(UUID accountId, String apiKey) {
		this.baseAddress = "https://pointofsaleapi.stubhub.net";

		JacksonJsonProvider jacksonJsonProvider = createJacksonJsonProvider();
		BearerAuthFilter authFilter = new BearerAuthFilter(accountId, apiKey);
		this.providers = List.of(
			jacksonJsonProvider,
			authFilter
		);

		accountResource = createProxy(AccountResource.class);
		currencyConversionOverrideResource = createProxy(CurrencyConversionOverrideResource.class);
		dealResource = createProxy(DealResource.class);
		eventResource = createProxy(EventResource.class);
		healthCheckResource = createProxy(HealthCheckResource.class);
		holdResource = createProxy(HoldResource.class);
		inventoryService = new CXFInventoryServce(createProxy(InventoryResource.class));
	}

	public AccountResource getAccountResource() {
		return accountResource;
	}

	public CurrencyConversionOverrideResource getCurrencyConversionOverrideResource() {
		return currencyConversionOverrideResource;
	}

	public DealResource getDealResource() {
		return dealResource;
	}

	public EventResource getEventResource() {
		return eventResource;
	}

	public HealthCheckResource getHealthCheckResource() {
		return healthCheckResource;
	}

	public HoldResource getHoldResource() {
		return holdResource;
	}

	protected <T> T createProxy(Class<T> cls) {
		return JAXRSClientFactory.create(
			baseAddress,
			cls,
			providers
		);
	}

	protected JacksonJsonProvider createJacksonJsonProvider() {
		JacksonJsonProvider provider = new JacksonJsonProvider();
		provider.setMapper(createObjectMapper());
		return provider;
	}

	protected ObjectMapper createObjectMapper() {
		return new ObjectMapper()
			.registerModule(new JavaTimeModule())
			.setDefaultPropertyInclusion(Include.NON_ABSENT)
			.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false)
			.configure(DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS, false)
			.configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, false)
			.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
	}

	@Override
	public CXFInventoryServce inventory() {
		return inventoryService;
	}

}