-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHomeController.java
More file actions
103 lines (90 loc) · 4.72 KB
/
Copy pathHomeController.java
File metadata and controls
103 lines (90 loc) · 4.72 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
package controllers.javaexample;
import java.util.List;
import java.util.Arrays;
import java.util.Collections;
import com.fasterxml.jackson.databind.node.ObjectNode;
import java.util.Locale;
import javax.inject.Inject;
import play.data.Form;
import play.data.FormFactory;
import play.data.validation.Constraints;
import play.filters.csrf.AddCSRFToken;
import play.filters.csrf.RequireCSRFCheck;
import play.libs.Json;
import play.mvc.Controller;
import play.mvc.Http;
import play.mvc.Result;
import playwebmcp.Tool;
/** Existing Play actions remain responsible for validation and CSRF protection. */
public final class HomeController extends Controller {
private static final List<String> PRODUCTS = Collections.unmodifiableList(Arrays.asList("Clavier", "Souris", "Écran"));
private final FormFactory forms;
private static final Tool SEARCH = Tool.create(
"search_products", "Rechercher les produits de cette boutique.",
"{\"type\":\"object\",\"properties\":{\"query\":{\"type\":\"string\",\"maxLength\":100}},\"required\":[\"query\"],\"additionalProperties\":false}",
"searchProducts").withReadOnly(true);
private static final Tool SUPPORT = Tool.create(
"create_support_request", "Créer une demande de support après confirmation de l’utilisateur.",
"{\"type\":\"object\",\"properties\":{\"name\":{\"type\":\"string\",\"minLength\":1,\"maxLength\":80},\"message\":{\"type\":\"string\",\"minLength\":1,\"maxLength\":1000}},\"required\":[\"name\",\"message\"],\"additionalProperties\":false}",
"createSupportRequest");
@Inject public HomeController(FormFactory forms) { this.forms = forms; }
public static final class SupportRequest {
@Constraints.Required(message = "Indiquez votre nom.")
@Constraints.MaxLength(value = 80, message = "Le nom doit contenir au maximum 80 caractères.")
public String name;
@Constraints.Required(message = "Décrivez votre demande.")
@Constraints.MaxLength(value = 1000, message = "La demande doit contenir au maximum 1000 caractères.")
public String message;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getMessage() { return message; }
public void setMessage(String message) { this.message = message; }
}
@AddCSRFToken public Result index(Http.Request request) {
String query = query(request);
return ok(views.html.javaIndex.render(SEARCH, SUPPORT, matching(query), query,
forms.form(SupportRequest.class), "", request.asScala()));
}
public Result products(Http.Request request) {
String query = query(request);
if (query.length() > 100) {
ObjectNode body = Json.newObject().put("ok", false);
body.putObject("errors").put("query", "La recherche doit contenir au maximum 100 caractères.");
return badRequest(body);
}
ObjectNode body = Json.newObject().put("ok", true);
body.set("products", Json.toJson(matching(query)));
return ok(body);
}
@RequireCSRFCheck @AddCSRFToken public Result support(Http.Request request) {
Form<SupportRequest> form = forms.form(SupportRequest.class).bindFromRequest(request);
if (form.hasErrors()) {
if (wantsJson(request)) {
ObjectNode body = Json.newObject().put("ok", false);
body.set("errors", form.errorsAsJson());
return badRequest(body);
}
return badRequest(views.html.javaIndex.render(SEARCH, SUPPORT, PRODUCTS, "", form,
"Corrigez les champs du formulaire.", request.asScala()));
}
// A real application would persist the request here using its existing service.
String message = "Demande validée pour " + form.get().name + " (démonstration, sans enregistrement).";
if (wantsJson(request)) {
return ok(Json.newObject().put("ok", true).put("message", message));
}
return ok(views.html.javaIndex.render(SEARCH, SUPPORT, PRODUCTS, "",
forms.form(SupportRequest.class), message, request.asScala()));
}
private static boolean wantsJson(Http.Request request) {
return request.getHeaders().get("Accept").orElse("").contains("application/json");
}
private static String query(Http.Request request) {
String value = request.getQueryString("query");
return value == null ? "" : value;
}
private static List<String> matching(String query) {
String normalized = query.toLowerCase(Locale.ROOT);
return PRODUCTS.stream().filter(p -> p.toLowerCase(Locale.ROOT).contains(normalized))
.collect(java.util.stream.Collectors.toList());
}
}