diff --git a/TopModel.Generator.Jpa/SpringClientApiGenerator.cs b/TopModel.Generator.Jpa/SpringClientApiGenerator.cs index f232a3b7..0e3880fb 100644 --- a/TopModel.Generator.Jpa/SpringClientApiGenerator.cs +++ b/TopModel.Generator.Jpa/SpringClientApiGenerator.cs @@ -39,36 +39,22 @@ protected override void HandleFile(string filePath, string fileName, string tag, WriteImports(endpoints, fw, tag); fw.WriteLine(); + if (endpoints.First().ModelFile.Options.Endpoints.Prefix != null) + { + fw.WriteLine($@"@HttpExchange(""{endpoints.First().ModelFile.Options.Endpoints.Prefix}"")"); + fw.AddImport("org.springframework.web.service.annotation"); + } var javaOrJakarta = Config.PersistenceMode.ToString().ToLower(); fw.AddImport($"{javaOrJakarta}.annotation.Generated"); fw.WriteLine("@Generated(\"TopModel : https://github.com/klee-contrib/topmodel\")"); - fw.WriteLine($"public abstract class {className} {{"); - - fw.WriteLine(); - - fw.WriteLine(1, $"protected RestTemplate restTemplate;"); - fw.WriteLine(1, $"protected String host;"); + fw.WriteLine($"public interface {className} {{"); fw.WriteLine(); - fw.WriteDocStart(1, "Constructeur par paramètres"); - fw.WriteLine(1, " * @param restTemplate"); - fw.WriteLine(1, " * @param host"); - fw.WriteDocEnd(1); - fw.WriteLine(1, $"protected {className}(RestTemplate restTemplate, String host) {{"); - fw.WriteLine(2, $"this.restTemplate = restTemplate;"); - fw.WriteLine(2, $"this.host = host;"); - fw.WriteLine(1, $"}}"); - - fw.WriteLine(); - fw.WriteDocStart(1, "Méthode de récupération des headers"); - fw.WriteLine(1, " * @return les headers à ajouter à la requête"); - fw.WriteDocEnd(1); - fw.WriteLine(1, $"protected abstract HttpHeaders getHeaders();"); foreach (var endpoint in endpoints) { - WriteEndpoint(fw, endpoint); + WriteEndpoint(fw, endpoint, tag); } fw.WriteLine("}"); @@ -76,68 +62,23 @@ protected override void HandleFile(string filePath, string fileName, string tag, private static string GetClassName(string fileName) { - return $"Abstract{fileName.ToPascalCase()}Client"; - } - - private List GetMethodParams(Endpoint endpoint, bool withType = true, bool withBody = true) - { - var methodParams = new List(); - foreach (var param in endpoint.GetRouteParams()) - { - if (withType) - { - methodParams.Add($"{Config.GetType(param)} {param.GetParamName()}"); - } - else - { - methodParams.Add(param.GetParamName()); - } - } - - foreach (var param in endpoint.GetQueryParams()) - { - if (withType) - { - methodParams.Add($"{Config.GetType(param)} {param.GetParamName()}"); - } - else - { - methodParams.Add(param.GetParamName()); - } - } - - var bodyParam = endpoint.GetJsonBodyParam(); - if (bodyParam != null && withBody) - { - if (withType) - { - methodParams.Add($"{Config.GetType(bodyParam)} {bodyParam.GetParamName()}"); - } - else - { - methodParams.Add(bodyParam.GetParamName()); - } - } - - return methodParams; + return $"{fileName.ToPascalCase()}Client"; } private IEnumerable GetTypeImports(IEnumerable endpoints, string tag) { - var properties = endpoints.SelectMany(endpoint => endpoint.Params).Concat(endpoints.Where(endpoint => endpoint.Returns is not null).Select(endpoint => endpoint.Returns)); - return properties.SelectMany(property => property!.GetTypeImports(Config, tag)); + var properties = endpoints.SelectMany(endpoint => endpoint.Params) + .Concat(endpoints.Where(endpoint => endpoint.Returns is not null) + .Select(endpoint => endpoint.Returns)); + return properties.SelectMany(property => property!.GetTypeImports(Config, tag)) + .Concat(endpoints.Where(endpoint => endpoint.Returns is not null) + .Select(e => e.Returns).OfType() + .SelectMany(c => c.GetKindImports(Config, tag))); } - private void WriteEndpoint(JavaWriter fw, Endpoint endpoint) + private void WriteEndpoint(JavaWriter fw, Endpoint endpoint, string tag) { fw.WriteLine(); - WriteUriBuilderMethod(fw, endpoint); - fw.WriteLine(); - WriteEndpointCallMethod(fw, endpoint); - } - - private void WriteEndpointCallMethod(JavaWriter fw, Endpoint endpoint) - { fw.WriteDocStart(1, endpoint.Description); foreach (var param in endpoint.Params) @@ -151,131 +92,94 @@ private void WriteEndpointCallMethod(JavaWriter fw, Endpoint endpoint) } fw.WriteLine(1, " */"); - var returnType = "ResponseEntity"; - var returnClass = "(Class) null"; + var returnType = "void"; + if (endpoint.Returns != null) { - if (Config.GetType(endpoint.Returns) == "ResponseEntity" && Config.GetType(endpoint.Returns).Split('<').Length > 1) + returnType = Config.GetType(endpoint.Returns); + } + + { + var produces = string.Empty; + if (endpoint.Returns != null && endpoint.Returns is IFieldProperty fp && fp.Domain.MediaType != null) { - returnType = $"ResponseEntity<{Config.GetType(endpoint.Returns).Split('<')[1].Split('>').First()}>"; - returnClass = $"{Config.GetType(endpoint.Returns).Split('<')[1].Split('>').First()}.class"; + produces = @$", produces = {{ ""{fp.Domain.MediaType}"" }}"; } - else if (Config.GetType(endpoint.Returns).Contains('<')) + + var consumes = string.Empty; + if (endpoint.Params.Any(p => p is IFieldProperty fdp && fdp.Domain.MediaType != null)) { - returnType = $"ResponseEntity<{Config.GetType(endpoint.Returns)}>"; - returnClass = @$"new ParameterizedTypeReference<{Config.GetType(endpoint.Returns)}>() {{}}"; - fw.AddImport("org.springframework.core.ParameterizedTypeReference"); + consumes = @$", consumes = {{ {string.Join(", ", endpoint.Params.Where(p => p is IFieldProperty fdp && fdp.Domain.MediaType != null).Select(p => $@"""{((IFieldProperty)p).Domain.MediaType}"""))} }}"; } - else + + foreach (var annotation in Config.GetDecoratorAnnotations(endpoint, tag)) { - returnType = $"ResponseEntity<{Config.GetType(endpoint.Returns)}>"; - returnClass = $"{Config.GetType(endpoint.Returns)}.class"; + fw.WriteLine(1, $"{(annotation.StartsWith("@") ? string.Empty : "@")}{annotation}"); } - } - fw.WriteLine(1, $"public {returnType} {endpoint.NameCamel}({string.Join(", ", GetMethodParams(endpoint))}){{"); - fw.WriteLine(2, $"HttpHeaders headers = this.getHeaders();"); - fw.WriteLine(2, $"UriComponentsBuilder uri = this.{endpoint.NameCamel}UriComponentsBuilder({string.Join(", ", GetMethodParams(endpoint, false, false))});"); - var body = $"new HttpEntity<>({(endpoint.GetJsonBodyParam()?.GetParamName() != null ? $"{endpoint.GetJsonBodyParam()?.GetParamName()}, " : string.Empty)}headers)"; - if (endpoint.Returns != null) - { - fw.WriteLine(2, $"return this.restTemplate.exchange(uri.build().toUri(), HttpMethod.{endpoint.Method}, {body}, {returnClass});"); - } - else - { - fw.WriteLine(2, $"return this.restTemplate.exchange(uri.build().toUri(), HttpMethod.{endpoint.Method}, {body}, {returnClass});"); + fw.WriteLine(1, @$"@{endpoint.Method.ToPascalCase(true)}Exchange(""{endpoint.Route}""{consumes}{produces})"); } - fw.WriteLine(1, "}"); - } - - private void WriteImports(IEnumerable endpoints, JavaWriter fw, string tag) - { - var imports = new List(); - imports.AddRange(GetTypeImports(endpoints, tag).Distinct()); - imports.Add(Config.PersistenceMode.ToString().ToLower() + ".annotation.Generated"); - imports.Add("org.springframework.web.util.UriComponentsBuilder"); - imports.Add("org.springframework.web.client.RestTemplate"); - imports.Add("java.net.URI"); - imports.Add("org.springframework.http.HttpMethod"); - imports.Add("org.springframework.http.HttpEntity"); - imports.Add("org.springframework.http.HttpHeaders"); - imports.Add("org.springframework.http.ResponseEntity"); - fw.AddImports(imports); - } - - private void WriteUriBuilderMethod(JavaWriter fw, Endpoint endpoint) - { - fw.WriteDocStart(1, $"UriComponentsBuilder pour la méthode {endpoint.NameCamel}"); - - foreach (var param in endpoint.GetRouteParams().Concat(endpoint.GetQueryParams())) + var methodParams = new List(); + foreach (var param in endpoint.GetRouteParams()) { - fw.WriteLine(1, $" * @param {param.GetParamName()} {param.Comment}"); - } + var pathParamAnnotation = @$"@PathVariable(""{param.GetParamName()}"")"; - if (endpoint.Returns != null) - { - fw.WriteLine(1, $" * @return uriBuilder avec les query params remplis"); + fw.AddImport("org.springframework.web.bind.annotation.PathVariable"); + fw.AddImports(Config.GetDomainImports(param, tag)); + var decoratorAnnotations = string.Join(' ', Config.GetDomainAnnotations(param, tag).Select(a => a.StartsWith("@") ? a : "@" + a)); + methodParams.Add($"{pathParamAnnotation}{(decoratorAnnotations.Length > 0 ? $" {decoratorAnnotations}" : string.Empty)} {Config.GetType(param)} {param.GetParamName()}"); } - fw.WriteLine(1, " */"); - var returnType = "UriComponentsBuilder"; - var methodParams = GetMethodParams(endpoint, true, false); - - fw.WriteLine(1, $"protected {returnType} {endpoint.NameCamel}UriComponentsBuilder({string.Join(", ", methodParams)}) {{"); - var fullRoute = endpoint.FullRoute; - fullRoute = "/" + fullRoute; - foreach (IProperty p in endpoint.GetRouteParams()) + foreach (var param in endpoint.GetQueryParams()) { - fullRoute = fullRoute.Replace(@$"{{{p.GetParamName()}}}", "%s"); + var ann = string.Empty; + ann += @$"@RequestParam(value = ""{param.GetParamName()}"", required = {(param is not IFieldProperty fp || fp.Required).ToString().ToFirstLower()}) "; + fw.AddImport("org.springframework.web.bind.annotation.RequestParam"); + fw.AddImports(Config.GetDomainImports(param, tag)); + var decoratorAnnotations = string.Join(' ', Config.GetDomainAnnotations(param, tag).Select(a => a.StartsWith("@") ? a : "@" + a)); + methodParams.Add($"{ann}{(decoratorAnnotations.Length > 0 ? $" {decoratorAnnotations}" : string.Empty)}{Config.GetType(param)} {param.GetParamName()}"); } - if (endpoint.GetRouteParams().Any()) + if (endpoint.IsMultipart) { - fullRoute = $@"""{fullRoute}"".formatted({string.Join(", ", endpoint.GetRouteParams().Select(p => p.GetParamName()))})"; + foreach (var param in endpoint.Params.Where(param => param is CompositionProperty || (param.Domain?.BodyParam ?? false) || (param.Domain?.IsMultipart ?? false))) + { + var ann = string.Empty; + if (!(param.Domain?.IsMultipart ?? false)) + { + ann += @$"@ModelAttribute "; + fw.AddImport("org.springframework.web.bind.annotation.ModelAttribute"); + } + else + { + ann += @$"@RequestPart(value = ""{param.GetParamName()}"", required = {(param is not IFieldProperty fp || fp.Required).ToString().ToFirstLower()}) "; + fw.AddImport("org.springframework.web.bind.annotation.RequestPart"); + } + + methodParams.Add($"{ann}{Config.GetType(param)} {param.GetParamName()}"); + } } else { - fullRoute = $@"""{fullRoute}"""; - } - - fw.WriteLine(2, @$"String uri = host + {fullRoute};"); - if (!endpoint.GetQueryParams().Any()) - { - fw.WriteLine(2, @$"return UriComponentsBuilder.fromUri(URI.create(uri));"); - fw.WriteLine(1, "}"); - return; - } - - fw.WriteLine(2, @$"UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUri(URI.create(uri));"); - foreach (IProperty p in endpoint.GetQueryParams()) - { - var indentLevel = 2; - var isRequired = p is IFieldProperty fp && fp.Required; - if (!isRequired) + var bodyParam = endpoint.GetJsonBodyParam(); + if (bodyParam != null) { - fw.WriteLine(2, @$"if ({p.GetParamName()} != null) {{"); - indentLevel++; - } - - if (Config.GetType(p).StartsWith("List")) - { - fw.AddImport("java.util.stream.Collectors"); - fw.WriteLine(indentLevel, @$"uriBuilder.queryParam(""{p.GetParamName()}"", {p.GetParamName()}.stream().collect(Collectors.joining("","")));"); - } - else - { - fw.WriteLine(indentLevel, @$"uriBuilder.queryParam(""{p.GetParamName()}"", {p.GetParamName()});"); - } - - if (!isRequired) - { - fw.WriteLine(2, @$"}}"); - fw.WriteLine(); + var ann = string.Empty; + ann += @$"@RequestBody @Valid "; + fw.AddImport("org.springframework.web.bind.annotation.RequestBody"); + fw.AddImport(Config.PersistenceMode.ToString().ToLower() + ".validation.Valid"); + methodParams.Add($"{ann}{Config.GetType(bodyParam)} {bodyParam.GetParamName()}"); } } - fw.WriteLine(2, $"return uriBuilder;"); - fw.WriteLine(1, "}"); + fw.WriteLine(1, $"{returnType} {endpoint.NameCamel}({string.Join(", ", methodParams)});"); + } + + private void WriteImports(IEnumerable endpoints, JavaWriter fw, string tag) + { + fw.AddImports(endpoints.Select(e => $"org.springframework.web.service.annotation.{e.Method.ToPascalCase(true)}Exchange")); + fw.AddImports(GetTypeImports(endpoints, tag)); + fw.AddImports(endpoints.SelectMany(e => Config.GetDecoratorImports(e, tag))); } -} \ No newline at end of file +} diff --git a/samples/generators/jpa/src/main/javagen/topmodel/jpa/sample/demo/api/client/securite/profil/AbstractProfilClient.java b/samples/generators/jpa/src/main/javagen/topmodel/jpa/sample/demo/api/client/securite/profil/AbstractProfilClient.java deleted file mode 100644 index e9db1397..00000000 --- a/samples/generators/jpa/src/main/javagen/topmodel/jpa/sample/demo/api/client/securite/profil/AbstractProfilClient.java +++ /dev/null @@ -1,127 +0,0 @@ -//// -//// ATTENTION CE FICHIER EST GENERE AUTOMATIQUEMENT ! -//// - -package topmodel.jpa.sample.demo.api.client.securite.profil; - -import java.net.URI; -import java.util.List; - -import org.springframework.core.ParameterizedTypeReference; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.ResponseEntity; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.UriComponentsBuilder; - -import jakarta.annotation.Generated; - -import topmodel.jpa.sample.demo.dtos.securite.profil.ProfilItem; -import topmodel.jpa.sample.demo.dtos.securite.profil.ProfilRead; -import topmodel.jpa.sample.demo.dtos.securite.profil.ProfilWrite; - -@Generated("TopModel : https://github.com/klee-contrib/topmodel") -public abstract class AbstractProfilClient { - - protected RestTemplate restTemplate; - protected String host; - - /** - * Constructeur par paramètres. - * @param restTemplate - * @param host - */ - protected AbstractProfilClient(RestTemplate restTemplate, String host) { - this.restTemplate = restTemplate; - this.host = host; - } - - /** - * Méthode de récupération des headers. - * @return les headers à ajouter à la requête - */ - protected abstract HttpHeaders getHeaders(); - - /** - * UriComponentsBuilder pour la méthode addProfil. - * @return uriBuilder avec les query params remplis - */ - protected UriComponentsBuilder addProfilUriComponentsBuilder() { - String uri = host + "/api/profils"; - return UriComponentsBuilder.fromUri(URI.create(uri)); - } - - /** - * Ajoute un Profil. - * @param profil Profil à sauvegarder - * @return Profil sauvegardé - */ - public ResponseEntity addProfil(ProfilWrite profil){ - HttpHeaders headers = this.getHeaders(); - UriComponentsBuilder uri = this.addProfilUriComponentsBuilder(); - return this.restTemplate.exchange(uri.build().toUri(), HttpMethod.POST, new HttpEntity<>(profil, headers), ProfilRead.class); - } - - /** - * UriComponentsBuilder pour la méthode getProfil. - * @param proId Id technique - * @return uriBuilder avec les query params remplis - */ - protected UriComponentsBuilder getProfilUriComponentsBuilder(Integer proId) { - String uri = host + "/api/profils/%s".formatted(proId); - return UriComponentsBuilder.fromUri(URI.create(uri)); - } - - /** - * Charge le détail d'un Profil. - * @param proId Id technique - * @return Le détail de l'Profil - */ - public ResponseEntity getProfil(Integer proId){ - HttpHeaders headers = this.getHeaders(); - UriComponentsBuilder uri = this.getProfilUriComponentsBuilder(proId); - return this.restTemplate.exchange(uri.build().toUri(), HttpMethod.GET, new HttpEntity<>(headers), ProfilRead.class); - } - - /** - * UriComponentsBuilder pour la méthode getProfils. - * @return uriBuilder avec les query params remplis - */ - protected UriComponentsBuilder getProfilsUriComponentsBuilder() { - String uri = host + "/api/profils"; - return UriComponentsBuilder.fromUri(URI.create(uri)); - } - - /** - * Liste tous les Profils. - * @return Profils matchant les critères - */ - public ResponseEntity> getProfils(){ - HttpHeaders headers = this.getHeaders(); - UriComponentsBuilder uri = this.getProfilsUriComponentsBuilder(); - return this.restTemplate.exchange(uri.build().toUri(), HttpMethod.GET, new HttpEntity<>(headers), new ParameterizedTypeReference>() {}); - } - - /** - * UriComponentsBuilder pour la méthode updateProfil. - * @param proId Id technique - * @return uriBuilder avec les query params remplis - */ - protected UriComponentsBuilder updateProfilUriComponentsBuilder(Integer proId) { - String uri = host + "/api/profils/%s".formatted(proId); - return UriComponentsBuilder.fromUri(URI.create(uri)); - } - - /** - * Sauvegarde un Profil. - * @param proId Id technique - * @param profil Profil à sauvegarder - * @return Profil sauvegardé - */ - public ResponseEntity updateProfil(Integer proId, ProfilWrite profil){ - HttpHeaders headers = this.getHeaders(); - UriComponentsBuilder uri = this.updateProfilUriComponentsBuilder(proId); - return this.restTemplate.exchange(uri.build().toUri(), HttpMethod.PUT, new HttpEntity<>(profil, headers), ProfilRead.class); - } -} diff --git a/samples/generators/jpa/src/main/javagen/topmodel/jpa/sample/demo/api/client/securite/profil/ProfilClient.java b/samples/generators/jpa/src/main/javagen/topmodel/jpa/sample/demo/api/client/securite/profil/ProfilClient.java new file mode 100644 index 00000000..cbbf61ad --- /dev/null +++ b/samples/generators/jpa/src/main/javagen/topmodel/jpa/sample/demo/api/client/securite/profil/ProfilClient.java @@ -0,0 +1,64 @@ +//// +//// ATTENTION CE FICHIER EST GENERE AUTOMATIQUEMENT ! +//// + +package topmodel.jpa.sample.demo.api.client.securite.profil; + +import java.util.List; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.service.annotation; +import org.springframework.web.service.annotation.GetExchange; +import org.springframework.web.service.annotation.PostExchange; +import org.springframework.web.service.annotation.PutExchange; + +import jakarta.annotation.Generated; +import jakarta.validation.Valid; + +import topmodel.jpa.sample.demo.dtos.securite.profil.ProfilItem; +import topmodel.jpa.sample.demo.dtos.securite.profil.ProfilRead; +import topmodel.jpa.sample.demo.dtos.securite.profil.ProfilWrite; + +@HttpExchange("api/profils") +@Generated("TopModel : https://github.com/klee-contrib/topmodel") +public interface ProfilClient { + + + /** + * Ajoute un Profil. + * @param profil Profil à sauvegarder + * @return Profil sauvegardé + */ + @PreAuthorize("hasRole('CREATE')") + @PostExchange("/") + ProfilRead addProfil(@RequestBody @Valid ProfilWrite profil); + + /** + * Charge le détail d'un Profil. + * @param proId Id technique + * @return Le détail de l'Profil + */ + @PreAuthorize("hasRole('READ')") + @GetExchange("/{proId}") + ProfilRead getProfil(@PathVariable("proId") Integer proId); + + /** + * Liste tous les Profils. + * @return Profils matchant les critères + */ + @PreAuthorize("hasRole('READ')") + @GetExchange("/") + List getProfils(); + + /** + * Sauvegarde un Profil. + * @param proId Id technique + * @param profil Profil à sauvegarder + * @return Profil sauvegardé + */ + @PreAuthorize("hasRole('UPDATE')") + @PutExchange("/{proId}") + ProfilRead updateProfil(@PathVariable("proId") Integer proId, @RequestBody @Valid ProfilWrite profil); +} diff --git a/samples/generators/jpa/src/main/javagen/topmodel/jpa/sample/demo/api/client/securite/utilisateur/AbstractUtilisateurClient.java b/samples/generators/jpa/src/main/javagen/topmodel/jpa/sample/demo/api/client/securite/utilisateur/AbstractUtilisateurClient.java deleted file mode 100644 index 8e895aff..00000000 --- a/samples/generators/jpa/src/main/javagen/topmodel/jpa/sample/demo/api/client/securite/utilisateur/AbstractUtilisateurClient.java +++ /dev/null @@ -1,179 +0,0 @@ -//// -//// ATTENTION CE FICHIER EST GENERE AUTOMATIQUEMENT ! -//// - -package topmodel.jpa.sample.demo.api.client.securite.utilisateur; - -import java.net.URI; -import java.time.LocalDate; -import java.util.List; - -import org.springframework.core.ParameterizedTypeReference; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.ResponseEntity; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.UriComponentsBuilder; - -import jakarta.annotation.Generated; - -import topmodel.jpa.sample.demo.dtos.securite.utilisateur.UtilisateurItem; -import topmodel.jpa.sample.demo.dtos.securite.utilisateur.UtilisateurRead; -import topmodel.jpa.sample.demo.dtos.securite.utilisateur.UtilisateurWrite; -import topmodel.jpa.sample.demo.enums.securite.utilisateur.TypeUtilisateurCode; - -@Generated("TopModel : https://github.com/klee-contrib/topmodel") -public abstract class AbstractUtilisateurClient { - - protected RestTemplate restTemplate; - protected String host; - - /** - * Constructeur par paramètres. - * @param restTemplate - * @param host - */ - protected AbstractUtilisateurClient(RestTemplate restTemplate, String host) { - this.restTemplate = restTemplate; - this.host = host; - } - - /** - * Méthode de récupération des headers. - * @return les headers à ajouter à la requête - */ - protected abstract HttpHeaders getHeaders(); - - /** - * UriComponentsBuilder pour la méthode addUtilisateur. - * @return uriBuilder avec les query params remplis - */ - protected UriComponentsBuilder addUtilisateurUriComponentsBuilder() { - String uri = host + "/api/utilisateurs"; - return UriComponentsBuilder.fromUri(URI.create(uri)); - } - - /** - * Ajoute un utilisateur. - * @param utilisateur Utilisateur à sauvegarder - * @return Utilisateur sauvegardé - */ - public ResponseEntity addUtilisateur(UtilisateurWrite utilisateur){ - HttpHeaders headers = this.getHeaders(); - UriComponentsBuilder uri = this.addUtilisateurUriComponentsBuilder(); - return this.restTemplate.exchange(uri.build().toUri(), HttpMethod.POST, new HttpEntity<>(utilisateur, headers), UtilisateurRead.class); - } - - /** - * UriComponentsBuilder pour la méthode deleteUtilisateur. - * @param utiId Id de l'utilisateur - */ - protected UriComponentsBuilder deleteUtilisateurUriComponentsBuilder(Integer utiId) { - String uri = host + "/api/utilisateurs/%s".formatted(utiId); - return UriComponentsBuilder.fromUri(URI.create(uri)); - } - - /** - * Supprime un utilisateur. - * @param utiId Id de l'utilisateur - */ - public ResponseEntity deleteUtilisateur(Integer utiId){ - HttpHeaders headers = this.getHeaders(); - UriComponentsBuilder uri = this.deleteUtilisateurUriComponentsBuilder(utiId); - return this.restTemplate.exchange(uri.build().toUri(), HttpMethod.DELETE, new HttpEntity<>(headers), (Class) null); - } - - /** - * UriComponentsBuilder pour la méthode getUtilisateur. - * @param utiId Id de l'utilisateur - * @return uriBuilder avec les query params remplis - */ - protected UriComponentsBuilder getUtilisateurUriComponentsBuilder(Integer utiId) { - String uri = host + "/api/utilisateurs/%s".formatted(utiId); - return UriComponentsBuilder.fromUri(URI.create(uri)); - } - - /** - * Charge le détail d'un utilisateur. - * @param utiId Id de l'utilisateur - * @return Le détail de l'utilisateur - */ - public ResponseEntity getUtilisateur(Integer utiId){ - HttpHeaders headers = this.getHeaders(); - UriComponentsBuilder uri = this.getUtilisateurUriComponentsBuilder(utiId); - return this.restTemplate.exchange(uri.build().toUri(), HttpMethod.GET, new HttpEntity<>(headers), UtilisateurRead.class); - } - - /** - * UriComponentsBuilder pour la méthode searchUtilisateur. - * @param nom Nom de l'utilisateur - * @param prenom Nom de l'utilisateur - * @param email Email de l'utilisateur - * @param dateNaissance Age de l'utilisateur - * @param adresse Adresse de l'utilisateur - * @param actif Si l'utilisateur est actif - * @param profilId Profil de l'utilisateur - * @param typeUtilisateurCode Type d'utilisateur - * @return uriBuilder avec les query params remplis - */ - protected UriComponentsBuilder searchUtilisateurUriComponentsBuilder(String nom, String prenom, String email, LocalDate dateNaissance, String adresse, Boolean actif, Integer profilId, TypeUtilisateurCode typeUtilisateurCode) { - String uri = host + "/api/utilisateurs"; - UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromUri(URI.create(uri)); - uriBuilder.queryParam("nom", nom); - uriBuilder.queryParam("prenom", prenom); - uriBuilder.queryParam("email", email); - if (dateNaissance != null) { - uriBuilder.queryParam("dateNaissance", dateNaissance); - } - - if (adresse != null) { - uriBuilder.queryParam("adresse", adresse); - } - - uriBuilder.queryParam("actif", actif); - uriBuilder.queryParam("profilId", profilId); - uriBuilder.queryParam("typeUtilisateurCode", typeUtilisateurCode); - return uriBuilder; - } - - /** - * Recherche des utilisateurs. - * @param nom Nom de l'utilisateur - * @param prenom Nom de l'utilisateur - * @param email Email de l'utilisateur - * @param dateNaissance Age de l'utilisateur - * @param adresse Adresse de l'utilisateur - * @param actif Si l'utilisateur est actif - * @param profilId Profil de l'utilisateur - * @param typeUtilisateurCode Type d'utilisateur - * @return Utilisateurs matchant les critères - */ - public ResponseEntity> searchUtilisateur(String nom, String prenom, String email, LocalDate dateNaissance, String adresse, Boolean actif, Integer profilId, TypeUtilisateurCode typeUtilisateurCode){ - HttpHeaders headers = this.getHeaders(); - UriComponentsBuilder uri = this.searchUtilisateurUriComponentsBuilder(nom, prenom, email, dateNaissance, adresse, actif, profilId, typeUtilisateurCode); - return this.restTemplate.exchange(uri.build().toUri(), HttpMethod.GET, new HttpEntity<>(headers), new ParameterizedTypeReference>() {}); - } - - /** - * UriComponentsBuilder pour la méthode updateUtilisateur. - * @param utiId Id de l'utilisateur - * @return uriBuilder avec les query params remplis - */ - protected UriComponentsBuilder updateUtilisateurUriComponentsBuilder(Integer utiId) { - String uri = host + "/api/utilisateurs/%s".formatted(utiId); - return UriComponentsBuilder.fromUri(URI.create(uri)); - } - - /** - * Sauvegarde un utilisateur. - * @param utiId Id de l'utilisateur - * @param utilisateur Utilisateur à sauvegarder - * @return Utilisateur sauvegardé - */ - public ResponseEntity updateUtilisateur(Integer utiId, UtilisateurWrite utilisateur){ - HttpHeaders headers = this.getHeaders(); - UriComponentsBuilder uri = this.updateUtilisateurUriComponentsBuilder(utiId); - return this.restTemplate.exchange(uri.build().toUri(), HttpMethod.PUT, new HttpEntity<>(utilisateur, headers), UtilisateurRead.class); - } -} diff --git a/samples/generators/jpa/src/main/javagen/topmodel/jpa/sample/demo/api/client/securite/utilisateur/UtilisateurClient.java b/samples/generators/jpa/src/main/javagen/topmodel/jpa/sample/demo/api/client/securite/utilisateur/UtilisateurClient.java new file mode 100644 index 00000000..6113d920 --- /dev/null +++ b/samples/generators/jpa/src/main/javagen/topmodel/jpa/sample/demo/api/client/securite/utilisateur/UtilisateurClient.java @@ -0,0 +1,84 @@ +//// +//// ATTENTION CE FICHIER EST GENERE AUTOMATIQUEMENT ! +//// + +package topmodel.jpa.sample.demo.api.client.securite.utilisateur; + +import java.time.LocalDate; +import java.util.List; + +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.service.annotation; +import org.springframework.web.service.annotation.DeleteExchange; +import org.springframework.web.service.annotation.GetExchange; +import org.springframework.web.service.annotation.PostExchange; +import org.springframework.web.service.annotation.PutExchange; + +import jakarta.annotation.Generated; +import jakarta.validation.Valid; + +import topmodel.jpa.sample.demo.dtos.securite.utilisateur.UtilisateurItem; +import topmodel.jpa.sample.demo.dtos.securite.utilisateur.UtilisateurRead; +import topmodel.jpa.sample.demo.dtos.securite.utilisateur.UtilisateurWrite; +import topmodel.jpa.sample.demo.enums.securite.utilisateur.TypeUtilisateurCode; + +@HttpExchange("api/utilisateurs") +@Generated("TopModel : https://github.com/klee-contrib/topmodel") +public interface UtilisateurClient { + + + /** + * Ajoute un utilisateur. + * @param utilisateur Utilisateur à sauvegarder + * @return Utilisateur sauvegardé + */ + @PreAuthorize("hasRole('CREATE')") + @PostExchange("/") + UtilisateurRead addUtilisateur(@RequestBody @Valid UtilisateurWrite utilisateur); + + /** + * Supprime un utilisateur. + * @param utiId Id de l'utilisateur + */ + @PreAuthorize("hasRole('DELETE')") + @DeleteExchange("/{utiId}") + void deleteUtilisateur(@PathVariable("utiId") Integer utiId); + + /** + * Charge le détail d'un utilisateur. + * @param utiId Id de l'utilisateur + * @return Le détail de l'utilisateur + */ + @PreAuthorize("hasRole('READ')") + @GetExchange("/{utiId}") + UtilisateurRead getUtilisateur(@PathVariable("utiId") Integer utiId); + + /** + * Recherche des utilisateurs. + * @param nom Nom de l'utilisateur + * @param prenom Nom de l'utilisateur + * @param email Email de l'utilisateur + * @param dateNaissance Age de l'utilisateur + * @param adresse Adresse de l'utilisateur + * @param actif Si l'utilisateur est actif + * @param profilId Profil de l'utilisateur + * @param typeUtilisateurCode Type d'utilisateur + * @return Utilisateurs matchant les critères + */ + @PreAuthorize("hasRole('READ')") + @GetExchange("/") + List searchUtilisateur(@RequestParam(value = "nom", required = true) String nom, @RequestParam(value = "prenom", required = true) String prenom, @RequestParam(value = "email", required = true) String email, @RequestParam(value = "dateNaissance", required = false) LocalDate dateNaissance, @RequestParam(value = "adresse", required = false) String adresse, @RequestParam(value = "actif", required = true) Boolean actif, @RequestParam(value = "profilId", required = true) Integer profilId, @RequestParam(value = "typeUtilisateurCode", required = true) TypeUtilisateurCode typeUtilisateurCode); + + /** + * Sauvegarde un utilisateur. + * @param utiId Id de l'utilisateur + * @param utilisateur Utilisateur à sauvegarder + * @return Utilisateur sauvegardé + */ + @PreAuthorize("hasRole('UPDATE')") + @PutExchange("/{utiId}") + UtilisateurRead updateUtilisateur(@PathVariable("utiId") Integer utiId, @RequestBody @Valid UtilisateurWrite utilisateur); +} diff --git a/samples/model/jpa.topmodel.lock b/samples/model/jpa.topmodel.lock index ca2b73eb..b1c2c449 100644 --- a/samples/model/jpa.topmodel.lock +++ b/samples/model/jpa.topmodel.lock @@ -4,8 +4,8 @@ version: 1.41.2 generatedFiles: - - ../generators/jpa/src/main/javagen/topmodel/jpa/sample/demo/api/client/securite/profil/AbstractProfilClient.java - - ../generators/jpa/src/main/javagen/topmodel/jpa/sample/demo/api/client/securite/utilisateur/AbstractUtilisateurClient.java + - ../generators/jpa/src/main/javagen/topmodel/jpa/sample/demo/api/client/securite/profil/ProfilClient.java + - ../generators/jpa/src/main/javagen/topmodel/jpa/sample/demo/api/client/securite/utilisateur/UtilisateurClient.java - ../generators/jpa/src/main/javagen/topmodel/jpa/sample/demo/api/server/securite/profil/ProfilController.java - ../generators/jpa/src/main/javagen/topmodel/jpa/sample/demo/api/server/securite/utilisateur/UtilisateurController.java - ../generators/jpa/src/main/javagen/topmodel/jpa/sample/demo/daos/securite/profil/DroitDAO.java