View Javadoc
1   package org.oxerr.viagogo.client.rescu.impl;
2   
3   import java.util.function.Supplier;
4   
5   import org.oxerr.rescu.ext.singleton.RestProxyFactorySingletonImpl;
6   import org.oxerr.viagogo.client.ViagogoClient;
7   import org.oxerr.viagogo.client.catalog.EventService;
8   import org.oxerr.viagogo.client.inventory.SellerEventService;
9   import org.oxerr.viagogo.client.inventory.SellerListingService;
10  import org.oxerr.viagogo.client.rescu.impl.catalog.EventServiceImpl;
11  import org.oxerr.viagogo.client.rescu.impl.inventory.SellerEventServiceImpl;
12  import org.oxerr.viagogo.client.rescu.impl.inventory.SellerListingServiceImpl;
13  import org.oxerr.viagogo.client.rescu.impl.sale.SaleServiceImpl;
14  import org.oxerr.viagogo.client.rescu.impl.webhook.WebhookServiceImpl;
15  import org.oxerr.viagogo.client.rescu.resource.catalog.EventResource;
16  import org.oxerr.viagogo.client.rescu.resource.inventory.SellerEventResource;
17  import org.oxerr.viagogo.client.rescu.resource.inventory.SellerListingResource;
18  import org.oxerr.viagogo.client.rescu.resource.sale.SaleResource;
19  import org.oxerr.viagogo.client.rescu.resource.webhook.WebhookResource;
20  import org.oxerr.viagogo.client.sale.SaleService;
21  import org.oxerr.viagogo.client.webhook.WebhookService;
22  
23  import com.fasterxml.jackson.annotation.JsonInclude.Include;
24  import com.fasterxml.jackson.databind.DeserializationFeature;
25  import com.fasterxml.jackson.databind.ObjectMapper;
26  import com.fasterxml.jackson.databind.PropertyNamingStrategies;
27  import com.fasterxml.jackson.databind.SerializationFeature;
28  import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
29  
30  import io.openapitools.jackson.dataformat.hal.HALMapper;
31  import jakarta.ws.rs.HeaderParam;
32  import jakarta.ws.rs.PathParam;
33  import si.mazi.rescu.ClientConfig;
34  import si.mazi.rescu.IRestProxyFactory;
35  import si.mazi.rescu.Interceptor;
36  import si.mazi.rescu.RestProxyFactoryImpl;
37  import si.mazi.rescu.serialization.jackson.DefaultJacksonObjectMapperFactory;
38  import si.mazi.rescu.serialization.jackson.JacksonObjectMapperFactory;
39  
40  public class ResCUViagogoClient implements ViagogoClient {
41  
42  	private static final String DEFAULT_BASE_URL = "https://api.viagogo.net";
43  
44  	private final String baseUrl;
45  
46  	private final ClientConfig clientConfig;
47  
48  	private final IRestProxyFactory restProxyFactory;
49  
50  	private final EventService eventService;
51  
52  	private final SellerListingService sellerListingService;
53  
54  	private final SellerEventService sellerEventService;
55  
56  	private final SaleService saleService;
57  
58  	private final WebhookService webhookService;
59  
60  	public ResCUViagogoClient(String token, Interceptor... interceptors) {
61  		this(DEFAULT_BASE_URL, token, interceptors);
62  	}
63  
64  	public ResCUViagogoClient(String baseUrl, String token, Interceptor... interceptors) {
65  		this(baseUrl, () -> token, interceptors);
66  	}
67  
68  	public ResCUViagogoClient(Supplier<String> token, Interceptor... interceptors) {
69  		this(DEFAULT_BASE_URL, token, interceptors);
70  	}
71  
72  	public ResCUViagogoClient(String baseUrl, Supplier<String> tokenSupplier, Interceptor... interceptors) {
73  		this.baseUrl = baseUrl;
74  
75  		JacksonObjectMapperFactory jacksonObjectMapperFactory = new DefaultJacksonObjectMapperFactory() {
76  
77  			@Override
78  			public void configureObjectMapper(ObjectMapper objectMapper) {
79  				super.configureObjectMapper(objectMapper);
80  				objectMapper.registerModule(new JavaTimeModule());
81  				objectMapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
82  				objectMapper.setSerializationInclusion(Include.NON_ABSENT);
83  				objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
84  				objectMapper.configure(DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS, false);
85  				objectMapper.configure(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE, false);
86  			}
87  
88  			@Override
89  			protected ObjectMapper createInstance() {
90  				return new HALMapper();
91  			}
92  		};
93  
94  		this.clientConfig = new ClientConfig();
95  		clientConfig.addDefaultParam(PathParam.class, "version", "v2");
96  		clientConfig.addDefaultParam(HeaderParam.class, "Authorization", new Object() {
97  
98  			@Override
99  			public String toString() {
100 				return "Bearer " + tokenSupplier.get();
101 			}
102 
103 		});
104 		clientConfig.setJacksonObjectMapperFactory(jacksonObjectMapperFactory);
105 
106 		this.restProxyFactory = new RestProxyFactorySingletonImpl(new RestProxyFactoryImpl());
107 
108 		this.eventService = new EventServiceImpl(createProxy(EventResource.class, interceptors));
109 		this.sellerListingService = new SellerListingServiceImpl(createProxy(SellerListingResource.class, interceptors));
110 		this.sellerEventService = new SellerEventServiceImpl(createProxy(SellerEventResource.class, interceptors));
111 		this.saleService = new SaleServiceImpl(createProxy(SaleResource.class, interceptors));
112 		this.webhookService = new WebhookServiceImpl(createProxy(WebhookResource.class, interceptors));
113 	}
114 
115 	@Override
116 	public EventService getEventService() {
117 		return this.eventService;
118 	}
119 
120 	@Override
121 	public SellerListingService getSellerListingService() {
122 		return this.sellerListingService;
123 	}
124 
125 	@Override
126 	public SellerEventService getSellerEventService() {
127 		return this.sellerEventService;
128 	}
129 
130 	@Override
131 	public SaleService getSaleService() {
132 		return this.saleService;
133 	}
134 
135 	@Override
136 	public WebhookService getWebhookService() {
137 		return this.webhookService;
138 	}
139 
140 	protected <I> I createProxy(Class<I> restInterface, Interceptor... interceptors) {
141 		return this.restProxyFactory.createProxy(restInterface, baseUrl, this.clientConfig, interceptors);
142 	}
143 
144 }