package com.cajp.giros.web.websocket;
import com.cajp.giros.security.SecurityUtils;
import com.cajp.giros.web.websocket.dto.ActivityDTO;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationListener;
import org.springframework.messaging.Message;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.messaging.simp.SimpMessageSendingOperations;
import org.springframework.messaging.simp.stomp.StompHeaderAccessor;
import org.springframework.stereotype.Controller;
import org.springframework.web.socket.messaging.SessionDisconnectEvent;
import javax.inject.Inject;
import java.security.Principal;
import java.util.Calendar;
import static com.cajp.giros.config.WebsocketConfiguration.IP_ADDRESS;
@Controller
public class ActivityService implements ApplicationListener<SessionDisconnectEvent> {
private static final Logger log = LoggerFactory.getLogger(ActivityService.class);
private DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
@Inject
SimpMessageSendingOperations messagingTemplate;
@MessageMapping("/websocket/activity")
@SendTo("/topic/activity")
public ActivityDTO sendActivity(@Payload ActivityDTO activityDTO, StompHeaderAccessor stompHeaderAccessor, Principal principal) {
activityDTO.setUserLogin(SecurityUtils.getCurrentLogin());
activityDTO.setUserLogin(principal.getName());
activityDTO.setSessionId(stompHeaderAccessor.getSessionId());
activityDTO.setIpAddress(stompHeaderAccessor.getSessionAttributes().get(IP_ADDRESS).toString());
activityDTO.setTime(dateTimeFormatter.print(Calendar.getInstance().getTimeInMillis()));
log.debug("Sending user tracking data {}", activityDTO);
return activityDTO;
}
@MessageMapping("/websocket/tracker")
public ActivityDTO receiveActivity(@Payload ActivityDTO activityDTO) {
return activityDTO;
}
@Override
public void onApplicationEvent(SessionDisconnectEvent event) {
ActivityDTO activityDTO = new ActivityDTO();
Message message = event.getMessage();
activityDTO.setSessionId(event.getSessionId());
activityDTO.setPage("logout");
messagingTemplate.convertAndSend("/topic/activity", activityDTO);
}
}