Skip to content

Commit

Permalink
Introducing internal HTTP routes.
Browse files Browse the repository at this point in the history
  • Loading branch information
nmihajlovski committed Jun 2, 2018
1 parent d8b86d2 commit 251fa6b
Show file tree
Hide file tree
Showing 14 changed files with 140 additions and 41 deletions.
Expand Up @@ -47,9 +47,9 @@ public interface HttpRoutes {


Set<Route> all(); Set<Route> all();


Set<Route> allAdmin(); Set<Route> allInternal();


Set<Route> allNonAdmin(); Set<Route> allExceptInternal();


Customization custom(); Customization custom();


Expand Down
Expand Up @@ -47,6 +47,6 @@ public interface Route {


boolean isAPI(); boolean isAPI();


boolean isAdminOnly(); boolean isInternal();


} }
Expand Up @@ -72,6 +72,10 @@ public interface RouteConfig {


RouteOptions cacheCapacity(int cacheCapacity); RouteOptions cacheCapacity(int cacheCapacity);


boolean internal();

RouteOptions internal(boolean internal);

RouteMeta meta(); RouteMeta meta();


RouteOptions meta(RouteMeta meta); RouteOptions meta(RouteMeta meta);
Expand Down
Expand Up @@ -565,13 +565,13 @@ public Set<Route> all() {
} }


@Override @Override
public Set<Route> allAdmin() { public Set<Route> allInternal() {
return U.set(Do.findIn(all()).all(Route::isAdminOnly)); return U.set(Do.findIn(all()).all(Route::isInternal));
} }


@Override @Override
public Set<Route> allNonAdmin() { public Set<Route> allExceptInternal() {
return U.set(Do.findIn(all()).all(route -> !route.isAdminOnly())); return U.set(Do.findIn(all()).all(route -> !route.isInternal()));
} }


@Override @Override
Expand Down
Expand Up @@ -143,7 +143,7 @@ public boolean isAPI() {
} }


@Override @Override
public boolean isAdminOnly() { public boolean isInternal() {
return options.zone().equalsIgnoreCase("admin"); return options.internal();
} }
} }
Expand Up @@ -61,6 +61,8 @@ public class RouteOptions extends RapidoidThing implements RouteConfig {


private volatile int cacheCapacity = 100; private volatile int cacheCapacity = 100;


private volatile boolean internal;

private volatile RouteMeta meta = new RouteMeta(); private volatile RouteMeta meta = new RouteMeta();


@Override @Override
Expand All @@ -77,6 +79,7 @@ public String toString() {
", wrappers=" + Arrays.toString(wrappers) + ", wrappers=" + Arrays.toString(wrappers) +
", cacheTTL=" + cacheTTL + ", cacheTTL=" + cacheTTL +
", cacheCapacity=" + cacheCapacity + ", cacheCapacity=" + cacheCapacity +
", internal=" + internal +
", meta=" + meta + ", meta=" + meta +
'}'; '}';
} }
Expand Down Expand Up @@ -204,6 +207,17 @@ public RouteOptions meta(RouteMeta meta) {
return this; return this;
} }


@Override
public boolean internal() {
return internal;
}

@Override
public RouteOptions internal(boolean internal) {
this.internal = internal;
return this;
}

