NastasiyaT/java-project-99

View on GitHub
src/main/java/hexlet/code/mapper/TaskMapper.java

Summary

Maintainability
A
0 mins
Test Coverage
B
83%
package hexlet.code.mapper;

import hexlet.code.dto.TaskDTO;
import hexlet.code.model.Label;
import hexlet.code.model.Task;
import hexlet.code.model.TaskStatus;
import hexlet.code.model.User;
import hexlet.code.repository.LabelRepository;
import hexlet.code.repository.TaskStatusRepository;
import org.mapstruct.InheritConfiguration;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingConstants;
import org.mapstruct.MappingTarget;
import org.mapstruct.Mappings;
import org.mapstruct.Named;
import org.mapstruct.NullValuePropertyMappingStrategy;
import org.mapstruct.ReportingPolicy;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;

@Mapper(
        uses = { JsonNullableMapper.class, ReferenceMapper.class },
        nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE,
        componentModel = MappingConstants.ComponentModel.SPRING,
        unmappedTargetPolicy = ReportingPolicy.IGNORE
)
public abstract class TaskMapper {

    @Autowired
    private TaskStatusRepository taskStatusRepository;

    @Autowired
    private LabelRepository labelRepository;

    @Mapping(target = "assigneeId", source = "assignee.id")
    @Mapping(target = "title", source = "name")
    @Mapping(target = "content", source = "description")
    @Mapping(target = "status", source = "taskStatus.slug")
    @Mapping(target = "taskLabelIds", source = "labels", qualifiedByName = "labelsToIds")
    public abstract TaskDTO mapToDto(Task model);

    @Named("labelsToIds")
    public final Set<Long> toDTO(Set<Label> labels) {
        return labels.isEmpty() ? new HashSet<>() : labels.stream()
                                                            .map(Label::getId)
                                                            .collect(Collectors.toSet());
    }

    @Mappings({
            @Mapping(target = "taskStatus", source = "status", qualifiedByName = "slugToTaskStatus"),
            @Mapping(target = "assignee", source = "assigneeId", qualifiedByName = "idToUser"),
            @Mapping(target = "labels", source = "taskLabelIds", qualifiedByName = "idsToLabels"),
            @Mapping(target = "name", source = "title"),
            @Mapping(target = "description", source = "content"),
            @Mapping(target = "createdAt", ignore = true),
            @Mapping(target = "id", ignore = true)
    })
    public abstract Task mapToEntity(TaskDTO data);

    @InheritConfiguration(name = "mapToEntity")
    public abstract Task update(TaskDTO model, @MappingTarget Task data);

    @Named("slugToTaskStatus")
    public final TaskStatus toEntity(String status) {
        return taskStatusRepository.findBySlug(status)
                .orElseThrow();
    }

    @Named("idToUser")
    public final User toEntity(Long assigneeId) {
        var user = new User();
        user.setId(assigneeId);
        return assigneeId == null ? null : user;
    }

    @Named("idsToLabels")
    public final Set<Label> toEntity(Set<Long> labelIds) {
        return labelIds.isEmpty() ? new HashSet<>() : labelIds.stream()
                                                                .map(labelId -> labelRepository.findById(labelId).get())
                                                                .collect(Collectors.toSet());
    }
}