91 lines
3.6 KiB
Java
91 lines
3.6 KiB
Java
package io.spring.graphql;
|
|
|
|
import com.netflix.graphql.dgs.DgsComponent;
|
|
import com.netflix.graphql.dgs.DgsData;
|
|
import com.netflix.graphql.dgs.InputArgument;
|
|
import graphql.execution.DataFetcherResult;
|
|
import io.spring.api.exception.InvalidAuthenticationException;
|
|
import io.spring.application.user.RegisterParam;
|
|
import io.spring.application.user.UpdateUserCommand;
|
|
import io.spring.application.user.UpdateUserParam;
|
|
import io.spring.application.user.UserService;
|
|
import io.spring.core.user.EncryptService;
|
|
import io.spring.core.user.User;
|
|
import io.spring.core.user.UserRepository;
|
|
import io.spring.graphql.DgsConstants.MUTATION;
|
|
import io.spring.graphql.types.CreateUserInput;
|
|
import io.spring.graphql.types.UpdateUserInput;
|
|
import io.spring.graphql.types.UserPayload;
|
|
import java.util.Optional;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.security.authentication.AnonymousAuthenticationToken;
|
|
import org.springframework.security.core.Authentication;
|
|
import org.springframework.security.core.context.SecurityContextHolder;
|
|
|
|
@DgsComponent
|
|
public class UserMutation {
|
|
|
|
private UserRepository userRepository;
|
|
private EncryptService encryptService;
|
|
private UserService userService;
|
|
|
|
@Autowired
|
|
public UserMutation(
|
|
UserRepository userRepository, EncryptService encryptService, UserService userService) {
|
|
this.userRepository = userRepository;
|
|
this.encryptService = encryptService;
|
|
this.userService = userService;
|
|
}
|
|
|
|
@DgsData(parentType = MUTATION.TYPE_NAME, field = MUTATION.CreateUser)
|
|
public DataFetcherResult<UserPayload> createUser(@InputArgument("input") CreateUserInput input) {
|
|
RegisterParam registerParam =
|
|
new RegisterParam(input.getEmail(), input.getUsername(), input.getPassword());
|
|
User user = userService.createUser(registerParam);
|
|
|
|
return DataFetcherResult.<UserPayload>newResult()
|
|
.data(UserPayload.newBuilder().build())
|
|
.localContext(user)
|
|
.build();
|
|
}
|
|
|
|
@DgsData(parentType = MUTATION.TYPE_NAME, field = MUTATION.Login)
|
|
public DataFetcherResult<UserPayload> login(
|
|
@InputArgument("password") String password, @InputArgument("email") String email) {
|
|
Optional<User> optional = userRepository.findByEmail(email);
|
|
if (optional.isPresent() && encryptService.check(password, optional.get().getPassword())) {
|
|
return DataFetcherResult.<UserPayload>newResult()
|
|
.data(UserPayload.newBuilder().build())
|
|
.localContext(optional.get())
|
|
.build();
|
|
} else {
|
|
throw new InvalidAuthenticationException();
|
|
}
|
|
}
|
|
|
|
@DgsData(parentType = MUTATION.TYPE_NAME, field = MUTATION.UpdateUser)
|
|
public DataFetcherResult<UserPayload> updateUser(
|
|
@InputArgument("changes") UpdateUserInput updateUserInput) {
|
|
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
|
|
if (authentication instanceof AnonymousAuthenticationToken
|
|
|| authentication.getPrincipal() == null) {
|
|
return null;
|
|
}
|
|
io.spring.core.user.User currentUser = (io.spring.core.user.User) authentication.getPrincipal();
|
|
UpdateUserParam param =
|
|
UpdateUserParam.builder()
|
|
.username(updateUserInput.getUsername())
|
|
.email(updateUserInput.getEmail())
|
|
.bio(updateUserInput.getBio())
|
|
.password(updateUserInput.getPassword())
|
|
.image(updateUserInput.getImage())
|
|
.build();
|
|
|
|
userService.updateUser(new UpdateUserCommand(currentUser, param));
|
|
return DataFetcherResult.<UserPayload>newResult()
|
|
.data(UserPayload.newBuilder().build())
|
|
.localContext(currentUser)
|
|
.build();
|
|
}
|
|
}
|