package de.asideas.crowdsource.security;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import de.asideas.crowdsource.domain.model.UserEntity;
import de.asideas.crowdsource.repository.UserRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ClassPathResource;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.List;
/**
* Service whichs solely purpose is to create default users.
*/
@Component
public class DefaultUsersService {
private static final Logger LOG = LoggerFactory.getLogger(DefaultUsersService.class);
@Value("${de.asideas.crowdsource.createusers.fixtures.path}")
private ClassPathResource defaultUserFixtures;
@Autowired
private UserRepository userRepository;
@Autowired
private PasswordEncoder passwordEncoder;
@Autowired
private ObjectMapper objectMapper;
public void loadDefaultUsers() {
if (!defaultUserFixtures.exists() || !defaultUserFixtures.isReadable()) {
LOG.warn("Fixtures file at {} does not exists or is not accessible. Skipping creation of default users.", defaultUserFixtures.getPath());
return;
}
try {
List<UserEntity> users = objectMapper.readValue(defaultUserFixtures.getInputStream(), new TypeReference<List<UserEntity>>() {
});
users.stream().forEach(this::createUser);
LOG.info("Finished creating or updating {} users without errors.", users.size());
} catch (IOException e) {
LOG.error("IO Exception occured while parsing fixtures file from classpath location {}", defaultUserFixtures.getPath(), e);
throw new IllegalStateException(e);
}
}
private void createUser(UserEntity inputUser) {
LOG.info("Creating or updating user: {}", inputUser);
// default user
UserEntity user = userRepository.findByEmail(inputUser.getEmail());
if (user == null) {
user = inputUser;
}
user.setPassword(passwordEncoder.encode(inputUser.getPassword()));
user.setActivated(inputUser.isActivated());
user.setRoles(inputUser.getRoles());
userRepository.save(user);
}
}