-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathJobApi.java
More file actions
105 lines (93 loc) · 3.57 KB
/
Copy pathJobApi.java
File metadata and controls
105 lines (93 loc) · 3.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package org.javawebstack.jobs.api;
import lombok.Getter;
import org.javawebstack.http.router.HTTPMethod;
import org.javawebstack.http.router.HTTPRouter;
import org.javawebstack.http.router.transformer.response.JsonResponseTransformer;
import org.javawebstack.http.router.undertow.UndertowHTTPSocketServer;
import org.javawebstack.jobs.Jobs;
import org.javawebstack.jobs.api.auth.AuthProvider;
import org.javawebstack.jobs.api.controller.*;
import org.javawebstack.jobs.api.middleware.AuthMiddleware;
import org.javawebstack.jobs.api.middleware.ResponseMiddleware;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
public class JobApi {
@Getter
final Jobs jobs;
@Getter
AuthProvider authProvider = AuthProvider.noAuth();
boolean enableDashboard = false;
public JobApi(Jobs jobs) {
this.jobs = jobs;
}
public JobApi auth(AuthProvider provider) {
this.authProvider = provider;
return this;
}
public JobApi enableDashboard() {
return dashboard(true);
}
public JobApi dashboard(boolean enableDashboard) {
this.enableDashboard = enableDashboard;
return this;
}
public HTTPRouter start(int port) {
HTTPRouter router = new HTTPRouter(new UndertowHTTPSocketServer())
.responseTransformer(new JsonResponseTransformer().ignoreStrings())
.port(port);
install(router, null);
router.start();
router.beforeInterceptor(ex -> {
ex.header("Access-Control-Allow-Origin", "*");
ex.header("Access-Control-Allow-Methods", "*");
ex.header("Access-Control-Allow-Headers", "*");
if(ex.getMethod() == HTTPMethod.OPTIONS) {
ex.close();
return true;
}
return false;
});
return router;
}
public JobApi install(HTTPRouter router, String prefix) {
if(prefix == null)
prefix = "";
if(prefix.length() > 0 && enableDashboard)
throw new IllegalArgumentException("Prefix can not be set when the dashboard is enabled!");
router
.exceptionHandler(new ErrorController())
.controller(prefix, new JobController(jobs))
.controller(prefix, new RecurringJobController(jobs))
.controller(prefix, new StatusController(jobs))
.controller(prefix, new WorkerController(jobs))
.afterAny(prefix + "{*:path}", new ResponseMiddleware())
.middleware("jobs_auth", new AuthMiddleware(this));
if(enableDashboard) {
router.get("/", ex -> {
ex.redirect("/overview");
return "";
});
router.staticResourceDirectory(prefix, JobApi.class.getClassLoader(), "dashboard");
String html = loadHtml();
router.get(prefix + "{*:path}", ex -> html);
}
// TODO install dashboard
return this;
}
private String loadHtml() {
try {
InputStream is = JobApi.class.getClassLoader().getResourceAsStream("dashboard/index.html");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int r;
while ((r = is.read(buffer)) != -1)
baos.write(buffer, 0, r);
is.close();
return new String(baos.toByteArray(), StandardCharsets.UTF_8);
}catch (IOException ex) {
return null;
}
}
}