View Javadoc
1   package org.oxerr.seatgeek.client.rescu;
2   
3   import jakarta.ws.rs.HeaderParam;
4   
5   import org.apache.commons.lang3.ArrayUtils;
6   import org.oxerr.rescu.ext.ratelimiter.RateLimiterInterceptor;
7   import org.oxerr.rescu.ext.ratelimiter.RateLimiter;
8   import org.oxerr.rescu.ext.singleton.RestProxyFactorySingletonImpl;
9   import org.oxerr.seatgeek.client.ListingService;
10  import org.oxerr.seatgeek.client.SeatGeekClient;
11  
12  import com.fasterxml.jackson.annotation.JsonInclude.Include;
13  import com.fasterxml.jackson.databind.DeserializationFeature;
14  import com.fasterxml.jackson.databind.ObjectMapper;
15  import com.fasterxml.jackson.databind.PropertyNamingStrategies;
16  import com.fasterxml.jackson.databind.SerializationFeature;
17  import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
18  
19  import si.mazi.rescu.ClientConfig;
20  import si.mazi.rescu.IRestProxyFactory;
21  import si.mazi.rescu.Interceptor;
22  import si.mazi.rescu.RestProxyFactoryImpl;
23  import si.mazi.rescu.serialization.jackson.DefaultJacksonObjectMapperFactory;
24  import si.mazi.rescu.serialization.jackson.JacksonObjectMapperFactory;
25  
26  public class ResCUSeatGeekClient implements SeatGeekClient {
27  
28  	private final String baseUrl;
29  
30  	private final ClientConfig clientConfig;
31  
32  	private final IRestProxyFactory restProxyFactory;
33  
34  	private final ListingService listingService;
35  
36  	public ResCUSeatGeekClient(String token, RateLimiter rateLimiter, Interceptor... interceptors) {
37  		this("https://sellerdirect-api.seatgeek.com", token, rateLimiter, interceptors);
38  	}
39  
40  	public ResCUSeatGeekClient(String baseUrl, String token, RateLimiter rateLimiter, Interceptor... interceptors) {
41  		this.baseUrl = baseUrl;
42  
43  		JacksonObjectMapperFactory jacksonObjectMapperFactory = new DefaultJacksonObjectMapperFactory() {
44  
45  			@Override
46  			public void configureObjectMapper(ObjectMapper objectMapper) {
47  				super.configureObjectMapper(objectMapper);
48  				objectMapper.registerModule(new JavaTimeModule());
49  				objectMapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
50  				objectMapper.setSerializationInclusion(Include.NON_ABSENT);
51  				objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
52  				objectMapper.configure(DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS, false);
53  				objectMapper.configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, false);
54  			}
55  
56  			@Override
57  			protected ObjectMapper createInstance() {
58  				return new ObjectMapper();
59  			}
60  		};
61  
62  		this.clientConfig = new ClientConfig();
63  		clientConfig.addDefaultParam(HeaderParam.class, "Authorization", "token " + token);
64  		clientConfig.setJacksonObjectMapperFactory(jacksonObjectMapperFactory);
65  
66  		this.restProxyFactory = new RestProxyFactorySingletonImpl(new RestProxyFactoryImpl());
67  
68  		RateLimiterInterceptor rateLimiterInterceptor = new RateLimiterInterceptor(rateLimiter);
69  		Interceptor[] allInterceptors = ArrayUtils.addFirst(interceptors, rateLimiterInterceptor);
70  
71  		this.listingService = new ListingServiceImpl(createProxy(ListingResource.class, allInterceptors));
72  	}
73  
74  	@Override
75  	public ListingService getListingService() {
76  		return this.listingService;
77  	}
78  
79  	protected <I> I createProxy(Class<I> restInterface, Interceptor... interceptors) {
80  		return this.restProxyFactory.createProxy(restInterface, baseUrl, this.clientConfig, interceptors);
81  	}
82  
83  }