diff --git a/src/main/java/fr/univnantes/webandcloud/api/controllers/v1/Users.java b/src/main/java/fr/univnantes/webandcloud/api/controllers/v1/Users.java index 3ba30762b6d59116976a427a48f0a1f607061d4a..60cec2616020f7ac4df2b6692ff5d2320009fe86 100644 --- a/src/main/java/fr/univnantes/webandcloud/api/controllers/v1/Users.java +++ b/src/main/java/fr/univnantes/webandcloud/api/controllers/v1/Users.java @@ -18,6 +18,7 @@ import org.springframework.web.bind.annotation.RestController; import fr.univnantes.webandcloud.api.core.Token; import fr.univnantes.webandcloud.api.core.User; +import fr.univnantes.webandcloud.api.core.UserPayload; import fr.univnantes.webandcloud.api.responses.BadRequest; import fr.univnantes.webandcloud.api.responses.NotFoundException; import fr.univnantes.webandcloud.api.responses.ResponseError; @@ -68,6 +69,25 @@ public class Users extends BaseController { return userDB.get(id); } + @CrossOrigin + @Operation(summary = "Update user") + @ApiResponse(responseCode = "200", description = "Update user", content = @Content(mediaType = "application/json", schema = @Schema(implementation = User.class))) + @RequestMapping(value = "/users/edit", method = RequestMethod.POST) + @Nullable + public User updateUser( + @Parameter(description = "Token for identify your account", example = "abcEFG145") @RequestHeader(required = false) @Nullable String token, + @Parameter(description = "Payload of User") @RequestBody @NonNull UserPayload userPayload) + throws ResponseError { + User currentUser = tokenService.getUserRelated(token); + if (currentUser == null) + throw new BadRequest("Token must be valid"); + if (!userPayload.id.equals(currentUser.getId())) + throw new BadRequest("User id is immutable"); + else + userDB.put(currentUser.updateFromPayload(userPayload)); + return currentUser; + } + @CrossOrigin @Operation(summary = "Follow user") @ApiResponse(responseCode = "200", description = "Follow a user") @@ -112,13 +132,13 @@ public class Users extends BaseController { @Operation(summary = "Create user") @ApiResponse(responseCode = "200", description = "User Created") @RequestMapping(value = "/users/create", method = RequestMethod.POST) - public Token createUser(@Parameter(description = "Payload of User") @RequestBody @NonNull User user) + public Token createUser(@Parameter(description = "Payload of User") @RequestBody @NonNull UserPayload userPayload) throws ResponseError { try { - User res = getUser(user.getId()); + getUser(userPayload.id); throw new BadRequest("User already exist"); } catch (NotFoundException ignored) { - user = this.userDB.add(user); + User user = this.userDB.add(new User(userPayload)); Token token = new Token(user); token = this.tokenDB.add(token); return token; diff --git a/src/main/java/fr/univnantes/webandcloud/api/core/User.java b/src/main/java/fr/univnantes/webandcloud/api/core/User.java index 4c5b817b77c5fc6b47b06e18bba6aef1185c9bc2..7dbdcbc7e51da46698464067d797188ceb0b1fcd 100644 --- a/src/main/java/fr/univnantes/webandcloud/api/core/User.java +++ b/src/main/java/fr/univnantes/webandcloud/api/core/User.java @@ -3,12 +3,6 @@ package fr.univnantes.webandcloud.api.core; import java.util.ArrayList; import java.util.List; -import com.fasterxml.jackson.annotation.JsonCreator; -import com.fasterxml.jackson.annotation.JsonProperty; - -import org.springframework.lang.NonNull; -import org.springframework.lang.Nullable; - import io.swagger.v3.oas.annotations.media.Schema; @Schema(description = "Some user") @@ -44,10 +38,18 @@ public class User implements WithIdentifier { this(id, userName, email, uri, new ArrayList<>(), new ArrayList<>(), new ArrayList<>()); } - @JsonCreator - public User(@NonNull @JsonProperty("userName") String userName, @NonNull @JsonProperty("email") String email, - @Nullable @JsonProperty("uri") String uri) { - this(userName, userName, email, uri, new ArrayList<>(), new ArrayList<>(), new ArrayList<>()); + public User(UserPayload payload) { + this(payload.id, payload.userName, payload.email, payload.uri); + } + + public User updateFromPayload(UserPayload payload) { + if (payload.id != null) + setId(payload.id); + if (payload.userName != null) + userName = payload.userName; + if (payload.uri != null) + uri = payload.uri; + return this; } @Override diff --git a/src/main/java/fr/univnantes/webandcloud/api/core/UserPayload.java b/src/main/java/fr/univnantes/webandcloud/api/core/UserPayload.java new file mode 100644 index 0000000000000000000000000000000000000000..b5b61247ec8330ed8c6c763be7390868a0e204b1 --- /dev/null +++ b/src/main/java/fr/univnantes/webandcloud/api/core/UserPayload.java @@ -0,0 +1,31 @@ +package fr.univnantes.webandcloud.api.core; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + +import org.springframework.lang.NonNull; +import org.springframework.lang.Nullable; + +import io.swagger.v3.oas.annotations.media.Schema; + +@Schema(description = "User Payload") +public class UserPayload { + + @Schema(description = "Id of User", example = "johnDoe") + public final String id; + @Schema(description = "UserName of User", example = "DarkSasukeOf44") + public final String userName; + @Schema(description = "Email of User", example = "example@example.org") + public final String email; + @Schema(description = "Uri of image related to this User", example = "foo.org/someImage.png") + public final String uri; + + @JsonCreator + public UserPayload(@NonNull @JsonProperty("id") String id, @NonNull @JsonProperty("userName") String userName, + @NonNull @JsonProperty("email") String email, @Nullable @JsonProperty("uri") String uri) { + this.id = id; + this.userName = userName; + this.email = email; + this.uri = uri; + } +} diff --git a/src/main/java/fr/univnantes/webandcloud/api/services/oauth/OAuthUserDataService.java b/src/main/java/fr/univnantes/webandcloud/api/services/oauth/OAuthUserDataService.java index d7f86fe818ce08bbc633ccd4d0093878273c06c2..9d0f31548ad4ed661db8e7b8a4c620a67dfdd162 100644 --- a/src/main/java/fr/univnantes/webandcloud/api/services/oauth/OAuthUserDataService.java +++ b/src/main/java/fr/univnantes/webandcloud/api/services/oauth/OAuthUserDataService.java @@ -84,6 +84,6 @@ public class OAuthUserDataService { firstName = nameSplit[0]; } } - return new User(nickName, email, null); + return new User(null, nickName, email, null); } }