Summary Table

Categories Total Count
PII 0
URL 0
DNS 0
EKL 0
IP 0
PORT 0
VsID 0
CF 0
AI 0
VPD 0
PL 0
Other 0

File Content

/*
* UserServiceImpl.java
* Copyright (c) 2017 Veterans Affairs.
*/
package gov.va.oneconsult.seoc.api.service.impl;

import java.util.Date;
import java.util.Set;

import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import gov.va.oneconsult.seoc.api.exceptions.BusinessException;
import gov.va.oneconsult.seoc.api.exceptions.SeocConstraintViolationException;
import gov.va.oneconsult.seoc.api.json.CreateUserRequest;
import gov.va.oneconsult.seoc.api.json.SeocGenericResponse;
import gov.va.oneconsult.seoc.api.model.User;
import gov.va.oneconsult.seoc.api.repository.UserRepository;
import gov.va.oneconsult.seoc.api.service.UserService;
import gov.va.oneconsult.seoc.api.util.ApiUtil;
import gov.va.oneconsult.seoc.api.util.Constants;
import gov.va.oneconsult.seoc.api.util.EncodeLoggerFactory;

/**
* Implementation of {@link UserService} methods
* @author AbleVets
*
*/
@Component
public class UserServiceImpl implements UserService{

@Autowired
public UserRepository userRepository;

private static int seqNum =0;

public static final Logger logger = EncodeLoggerFactory.getLogger(UserServiceImpl.class);

/**
* Description: Save User
* @param user
* @return
*/
private User save(User user)
{
if(user==null) {
return user;
}
User savedUser = userRepository.save(user);
return savedUser;
}

/**
* {@inheritDoc}
*/
public User getUserByVaNetworkId(String vaNetworkId)
{
if(vaNetworkId==null || vaNetworkId.isEmpty()) {
return null;
}
User user = userRepository.findByVaNetworkId(Constants.DOMAIN_SEPARATOR+ vaNetworkId);

if(user==null) {
return null;
}

return user;

}

/**
* Description: Checks for Duplicate User, called before creating new or updating a User
* For existing User check is skipped on the same user object in the database
* @param user
* @throws BusinessException
*/
private void checkDuplicateUser(User user) throws BusinessException
{
if(user==null) {
return ;
}

Set<User> activeUsers = getActiveUsers();
boolean foundDuplicate = false;

if(activeUsers!=null && !activeUsers.isEmpty()) {
for(User activeUser : activeUsers) {
if(user.getId()>0 && user.getId()==activeUser.getId()) {
//skip check of duplicate on same user
continue;
}
//Split vaUserId to domain and vaNetworkId
activeUser.splitDomainAndNetworkId();
//Check if this active user matches with the User data being updated
if(activeUser.getVaNetworkId().equalsIgnoreCase(user.getVaNetworkId())
|| activeUser.getUserName().equalsIgnoreCase(user.getUserName()))
{
foundDuplicate = true;
}
}
}

if(foundDuplicate) {
throw new BusinessException("Another user exists with same UserName or VaNetworkId.");
}
}

/**
* {@inheritDoc}
*/
@Override
public String getRoleByVaUserId(String vaUserId)
{
User user = userRepository.findByVaUserId(vaUserId);
if(user!=null) {
return user.getRole();
}
return null;
}

/**
* {@inheritDoc}
*/
@Override
public Set<User> getActiveUsers()
{
Set<User> activeUsers = userRepository.findActiveUsers();
if(activeUsers==null || activeUsers.isEmpty()) {
return null;
}

seqNum=0;
activeUsers.forEach(user -> user.setSequenceId(++seqNum));

return activeUsers;
}

/**
* {@inheritDoc}
*/
@Override
public SeocGenericResponse saveUser(CreateUserRequest userReq)
{
SeocGenericResponse genericResponse = new SeocGenericResponse();
Date today = ApiUtil.today_UTC();
boolean newUser = true;

if(userReq==null) {
genericResponse.setStatus(Constants.FAILURE);
genericResponse.setMessage("Request object missing");
return genericResponse;
}

User user = null;
//PrevNetworkId indicates updating existing User
if (userReq.getPrevNetworkId() != null && !userReq.getPrevNetworkId().isEmpty())
{
user = getUserByVaNetworkId(userReq.getPrevNetworkId());
//Did not find the user to update
if(user==null) {
genericResponse.setStatus(Constants.FAILURE);
genericResponse.setMessage("User not found for the requested vaNetworkId");
return genericResponse;
}
//Found existing user to update
user.setModifiedDate(today);
newUser= false;
}else {
//Creating new user
user = new User();
user.setCreateDate(today);
}

user.setRole(userReq.getRole());
user.setUserName(userReq.getUserName());
user.setDomain(userReq.getDomain());
user.setVaNetworkId(userReq.getVaNetworkId());
user.setVaUserId(user.appendDomainToNetworkId());

//Validations on domain, vaNetworkId, username and role
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
Validator validator = factory.getValidator();

Set<ConstraintViolation<User>> constraintViolations = validator.validate(user);

if(constraintViolations.size()>0) {
throw new SeocConstraintViolationException("Constraint violations in user data.", constraintViolations);
}

//Find if there is a duplicate user
checkDuplicateUser(user);

//Save User
User savedUser = save(user);

//Successfully Saved
if(savedUser!=null)
{
logger.info("Successfully saved/updated user with vaUserId " + savedUser.getVaUserId());
genericResponse.setMessage("Successfully saved User data");
if(newUser) {
genericResponse.setStatus(Constants.CREATED);
}else {
genericResponse.setStatus(Constants.UPDATED);
}
}else
{
genericResponse.setStatus(Constants.FAILURE);
genericResponse.setMessage("User not saved successfully");
return genericResponse;
}

return genericResponse;
}

/**
* {@inheritDoc}
*/
@Override
public SeocGenericResponse deleteUser(String networkId)
{
SeocGenericResponse response = new SeocGenericResponse();

if(networkId== null || networkId.isEmpty()) {
response.setStatus(Constants.FAILURE);
return response;
}

User user = getUserByVaNetworkId(networkId);

if(user==null) {
response.setStatus(Constants.FAILURE);
response.setAction(Constants.NOTFOUND);
return response;
}
//Split vaUserId and set domain and vaNetworkId fields. Save will run validations on these transient fields
//Preparing User object not to fail these validations.
user.splitDomainAndNetworkId();

user.setDeactivatedDate(ApiUtil.today_UTC());
//Calling save to set the deactivate field and user will be considered as deleted after setting deactivate field.
User deletedUser = save(user);
if(deletedUser!=null && deletedUser.getDeactivatedDate()!=null) {
response.setStatus(Constants.SUCCESS);
response.setAction(Constants.DELETE);
}else {
response.setStatus(Constants.FAILURE);
}

return response;
}

}