package persistency.exposed;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.NoResultException;
import javax.persistence.Query;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import auth.openidconnect.Utils;
import persistency.entities.LoggedUser;
import utils.Constants;
import utils.DBUtils;
public class LoggedUserExposed {
public EntityManager entityManager = null;
public LoggedUserExposed() {
entityManager = DBUtils.getEMF().createEntityManager();
}
public void createEntity(LoggedUser e) {
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
entityManager.persist(e);
transaction.commit();
}
public void deleteEntity(LoggedUser e) {
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
entityManager.remove(e);
transaction.commit();
}
public void updateEntity(LoggedUser e) {
EntityTransaction transaction = entityManager.getTransaction();
transaction.begin();
entityManager.merge(e);
transaction.commit();
}
public LoggedUser findPersonById(long id) {
Query namedQuery = entityManager.createNamedQuery("getPersonById");
namedQuery.setParameter("id", id);
LoggedUser result = null;
try {
result = (LoggedUser) namedQuery.getSingleResult();
} catch (NoResultException e) {
result = null;
}
return result;
}
public LoggedUser findPersonByAccessToken(String aToken) {
Query namedQuery = entityManager.createNamedQuery("getPersonByAccessToken");
namedQuery.setParameter("aToken", aToken);
LoggedUser result = null;
try {
result = (LoggedUser) namedQuery.getSingleResult();
} catch (NoResultException e) {
result = null;
}
return result;
}
public List<LoggedUser> getAllPersons() {
List<LoggedUser> result = new ArrayList<LoggedUser>();
try {
Query namedQuery = entityManager.createNamedQuery("getAllPersons");
result = (List<LoggedUser>) namedQuery.getResultList();
} catch (NoResultException e) {
result = new ArrayList<LoggedUser>();
} finally {
}
return result;
}
public LoggedUser getCurrentUser(HttpServletRequest request) {
LoggedUser user = getLoggedUser(request);
if(user != null){
return user;
}
return null;
}
private LoggedUser getLoggedUser(HttpServletRequest request) {
// user = getUser(request.getUserPrincipal());
Object attribute = request.getSession().getAttribute(Utils.ACCESS_TOKEN_SESSION_KEY);
if(attribute == null){
if(request.getHeader(Utils.ACCESS_TOKEN_SESSION_KEY) != null){
attribute = request.getHeader(Utils.ACCESS_TOKEN_SESSION_KEY);
}
if(attribute == null){
if(request.getHeader(Utils.ACCESS_TOKEN_SESSION_KEY.toLowerCase()) != null){
attribute = request.getHeader(Utils.ACCESS_TOKEN_SESSION_KEY.toLowerCase());
}
}
}
if(attribute == null){
return null;
}
return findPersonByAccessToken(attribute.toString());
}
public LoggedUser findPersonByOpenId(String openId) {
Query namedQuery = entityManager.createNamedQuery("getPersonByOpenId");
namedQuery.setParameter("openId", openId);
LoggedUser result = null;
try {
result = (LoggedUser) namedQuery.getSingleResult();
} catch (NoResultException e) {
result = null;
}
return result;
}
public String assebleOpenId(String id, String provider){
return id+"@"+provider;
}
public LoggedUser createNewUser(String application, UserInfoJson userInfo) {
LoggedUser lu = new LoggedUser();
if(userInfo.getEmail() == null){
throw new IllegalArgumentException("failed to find email");
}
String openId = assebleOpenId(userInfo.getEmail(), application);
//Some IDP require additional request to get the email, so we have to absolutely sure that the person is not registered
LoggedUser findPersonByOpenId = findPersonByOpenId(openId);
if(findPersonByOpenId != null){
findPersonByOpenId.setAccessToken(userInfo.getAccessToken());
findPersonByOpenId.setSecretAccess(userInfo.getSecretAccessToken());
if(userInfo != null && userInfo.getEmail() != null){
lu.setEmail(userInfo.getEmail());
}
return findPersonByOpenId;
}
lu.setOpenId(openId);
if(userInfo != null){
lu.setName(userInfo.getName());
if(userInfo.getEmail() != null){
lu.setEmail(userInfo.getEmail());
}
lu.setAccessToken(userInfo.getAccessToken());
lu.setSecretAccess(userInfo.getSecretAccessToken());
}
createEntity(lu);
return lu;
}
public class LinkedInUserInfoJson {
private String firstName;
private String lastName;
private String headline;
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public String getHeadline() {
return headline;
}
}
public class FacebookUserInfoJson {
private String name;
private String email;
private String firstName;
private String lastName;
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public String getName() {
return name;
}
public String getEmail() {
return email;
}
}
}