From 2e20aeb9842a543ee6d520ce10be44e4de998aed Mon Sep 17 00:00:00 2001 From: "konstantina.galouni" Date: Thu, 21 Dec 2023 14:45:11 +0200 Subject: [PATCH] [master | DONE | Added] New user profile table in DB to save if user has consent in actions logging or not. 1. UserProfile.java: Define class UserProfile with fields String id, private String aaiId, private Boolean consent = false. 2. UserProfileDAO.java & MongoDBUserProfileDAO.java: Added DAO methods for getting/ saving/ deleting user profiles on DB. 3. UserProfileController.java: Added API endpoints GET /user and POST /user/save for authenticated users. 4. IrishMongoConnection.java: Open a new connection to DB with mongoTemplateRef = "mongoIrishTemplate". --- .../mongo/IrishMongoConnection.java | 45 +++++++++++++ .../controllers/UserProfileController.java | 66 +++++++++++++++++++ .../dao/MongoDBUserProfileDAO.java | 20 ++++++ .../dao/UserProfileDAO.java | 19 ++++++ .../entities/UserProfile.java | 41 ++++++++++++ 5 files changed, 191 insertions(+) create mode 100644 src/main/java/eu/dnetlib/irishmonitorservice/configuration/mongo/IrishMongoConnection.java create mode 100644 src/main/java/eu/dnetlib/irishmonitorservice/controllers/UserProfileController.java create mode 100644 src/main/java/eu/dnetlib/irishmonitorservice/dao/MongoDBUserProfileDAO.java create mode 100644 src/main/java/eu/dnetlib/irishmonitorservice/dao/UserProfileDAO.java create mode 100644 src/main/java/eu/dnetlib/irishmonitorservice/entities/UserProfile.java diff --git a/src/main/java/eu/dnetlib/irishmonitorservice/configuration/mongo/IrishMongoConnection.java b/src/main/java/eu/dnetlib/irishmonitorservice/configuration/mongo/IrishMongoConnection.java new file mode 100644 index 0000000..4a85008 --- /dev/null +++ b/src/main/java/eu/dnetlib/irishmonitorservice/configuration/mongo/IrishMongoConnection.java @@ -0,0 +1,45 @@ +package eu.dnetlib.irishmonitorservice.configuration.mongo; + +import com.mongodb.MongoClient; +import com.mongodb.MongoCredential; +import com.mongodb.ServerAddress; +import eu.dnetlib.uoamonitorservice.configuration.properties.MongoConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.mongodb.MongoDbFactory; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.SimpleMongoDbFactory; +import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; + +import java.util.Collections; + +@Configuration +@EnableMongoRepositories(basePackages = {"eu.dnetlib.irishmonitorservice.dao"}, mongoTemplateRef = "mongoIrishTemplate") +public class IrishMongoConnection { + + @Autowired + private MongoConfig mongoConfig; + + @Bean + public MongoDbFactory mongoDbFactory() { + return new SimpleMongoDbFactory(getMongoClient(), mongoConfig.getDatabase()); + } + + @Bean(name = "mongoIrishTemplate") + public MongoTemplate getMongoTemplate() { + return new MongoTemplate(mongoDbFactory()); + } + + private MongoClient getMongoClient() { + if(mongoConfig.getUsername() != null && mongoConfig.getPassword() != null){ + return new MongoClient(Collections.singletonList( + new ServerAddress(mongoConfig.getHost(), mongoConfig.getPort())), + Collections.singletonList(MongoCredential.createCredential(mongoConfig.getUsername(), mongoConfig.getDatabase(), mongoConfig.getPassword().toCharArray()))); + } else { + return new MongoClient(Collections.singletonList(new ServerAddress(mongoConfig.getHost(), mongoConfig.getPort()))); + } + } + + +} diff --git a/src/main/java/eu/dnetlib/irishmonitorservice/controllers/UserProfileController.java b/src/main/java/eu/dnetlib/irishmonitorservice/controllers/UserProfileController.java new file mode 100644 index 0000000..76c42f2 --- /dev/null +++ b/src/main/java/eu/dnetlib/irishmonitorservice/controllers/UserProfileController.java @@ -0,0 +1,66 @@ +package eu.dnetlib.irishmonitorservice.controllers; + +import eu.dnetlib.irishmonitorservice.dao.UserProfileDAO; +import eu.dnetlib.irishmonitorservice.entities.UserProfile; +import eu.dnetlib.uoaadmintoolslibrary.handlers.ContentNotFoundException; +import eu.dnetlib.uoaadmintoolslibrary.handlers.ForbiddenException; +import eu.dnetlib.uoaadmintoolslibrary.handlers.utils.RolesUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +@RestController +@CrossOrigin(origins = "*") +@RequestMapping("/user") +@PreAuthorize("isAuthenticated()") +public class UserProfileController { + private final Logger log = LogManager.getLogger(this.getClass()); + + @Autowired + private RolesUtils rolesUtils; + + @Autowired + private UserProfileDAO userDAO; + + @RequestMapping(value = "/save", method = RequestMethod.POST) + public UserProfile saveUserProfile(@RequestBody UserProfile userProfile) { + String aaiId = rolesUtils.getAaiId(); + UserProfile existingUserProfile = userDAO.findByAaiId(aaiId); + if(existingUserProfile != null) { + userProfile.setId(existingUserProfile.getId()); + } + userProfile.setAaiId(aaiId); // users can only save/ update their own profiles + return userDAO.save(userProfile); + } + +// @RequestMapping(value = "/delete/{aaiId}", method = RequestMethod.DELETE) +// public Boolean deleteUserProfileByAaiId(@PathVariable("aaiId") String aaiId) { +// // maybe portal admin could delete any user profile? +// +// String currentAaiId = rolesUtils.getAaiId(); +// if(aaiId != null && currentAaiId.equals(aaiId)) { +// throw new ForbiddenException("User with id: "+currentAaiId + " has not access to update user with id: "+aaiId); +// } +// UserProfile user = userDAO.findByAaiId(aaiId); +// if(user == null) { +// // EXCEPTION - Entity Not Found +// throw new ContentNotFoundException("Delete user profile: No user profile found for : " + aaiId); +// } else { +// userDAO.delete(user.getId()); +// } +// return true; +// } + + @RequestMapping(value = "", method = RequestMethod.GET) + public UserProfile getUserProfile() { + String aaiId = rolesUtils.getAaiId(); + UserProfile user = userDAO.findByAaiId(aaiId); + if(user == null) { + // EXCEPTION - Entity Not Found + throw new ContentNotFoundException("No user profile found for: " + aaiId); + } + return user; + } +} diff --git a/src/main/java/eu/dnetlib/irishmonitorservice/dao/MongoDBUserProfileDAO.java b/src/main/java/eu/dnetlib/irishmonitorservice/dao/MongoDBUserProfileDAO.java new file mode 100644 index 0000000..8ee3335 --- /dev/null +++ b/src/main/java/eu/dnetlib/irishmonitorservice/dao/MongoDBUserProfileDAO.java @@ -0,0 +1,20 @@ +package eu.dnetlib.irishmonitorservice.dao; + +import eu.dnetlib.irishmonitorservice.entities.UserProfile; +import org.springframework.data.mongodb.repository.MongoRepository; + +import java.util.List; + +public interface MongoDBUserProfileDAO extends UserProfileDAO, MongoRepository { + List findAll(); + + UserProfile findById(String Id); + + UserProfile findByAaiId(String aaiId); + + UserProfile save(UserProfile user); + + void deleteAll(); + + void delete(String id); +} diff --git a/src/main/java/eu/dnetlib/irishmonitorservice/dao/UserProfileDAO.java b/src/main/java/eu/dnetlib/irishmonitorservice/dao/UserProfileDAO.java new file mode 100644 index 0000000..44e7c51 --- /dev/null +++ b/src/main/java/eu/dnetlib/irishmonitorservice/dao/UserProfileDAO.java @@ -0,0 +1,19 @@ +package eu.dnetlib.irishmonitorservice.dao; + +import eu.dnetlib.irishmonitorservice.entities.UserProfile; + +import java.util.List; + +public interface UserProfileDAO { + List findAll(); + + UserProfile findById(String Id); + + UserProfile findByAaiId(String aaiId); + + UserProfile save(UserProfile user); + + void deleteAll(); + + void delete(String id); +} diff --git a/src/main/java/eu/dnetlib/irishmonitorservice/entities/UserProfile.java b/src/main/java/eu/dnetlib/irishmonitorservice/entities/UserProfile.java new file mode 100644 index 0000000..a1d42da --- /dev/null +++ b/src/main/java/eu/dnetlib/irishmonitorservice/entities/UserProfile.java @@ -0,0 +1,41 @@ +package eu.dnetlib.irishmonitorservice.entities; + +import com.fasterxml.jackson.annotation.JsonProperty; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.index.Indexed; + +public class UserProfile { + @Id + @JsonProperty("_id") + private String id; + + @Indexed(unique = true) + private String aaiId; + private Boolean consent = false; + + public UserProfile() {} + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getAaiId() { + return aaiId; + } + + public void setAaiId(String aaiId) { + this.aaiId = aaiId; + } + + public Boolean getConsent() { + return consent; + } + + public void setConsent(Boolean consent) { + this.consent = consent; + } +}