package com.yaoyuan.jiscuss.dto; import com.yaoyuan.jiscuss.entity.User; import org.mapstruct.Mapper; import org.mapstruct.MappingConstants; import org.mapstruct.ReportingPolicy; /** * MapStruct mapper between {@link User} entity and its DTOs. * *

The {@code password} field is intentionally never copied into a response and * is left {@code null} when constructing a {@link User} from a create request — * the caller (service layer) is responsible for BCrypt-hashing and setting it. */ @Mapper( componentModel = MappingConstants.ComponentModel.SPRING, unmappedTargetPolicy = ReportingPolicy.IGNORE ) public interface UserMapper { /** Map a {@link User} entity to a safe {@link UserResponse} (no password). */ default UserResponse toResponse(User user) { if (user == null) { return null; } return new UserResponse( user.getId(), user.getUsername(), user.getRealname(), user.getEmail(), user.getAvatar(), user.getGender(), user.getPhone(), user.getAge(), user.getDiscussionsCount(), user.getCommentsCount(), user.getJoinTime(), user.getLastSeenTime(), user.getLevel() ); } /** Map a create request to a new {@link User} entity. Password must be set by the caller. */ default User fromCreateRequest(UserCreateRequest request) { if (request == null) { return null; } User user = new User(); user.setUsername(request.username()); user.setEmail(request.email()); user.setRealname(request.realname()); return user; } }