Add form data support for superuser signup API (#6844)

The superuser signup api available at /users/super currently only supports JSON payload. This PR adds support for form-data payload at the same endpoint, and makes it consistent with the normal user's signup API endpoint.
This commit is contained in:
Shrikant Sharat Kandula 2021-08-26 06:35:32 +05:30 committed by GitHub
parent 58fad5f3fb
commit e0273ecc03
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 52 additions and 2 deletions

View File

@ -75,7 +75,7 @@ public class UserController extends BaseController<UserService, User, String> {
return userSignup.signupAndLoginFromFormData(exchange);
}
@PostMapping("/super")
@PostMapping(value = "/super", consumes = {MediaType.APPLICATION_JSON_VALUE})
public Mono<ResponseDTO<User>> createSuperUser(
@Valid @RequestBody UserSignupRequestDTO resource,
ServerWebExchange exchange
@ -84,6 +84,11 @@ public class UserController extends BaseController<UserService, User, String> {
.map(created -> new ResponseDTO<>(HttpStatus.CREATED.value(), created, null));
}
@PostMapping(value = "/super", consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE})
public Mono<Void> createSuperUserFromFormData(ServerWebExchange exchange) {
return userSignup.signupAndLoginSuperFromFormData(exchange);
}
@PutMapping()
public Mono<ResponseDTO<User>> update(@RequestBody User resource, ServerWebExchange exchange) {
return service.updateCurrentUser(resource, exchange)

View File

@ -125,7 +125,7 @@ public class UserSignup {
.map(formData -> {
final User user = new User();
user.setEmail(formData.getFirst(FieldName.EMAIL));
user.setPassword(formData.getFirst("password"));
user.setPassword(formData.getFirst(FieldName.PASSWORD));
if (formData.containsKey(FieldName.NAME)) {
user.setName(formData.getFirst(FieldName.NAME));
}
@ -201,4 +201,49 @@ public class UserSignup {
});
}
public Mono<Void> signupAndLoginSuperFromFormData(ServerWebExchange exchange) {
return exchange.getFormData()
.map(formData -> {
final UserSignupRequestDTO user = new UserSignupRequestDTO();
user.setEmail(formData.getFirst(FieldName.EMAIL));
user.setPassword(formData.getFirst(FieldName.PASSWORD));
user.setSource(LoginSource.FORM);
user.setState(UserState.ACTIVATED);
user.setEnabled(true);
if (formData.containsKey(FieldName.NAME)) {
user.setName(formData.getFirst(FieldName.NAME));
}
if (formData.containsKey("role")) {
user.setRole(formData.getFirst("role"));
}
if (formData.containsKey("companyName")) {
user.setCompanyName(formData.getFirst("companyName"));
}
if (formData.containsKey("allowCollectingAnonymousData")) {
user.setAllowCollectingAnonymousData("true".equals(formData.getFirst("allowCollectingAnonymousData")));
}
if (formData.containsKey("signupForNewsletter")) {
user.setSignupForNewsletter("true".equals(formData.getFirst("signupForNewsletter")));
}
return user;
})
.flatMap(user -> signupAndLoginSuper(user, exchange))
.then()
.onErrorResume(error -> {
String referer = exchange.getRequest().getHeaders().getFirst("referer");
if (referer == null) {
referer = DEFAULT_ORIGIN_HEADER;
}
final URIBuilder redirectUriBuilder = new URIBuilder(URI.create(referer)).setParameter("error", error.getMessage());
URI redirectUri;
try {
redirectUri = redirectUriBuilder.build();
} catch (URISyntaxException e) {
log.error("Error building redirect URI with error for signup, {}.", e.getMessage(), error);
redirectUri = URI.create(referer);
}
return redirectStrategy.sendRedirect(exchange, redirectUri);
});
}
}