spring-boot-realworld-examp.../src/main/java/io/spring/graphql/UserMutation.java
2021-03-23 17:15:49 +08:00

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();
}
}