package opensnap.web;
import opensnap.Queue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.handler.annotation.DestinationVariable;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.messaging.simp.annotation.SendToUser;
import org.springframework.messaging.simp.annotation.SubscribeMapping;
import org.springframework.stereotype.Controller;
import opensnap.domain.User;
import opensnap.service.UserService;
import java.security.Principal;
import java.util.Set;
import java.util.stream.Collectors;
@Controller
@MessageMapping("/usr")
public class UserController extends AbstractStompController {
private final UserService userService;
private final SimpMessagingTemplate template;
@Autowired
public UserController(UserService userService, SimpMessagingTemplate template) {
this.userService = userService;
this.template = template;
}
@MessageMapping("/signup")
public void signup(User user, Principal principal) {
userService.signup(user).thenAccept(createdUser ->
template.convertAndSendToUser(principal.getName(), Queue.USER_CREATED, createdUser)
);
}
@MessageMapping("/authenticated")
public void getAuthenticatedUser(Principal principal) {
userService.getByUsername(principal.getName()).thenAccept(user ->
template.convertAndSendToUser(principal.getName(), Queue.USER_AUTHENTICATED, user.withoutPassword())
);
}
@SubscribeMapping("/all")
public void getAllUsers(Principal principal) {
userService.getAllUsers().thenAccept(users ->
template.convertAndSendToUser(principal.getName(), Queue.USER_ALL, users.stream().map((u -> u.withoutPasswordAndRoles())).collect(Collectors.toSet()))
);
}
}