MemberMapper.java

package io.featureprobe.api.mapper;

import io.featureprobe.api.dto.MemberItemResponse;
import io.featureprobe.api.dto.MemberResponse;
import io.featureprobe.api.dto.MemberUpdateRequest;
import io.featureprobe.api.dao.entity.Member;
import org.apache.commons.lang3.StringUtils;
import org.mapstruct.BeanMapping;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;
import org.mapstruct.NullValuePropertyMappingStrategy;
import org.mapstruct.factory.Mappers;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

@Mapper
public interface MemberMapper extends BaseMapper {

    MemberMapper INSTANCE = Mappers.getMapper(MemberMapper.class);

    @Mapping(target = "account", expression = "java(member.getAccount())")
    @Mapping(target = "nickname", expression = "java(member.getNickname())")
    @Mapping(target = "createdBy", expression = "java(getAccount(member.getCreatedBy()))")
    @Mapping(target = "visitedTime", expression = "java(member.getVisitedTime())")
    MemberItemResponse entityToItemResponse(Member member);

    @Mapping(target = "account", expression = "java(member.getAccount())")
    @Mapping(target = "createdBy", expression = "java(getAccount(member.getCreatedBy()))")
    @Mapping(target = "modifiedBy", expression = "java(getAccount(member.getModifiedBy()))")
    MemberResponse entityToResponse(Member member);


    @Mapping(target = "password", expression = "java(toPasswordEncrypt(updateRequest.getPassword(), member))")
    @Mapping(target = "account", expression = "java(updateRequest.getAccount())")
    @BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
    void mapEntity(MemberUpdateRequest updateRequest, @MappingTarget Member member);

    default String toPasswordEncrypt(String password, Member member) {
        if (StringUtils.isNotBlank(password)) {
            return new BCryptPasswordEncoder().encode(password);
        }
        return member.getPassword();
    }
}