public RouteOptions copy() { public RouteOptions copy() {
RouteOptions copy = new RouteOptions(); RouteOptions copy = new RouteOptions();


Expand All @@ -217,6 +231,7 @@ public RouteOptions copy() {
copy.managed = this.managed; copy.managed = this.managed;
copy.cacheTTL = this.cacheTTL; copy.cacheTTL = this.cacheTTL;
copy.cacheCapacity = this.cacheCapacity; copy.cacheCapacity = this.cacheCapacity;
copy.internal = this.internal;
copy.meta = this.meta.copy(); copy.meta = this.meta.copy();


return copy; return copy;
Expand All @@ -231,12 +246,12 @@ public boolean equals(Object o) {
if (this == o) return true; if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false; if (o == null || getClass() != o.getClass()) return false;
RouteOptions that = (RouteOptions) o; RouteOptions that = (RouteOptions) o;

return contentTypeCustomized == that.contentTypeCustomized && return contentTypeCustomized == that.contentTypeCustomized &&
mvc == that.mvc && mvc == that.mvc &&
managed == that.managed && managed == that.managed &&
cacheTTL == that.cacheTTL && cacheTTL == that.cacheTTL &&
cacheCapacity == that.cacheCapacity && cacheCapacity == that.cacheCapacity &&
internal == that.internal &&
Objects.equals(contentType, that.contentType) && Objects.equals(contentType, that.contentType) &&
Objects.equals(view, that.view) && Objects.equals(view, that.view) &&
Objects.equals(zone, that.zone) && Objects.equals(zone, that.zone) &&
Expand All @@ -248,7 +263,7 @@ public boolean equals(Object o) {


@Override @Override
public int hashCode() { public int hashCode() {
int result = Objects.hash(contentType, contentTypeCustomized, view, mvc, zone, managed, transaction, roles, cacheTTL, cacheCapacity, meta); int result = Objects.hash(contentType, contentTypeCustomized, view, mvc, zone, managed, transaction, roles, cacheTTL, cacheCapacity, internal, meta);
result = 31 * result + Arrays.hashCode(wrappers); result = 31 * result + Arrays.hashCode(wrappers);
return result; return result;
} }
Expand Down
13 changes: 10 additions & 3 deletions rapidoid-oauth/src/main/java/org/rapidoid/oauth/OAuth.java
Expand Up @@ -84,16 +84,23 @@ public static void register(Setup setup, OAuthStateCheck stateCheck, OAuthProvid
Value<String> clientId = providerConfig.entry("clientId").str(); Value<String> clientId = providerConfig.entry("clientId").str();
Value<String> clientSecret = providerConfig.entry("clientSecret").str(); Value<String> clientSecret = providerConfig.entry("clientSecret").str();


setup.get(loginUri).html(new OAuthLoginHandler(provider, DOMAIN)); setup.get(loginUri)
setup.get(callbackUri).html(new OAuthTokenHandler(provider, setup.custom(), DOMAIN, stateCheck, clientId, clientSecret, callbackUri)); .internal(true)
.html(new OAuthLoginHandler(provider, DOMAIN));

setup.get(callbackUri)
.internal(true)
.html(new OAuthTokenHandler(provider, setup.custom(), DOMAIN, stateCheck, clientId, clientSecret, callbackUri));


loginHtml.append(LOGIN_BTN.render(U.map("uri", loginUri, "provider", provider.getName()))); loginHtml.append(LOGIN_BTN.render(U.map("uri", loginUri, "provider", provider.getName())));
} }


loginHtml.append("</div>"); loginHtml.append("</div>");
final String loginPage = loginHtml.toString(); final String loginPage = loginHtml.toString();


setup.get(Msc.specialUri("oauth")).mvc((ReqHandler) x -> GUI.hardcoded(loginPage)); setup.get(Msc.specialUri("oauth"))
.internal(true)
.mvc((ReqHandler) x -> GUI.hardcoded(loginPage));
} }


public static String getLoginURL(Req req, OAuthProvider provider, String oauthDomain) { public static String getLoginURL(Req req, OAuthProvider provider, String oauthDomain) {
Expand Down
Expand Up @@ -35,8 +35,13 @@ public class OpenAPI extends RapidoidThing {
public static void bootstrap(Setup setup) { public static void bootstrap(Setup setup) {
OpenAPIDescriptor descriptor = new OpenAPIDescriptor(setup, Conf.OPENAPI); OpenAPIDescriptor descriptor = new OpenAPIDescriptor(setup, Conf.OPENAPI);


setup.get(Msc.specialUri("api/openapi.json")).json(descriptor::getAPIDocs); setup.get(Msc.specialUri("api/openapi.json"))
setup.get(Msc.specialUri("api/openapi.yaml")).plain(() -> YAML.stringify(descriptor.getAPIDocs())); .internal(true)
.json(descriptor::getAPIDocs);

setup.get(Msc.specialUri("api/openapi.yaml"))
.internal(true)
.plain(() -> YAML.stringify(descriptor.getAPIDocs()));
} }


} }
Expand Up @@ -82,16 +82,15 @@ public Map<String, Object> getAPIDocs() {


private List<Route> findPublishableRoutes() { private List<Route> findPublishableRoutes() {
// admin zone routes are considered private, don't publish them // admin zone routes are considered private, don't publish them
Set<Route> nonAdmin = setup.routes().allNonAdmin(); Set<Route> nonAdmin = setup.routes().allExceptInternal();


return Do.findIn(nonAdmin).all(this::isPublishable); return Do.findIn(nonAdmin).all(this::isPublishable);
} }


private boolean isPublishable(Route route) { private boolean isPublishable(Route route) {
RouteMeta meta = route.config().meta();

return route.isAPI() // non-API routes (e.g. pages) won't be published return route.isAPI() // non-API routes (e.g. pages) won't be published
&& meta.publish() // routes can be marked as private/public && !route.config().internal() // don't publish internal routes
&& route.config().meta().publish() // a route can be configured not to be published
&& !route.path().startsWith("/_"); // routes having paths starting with '/_' are considered private && !route.path().startsWith("/_"); // routes having paths starting with '/_' are considered private
} }


Expand Down
5 changes: 5 additions & 0 deletions rapidoid-rest/src/main/java/org/rapidoid/setup/OnRoute.java
Expand Up @@ -446,6 +446,11 @@ public OnRoute contentType(MediaType contentType) {
return this; return this;
} }


public OnRoute internal(boolean internal) {
options.internal(internal);
return this;
}

public OnRoute meta(RouteMeta meta) { public OnRoute meta(RouteMeta meta) {
options.meta(meta); options.meta(meta);
return this; return this;
Expand Down
20 changes: 20 additions & 0 deletions rapidoid-web/src/main/java/org/rapidoid/goodies/Booter.java
Expand Up @@ -68,10 +68,12 @@ public Booter adminCenter() {


public Booter auth() { public Booter auth() {
setup.post(uri("login")) setup.post(uri("login"))
.internal(true)
.roles() .roles()
.json(new LoginHandler()); .json(new LoginHandler());


setup.get(uri("logout")) setup.get(uri("logout"))
.internal(true)
.roles(Role.LOGGED_IN) .roles(Role.LOGGED_IN)
.json(new LogoutHandler()); .json(new LogoutHandler());


Expand All @@ -80,6 +82,7 @@ public Booter auth() {


public Booter lifecycle() { public Booter lifecycle() {
setup.page(uri("terminate")) setup.page(uri("terminate"))
.internal(true)
.roles(Role.ADMINISTRATOR) .roles(Role.ADMINISTRATOR)
.zone(CENTER) .zone(CENTER)
.menu("System", "Terminate / Restart") .menu("System", "Terminate / Restart")
Expand All @@ -90,6 +93,7 @@ public Booter lifecycle() {


public Booter overview() { public Booter overview() {
setup.page(uri("")) setup.page(uri(""))
.internal(true)
.roles(Role.ADMINISTRATOR) .roles(Role.ADMINISTRATOR)
.zone(CENTER) .zone(CENTER)
.menu("System", "Overview") .menu("System", "Overview")
Expand All @@ -100,24 +104,28 @@ public Booter overview() {


public Booter application() { public Booter application() {
setup.page(uri("routes")) setup.page(uri("routes"))
.internal(true)
.roles(Role.ADMINISTRATOR) .roles(Role.ADMINISTRATOR)
.zone(CENTER) .zone(CENTER)
.menu("Routes") .menu("Routes")
.mvc(new RoutesHandler()); .mvc(new RoutesHandler());


setup.page(uri("config")) setup.page(uri("config"))
.internal(true)
.roles(Role.ADMINISTRATOR) .roles(Role.ADMINISTRATOR)
.zone(CENTER) .zone(CENTER)
.menu("Configuration") .menu("Configuration")
.mvc(new ConfigHandler()); .mvc(new ConfigHandler());


setup.page(uri("beans")) setup.page(uri("beans"))
.internal(true)
.roles(Role.ADMINISTRATOR) .roles(Role.ADMINISTRATOR)
.zone(CENTER) .zone(CENTER)
.menu("Application", "Beans") .menu("Application", "Beans")
.mvc(new BeansHandler()); .mvc(new BeansHandler());


setup.get(uri("classpath")) setup.get(uri("classpath"))
.internal(true)
.roles(Role.ADMINISTRATOR) .roles(Role.ADMINISTRATOR)
.zone(CENTER) .zone(CENTER)
.menu("Application", "Classpath") .menu("Application", "Classpath")
Expand All @@ -130,12 +138,14 @@ public Booter metrics() {
Metrics.bootstrap(); Metrics.bootstrap();


setup.page(uri("metrics")) setup.page(uri("metrics"))
.internal(true)
.roles(Role.ADMINISTRATOR) .roles(Role.ADMINISTRATOR)
.zone(CENTER) .zone(CENTER)
.menu("Metrics") .menu("Metrics")
.mvc(new GraphsHandler()); .mvc(new GraphsHandler());


setup.get(uri("graphs/{id:.*}")) setup.get(uri("graphs/{id:.*}"))
.internal(true)
.roles(Role.ADMINISTRATOR) .roles(Role.ADMINISTRATOR)
.json(new GraphDataHandler()); .json(new GraphDataHandler());


Expand All @@ -144,48 +154,56 @@ public Booter metrics() {


public Booter jmx() { public Booter jmx() {
setup.page(uri("jmx/mempool")) setup.page(uri("jmx/mempool"))
.internal(true)
.roles(Role.ADMINISTRATOR) .roles(Role.ADMINISTRATOR)
.zone(CENTER) .zone(CENTER)
.menu("System", "Memory pool") .menu("System", "Memory pool")
.mvc(JMX.memoryPool()); .mvc(JMX.memoryPool());


setup.page(uri("jmx/threads")) setup.page(uri("jmx/threads"))
.internal(true)
.roles(Role.ADMINISTRATOR) .roles(Role.ADMINISTRATOR)
.zone(CENTER) .zone(CENTER)
.menu("System", "JVM Threads") .menu("System", "JVM Threads")
.mvc(JMX.threads()); .mvc(JMX.threads());


setup.page(uri("jmx/os")) setup.page(uri("jmx/os"))
.internal(true)
.roles(Role.ADMINISTRATOR) .roles(Role.ADMINISTRATOR)
.zone(CENTER) .zone(CENTER)
.menu("System", "Operating system") .menu("System", "Operating system")
.mvc(JMX.os()); .mvc(JMX.os());


setup.page(uri("jmx/gc")) setup.page(uri("jmx/gc"))
.internal(true)
.roles(Role.ADMINISTRATOR) .roles(Role.ADMINISTRATOR)
.zone(CENTER) .zone(CENTER)
.menu("System", "Garbage collection") .menu("System", "Garbage collection")
.mvc(JMX.gc()); .mvc(JMX.gc());


setup.page(uri("jmx/memory")) setup.page(uri("jmx/memory"))
.internal(true)
.roles(Role.ADMINISTRATOR) .roles(Role.ADMINISTRATOR)
.zone(CENTER) .zone(CENTER)
.menu("System", "Memory") .menu("System", "Memory")
.mvc(JMX.memory()); .mvc(JMX.memory());


setup.page(uri("jmx/runtime")) setup.page(uri("jmx/runtime"))
.internal(true)
.roles(Role.ADMINISTRATOR) .roles(Role.ADMINISTRATOR)
.zone(CENTER) .zone(CENTER)
.menu("System", "Runtime") .menu("System", "Runtime")
.mvc(JMX.runtime()); .mvc(JMX.runtime());


setup.page(uri("jmx/classes")) setup.page(uri("jmx/classes"))
.internal(true)
.roles(Role.ADMINISTRATOR) .roles(Role.ADMINISTRATOR)
.zone(CENTER) .zone(CENTER)
.menu("System", "Classes") .menu("System", "Classes")
.mvc(JMX.classes()); .mvc(JMX.classes());


setup.page(uri("jmx/compilation")) setup.page(uri("jmx/compilation"))
.internal(true)
.roles(Role.ADMINISTRATOR) .roles(Role.ADMINISTRATOR)
.zone(CENTER) .zone(CENTER)
.menu("System", "Compilation") .menu("System", "Compilation")
Expand All @@ -196,6 +214,7 @@ public Booter jmx() {


public Booter entities() { public Booter entities() {
setup.page(uri("entities")) setup.page(uri("entities"))
.internal(true)
.roles(Role.ADMINISTRATOR) .roles(Role.ADMINISTRATOR)
.zone(CENTER) .zone(CENTER)
.menu("System", "Entities") .menu("System", "Entities")
Expand All @@ -209,6 +228,7 @@ public Booter entities() {
String contextPath = zone.entry("home").or(uri("")); String contextPath = zone.entry("home").or(uri(""));


X.scaffold(type) X.scaffold(type)
.internal(true)
.baseUri(Msc.uri(contextPath, uri)) .baseUri(Msc.uri(contextPath, uri))
.roles(Role.ADMINISTRATOR) .roles(Role.ADMINISTRATOR)
.on(setup); .on(setup);
Expand Down
Expand Up @@ -32,6 +32,7 @@
import org.rapidoid.setup.On; import org.rapidoid.setup.On;
import org.rapidoid.u.U; import org.rapidoid.u.U;


import java.util.Comparator;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
Expand All @@ -45,18 +46,18 @@ public class RoutesHandler extends GUI implements Callable<Object> {
public Object call() { public Object call() {
List<Object> routes = U.list(); List<Object> routes = U.list();


Set<Route> appRoutes = On.setup().routes().allNonAdmin(); Set<Route> appRoutes = On.setup().routes().allExceptInternal();


Set<Route> adminRoutes = On.setup().routes().allAdmin(); Set<Route> internalRoutes = On.setup().routes().allInternal();
adminRoutes.addAll(Admin.setup().routes().allAdmin()); internalRoutes.addAll(Admin.setup().routes().allInternal());


routes.add(div(h3("Application routes:"), routesOf(appRoutes, true))); routes.add(div(h3("Application routes:"), routesOf(appRoutes, true)));
routes.add(div(h3("Admin routes:"), routesOf(adminRoutes, true))); routes.add(div(h3("Internal routes:"), routesOf(internalRoutes, true)));


return multi(routes); return multi(routes);
} }


public static TableTag routesOf(Set<Route> httpRoutes, boolean withHandler) { private static TableTag routesOf(Set<Route> httpRoutes, boolean withHandler) {
List<Route> routes = U.list(httpRoutes); List<Route> routes = U.list(httpRoutes);
sortRoutes(routes); sortRoutes(routes);


Expand Down Expand Up @@ -93,10 +94,7 @@ private static boolean sameTarget(Route a, Route b) {
} }


private static void sortRoutes(List<Route> routes) { private static void sortRoutes(List<Route> routes) {
routes.sort((a, b) -> { routes.sort(Comparator.comparing(Route::path).thenComparing(Route::verb));
int cmpByPath = a.path().compareTo(b.path());
return cmpByPath != 0 ? cmpByPath : a.verb().compareTo(b.verb());
});
} }


private static Tag routeRow(Route route, List<HttpVerb> verbs, boolean withHandler) { private static Tag routeRow(Route route, List<HttpVerb> verbs, boolean withHandler) {
Expand Down

0 comments on commit 251fa6b

Please sign in to comment.