UserDetailsMapper.java
package com.seebie.server.mapper.entitytodto;
import com.seebie.server.security.AppUserDetails;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import com.seebie.server.entity.Role;
import com.seebie.server.entity.User;
import static org.springframework.security.core.userdetails.User.builder;
import java.util.Collection;
import java.util.Set;
import java.util.function.Function;
public class UserDetailsMapper implements Function<User, UserDetails> {
    @Override
    public AppUserDetails apply(User u) {
        return new AppUserDetails(u.getEmail(), u.getPublicId(), u.getPassword(), createAuthorities(u));
    }
    private Collection<? extends GrantedAuthority> createAuthorities(User u) {
        return toAuthorities(toNames(u.getRoles()));
    }
    private String[] toNames(Set<Role> roles) {
        return roles.stream()
                .map(Role::name)
                .toArray(String[]::new);
    }
    public static Collection<? extends GrantedAuthority> toAuthorities(String[] roles) {
        // leverage Spring Security's method so we get updates if anything changes
        return builder().username(" ").password("").roles(roles).build().getAuthorities();
    }
}