CreateUserCommandHandler.java

package es.um.atica.faker.users.application.command;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import es.um.atica.faker.users.application.service.UsersOriginCountryService;
import es.um.atica.faker.users.domain.factory.UsersFactory;
import es.um.atica.faker.users.domain.model.User;
import es.um.atica.faker.users.domain.model.UserAge;
import es.um.atica.faker.users.domain.model.UserId;
import es.um.atica.faker.users.domain.model.UserName;
import es.um.atica.faker.users.domain.model.UserOriginCountry;
import es.um.atica.faker.users.domain.repository.UsersReadRepository;
import es.um.atica.faker.users.domain.repository.UsersWriteRepository;
import es.um.atica.shared.domain.cqrs.SyncCommandHandler;
import es.um.atica.shared.domain.events.EventBus;

@Component
public class CreateUserCommandHandler implements SyncCommandHandler<Void,CreateUserCommand>{

    @Autowired
    private UsersWriteRepository usersWriteRepository;

    @Autowired
    private UsersReadRepository usersReadRepository;

    @Autowired
    private UsersOriginCountryService usersOriginCountryService;

    @Autowired
    private EventBus eventBus;

    @Override
    public Void handle(CreateUserCommand command) {
        // Idempotency
        usersReadRepository.findUser(command.getId())
            .ifPresentOrElse(
                (u)-> { throw new UnsupportedOperationException(String.format("Usuario ya creado %s",u.getId().getValue())); },
                () -> {
                    User usr = UsersFactory
                        .createUserWithDefaultPreferences(
                            UserId.of(command.getId()),
                            UserName.of(command.getName()),
                            UserAge.of(command.getAge()),
                            UserOriginCountry.of(usersOriginCountryService.getOriginCountry(command.getIPAddress())));
                    usr.createUser();
                    usersWriteRepository.saveUser(usr);
                    eventBus.publish(usr);
                }
            );
        return null;        
    }

}