package com.mossle.auth.subscribe;
import java.io.IOException;
import javax.annotation.Resource;
import com.mossle.api.user.UserDTO;
import com.mossle.auth.component.AuthCache;
import com.mossle.auth.persistence.domain.UserStatus;
import com.mossle.auth.persistence.manager.UserStatusManager;
import com.mossle.core.mapper.JsonMapper;
import com.mossle.core.subscribe.Subscribable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
@Transactional
@Component("com.mossle.auth.component.UserUpdatedSubscriber")
public class UserUpdatedSubscriber implements Subscribable<String> {
private static Logger logger = LoggerFactory
.getLogger(UserUpdatedSubscriber.class);
private String updateSql = "UPDATE AUTH_USER_STATUS SET USERNAME=? WHERE REF=? AND TENANT_ID=?";
private JsonMapper jsonMapper = new JsonMapper();
private String destinationName = "queue.user.sync.updated";
private JdbcTemplate jdbcTemplate;
private UserStatusManager userStatusManager;
private AuthCache authCache;
public void handleMessage(String message) {
UserDTO userDto = null;
String tenantId = null;
try {
userDto = jsonMapper.fromJson(message, UserDTO.class);
tenantId = userDto.getUserRepoRef();
jdbcTemplate.update(updateSql, userDto.getUsername(),
userDto.getId(), tenantId);
logger.info("update user : {}", message);
} catch (IOException ex) {
logger.error(ex.getMessage(), ex);
}
if (userDto != null) {
String hql = "from UserStatus where username=? and tenantId=?";
UserStatus userStatus = userStatusManager.findUnique(hql,
userDto.getUsername(), tenantId);
if (userStatus != null) {
authCache.evictUserStatus(userStatus);
logger.info("refresh cache : {}, {}", userStatus.getUsername(),
userStatus.getTenantId());
} else {
authCache.evictUser(userDto.getId());
logger.info("cannot find cache : {}", userDto.getUsername());
}
}
}
public boolean isTopic() {
return false;
}
public String getName() {
return destinationName;
}
public void setDestinationName(String destinationName) {
this.destinationName = destinationName;
}
@Resource
public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Resource
public void setUserStatusManager(UserStatusManager userStatusManager) {
this.userStatusManager = userStatusManager;
}
@Resource
public void setAuthCache(AuthCache authCache) {
this.authCache = authCache;
}
}