package opensnap.web;
import opensnap.Queue;
import opensnap.domain.Snap;
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.SubscribeMapping;
import org.springframework.stereotype.Controller;
import opensnap.service.SnapService;
import java.security.Principal;
import java.util.List;
import java.util.stream.Collectors;
@Controller
@MessageMapping("/snap")
public class SnapController extends AbstractStompController {
private final SnapService snapService;
private final SimpMessagingTemplate template;
@Autowired
public SnapController(SnapService snapService, SimpMessagingTemplate template) {
this.snapService = snapService;
this.template = template;
}
@MessageMapping("/create")
void create(Snap snap, Principal principal) {
snapService.create(snap).thenAccept(createdSnap ->
template.convertAndSendToUser(principal.getName(), Queue.SNAP_CREATED, createdSnap)
);
}
@MessageMapping("/id/{id}")
void getById(@DestinationVariable String id, Principal principal) {
snapService.getById(id).thenAccept(snap ->
template.convertAndSendToUser(principal.getName(), Queue.SNAP_BY_ID, snap)
);
}
@MessageMapping("/received")
void getReceivedSnaps(Principal principal) {
snapService.getSnapsFromRecipient(principal.getName()).thenAccept(snaps -> {
List<Snap> filteredSnaps = snaps.stream().map((s -> s.withoutPhotoAndRecipients())).collect(Collectors.toList());
template.convertAndSendToUser(principal.getName(), Queue.SNAPS_RECEIVED, filteredSnaps);
});
}
@MessageMapping("/sent")
void getSentSnaps(Principal principal) {
snapService.getSnapsFromAuthor(principal.getName()).thenAccept(snaps -> {
List<Snap> filteredSnaps = snaps.stream().map((s -> s.withoutPhoto())).collect(Collectors.toList());
template.convertAndSendToUser(principal.getName(), Queue.SNAPS_SENT, filteredSnaps);
});
}
@SubscribeMapping("/delete/{id}")
void delete(@DestinationVariable String id) {
snapService.delete(id);
}
@SubscribeMapping("/delete-for-authenticated-user/{id}")
void deleteForUser(@DestinationVariable String id, Principal principal) {
snapService.delete(id, principal.getName());
}
}