argos/notification-service/notification/src/main/java/gr/cite/notification/service/notify/InAppNotifier.java

92 lines
3.9 KiB
Java

package gr.cite.notification.service.notify;
import gr.cite.notification.common.JsonHandlingService;
import gr.cite.notification.common.enums.IsActive;
import gr.cite.notification.common.enums.NotificationContactType;
import gr.cite.notification.common.enums.NotificationInAppTracking;
import gr.cite.notification.common.scope.tenant.TenantScope;
import gr.cite.notification.common.types.notification.InAppTrackingData;
import gr.cite.notification.data.InAppNotificationEntity;
import gr.cite.notification.service.contact.model.Contact;
import gr.cite.notification.service.contact.model.InAppContact;
import gr.cite.notification.service.message.model.InAppMessage;
import gr.cite.notification.service.message.model.Message;
import gr.cite.tools.logging.LoggerService;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.EntityTransaction;
import java.time.Instant;
import java.util.UUID;
@Component
public class InAppNotifier implements Notify{
private final static LoggerService logger = new LoggerService(LoggerFactory.getLogger(InAppNotifier.class));
private final JsonHandlingService jsonHandlingService;
private final ApplicationContext applicationContext;
@Autowired
public InAppNotifier(JsonHandlingService jsonHandlingService, ApplicationContext applicationContext) {
this.jsonHandlingService = jsonHandlingService;
this.applicationContext = applicationContext;
}
@Override
public String notify(Contact contact, Message message) {
String data = null;
EntityManager entityManager = null;
EntityTransaction transaction = null;
try {
EntityManagerFactory entityManagerFactory = this.applicationContext.getBean(EntityManagerFactory.class);
entityManager = entityManagerFactory.createEntityManager();
transaction = entityManager.getTransaction();
transaction.begin();
InAppContact inAppContact = (InAppContact) contact;
if (inAppContact == null) throw new IllegalArgumentException("contact not provided");
InAppMessage inAppMessage = (InAppMessage) message;
if (inAppMessage == null) throw new IllegalArgumentException("message not provided");
TenantScope tenantScope = applicationContext.getBean(TenantScope.class);
InAppNotificationEntity inApp = new InAppNotificationEntity();
inApp.setId(UUID.randomUUID());
inApp.setUserId(inAppContact.getUserId());
inApp.setIsActive(IsActive.Active);
inApp.setType(inAppMessage.getType());
inApp.setTrackingState(NotificationInAppTracking.STORED);
inApp.setPriority(inAppMessage.getPriority());
inApp.setSubject(inAppMessage.getSubject());
inApp.setBody(inAppMessage.getBody());
inApp.setExtraData(inAppMessage.getExtraData() != null ? this.jsonHandlingService.toJsonSafe(inAppMessage.getExtraData()) : null);
inApp.setCreatedAt(Instant.now());
inApp.setUpdatedAt(Instant.now());
inApp.setTenantId(tenantScope.getTenant());
entityManager.persist(inApp);
entityManager.flush();
InAppTrackingData trackingData = new InAppTrackingData(inApp.getId());
data = this.jsonHandlingService.toJsonSafe(trackingData);
transaction.commit();
} catch (Exception e) {
if (transaction != null) transaction.rollback();
logger.error(e.getMessage(), e);
} finally {
if (entityManager != null) entityManager.close();
}
return data;
}
@Override
public NotificationContactType supports() {
return NotificationContactType.IN_APP;
}
}