Skip to content

Commit

Permalink
[SELC-5166] Refactor mongodb query to use reactive method
Browse files Browse the repository at this point in the history
  • Loading branch information
flaminiaScarciofolo committed Jul 9, 2024
1 parent 2249f08 commit cd938f2
Show file tree
Hide file tree
Showing 9 changed files with 147 additions and 108 deletions.
53 changes: 53 additions & 0 deletions apps/institution-send-mail-scheduler/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# syntax=docker/dockerfile:1.6@sha256:ac85f380a63b13dfcefa89046420e1781752bab202122f8f50032edf31be0021
FROM maven:3-eclipse-temurin-17@sha256:0d328fa6843bb26b60cf44d69833f241ffe96218fb29fa19df7a6603863eaae7 AS builder

WORKDIR /src
COPY --link pom.xml .

WORKDIR /src/test-coverage
COPY --link ./test-coverage/pom.xml .

WORKDIR /src/apps
COPY --link ./apps/pom.xml .

WORKDIR /src/apps/institution-send-mail-scheduler
COPY --link ./apps/institution-send-mail-scheduler/pom.xml .
COPY ./apps/institution-send-mail-scheduler/src/main/ ./src/main/

WORKDIR /src

RUN echo "<settings>\n" \
"<servers>\n" \
"<server>\n" \
"<id>\${repositoryId}</id>\n" \
"<username>\${repoLogin}</username>\n" \
"<password>\${repoPwd}</password>\n" \
"</server>\n" \
"</servers>\n" \
"</settings>\n" > settings.xml

ARG REPO_ONBOARDING
ARG REPO_USERNAME
ARG REPO_PASSWORD

RUN mvn --global-settings settings.xml --projects :institution-send-mail-scheduler -DrepositoryId=${REPO_ONBOARDING} -DrepoLogin=${REPO_USERNAME} -DrepoPwd=${REPO_PASSWORD} --also-make clean package -DskipTests

FROM openjdk:17-jdk@sha256:528707081fdb9562eb819128a9f85ae7fe000e2fbaeaf9f87662e7b3f38cb7d8 AS runtime

ENV LANG='en_US.UTF-8' LANGUAGE='en_US:en'
ENV JAVA_OPTIONS="-Dquarkus.http.host=0.0.0.0 -Djava.util.logging.manager=org.jboss.logmanager.LogManager"

WORKDIR /app

