diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/repository/MongoTagRepository.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/repository/MongoTagRepository.java index 268560610..983923c50 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/repository/MongoTagRepository.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/repository/MongoTagRepository.java @@ -15,4 +15,6 @@ public interface MongoTagRepository extends ResourceRepository List findAllByTagElementId(String id); + List findAllByTagElementIdIsNull(); + } diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tags/controllers/TagNotificationController.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tags/controllers/TagNotificationController.java index b9019325a..15fb8d15f 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tags/controllers/TagNotificationController.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tags/controllers/TagNotificationController.java @@ -4,20 +4,23 @@ import org.integratedmodelling.klab.api.API; import org.integratedmodelling.klab.hub.tags.dto.TagNotification; +import org.integratedmodelling.klab.hub.tags.enums.ITagElementEnum; +import org.integratedmodelling.klab.hub.tags.payload.TagRequest; import org.integratedmodelling.klab.hub.tags.services.TagNotificationService; import org.integratedmodelling.klab.hub.users.dto.User; import org.integratedmodelling.klab.hub.users.services.UserProfileService; +import org.integratedmodelling.klab.rest.HubNotificationMessage; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import net.minidev.json.JSONObject; - @RestController public class TagNotificationController { @@ -39,7 +42,28 @@ public class TagNotificationController { List tagNotifications = tagNotificationService.getUserTagNotifications(user); return ResponseEntity.status(HttpStatus.OK).body(tagNotifications); } catch (Exception e) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage()); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage()); + } + } + + /** + * Create tag notification + * @param username + * @param TagRequest + * @return + */ + @PostMapping(value = API.HUB.TAG_NOTIFICATIONS, produces = "application/json") + public ResponseEntity< ? > createUserTagNotification(@RequestBody TagRequest tagRequest) { + try { + + TagNotification tagNotification = tagNotificationService.createTagNotification( + ITagElementEnum.valueOf(tagRequest.getiTagElement()), tagRequest.getiTagElementId(), + HubNotificationMessage.Type.valueOf(tagRequest.getType()), Boolean.valueOf(tagRequest.getVisible()), + tagRequest.getName(), tagRequest.getTitle(), tagRequest.getMessage()); + + return ResponseEntity.status(HttpStatus.OK).body(tagNotification); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage()); } } @@ -50,13 +74,13 @@ public class TagNotificationController { */ @DeleteMapping(value = API.HUB.TAG_NOTIFICATION_ID) public ResponseEntity< ? > deletetagNotification(@PathVariable("id") String id) { - JSONObject resp = new JSONObject(); + try { TagNotification tagNotification = tagNotificationService.deleteTagNotification(id); return ResponseEntity.status(HttpStatus.OK).body(tagNotification); } catch (Exception e) { // resp.appendField("Message", String.format("Role %s is not valid", role)); - return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(e.getMessage()); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(e.getMessage()); } } diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tags/dto/ITagElement.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tags/dto/ITagElement.java index 1c4140dae..9e9fb83f3 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tags/dto/ITagElement.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tags/dto/ITagElement.java @@ -4,6 +4,7 @@ /** * Objects that implementing this interface can use Tags + * The tags can be for users, groups... This interface allow all this classes to be in the MongoTag class * * @author kristina * diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tags/enums/ITagElementEnum.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tags/enums/ITagElementEnum.java new file mode 100644 index 000000000..a15e161d7 --- /dev/null +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tags/enums/ITagElementEnum.java @@ -0,0 +1,12 @@ +package org.integratedmodelling.klab.hub.tags.enums; + +/** + * Use for determinate entity of MongoTag, if is NULL is generic + * + * @author kristina + * + */ +public enum ITagElementEnum { + USER, GROUP; + +} diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tags/payload/TagRequest.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tags/payload/TagRequest.java new file mode 100644 index 000000000..98a66c95f --- /dev/null +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tags/payload/TagRequest.java @@ -0,0 +1,63 @@ +package org.integratedmodelling.klab.hub.tags.payload; + +public class TagRequest { + + private String id; + private String type; + private String iTagElement; + private String iTagElementId; + private String name; + private String title; + private String message; + private String visible; + + public String getId() { + return id; + } + public void setId(String id) { + this.id = id; + } + public String getType() { + return type; + } + public void setType(String type) { + this.type = type; + } + public String getiTagElement() { + return iTagElement; + } + public void setiTagElement(String iTagElement) { + this.iTagElement = iTagElement; + } + public String getiTagElementId() { + return iTagElementId; + } + public void setiTagElementId(String iTagElementId) { + this.iTagElementId = iTagElementId; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getTitle() { + return title; + } + public void setTitle(String title) { + this.title = title; + } + public String getMessage() { + return message; + } + public void setMessage(String message) { + this.message = message; + } + public String getVisible() { + return visible; + } + public void setVisible(String visible) { + this.visible = visible; + } + +} diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tags/services/TagNotificationService.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tags/services/TagNotificationService.java index 913214c91..2540691e7 100644 --- a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tags/services/TagNotificationService.java +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/tags/services/TagNotificationService.java @@ -9,8 +9,11 @@ import org.integratedmodelling.klab.hub.tags.dto.ITagElement; import org.integratedmodelling.klab.hub.tags.dto.MongoTag; import org.integratedmodelling.klab.hub.tags.dto.TagNotification; +import org.integratedmodelling.klab.hub.tags.enums.ITagElementEnum; import org.integratedmodelling.klab.hub.tags.enums.TagNameEnum; import org.integratedmodelling.klab.hub.users.dto.User; +import org.integratedmodelling.klab.hub.users.services.UserService; +import org.integratedmodelling.klab.rest.HubNotificationMessage; import org.integratedmodelling.klab.rest.HubNotificationMessage.Type; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -32,10 +35,73 @@ public class TagNotificationService { @Autowired private MongoTagRepository mongoTagRepository; + @Autowired + private UserService userService; + + /** + * Create TagNotification + * + * @param iTagElementEnum {@link ITagElementEnum} Element for which the notification is. + * @param id Id of element, empty if iTagElementEnum is ALL + * @param tagNotifactionType {@link HubNotificationMessage.Type} Type of notification + * @param visible Visible or not + * @param tagName To use with frontend predefined titles and messages use {@link TagNameEnum} otherwise free string + * @param title Title of notification if tagName is not a {@link TagNameEnum} + * @param message Message of notification if tagName is not a {@link TagNameEnum} + * @return + */ + public TagNotification createTagNotification(ITagElementEnum iTagElementEnum, String id, + HubNotificationMessage.Type tagNotifactionType, Boolean visible, String tagName, String title, String message) { + + /* Create Mongo Tag */ + MongoTag tag = new MongoTag(); + + tag.setName(tagName); + tag.setVisible(visible); + + setITagElementById(tag, iTagElementEnum, id); + + tag = mongoTagRepository.save(tag); + + /* Create TagNotification */ + TagNotification tagNotification = new TagNotification(); + + tagNotification.setTag(tag); + tagNotification.setType(tagNotifactionType); + + tagNotification.setTitle(title); + tagNotification.setMessage(message); + + try { + tagNotificationRepository.save(tagNotification); + } catch (Exception e) { + throw new KlabException("Error saving tag notification.", e); + } + + return tagNotification; + + } + + private void setITagElementById(MongoTag tag, ITagElementEnum iTagElementEnum, String id) { + if (id.isEmpty() || iTagElementEnum == null) { + return; + } + + tag.setTagElementId(!id.isEmpty() ? id : null); + switch(iTagElementEnum) { + case USER: + tag.setITagElement(userService.getUserById(id)); + break; + case GROUP: + break; + } + + } + public TagNotification createWarningUserTagNotification(User user, String tagName, Boolean visible, String title, String message) { MongoTag tag = new MongoTag(); - tag.setTagElementId(user.getId()); + tag.setTagElementId(user.getId().isEmpty() ? null : user.getId()); tag.setITagElement(user); tag.setName(tagName); tag.setVisible(visible); @@ -65,6 +131,7 @@ public List getUserTagNotifications(ITagElement iTagElement) { List listMongoTags = null; try { listMongoTags = mongoTagRepository.findAllByTagElementId(iTagElement.getId()); + listMongoTags.addAll(mongoTagRepository.findAllByTagElementIdIsNull()); listTagNotifications = tagNotificationRepository.findAllByTagIn(listMongoTags); } catch (Exception e) { logger.error(e.getMessage()); diff --git a/klab.hub/src/main/java/org/integratedmodelling/klab/hub/users/services/UserService.java b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/users/services/UserService.java new file mode 100644 index 000000000..3d13b80f7 --- /dev/null +++ b/klab.hub/src/main/java/org/integratedmodelling/klab/hub/users/services/UserService.java @@ -0,0 +1,26 @@ +package org.integratedmodelling.klab.hub.users.services; + +import org.integratedmodelling.klab.hub.repository.UserRepository; +import org.integratedmodelling.klab.hub.tags.dto.ITagElement; +import org.integratedmodelling.klab.hub.users.dto.User; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +@Service +public class UserService { + + @Autowired + private UserRepository userRepository; + + public User getUserByUsername(String username) throws UsernameNotFoundException { + + return userRepository.findByNameIgnoreCase(username).get(); + + } + + public ITagElement getUserById(String id) { + return userRepository.findById(id).get(); + } + +}