2727import io .vertx .reactivex .ext .web .api .contract .openapi3 .OpenAPI3RouterFactory ;
2828import in .erail .service .RESTService ;
2929import io .netty .handler .codec .http .HttpResponseStatus ;
30+ import io .reactivex .Observable ;
3031import io .vertx .reactivex .core .buffer .Buffer ;
3132import io .vertx .reactivex .ext .web .Cookie ;
3233import java .util .Arrays ;
@@ -50,7 +51,7 @@ public class OpenAPI3RouteBuilder extends AbstractRouterBuilderImpl {
5051 private HashMap <String , Metered > mMetrics = new HashMap <>();
5152 private MetricRegistry mMetricRegistry ;
5253 private String mRequestIdHeaderName = HEADER_X_REQUEST_ID ;
53-
54+
5455 public File getOpenAPI3File () {
5556 return mOpenAPI3File ;
5657 }
@@ -254,33 +255,65 @@ public Router getRouter(Router pRouter) {
254255 return ;
255256 }
256257
257- routingContext .user ().isAuthorized (service .getAuthority (), (event ) -> {
258- boolean authSuccess = event .succeeded () ? event .result () : false ;
259- if (authSuccess ) {
260- process (routingContext , service .getServiceUniqueId ());
261- } else {
262- routingContext .fail (401 );
263- }
264- });
258+ Optional <String []> authorities = Optional .ofNullable (service .getAuthority ());
259+
260+ if (authorities .isPresent ()) {
261+ Observable
262+ .fromArray (authorities .get ())
263+ .flatMapSingle (a -> routingContext .user ().rxIsAuthorized (a ))
264+ .filter (a -> a )
265+ .firstElement ()
266+ .subscribe ((success ) -> {
267+ getLog ().trace (() -> "Request is authorized. Processing Message:" + service .getOperationId ());
268+ process (routingContext , service .getServiceUniqueId ());
269+ }, (err ) -> {
270+ getLog ().error (() -> "Error processing serive message" , err );
271+ routingContext .fail (err );
272+ }, () -> {
273+ getLog ().warn (() -> "You are not authorized to access service:" + service .getOperationId () + ":" + routingContext .toString ());
274+ routingContext .fail (401 );
275+ });
276+ } else {
277+ getLog ().error (() -> "Service marked as secure, but, no authority defined at service level:" + service .getOperationId ());
278+ routingContext .fail (401 );
279+ }
280+
265281 } else {
266282 getLog ().warn ("Security disabled for " + service .getServiceUniqueId ());
267283 process (routingContext , service .getServiceUniqueId ());
268284 }
269285 });
270286
271287 apiFactory .addFailureHandlerByOperationId (service .getOperationId (), (routingContext ) -> {
288+ int respStatusCode = routingContext .statusCode ();
289+ if (respStatusCode == -1 ) {
290+ respStatusCode = 400 ;
291+ }
292+
293+ getLog ().debug (() -> "API Failure Handle called:" + service .getOperationId () + ":" + generateErrorResponse (routingContext ));
294+
272295 routingContext
273296 .response ()
274- .setStatusCode (HttpResponseStatus . BAD_REQUEST . code () )
297+ .setStatusCode (respStatusCode )
275298 .end (generateErrorResponse (routingContext ));
276299 });
277300 apiFactory .setValidationFailureHandler ((routingContext ) -> {
301+ int respStatusCode = routingContext .statusCode ();
302+ if (respStatusCode == -1 ) {
303+ respStatusCode = 400 ;
304+ }
305+
306+ getLog ().debug (() -> "API Validation Failer Handle called:" + service .getOperationId () + ":" + generateErrorResponse (routingContext ));
307+
278308 routingContext
279309 .response ()
280- .setStatusCode (HttpResponseStatus . BAD_REQUEST . code () )
310+ .setStatusCode (respStatusCode )
281311 .end (generateErrorResponse (routingContext ));
282312 });
283313 apiFactory .setNotImplementedFailureHandler ((routingContext ) -> {
314+
315+ getLog ().debug (() -> "API not implemented:" + service .getOperationId () + ":" + generateErrorResponse (routingContext ));
316+
284317 routingContext
285318 .response ()
286319 .setStatusCode (HttpResponseStatus .BAD_REQUEST .code ())
0 commit comments