COPY --from=builder /src/apps/institution-send-mail-scheduler/target/quarkus-app/lib/ ./lib/
COPY --from=builder /src/apps/institution-send-mail-scheduler/target/quarkus-app/*.jar ./
COPY --from=builder /src/apps/institution-send-mail-scheduler/target/quarkus-app/app/ ./app/
COPY --from=builder /src/apps/institution-send-mail-scheduler/target/quarkus-app/quarkus/ ./quarkus/

ADD https://github.com/microsoft/ApplicationInsights-Java/releases/download/3.2.11/applicationinsights-agent-3.2.11.jar ./applicationinsights-agent.jar
RUN chmod 755 ./applicationinsights-agent.jar

EXPOSE 8080
USER 1001

ENTRYPOINT ["sh", "-c", "java $JAVA_OPTIONS -jar /app/quarkus-run.jar"]
7 changes: 6 additions & 1 deletion apps/institution-send-mail-scheduler/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
<quarkus.platform.version>3.11.3</quarkus.platform.version>
<skipITs>true</skipITs>
<surefire-plugin.version>3.1.2</surefire-plugin.version>
<onboarding-sdk.version>0.1.16</onboarding-sdk.version>
<onboarding-sdk.version>0.1.14</onboarding-sdk.version>
<quarkus-openapi-generator.version>2.4.2</quarkus-openapi-generator.version>
</properties>
<dependencyManagement>
Expand Down Expand Up @@ -129,6 +129,11 @@
<version>4.13.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-storage-blob</artifactId>
<version>12.14.0</version>
</dependency>
</dependencies>
<build>
<plugins>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,28 +6,17 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import io.quarkus.runtime.StartupEvent;
import io.vertx.core.impl.logging.Logger;
import io.vertx.core.impl.logging.LoggerFactory;
import io.vertx.core.json.jackson.DatabindCodec;
import it.pagopa.selfcare.azurestorage.AzureBlobClient;
import it.pagopa.selfcare.azurestorage.AzureBlobClientDefault;
import it.pagopa.selfcare.institution.repository.PecNotificationsRepository;
import it.pagopa.selfcare.product.service.ProductService;
import it.pagopa.selfcare.product.service.ProductServiceDefault;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.event.Observes;
import jakarta.enterprise.inject.Produces;

@ApplicationScoped
public class InstitutionSendMailConfig {

private static final Logger log = LoggerFactory.getLogger(InstitutionSendMailConfig.class);

void onStart(@Observes StartupEvent ev, PecNotificationsRepository repository) {
log.info(String.format("Database %s is starting...", repository.mongoDatabase().getName()));
}

@Produces
public ObjectMapper objectMapper(){
ObjectMapper mapper = DatabindCodec.mapper();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,48 +1,22 @@
package it.pagopa.selfcare.institution.entity;

import io.quarkus.mongodb.panache.common.MongoEntity;
import lombok.Getter;
import org.bson.codecs.pojo.annotations.BsonId;
import io.quarkus.mongodb.panache.reactive.ReactivePanacheMongoEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.FieldNameConstants;
import org.bson.types.ObjectId;

@Getter
@MongoEntity(collection="pecNotification")
public class PecNotification {
@BsonId
@EqualsAndHashCode(callSuper = true)
@Data
@FieldNameConstants(asEnum = true)
@MongoEntity(collection="PecNotification")
public class PecNotification extends ReactivePanacheMongoEntity{

private ObjectId id;
private Integer moduleDayOfTheEpoch;
private String productId;
private String institutionId;
private String institutionMail;

public void setInstitutionMail(String institutionMail) {
this.institutionMail = institutionMail;
}

public void setId(ObjectId id) {
this.id = id;
}

public void setModuleDayOfTheEpoch(Integer moduleDayOfTheEpoch) {
this.moduleDayOfTheEpoch = moduleDayOfTheEpoch;
}

public void setProductId(String productId) {
this.productId = productId;
}

public void setInstitutionId(String institutionId) {
this.institutionId = institutionId;
}

@Override
public String toString() {
return "PecNotification{" +
"id=" + id +
", moduleDayOfTheEpoch=" + moduleDayOfTheEpoch +
", productId='" + productId + '\'' +
", institutionId='" + institutionId + '\'' +
", institutionMail='" + institutionMail + '\'' +
'}';
}
private String createdAt;
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
package it.pagopa.selfcare.institution.service;

import io.quarkus.mongodb.panache.PanacheQuery;
import io.quarkus.mongodb.panache.reactive.ReactivePanacheMongoEntityBase;
import io.smallrye.mutiny.Multi;
import io.smallrye.mutiny.Uni;
import io.vertx.core.impl.logging.Logger;
import io.vertx.core.impl.logging.LoggerFactory;
import it.pagopa.selfcare.institution.entity.PecNotification;
import it.pagopa.selfcare.institution.repository.PecNotificationsRepository;
import it.pagopa.selfcare.product.entity.Product;
import it.pagopa.selfcare.product.service.ProductService;
import jakarta.enterprise.context.ApplicationScoped;
Expand All @@ -24,22 +23,19 @@ public class InstitutionSendMailScheduledServiceImpl implements InstitutionSendM
private static final Logger log = LoggerFactory.getLogger(InstitutionSendMailScheduledServiceImpl.class);

private static final String PRODUCT_PLACEHOLDER = "nome_prodotto";
private final PecNotificationsRepository pecNotificationsRepository;
private final MailServiceImpl mailService;
private final String templateMail;
private final ProductService productService;
private final String startDate;
private final Integer sendingFrequency;
private final Integer querySize;

public InstitutionSendMailScheduledServiceImpl(PecNotificationsRepository pecNotificationsRepository,
MailServiceImpl mailService,
public InstitutionSendMailScheduledServiceImpl(MailServiceImpl mailService,
@ConfigProperty(name = "institution-send-mail.notification-path") String templateMail,
@ConfigProperty(name = "institution-send-mail.notification-sending-frequency") Integer sendingFrequency,
@ConfigProperty(name = "institution-send-mail.notification-start-date") String startDate,
ProductService productService,
@ConfigProperty(name = "institution-send-mail.notification-query-size") Integer querySize) {
this.pecNotificationsRepository = pecNotificationsRepository;
this.mailService = mailService;
this.templateMail = templateMail;
this.productService = productService;
Expand All @@ -57,31 +53,41 @@ public Uni<Integer> retrieveInstitutionFromPecNotificationAndSendMail() {

public Uni<Integer> retrieveFilteredAndPaginatedPecNotification(Long moduleDayOfTheEpoch, int page, int size) {
log.info("Retrieving page " + page + " of PecNotification");
PanacheQuery<PecNotification> query = pecNotificationsRepository.find("moduleDayOfTheEpoch", moduleDayOfTheEpoch)

var pecNotificationPage = PecNotification.find(PecNotification.Fields.moduleDayOfTheEpoch.name(), moduleDayOfTheEpoch)
.page(page, size);
if(query.hasNextPage()) {
return retrievePecNotificationListAndSendMail(query)
.onItem().transformToUni(unused -> retrieveFilteredAndPaginatedPecNotification(moduleDayOfTheEpoch, page + 1, size))
.replaceWith(0);
}else{
return retrievePecNotificationListAndSendMail(query)
.replaceWith(0);
}

return Uni.combine().all()
.unis(pecNotificationPage.hasNextPage(), pecNotificationPage.list())
.asTuple()
.onItem().transformToUni(tuple -> {
if(tuple.getItem1()) {
return retrievePecNotificationListAndSendMail(tuple.getItem2())
.onItem().transformToUni(unused -> retrieveFilteredAndPaginatedPecNotification(moduleDayOfTheEpoch, page + 1, size))
.replaceWith(0);
}else{
return retrievePecNotificationListAndSendMail(tuple.getItem2())
.replaceWith(0);
}
})
.onFailure().invoke(throwable -> log.error("Error during send scheduled mail", throwable));

}

private Uni<Void> retrievePecNotificationListAndSendMail(PanacheQuery<PecNotification> query) {
return Multi.createFrom().iterable(query.list())
private Uni<Void> retrievePecNotificationListAndSendMail(List<ReactivePanacheMongoEntityBase> query) {
return Multi.createFrom().iterable(query)
.onItem().transform(entityBase -> (PecNotification) entityBase)
.onItem().transformToUniAndMerge(this::constructAndSendMail)
.onFailure().invoke(throwable -> log.error("Error during send scheduled mail", throwable))
.collect().asList()
.onItem().invoke(list -> log.info("Mail sent to institutions"))
.replaceWith(Uni.createFrom().voidItem());
}

private Uni<Void> constructAndSendMail(PecNotification pecNotification) {
Product product = productService.getProduct(pecNotification.getProductId());
Map<String, String> mailParameters = retrieveMailParameters(product.getTitle());
mailService.sendMailWithFile(List.of(pecNotification.getInstitutionMail()), templateMail, mailParameters, null, null);
log.info("Mail sent to institutions");
return Uni.createFrom().voidItem();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
quarkus.mongodb.database=pecNotification

institution-send-mail.connection-string = ${MONGODB-CONNECTION-STRING:http://localhost:8080}
quarkus.mongodb.connection-string = ${MONGODB-CONNECTION-STRING}
quarkus.mongodb.database = selcMsCore
## MAIL
institution-send-mail.sender-mail = ${MAIL_SENDER_ADDRESS:[email protected]}
## In PROD env must be false for sending real mail
institution-send-mail.destination-mail = ${MAIL_DESTINATION_TEST:true}
institution-send-mail.destination-mail = ${MAIL_DESTINATION_TEST:false}
## If MAIL_DESTINATION_TEST is true, app send mail to this address
institution-send-mail.destination-mail-test-address = ${MAIL_DESTINATION_TEST_ADDRESS:[email protected]}

institution-send-mail.notification-path= ${MAIL_TEMPLATE_NOTIFICATION_PATH:test.json}

institution-send-mail.notification-query-size = 1000
institution-send-mail.notification-query-size = 1
institution-send-mail.notification-sending-frequency = 30
institution-send-mail.notification-start-date = 2024-01-01

Expand Down
Loading

0 comments on commit cd938f2

Please sign in to comment.