package com.allanditzel.dashboard.service.user; import com.allanditzel.dashboard.controller.user.UserBuilder; import com.allanditzel.dashboard.exception.ApplicationException; import com.allanditzel.dashboard.exception.UnknownResourceException; import com.allanditzel.dashboard.model.StormpathUserMapping; import com.allanditzel.dashboard.model.User; import com.allanditzel.dashboard.persistence.StormpathUserMappingRepository; import com.allanditzel.dashboard.service.account.AccountService; import com.stormpath.sdk.account.Account; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.Assert; import java.util.ArrayList; import java.util.List; /** * JPA and Stormpath specific implementation of {@link com.allanditzel.dashboard.service.user.UserService}. * * @since 1.0 */ @Service public class JpaAndStormpathUserService implements UserService { @Autowired private StormpathUserMappingRepository userMappingRepo; @Autowired private AccountService accountService; @Override public User getById(String id) { Assert.hasText(id); StormpathUserMapping mapping = userMappingRepo.findOne(id); return getUser(mapping); } @Override public User getByHref(String href) { Assert.hasText(href); StormpathUserMapping mapping = userMappingRepo.findByStormpathUrlIgnoreCase(href); return getUser(mapping); } @Override public User getByUsername(String username) { Assert.hasText(username); StormpathUserMapping mapping = userMappingRepo.findByUsernameIgnoreCase(username); return getUser(mapping); } @Override public User createUser(User user) { Assert.notNull(user, "User parameter cannot be null."); Account account = accountService.createAccountFromUser(user); if (account == null) { throw new ApplicationException("Could not create user " + user.getUsername() + " in Stormpath."); } StormpathUserMapping mapping = new StormpathUserMapping(account.getUsername(), account.getHref()); mapping = userMappingRepo.save(mapping); user.setId(mapping.getId()); return user; } @Override public List<User> getAllUsers() { List<User> users = new ArrayList<>(); List<Account> accounts = accountService.getAllAccounts(); for (Account account : accounts) { users.add(getUser(account)); } return users; } /** * Returns a {@link com.allanditzel.dashboard.model.User} object for the given Stormpath {@code Account}. * * @param account the Stormpath account we want a {@link com.allanditzel.dashboard.model.User} for * @return the {@link com.allanditzel.dashboard.model.User} representing the Stormpath {@code Account}. */ private User getUser(Account account) { Assert.notNull(account, "Account object cannot be null."); UserBuilder userBuilder = new UserBuilder(); StormpathUserMapping mapping = userMappingRepo.findByUsernameIgnoreCase(account.getUsername()); if (mapping == null) { mapping = new StormpathUserMapping(account.getUsername(), account.getHref()); mapping = userMappingRepo.save(mapping); } return userBuilder.addStormpathAccount(account).addStormpathUserMapping(mapping).build(); } private User getUser(StormpathUserMapping mapping) { if (mapping == null) { throw new UnknownResourceException("Mapping not found"); } Account account = accountService.getAccountByUrl(mapping.getStormpathUrl()); if (account == null) { throw new UnknownResourceException("Acount not find account in Stormpath."); } UserBuilder userBuilder = new UserBuilder(); return userBuilder.addStormpathAccount(account).addStormpathUserMapping(mapping).build(); } }