UpdateJobMapper.java

package com.wilzwert.myjobs.infrastructure.mapper;


import com.wilzwert.myjobs.core.domain.model.job.JobId;
import com.wilzwert.myjobs.core.domain.model.job.command.*;
import com.wilzwert.myjobs.core.domain.model.user.UserId;
import com.wilzwert.myjobs.infrastructure.api.rest.dto.job.*;
import org.mapstruct.Mapper;

/**
 * Maps job update request dtos to domain commands
 * @author Wilhelm Zwertvaegher
 * Date:05/06/2025
 * Time:11:34
 */
@Mapper(componentModel = "spring")
public interface UpdateJobMapper {

    default UpdateJobCommand toCommand(UpdateJobDto request, JobId jobId, UserId userId) {
        return switch (request) {
            case UpdateJobStatusRequest u -> toCommand(u, jobId, userId);
            case UpdateJobRatingRequest r -> toCommand(r, jobId, userId);
            case UpdateJobRequest j -> toCommand(j, jobId, userId);
            case UpdateJobFieldRequest f -> toCommand(f, jobId, userId);
        };
    }

    default UpdateJobCommand toCommand(UpdateJobFieldRequest request, JobId jobId, UserId userId) {
        UpdateJobFieldCommand.Field field = UpdateJobFieldCommand.Field.fromString(request.getField()).orElseThrow(IllegalArgumentException::new);
        return new UpdateJobFieldCommand(jobId, userId, field, request.getValue());
    }

    UpdateJobFullCommand toCommand(UpdateJobRequest updateJobRequest, JobId jobId, UserId userId);

    UpdateJobStatusCommand toCommand(UpdateJobStatusRequest updateJobStatusRequest, JobId jobId, UserId userId);

    UpdateJobRatingCommand toCommand(UpdateJobRatingRequest updateJobRatingRequest, JobId jobId, UserId userId);
}