UserServiceV2.java

package com.dmasone.identity.service;

import com.dmasone.identity.api.generated.model.CreateUserRequestV2;
import com.dmasone.identity.api.generated.model.UpdateUserRequestV2;
import com.dmasone.identity.api.generated.model.UserResponseV2;
import com.dmasone.identity.api.mapper.UserMapper;
import com.dmasone.identity.domain.model.User;
import com.dmasone.identity.domain.model.UserStatus;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.UUID;

/**
 * Version 2 user business operations.
 *
 * <p>Version 2 extends the user model with profile fields and partial updates
 * while preserving the behavior of earlier API versions.</p>
 */
@Service
@RequiredArgsConstructor
@Transactional
public class UserServiceV2 {

    private final UserServiceSupport support;
    private final UserMapper userMapper;

    /**
     * Creates a user from the version 2 API request.
     *
     * @param request generated request model validated by the API layer
     * @return generated response model for the created user
     */
    public UserResponseV2 createUser(CreateUserRequestV2 request) {
        User user = userMapper.toEntity(request);
        return userMapper.toV2(support.create(user, request.getPassword()));
    }

    /**
     * Loads a user by identifier.
     *
     * @param id user identifier parsed from the request path
     * @return generated response model for the found user
     */
    @Transactional(readOnly = true)
    public UserResponseV2 getUserById(UUID id) {
        return userMapper.toV2(support.getRequired(id));
    }

    /**
     * Applies a partial update to a version 2 user profile.
     *
     * @param id user identifier parsed from the request path
     * @param request generated partial-update request
     * @return generated response model after persistence
     */
    public UserResponseV2 updateUser(UUID id, UpdateUserRequestV2 request) {
        User user = support.getRequired(id);
        boolean changed = false;

        if (request.getFirstName() != null) {
            user.setFirstName(request.getFirstName());
            changed = true;
        }

        if (request.getLastName() != null) {
            user.setLastName(request.getLastName());
            changed = true;
        }

        if (request.getStatus() != null) {
            user.setStatus(toDomainStatus(request.getStatus()));
            changed = true;
        }

        return userMapper.toV2(changed ? support.saveChanged(user) : user);
    }

    private UserStatus toDomainStatus(com.dmasone.identity.api.generated.model.UserStatus status) {
        return UserStatus.valueOf(status.getValue());
    }
}