Skip to content

Commit fc9191e

Browse files
committed
Improved model binding system to allow custom queries
1 parent fef49b1 commit fc9191e

File tree

4 files changed

+37
-10
lines changed

4 files changed

+37
-10
lines changed

src/main/java/org/javawebstack/framework/WebApplication.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.github.javafaker.Faker;
44
import org.javawebstack.framework.bind.ModelBindParamTransformer;
5+
import org.javawebstack.framework.bind.ModelBindTransformer;
56
import org.javawebstack.framework.config.Config;
67
import org.javawebstack.framework.module.Module;
78
import org.javawebstack.framework.util.CORSPolicy;
@@ -28,6 +29,7 @@ public abstract class WebApplication {
2829
private final Config config = new Config();
2930
private final Crypt crypt;
3031
private final List<Module> modules = new ArrayList<>();
32+
private final ModelBindParamTransformer modelBindParamTransformer = new ModelBindParamTransformer();
3133

3234
public WebApplication(){
3335
injector = new SimpleInjector();
@@ -75,7 +77,7 @@ public WebApplication(){
7577
if(config.isEnabled("http.server.json", true))
7678
server.responseTransformer(new JsonResponseTransformer().ignoreStrings());
7779
if(sql != null)
78-
server.routeParamTransformer(new ModelBindParamTransformer());
80+
server.routeParamTransformer(modelBindParamTransformer);
7981
modules.forEach(m -> m.beforeSetupServer(this, server));
8082
setupServer(server);
8183
modules.forEach(m -> m.setupServer(this, server));
@@ -86,6 +88,11 @@ public WebApplication addModule(Module module){
8688
return this;
8789
}
8890

91+
public WebApplication setModelBindTransformer(ModelBindTransformer transformer){
92+
modelBindParamTransformer.setTransformer(transformer);
93+
return this;
94+
}
95+
8996
public Logger getLogger(){
9097
return logger;
9198
}
@@ -110,6 +117,10 @@ public Config getConfig() {
110117
return config;
111118
}
112119

120+
public Crypt getCrypt(){
121+
return crypt;
122+
}
123+
113124
public abstract void setupModules();
114125
public abstract void setupConfig(Config config);
115126
public abstract void setupInjection(SimpleInjector injector);

src/main/java/org/javawebstack/framework/bind/ModelBind.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@
99
@Retention(RetentionPolicy.RUNTIME)
1010
public @interface ModelBind {
1111
String value();
12+
String field() default "";
1213
}

src/main/java/org/javawebstack/framework/bind/ModelBindParamTransformer.java

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,24 +9,32 @@
99

1010
public class ModelBindParamTransformer extends RouteParamTransformer {
1111

12+
private ModelBindTransformer transformer;
13+
1214
public ModelBindParamTransformer(){
15+
this.transformer = (repo, fieldName, source) -> repo.where(fieldName, source).get();
1316
for(Class<? extends Model> model : ORM.getModels()){
1417
ModelBind[] binds = model.getDeclaredAnnotationsByType(ModelBind.class);
1518
if(binds.length == 0)
1619
continue;
1720
Repo<?> repo = Repo.get(model);
18-
Class<?> idType = repo.getInfo().getIdType();
19-
if(idType.equals(String.class))
21+
String fieldName = binds[0].field().length() > 0 ? binds[0].field() : repo.getInfo().getIdField();
22+
Class<?> fieldType = repo.getInfo().getField(fieldName).getType();
23+
String parent = "string";
24+
if(fieldType.equals(String.class))
2025
extend("string", binds[0].value(), repo::get);
21-
if(idType.equals(UUID.class))
22-
extend("uuid", binds[0].value(), repo::get);
23-
if(idType.equals(Integer.class))
24-
extend("i+", binds[0].value(), repo::get);
25-
if(idType.equals(Long.class))
26-
extend("l+", binds[0].value(), repo::get);
26+
if(fieldType.equals(UUID.class))
27+
parent = "uuid";
28+
if(fieldType.equals(Integer.class))
29+
parent = "i+";
30+
if(fieldType.equals(Long.class))
31+
parent = "l+";
32+
extend(parent, binds[0].value(), source -> transformer.transform(repo, fieldName, source));
2733
}
2834
}
2935

30-
36+
public void setTransformer(ModelBindTransformer transformer){
37+
this.transformer = transformer;
38+
}
3139

3240
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.javawebstack.framework.bind;
2+
3+
import org.javawebstack.orm.Repo;
4+
5+
public interface ModelBindTransformer {
6+
Object transform(Repo<?> repo, String fieldName, Object source);
7+
}

0 commit comments

Comments
 (0)