package ru.hflabs.rcd.web.controller.document; import com.google.common.collect.ImmutableList; import com.google.common.collect.Sets; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import ru.hflabs.rcd.model.criteria.FilterCriteria; import ru.hflabs.rcd.model.definition.ModelDefinition; import ru.hflabs.rcd.model.document.Dictionary; import ru.hflabs.rcd.model.document.Group; import ru.hflabs.rcd.service.document.IDictionaryService; import ru.hflabs.rcd.service.document.IGroupService; import ru.hflabs.rcd.service.rule.IRecodeRuleSetService; import ru.hflabs.rcd.web.controller.ControllerTemplate; import ru.hflabs.rcd.web.model.document.DictionaryStatisticBean; import ru.hflabs.rcd.web.model.document.GroupBean; import ru.hflabs.util.core.FormatUtil; import javax.annotation.Resource; import java.util.Collection; import java.util.Set; import static ru.hflabs.rcd.accessor.Accessors.injectId; import static ru.hflabs.rcd.model.CriteriaUtils.createCriteriaByIDs; import static ru.hflabs.rcd.model.ModelUtils.hasPermission; /** * Класс <class>GroupController</class> реализует контроллер управления группами справочников * * @see Group */ @Controller(GroupController.MAPPING_URI + GroupController.NAME_POSTFIX) @RequestMapping(GroupController.MAPPING_URI + GroupController.DATA_URI) public class GroupController extends ControllerTemplate { public static final String MAPPING_URI = "groups"; /** Сервис работы с группами справочников */ @Resource(name = "groupService") private IGroupService groupService; /** Сервис работы со справочниками */ @Resource(name = "dictionaryService") private IDictionaryService dictionaryService; /** Сервис работы с наборами правил перекодирования */ @Resource(name = "recodeRuleSetService") private IRecodeRuleSetService recodeRuleSetService; @RequestMapping(value = "/model", method = RequestMethod.GET) @ResponseBody public ModelDefinition createModel() { return modelDefinitionFactory.retrieveService(Group.class); } /** * Выполняет формирование декоратора группы с заполнением рассчитываемых параметров * * @param group целевая группа * @return Возвращает декоратор группы */ private GroupBean populateGroup(Group group) { // Получаем количество справочников в группе int dictionariesCount = dictionaryService.countByCriteria(createCriteriaByIDs(Dictionary.GROUP_ID, group.getId())); // Получаем несопоставленные справочники для группы Set<Dictionary> unmatchedDictionaries = recodeRuleSetService.findUnmatchedDictionaries(group.getId(), false); // Формируем и возвращаем декоратор группы return new GroupBean(group, new DictionaryStatisticBean(dictionariesCount, unmatchedDictionaries.size())); } @RequestMapping(value = "/", method = RequestMethod.GET) @ResponseBody public Collection<GroupBean> getGroups( @RequestParam(value = FilterCriteria.SEARCH, required = false) String search, @RequestParam(value = Group.PERMISSION_WRITE_NAME, required = false) boolean onlyWritable) { // Получаем все группы справочников Collection<Group> groups = groupService.findAllByCriteria( new FilterCriteria().injectSearch(FormatUtil.parseString(search)), false ); // Для каждой группы формируем ее декоратор ImmutableList.Builder<GroupBean> result = ImmutableList.builder(); for (Group group : groups) { if (!onlyWritable || hasPermission(group, Group.PERMISSION_WRITE)) { result.add(populateGroup(group)); } } // Возвращаем сформированные декораторы return result.build(); } @RequestMapping(value = "/{id}", method = RequestMethod.GET) @ResponseBody public GroupBean getGroup(@PathVariable String id) { return populateGroup(groupService.findByID(id, false, false)); } @RequestMapping(value = "/", method = RequestMethod.POST) @ResponseBody public GroupBean createGroup(@RequestBody Group group) { return populateGroup(createSingleDocument(groupService, injectId(group, null), true)); } @RequestMapping(value = "/{id}", method = RequestMethod.PUT) @ResponseBody public GroupBean updateGroup(@PathVariable String id, @RequestBody Group group) { return populateGroup(updateSingleDocument(groupService, injectId(group, id), true)); } @RequestMapping(value = "/{id}", method = RequestMethod.DELETE) public void closeGroup(@PathVariable String id) { groupService.closeByIDs(Sets.newHashSet(id)); } }