From 03e7120d51c14c246b1a275c9357adf7174fda04 Mon Sep 17 00:00:00 2001 From: Pooja Kulkarni Date: Thu, 26 Aug 2021 15:59:43 -0700 Subject: [PATCH 001/171] [story/Q20-11] completed edit collections implementation, added unit tests --- .../core/data/CollectionRepository.java | 3 + .../core/service/CollectionManager.java | 4 + .../service/impl/CollectionManagerImpl.java | 42 +++- .../quadriga/web/AddCollectionController.java | 1 + .../web/EditCollectionController.java | 101 +++++++++ .../quadriga/web/forms/CollectionForm.java | 10 + .../WEB-INF/views/auth/editCollection.html | 27 +++ .../WEB-INF/views/auth/showcollection.html | 8 +- .../webapp/WEB-INF/views/layouts/main.html | 4 +- .../quadriga/core/literals/TestLiterals.java | 18 ++ .../impl/CollectionManagerImplTest.java | 212 +++++++++++++++++- .../web/EditCollectionControllerTest.java | 165 ++++++++++++++ 12 files changed, 589 insertions(+), 6 deletions(-) create mode 100644 quadriga/src/main/java/edu/asu/diging/quadriga/web/EditCollectionController.java create mode 100644 quadriga/src/main/webapp/WEB-INF/views/auth/editCollection.html create mode 100644 quadriga/src/test/java/edu/asu/diging/quadriga/core/literals/TestLiterals.java create mode 100644 quadriga/src/test/java/edu/asu/diging/quadriga/web/EditCollectionControllerTest.java diff --git a/quadriga/src/main/java/edu/asu/diging/quadriga/core/data/CollectionRepository.java b/quadriga/src/main/java/edu/asu/diging/quadriga/core/data/CollectionRepository.java index c7b23e38..48a2d3ce 100644 --- a/quadriga/src/main/java/edu/asu/diging/quadriga/core/data/CollectionRepository.java +++ b/quadriga/src/main/java/edu/asu/diging/quadriga/core/data/CollectionRepository.java @@ -1,5 +1,6 @@ package edu.asu.diging.quadriga.core.data; +import org.bson.types.ObjectId; import org.springframework.data.mongodb.repository.MongoRepository; import org.springframework.stereotype.Repository; @@ -8,4 +9,6 @@ @Repository public interface CollectionRepository extends MongoRepository{ + Collection findBy_id(ObjectId _id); + } diff --git a/quadriga/src/main/java/edu/asu/diging/quadriga/core/service/CollectionManager.java b/quadriga/src/main/java/edu/asu/diging/quadriga/core/service/CollectionManager.java index 4f90cad8..a956ad95 100644 --- a/quadriga/src/main/java/edu/asu/diging/quadriga/core/service/CollectionManager.java +++ b/quadriga/src/main/java/edu/asu/diging/quadriga/core/service/CollectionManager.java @@ -1,8 +1,12 @@ package edu.asu.diging.quadriga.core.service; +import java.util.Optional; + import edu.asu.diging.quadriga.core.model.Collection; public interface CollectionManager { public Collection addCollection(String name, String description); + public Collection findCollection(String id); + public Collection editCollection(String id, Optional name, Optional description); } diff --git a/quadriga/src/main/java/edu/asu/diging/quadriga/core/service/impl/CollectionManagerImpl.java b/quadriga/src/main/java/edu/asu/diging/quadriga/core/service/impl/CollectionManagerImpl.java index fc736345..3acaeab2 100644 --- a/quadriga/src/main/java/edu/asu/diging/quadriga/core/service/impl/CollectionManagerImpl.java +++ b/quadriga/src/main/java/edu/asu/diging/quadriga/core/service/impl/CollectionManagerImpl.java @@ -1,5 +1,8 @@ package edu.asu.diging.quadriga.core.service.impl; +import java.util.Optional; + +import org.bson.types.ObjectId; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -13,7 +16,6 @@ public class CollectionManagerImpl implements CollectionManager { @Autowired private CollectionRepository collectionRepo; - /** * Creates a new Collection instance and stores it in mongodb * @@ -30,4 +32,42 @@ public Collection addCollection(String name, String description) { return collectionRepo.save(collection); } + /** + * Finds a collection from mongodb collection table by _id + * + * @param id used to look up the collection in mongodb + * + * + * @return Collection Instance that is found from the database + * + **/ + @Override + public Collection findCollection(String id) { + return collectionRepo.findBy_id(new ObjectId(id)); + } + + /** + * Edits an existing Collection and updates it in mongodb + * + * @param _id of the collection that needs to be updated + * + * + * @return Collection Instance that is updated in database + * + **/ + @Override + public Collection editCollection(String id, Optional name, Optional description) { + Optional collection = Optional.ofNullable(findCollection(id)); + Collection updatedCollection = null; + + if (collection.isPresent()) { + Collection currentCollection = collection.get(); + name.ifPresent(updatedName -> currentCollection.setName(updatedName)); + description.ifPresent(updatedDescription -> currentCollection.setDescription(updatedDescription)); + updatedCollection = collectionRepo.save(currentCollection); + } + + return updatedCollection; + } + } diff --git a/quadriga/src/main/java/edu/asu/diging/quadriga/web/AddCollectionController.java b/quadriga/src/main/java/edu/asu/diging/quadriga/web/AddCollectionController.java index 89ddf393..ee0ac8ac 100644 --- a/quadriga/src/main/java/edu/asu/diging/quadriga/web/AddCollectionController.java +++ b/quadriga/src/main/java/edu/asu/diging/quadriga/web/AddCollectionController.java @@ -33,6 +33,7 @@ public String add(@Valid CollectionForm collectionForm, BindingResult result, Re collectionManager.addCollection(collectionForm.getName(), collectionForm.getDescription()); + redirectAttrs.addFlashAttribute("show_alert", true); redirectAttrs.addFlashAttribute("alert_type", "success"); redirectAttrs.addFlashAttribute("alert_msg", "Collection has been added."); return "redirect:/auth/collections"; diff --git a/quadriga/src/main/java/edu/asu/diging/quadriga/web/EditCollectionController.java b/quadriga/src/main/java/edu/asu/diging/quadriga/web/EditCollectionController.java new file mode 100644 index 00000000..f9667fe7 --- /dev/null +++ b/quadriga/src/main/java/edu/asu/diging/quadriga/web/EditCollectionController.java @@ -0,0 +1,101 @@ +package edu.asu.diging.quadriga.web; + +import java.util.Objects; +import java.util.Optional; + +import javax.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; + +import edu.asu.diging.quadriga.core.model.Collection; +import edu.asu.diging.quadriga.core.service.CollectionManager; +import edu.asu.diging.quadriga.web.forms.CollectionForm; + +/** + * This controller enables users to edit their collections + * + * @author poojakulkarni + * + */ +@Controller +public class EditCollectionController { + + @Autowired + private CollectionManager collectionManager; + + /** + * Request handler for getting the "Edit collections" view + * + * @param id of the collection to be edited + * @param model to set collectionForm attribute to pre-fill current name and + * description + * @return the editCollection view + */ + @RequestMapping(value = "/auth/collections/edit", method = RequestMethod.GET) + public String get(@RequestParam(value = "id", required = true) String id, Model model) { + Optional collection = Optional.ofNullable(collectionManager.findCollection(id)); + + if (collection.isPresent()) { + Collection currentCollection = collection.get(); + CollectionForm collectionForm = new CollectionForm(); + collectionForm.setId(id); + collectionForm.setName(currentCollection.getName()); + collectionForm.setDescription(currentCollection.getDescription()); + model.addAttribute("collectionForm", collectionForm); + + return "auth/editCollection"; + } + + return "redirect:/auth/collections"; + } + + /** + * Request handler for editing a collection in the "Edit collections" view + * + * @param id of the collection to be edited + * @param collectionForm that has the updated name and description values + * @param bindingResult for checking form errors + * @param redirectAttributes used for adding flash attributes after redirecting + * @return + */ + @RequestMapping(value = "/auth/collections/edit", method = RequestMethod.POST) + public String edit(@RequestParam(value = "id", required = true) String id, @Valid CollectionForm collectionForm, + BindingResult bindingResult, RedirectAttributes redirectAttributes) { + if (bindingResult.hasErrors()) { + redirectAttributes.addFlashAttribute("alert_type", "danger"); + redirectAttributes.addFlashAttribute("alert_msg", + "Something went wrong while editing collections, please try again!"); + redirectAttributes.addFlashAttribute("show_alert", true); + return "auth/editCollection"; + } + + Collection collection = null; + + if (Objects.nonNull(collectionForm)) { + collection = collectionManager.editCollection(id, Optional.ofNullable(collectionForm.getName()), + Optional.ofNullable(collectionForm.getDescription())); + + if (Objects.nonNull(collection)) { + redirectAttributes.addFlashAttribute("alert_type", "success"); + redirectAttributes.addFlashAttribute("alert_msg", "Collection has been edited."); + redirectAttributes.addFlashAttribute("show_alert", true); + return "redirect:/auth/collections"; + } + } + + redirectAttributes.addFlashAttribute("alert_type", "danger"); + redirectAttributes.addFlashAttribute("alert_msg", + "Something went wrong while editing collections, please try again!"); + redirectAttributes.addFlashAttribute("show_alert", true); + return "auth/editCollection"; + + } + +} diff --git a/quadriga/src/main/java/edu/asu/diging/quadriga/web/forms/CollectionForm.java b/quadriga/src/main/java/edu/asu/diging/quadriga/web/forms/CollectionForm.java index 4fa1b2f4..64a06c51 100644 --- a/quadriga/src/main/java/edu/asu/diging/quadriga/web/forms/CollectionForm.java +++ b/quadriga/src/main/java/edu/asu/diging/quadriga/web/forms/CollectionForm.java @@ -10,6 +10,16 @@ public class CollectionForm { private String description; + private String id; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + public String getName() { return name; } diff --git a/quadriga/src/main/webapp/WEB-INF/views/auth/editCollection.html b/quadriga/src/main/webapp/WEB-INF/views/auth/editCollection.html new file mode 100644 index 00000000..5f838237 --- /dev/null +++ b/quadriga/src/main/webapp/WEB-INF/views/auth/editCollection.html @@ -0,0 +1,27 @@ + + +Quadriga 2.0 + + +
+ +

+ Edit Collection - +

+ +
+ Please + enter a valid Collection name.
+ + +
+ +
+
+ +
+ + \ No newline at end of file diff --git a/quadriga/src/main/webapp/WEB-INF/views/auth/showcollection.html b/quadriga/src/main/webapp/WEB-INF/views/auth/showcollection.html index 2019d83f..4e0c5c9f 100644 --- a/quadriga/src/main/webapp/WEB-INF/views/auth/showcollection.html +++ b/quadriga/src/main/webapp/WEB-INF/views/auth/showcollection.html @@ -10,7 +10,13 @@

My Collections

  • + th:text="${collection.name}"> + +