package ru.hflabs.rcd.web.controller.document;
import com.google.common.collect.Collections2;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Sets;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import ru.hflabs.rcd.model.document.Field;
import ru.hflabs.rcd.model.document.MetaField;
import ru.hflabs.rcd.service.document.IFieldService;
import ru.hflabs.rcd.service.document.IMetaFieldService;
import ru.hflabs.rcd.web.controller.ControllerTemplate;
import ru.hflabs.rcd.web.model.document.MetaFieldBean;
import javax.annotation.Resource;
import java.util.Collection;
import static ru.hflabs.rcd.accessor.Accessors.*;
/**
* Класс <class>MetaFieldController</class> реализует контроллер управления структурой справочника
*
* @see MetaField
*/
@Controller(MetaFieldController.MAPPING_URI + MetaFieldController.NAME_POSTFIX)
@RequestMapping(MetaFieldController.MAPPING_URI + MetaFieldController.DATA_URI)
public class MetaFieldController extends ControllerTemplate {
public static final String MAPPING_URI = "metafields";
/** Сервис работы с МЕТА-полями справочника */
@Resource(name = "metaFieldService")
private IMetaFieldService metaFieldService;
/** Сервис работы со значениями полей справочника */
@Resource(name = "fieldService")
private IFieldService fieldService;
@RequestMapping(value = "/", method = RequestMethod.GET)
@ResponseBody
public Collection<MetaFieldBean> getMetaFields(@RequestParam(value = MetaField.DICTIONARY_ID) String dictionaryId) {
return Collections2.transform(
metaFieldService.findAllByRelativeId(dictionaryId, null, true),
MetaFieldBean.CONVERT
);
}
@RequestMapping(value = "/", method = RequestMethod.POST)
@ResponseBody
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
public MetaFieldBean createMetaField(@RequestBody MetaFieldBean bean) {
MetaField target = bean.getDelegate();
// Выполняем создание МЕТА-поля
MetaField result = createSingleDocument(metaFieldService, injectId(target, null), true);
// Выполняем создание пустых значений полей
MetaField primaryMetaField = metaFieldService.findPrimaryMetaField(result.getDictionaryId(), false, true);
if (primaryMetaField != null) {
ImmutableList.Builder<Field> fields = ImmutableList.builder();
// Получаем значение первичных ключей
Collection<Field> primaryFields = fieldService.findAllByRelativeId(primaryMetaField.getId(), null, false);
// Подготавливаем фиктивные значение полей
for (Field primaryField : primaryFields) {
Field field = new Field();
{
field = linkRelative(result, field);
field = injectName(field, primaryField.getName());
}
fields.add(field);
}
// Создаем фиктивные значений полей
fieldService.create(fields.build(), false);
}
// Возвращаем созданное МЕТА-поле
return MetaFieldBean.CONVERT.apply(result);
}
@RequestMapping(value = "/{id}", method = RequestMethod.PUT)
@ResponseBody
public MetaFieldBean updateMetaField(@PathVariable String id, @RequestBody MetaFieldBean metaFieldBean) {
return MetaFieldBean.CONVERT.apply(
updateSingleDocument(metaFieldService, injectId(metaFieldBean.getDelegate(), id), true)
);
}
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
public void closeMetaField(@PathVariable String id) {
metaFieldService.closeByIDs(Sets.newHashSet(id));
}
}