package assemblers;
import models.User;
import oauth2.AccessTokenGenerator;
import oauth2.Security;
import org.apache.commons.lang.StringUtils;
import utils.GsonFactory;
import DTO.UserDTO;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonObject;
/**
* Assembler for the UserDTO and related classes.
*
* @see UserDTO
* @see User
* @author Alex Jarvis axj7@aber.ac.uk
*/
public class UserAssembler {
/**
* Writes a UserDTO using a User object.
*
* Note - returns the UserDTO as if it is the unauthorised user.
* To return the UserDTO of the authorised user you have to use the
* accompanying method.
* @param user
* @return
*/
public static UserDTO writeDTO(User user) {
return writeDTO(user, false);
}
/**
* Writes a UserDTO for the specified User and if the authorisedUser
* flag is set then additional attributes are set:
* <ul>
* <li>accessToken,</li>
* <li>connections,</li>
* <li>connectionRequestsTo,</li>
* <li>connectionRequestsFrom,</li>
* <li>meetingsRelated</li>
* </ul>
* @param user
* @param authorisedUser
* @return
*/
public static UserDTO writeDTO(User user, boolean authorisedUser) {
UserDTO userDTO = new UserDTO();
userDTO.id = user.id;
userDTO.email = user.email;
userDTO.firstName = user.firstName;
userDTO.lastName = user.lastName;
userDTO.mobileNumber = user.mobileNumber;
if (authorisedUser) {
userDTO.accessToken = user.accessToken;
userDTO.connections = UserSummaryAssembler.writeDTOs(user);
userDTO.connectionRequestsTo = UserRequestSummaryAssembler.writeToDTOs(user);
userDTO.connectionRequestsFrom = UserRequestSummaryAssembler.writeFromDTOs(user);
userDTO.meetingsRelated = MeetingAssembler.writeDTOs(user);
}
return userDTO;
}
/**
* Creates a new User object with the attributes provided by a UserDTO.
* @param userDTO
* @return
*/
public static UserDTO createUser(UserDTO userDTO) {
User user = new User();
user.email = userDTO.email;
user.firstName = userDTO.firstName;
user.lastName = userDTO.lastName;
user.mobileNumber = userDTO.mobileNumber;
user.passwordHash = Security.sha256hexWithSalt(userDTO.password);
user.accessToken = AccessTokenGenerator.generate();
user.create();
return writeDTO(user, true);
}
/**
* Updates the User with the attributes provided by the UserDTO.
*
* @param userDTO
* @return
*/
public static UserDTO updateUser(UserDTO userDTO) {
User user = User.findById(userDTO.id);
if (StringUtils.isNotBlank(userDTO.email)) {
user.email = userDTO.email;
}
if (StringUtils.isNotBlank(userDTO.firstName)) {
user.firstName = userDTO.firstName;
}
if (StringUtils.isNotBlank(userDTO.lastName)) {
user.lastName = userDTO.lastName;
}
if (StringUtils.isNotBlank(userDTO.mobileNumber)) {
user.mobileNumber = userDTO.mobileNumber;
}
if (StringUtils.isNotBlank(userDTO.password)) {
user.passwordHash = Security.sha256hexWithSalt(userDTO.password);
}
user.save();
return writeDTO(user, true);
}
/**
* Creates a UserDTO from a JsonObject. Used when creating the UserDTO object
* from the body of a JSON request.
*
* @param jsonObject
* @return
*/
public static UserDTO userDTOWithJsonObject(JsonObject jsonObject) {
GsonBuilder gsonBuilder = GsonFactory.gsonBuilder();
UserDTO userDTO = gsonBuilder.create().fromJson(jsonObject, UserDTO.class);
return userDTO;
}
}