Столкнулся с проблемой абстрагирования, есть сервис на данный момент реализовано так, имеется сущность ProjectEntity (справочник проектов) и его методы реализованы в DirectoryController, всё прекрасно работало пока мне не пришлось добавлять в функционал еще один справочник задач (TaskEntity). Я конечно могу так же добавлять методы для нового справочника и всё будет работать, но у двух справочников одни и те же CRUD операции, и получится дублирование кода, что не есть хорошо. Подскажите как реализовать методы 2х сущностей в одном контроллере, имею представление о том что нужно все абстрагировать, но реализация не понятна. Всем заранее спасибо, и здоровья
Код:
package com.dilau.tsservice.controller;
import com.dilau.tsservice.dto.ProjectDto;
import com.dilau.tsservice.entity.ProjectEntity;
import com.dilau.tsservice.exception.ResourceNotFoundException;
import com.dilau.tsservice.repos.ProjectRepo;
import com.dilau.tsservice.repos.TaskRepo;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.modelmapper.ModelMapper;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.List;
import java.util.stream.Collectors;
@RestController
@Slf4j
@RequestMapping("/project")
@RequiredArgsConstructor
public class DirectoryController {
private final ModelMapper modelMapper;
private final ProjectRepo projectRepo;
private final TaskRepo taskRepo;
@GetMapping(produces = MediaType.APPLICATION_JSON_VALUE)
public List<ProjectDto> getAllProject() {
List<ProjectEntity> lists = (List<ProjectEntity>) projectRepo.findAll();
return lists.stream().map(this::toDto).collect(Collectors.toList());
}
@GetMapping(value = "/{id}", produces = MediaType.APPLICATION_JSON_VALUE)
public ProjectDto getProjectById(@PathVariable(value = "id") Long id) {
return toDto(projectRepo.findById(id)
.orElseThrow(() -> new ResourceNotFoundException("Project", "id", id)));
}
@PostMapping(value = "/addProject", consumes = MediaType.APPLICATION_JSON_VALUE, produces =
MediaType.APPLICATION_JSON_VALUE)
public void createProject(@RequestBody ProjectDto projectDto) {
ProjectEntity projectEntity = toEntity(projectDto);
ProjectEntity projectEntity1 = projectRepo.save(projectEntity);
}
@PostMapping(value = "/updateProject/{id}", consumes = MediaType.APPLICATION_JSON_VALUE, produces =
MediaType.APPLICATION_JSON_VALUE)
public void updateProject(@PathVariable(value = "id") Long id, @Valid @RequestBody ProjectDto projectDetail) {
ProjectDto projectDto = toDto(projectRepo.findById(id)
.orElseThrow(() -> new ResourceNotFoundException("Project", "id", id)));
projectDto.setId(projectDetail.getId());
projectDto.setCode(projectDetail.getCode());
projectDto.setValueKz(projectDetail.getValueKz());
projectDto.setValueRu(projectDetail.getValueRu());
ProjectEntity projectEntity = toEntity(projectDto);
projectRepo.save(projectEntity);
}
@DeleteMapping(value = "/deleteProject/{id}", produces =
MediaType.APPLICATION_JSON_VALUE)
public void deleteProject(@PathVariable(value = "id") Long id) {
ProjectDto projectDto = toDto(projectRepo.findById(id)
.orElseThrow(() -> new ResourceNotFoundException("Project", "id", id)));
ProjectEntity projectEntity = toEntity(projectDto);
projectRepo.delete(projectEntity);
}
private ProjectEntity toEntity(ProjectDto projectDto) {
return modelMapper.map(projectDto, ProjectEntity.class);
}
private ProjectDto toDto(ProjectEntity projectEntity) {
return modelMapper.map(projectEntity, ProjectDto.class);
}
}
Код:
package com.dilau.tsservice.dto;
import lombok.Data;
@Data
public class ProjectDto {
private Long id;
private String code;
private String valueKz;
private String valueRu;
}
Код:
package com.dilau.tsservice.dto;
import lombok.Data;
@Data
public class TaskDto {
private Long id;
private String code;
private String valueKz;
private String valueRu;
}
Код:
package com.dilau.tsservice.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import javax.validation.constraints.NotBlank;
import java.util.List;
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "project")
public class ProjectEntity {
@Id
@GeneratedValue
@Column(name = "id")
private Long id;
@NotBlank
@Column(name = "code", nullable = false)
private String code;
@NotBlank
@Column(name = "value_kz", nullable = false)
private String valueKz;
@NotBlank
@Column(name = "value_ru", nullable = false)
private String valueRu;
@OneToMany(mappedBy = "projectEntity")
//@JsonBackReference
private List<DashBoardEntity> dashBoardEntityList;
}
Код:
package com.dilau.tsservice.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
import javax.validation.constraints.NotBlank;
import java.util.List;
@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "task")
public class TaskEntity {
@Id
@GeneratedValue
@Column(name = "id")
private Long id;
@NotBlank
@Column(name = "code", nullable = false)
private String code;
@NotBlank
@Column(name = "value_kz", nullable = false)
private String valueKz;
@NotBlank
@Column(name = "value_ru", nullable = false)
private String valueRu;
@OneToMany(mappedBy = "taskEntity")
//@JsonBackReference
private List<DashBoardEntity> dashBoardEntityList;
}