/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package es.upm.fiware.rss.oauth.service;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ArrayNode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.pac4j.oauth.profile.JsonHelper;
import org.springframework.stereotype.Service;
import es.upm.fiware.rss.dao.DbeAggregatorDao;
import es.upm.fiware.rss.dao.RoleDao;
import es.upm.fiware.rss.dao.UserDao;
import es.upm.fiware.rss.model.RSUser;
import es.upm.fiware.rss.oauth.model.Role;
/**
*
* @author fdelavega
*/
@Service
@Transactional
public class AuthUserManager {
@Autowired
private UserDao userDao;
@Autowired
private RoleDao roleDao;
@Autowired
private DbeAggregatorDao aggregatorDao;
/**
* Update Database users accordint to the provided FIWAREOProfile
* @param profile, FIWAREProfile of the user
*/
public void updateUser(FIWAREProfile profile) {
RSUser user;
// Get basic user info
String username = (String) profile.getUsername();
String email = (String) profile.getEmail();
String displayName = (String) profile.getDisplayName();
// Modify the existing user
user = userDao.getById(username);
// Check if th user do not have any role and not exists, return
if (!profile.getRSRoles().isEmpty()) {
if (user == null) {
// Create a new user
user = new RSUser();
}
// Set field values
user.setId(username);
user.setDisplayName(displayName);
user.setEmail(email);
// The user must exists before creating roles in the database
userDao.createOrUpdate(user);
this.populateUserRoles(user, profile);
// Save user roles to the database
userDao.createOrUpdate(user);
} else if (user != null) {
userDao.delete(user);
}
}
/**
* Builds a list of Revenue Sharing roles according to the roles retrieved
* from the idm and the email of the user
* @param rolesNode, A JSON array containing the roles provided by the idm
* @param email, Email of the user
* @return List of revenue sharing roles
*/
public List<Role> buildUserRoles(ArrayNode rolesNode, String email) {
List<Role> userRoles = new ArrayList<>();
// Include idm defined roles
for (JsonNode node : rolesNode) {
Role r = new Role();
String role = (String) JsonHelper.get(node, "name");
r.setId((String) JsonHelper.get(node, "id"));
r.setName(role.toLowerCase());
userRoles.add(r);
}
// Check aggregator role
if (this.aggregatorDao.getById(email) != null) {
Role ag = new Role();
ag.setId("0");
ag.setName("aggregator");
userRoles.add(ag);
}
return userRoles;
}
private void populateUserRoles(RSUser user, FIWAREProfile profile) {
Set<es.upm.fiware.rss.model.Role> exRoles = user.getRoles();
if (exRoles == null) {
exRoles = new HashSet<>();
}
// Create new roles if needed
for (Role r: profile.getRSRoles()) {
// Check if the role already exists
es.upm.fiware.rss.model.Role dbRole = this.roleDao.getById(r.getId());
if (dbRole == null) {
dbRole = new es.upm.fiware.rss.model.Role();
dbRole.setId(r.getId());
}
// Add role name
dbRole.setName(r.getName());
// Add user to the role
Set<RSUser> users = dbRole.getUsers();
if (users == null) {
users = new HashSet<>();
}
users.add(user);
dbRole.setUsers(users);
this.roleDao.createOrUpdate(dbRole);
exRoles.add(dbRole);
}
user.setRoles(exRoles);
}
}