InternalUserManagementAdapterImpl.java

package net.andresbustamante.yafoot.core.web.adapters;

import net.andresbustamante.yafoot.commons.exceptions.DirectoryException;
import net.andresbustamante.yafoot.commons.model.UserContext;
import net.andresbustamante.yafoot.core.adapters.UserManagementAdapter;
import net.andresbustamante.yafoot.core.web.mappers.UserMapper;
import net.andresbustamante.yafoot.users.model.User;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpMethod;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.web.client.HttpClientErrorException;
import org.springframework.web.client.HttpServerErrorException;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;

/**
 * Internal users adapter implementation.
 */
@Component
public class InternalUserManagementAdapterImpl implements UserManagementAdapter {

    @Value("${api.users.server.url}")
    private String usersApiUrl;

    private final UserMapper userMapper;

    private final RestTemplate restTemplate;

    public InternalUserManagementAdapterImpl(
            final UserMapper userMapper, @Qualifier("usersRestTemplate") final RestTemplate restTemplate) {
        this.userMapper = userMapper;
        this.restTemplate = restTemplate;
    }

    @Override
    @Async
    public void updateUser(final User user, final UserContext context) throws DirectoryException {
        UriComponentsBuilder uriBuilder = getUriBuilder();
        uriBuilder.path("/").path(user.getEmail());

        HttpEntity<net.andresbustamante.yafoot.users.web.dto.UserForm> body = new HttpEntity<>(userMapper.map(user));

        try {
            restTemplate.exchange(uriBuilder.toUriString(), HttpMethod.PUT, body, Void.class);
        } catch (HttpClientErrorException | HttpServerErrorException e) {
            throw new DirectoryException(e.getMessage());
        }
    }


    @Override
    public void deleteUser(final User user, final UserContext context) throws DirectoryException {
        UriComponentsBuilder uriBuilder = getUriBuilder();
        uriBuilder.path("/").path(user.getEmail());

        try {
            restTemplate.exchange(uriBuilder.toUriString(), HttpMethod.DELETE,
                    HttpEntity.EMPTY, Void.class);
        } catch (HttpClientErrorException | HttpServerErrorException e) {
            throw new DirectoryException(e.getMessage());
        }
    }

    private UriComponentsBuilder getUriBuilder() {
        return UriComponentsBuilder.fromHttpUrl(usersApiUrl);
    }
}