/* * Copyright 2014 Ranjan Kumar * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing tags and * limitations under the License. */ package com.restfiddle.controller.rest; import java.util.ArrayList; import java.util.List; import javax.annotation.Resource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.ComponentScan; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort.Direction; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; 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.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import com.restfiddle.dao.NodeRepository; import com.restfiddle.dao.TagRepository; import com.restfiddle.dao.WorkspaceRepository; import com.restfiddle.dto.NodeDTO; import com.restfiddle.dto.TagDTO; import com.restfiddle.entity.BaseNode; import com.restfiddle.entity.Tag; import com.restfiddle.entity.Workspace; import com.restfiddle.util.EntityToDTO; @RestController @EnableAutoConfiguration @ComponentScan @Transactional public class TagController { Logger logger = LoggerFactory.getLogger(TagController.class); @Resource private WorkspaceRepository workspaceRepository; @Resource private TagRepository tagRepository; @Resource private NodeRepository nodeRepository; @RequestMapping(value = "/api/workspaces/{workspaceId}/tags", method = RequestMethod.POST, headers = "Accept=application/json") public @ResponseBody Tag create(@PathVariable("workspaceId") String workspaceId, @RequestBody TagDTO tagDTO) { logger.debug("Creating a new tag with information: " + tagDTO); Tag tag = new Tag(); tag.setName(tagDTO.getName()); tag.setDescription(tagDTO.getDescription()); Tag savedTag = tagRepository.save(tag); // Update workspace Workspace workspace = workspaceRepository.findOne(workspaceId); workspace.getTags().add(savedTag); workspaceRepository.save(workspace); return savedTag; } @RequestMapping(value = "/api/tags", method = RequestMethod.POST, headers = "Accept=application/json") public @ResponseBody Tag create(@RequestBody TagDTO tagDTO) { logger.debug("Creating a new tag with information: " + tagDTO); Tag tag = new Tag(); tag.setName(tagDTO.getName()); tag.setDescription(tagDTO.getDescription()); return tagRepository.save(tag); } @RequestMapping(value = "/api/tags/{id}", method = RequestMethod.DELETE, headers = "Accept=application/json") public @ResponseBody Tag delete(@PathVariable("id") String id) { logger.debug("Deleting tag with id: " + id); Tag deleted = tagRepository.findOne(id); tagRepository.delete(deleted); List<Workspace> workspaces = workspaceRepository.findByTags(id); //The list has to contain exactly 1 workspace. if is just an extra check if (workspaces.size()>0){ Workspace workspace = workspaces.get(0); workspace.getTags().remove(id); workspaceRepository.save(workspace); } return deleted; } @RequestMapping(value = "/api/workspaces/{workspaceId}/tags", method = RequestMethod.GET) public @ResponseBody List<Tag> findTagsFromAWorkspace(@PathVariable("workspaceId") String workspaceId) { logger.debug("Finding all tags from workspace with id " + workspaceId); // TODO: Reverse mapping is required for this // return tagRepository.findTagsFromAWorkspace(workspaceId); Workspace workspace = workspaceRepository.findOne(workspaceId); return workspace == null ? null : workspace.getTags(); } @RequestMapping(value = "/api/tags", method = RequestMethod.GET) public @ResponseBody List<Tag> findAll() { logger.debug("Finding all tags"); return tagRepository.findAll(); } @RequestMapping(value = "/api/tags/{id}", method = RequestMethod.GET) public @ResponseBody Tag findById(@PathVariable("id") String id) { logger.debug("Finding tag by id: " + id); return tagRepository.findOne(id); } @RequestMapping(value = "/api/workspaces/{workspaceId}/tags/{id}", method = RequestMethod.PUT, headers = "Accept=application/json") public @ResponseBody Tag update(@PathVariable("workspaceId") String workspaceId, @PathVariable("id") String id, @RequestBody TagDTO updated) { logger.debug("Updating tag with information: " + updated); Tag tag = tagRepository.findOne(updated.getId()); tag.setName(updated.getName()); tag.setDescription(updated.getDescription()); tagRepository.save(tag); return tag; } @RequestMapping(value = "/api/workspaces/{workspaceId}/tags/{tagId}/nodes", method = RequestMethod.GET) public @ResponseBody List<NodeDTO> findNodesByTag(@PathVariable("workspaceId") String workspaceId, @PathVariable("tagId") String tagId, @RequestParam(value = "page", required = false) Integer page, @RequestParam(value = "limit", required = false) Integer limit, @RequestParam(value = "search", required = false) String search, @RequestParam(value = "sortBy", required = false) String sortBy) { logger.debug("Finding nodes by tag id: " + tagId); int pageNo = 0; if (page != null && page > 0) { pageNo = page; } int numberOfRecords = 10; if (limit != null && limit > 0) { numberOfRecords = limit; } Sort sort = new Sort(Direction.DESC, "lastModifiedDate"); if("name".equals(sortBy)){ sort = new Sort(Direction.ASC, "name"); } else if ("lastRun".equals(sortBy)){ sort = new Sort(Direction.DESC, "lastModifiedDate"); }else if ("nameDesc".equals(sortBy)){ sort = new Sort(Direction.DESC, "name"); } Pageable pageable = new PageRequest(pageNo, numberOfRecords, sort); Page<BaseNode> paginatedTaggedNodes = nodeRepository.searchTaggedNodes(tagId, search != null ? search : "", pageable); List<BaseNode> taggedNodes = paginatedTaggedNodes.getContent(); List<NodeDTO> response = new ArrayList<NodeDTO>(); for(BaseNode item : taggedNodes){ response.add(EntityToDTO.toDTO(item)); } return response; } }