Skip to content

Commit

Permalink
[TRELLO-2896] Fix slugs in pdfs / emails (#1877)
Browse files Browse the repository at this point in the history
  • Loading branch information
charlescd authored Feb 7, 2025
1 parent 0bf148c commit 24da626
Show file tree
Hide file tree
Showing 11 changed files with 117 additions and 43 deletions.
39 changes: 31 additions & 8 deletions app/controllers/AdminController.scala
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import models.event.Event
import models.report._
import models.report.sampledata.SampleDataService
import orchestrators.EmailNotificationOrchestrator
import orchestrators.ReportFileOrchestrator
import play.api.Logger
import play.api.i18n.Lang
import play.api.i18n.Messages
Expand All @@ -30,6 +29,8 @@ import repositories.event.EventRepositoryInterface
import repositories.ipblacklist.BlackListedIp
import repositories.ipblacklist.IpBlackListRepositoryInterface
import repositories.report.ReportRepositoryInterface
import repositories.subcategorylabel.SubcategoryLabel
import repositories.subcategorylabel.SubcategoryLabelRepositoryInterface
import services.AlbertService
import services.PDFService
import services.emails.EmailDefinitions.allEmailDefinitions
Expand Down Expand Up @@ -59,13 +60,13 @@ class AdminController(
pdfService: PDFService,
emailConfiguration: EmailConfiguration,
taskConfiguration: TaskConfiguration,
reportFileOrchestrator: ReportFileOrchestrator,
companyRepository: CompanyRepositoryInterface,
emailNotificationOrchestrator: EmailNotificationOrchestrator,
ipBlackListRepository: IpBlackListRepositoryInterface,
albertClassificationRepository: AlbertClassificationRepositoryInterface,
albertService: AlbertService,
sampleDataService: SampleDataService,
subcategoryLabelRepository: SubcategoryLabelRepositoryInterface,
implicit val frontRoute: FrontRoute,
authenticator: Authenticator[User],
controllerComponents: ControllerComponents
Expand Down Expand Up @@ -213,7 +214,10 @@ class AdminController(
} yield ()
}

private def _sendReportAckToConsumer(reportsMap: Map[Report, List[ReportFile]]) = {
private def _sendReportAckToConsumer(
reportsMap: Map[Report, List[ReportFile]],
subcategoryLabels: List[SubcategoryLabel]
) = {
val reports = reportsMap.keys.toList
for {
events <- eventRepository.fetchEventsOfReports(reports)
Expand All @@ -223,12 +227,15 @@ class AdminController(
val maybeCompany = report.companyId.flatMap(companyId => companies.find(_.id == companyId))
val event =
events.get(report.id).flatMap(_.find(_.action == Constants.ActionEvent.EMAIL_CONSUMER_ACKNOWLEDGMENT))
val subcategoryLabel =
subcategoryLabels.find(sl => sl.category == report.category && sl.subcategories == report.subcategories)

event match {
case Some(evt) =>
Some(
ConsumerReportAcknowledgment.Email(
report,
subcategoryLabel,
maybeCompany,
evt,
reportAttachements,
Expand All @@ -244,19 +251,35 @@ class AdminController(
} yield ()
}

private def _sendReportToDgccrfIfNeeded(
reportsMap: Map[Report, List[ReportFile]],
subcategoryLabels: List[SubcategoryLabel]
) = {
val reports = reportsMap.keys.toList

reports.traverse { report =>
val subcategoryLabel =
subcategoryLabels.find(sl => sl.category == report.category && sl.subcategories == report.subcategories)
emailNotificationOrchestrator.notifyDgccrfIfNeeded(report, subcategoryLabel)
}
}

def resend(start: OffsetDateTime, end: OffsetDateTime, emailType: ResendEmailType) =
SecuredAction.andThen(WithRole(UserRole.SuperAdmin)).async { implicit request =>
for {
reports <- reportRepository.getReportsWithFiles(
Some(request.identity),
ReportFilter(start = Some(start), end = Some(end))
)
reportsList = reports.keys.toList
subcategoryLabels <- reportsList
.traverse(report => subcategoryLabelRepository.get(report.category, report.subcategories))
.map(_.flatten)
_ <- emailType match {
case ResendEmailType.NewReportAckToConsumer => _sendReportAckToConsumer(reports.toMap)
case ResendEmailType.NewReportAckToPro => _sendNewReportToPro(reports.keys.toList)
case ResendEmailType.NotifyDGCCRF =>
Future.sequence(reports.keys.map(emailNotificationOrchestrator.notifyDgccrfIfNeeded))
case ResendEmailType.ReportProResponse => _sendProAckToConsumer(reports.keys.toList)
case ResendEmailType.NewReportAckToConsumer => _sendReportAckToConsumer(reports.toMap, subcategoryLabels)
case ResendEmailType.NewReportAckToPro => _sendNewReportToPro(reportsList)
case ResendEmailType.NotifyDGCCRF => _sendReportToDgccrfIfNeeded(reports.toMap, subcategoryLabels)
case ResendEmailType.ReportProResponse => _sendProAckToConsumer(reportsList)
}
} yield NoContent
}
Expand Down
17 changes: 11 additions & 6 deletions app/controllers/ReportController.scala
Original file line number Diff line number Diff line change
Expand Up @@ -274,21 +274,26 @@ class ReportController(
SecuredAction.andThen(WithRole(UserRole.AdminsAndReadOnly)).async { implicit request =>
for {
maybeReportWithMetadata <- reportRepository.getFor(Some(request.identity), uuid)
maybeReport = maybeReportWithMetadata.map(_.report)
company <- maybeReport.flatMap(_.companyId).flatTraverse(r => companyRepository.get(r))
company <- maybeReportWithMetadata.flatMap(_.report.companyId).flatTraverse(r => companyRepository.get(r))
files <- reportFileRepository.retrieveReportFiles(uuid)
events <- eventsOrchestrator.getReportsEvents(
reportId = uuid,
eventType = None,
user = request.identity
)
proResponseEvent = events.find(_.data.action == REPORT_PRO_RESPONSE)
source = maybeReport
.map { report =>
val lang = Lang(report.lang.getOrElse(Locale.FRENCH))
source = maybeReportWithMetadata
.map { reportWithMetadata =>
val lang = Lang(reportWithMetadata.report.lang.getOrElse(Locale.FRENCH))
implicit val messagesProvider: MessagesProvider = MessagesImpl(lang, controllerComponents.messagesApi)
val notificationHtml =
views.html.mails.consumer.reportAcknowledgment(report, company, files, isPDF = true)(
views.html.mails.consumer.reportAcknowledgment(
reportWithMetadata.report,
reportWithMetadata.subcategoryLabel,
company,
files,
isPDF = true
)(
frontRoute,
messagesProvider
)
Expand Down
3 changes: 2 additions & 1 deletion app/loader/SignalConsoApplicationLoader.scala
Original file line number Diff line number Diff line change
Expand Up @@ -467,6 +467,7 @@ class SignalConsoComponents(
companySyncService,
engagementRepository,
engagementOrchestrator,
subcategoryLabelRepository,
messagesApi
)

Expand Down Expand Up @@ -774,13 +775,13 @@ class SignalConsoComponents(
pdfService,
emailConfiguration,
taskConfiguration,
reportFileOrchestrator,
companyRepository,
emailNotificationOrchestrator,
ipBlackListRepository,
albertClassificationRepository,
albertService,
sampleDataService,
subcategoryLabelRepository,
frontRoute,
cookieAuthenticator,
controllerComponents
Expand Down
17 changes: 11 additions & 6 deletions app/orchestrators/EmailNotificationOrchestrator.scala
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import cats.implicits.toTraverseOps
import models.report.Report
import models.report.ReportTag
import play.api.Logger
import repositories.subcategorylabel.SubcategoryLabel
import repositories.subscription.SubscriptionRepositoryInterface
import services.emails.EmailDefinitionsDggcrf.DgccrfDangerousProductReportNotification
import services.emails.EmailDefinitionsDggcrf.DgccrfPriorityReportNotification
Expand All @@ -24,13 +25,17 @@ class EmailNotificationOrchestrator(mailService: MailService, subscriptionReposi
tag == ReportTag.ProduitDangereux || tag == ReportTag.BauxPrecaire || tag == ReportTag.Shrinkflation
)

private def getNotificationEmail(report: Report): Option[Seq[EmailAddress] => BaseEmail] = {
private def getNotificationEmail(
report: Report,
subcategoryLabel: Option[SubcategoryLabel]
): Option[Seq[EmailAddress] => BaseEmail] = {
val maybeTag = shouldNotifyDgccrf(report)

maybeTag match {
case Some(ReportTag.ProduitDangereux) => Some(DgccrfDangerousProductReportNotification.Email(_, report))
case Some(tag) => Some(DgccrfPriorityReportNotification.Email(_, report, tag.translate()))
case None => None
case Some(ReportTag.ProduitDangereux) =>
Some(DgccrfDangerousProductReportNotification.Email(_, report, subcategoryLabel))
case Some(tag) => Some(DgccrfPriorityReportNotification.Email(_, report, subcategoryLabel, tag.translate()))
case None => None
}
}

Expand Down Expand Up @@ -67,8 +72,8 @@ class EmailNotificationOrchestrator(mailService: MailService, subscriptionReposi
}
}

def notifyDgccrfIfNeeded(report: Report): Future[Unit] =
getNotificationEmail(report) match {
def notifyDgccrfIfNeeded(report: Report, subcategoryLabel: Option[SubcategoryLabel]): Future[Unit] =
getNotificationEmail(report, subcategoryLabel) match {
case Some(email) =>
for {
ddEmails <- getDDEmails(report)
Expand Down
25 changes: 20 additions & 5 deletions app/orchestrators/ReportOrchestrator.scala
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ import repositories.report.ReportRepositoryInterface
import repositories.reportmetadata.ReportMetadataRepositoryInterface
import repositories.socialnetwork.SocialNetworkRepositoryInterface
import repositories.subcategorylabel.SubcategoryLabel
import repositories.subcategorylabel.SubcategoryLabelRepositoryInterface
import repositories.user.UserRepositoryInterface
import repositories.website.WebsiteRepositoryInterface
import services.emails.EmailDefinitionsConsumer.ConsumerProResponseNotification
Expand Down Expand Up @@ -94,6 +95,7 @@ class ReportOrchestrator(
companySyncService: CompanySyncServiceInterface,
engagementRepository: EngagementRepositoryInterface,
engagementOrchestrator: EngagementOrchestrator,
subcategoryLabelRepository: SubcategoryLabelRepositoryInterface,
messagesApi: MessagesApi
)(implicit val executionContext: ExecutionContext) {
val logger = Logger(this.getClass)
Expand Down Expand Up @@ -345,13 +347,14 @@ class ReportOrchestrator(
reportCreationDate,
expirationDate
)
report <- reportRepository.create(reportToCreate)
report <- reportRepository.create(reportToCreate)
maybeSubcategoryLabel <- subcategoryLabelRepository.get(report.category, report.subcategories)
_ = logger.debug(s"Created report with id ${report.id}")
_ <- createReportMetadata(draftReport, report, consumerIp)
files <- reportFileOrchestrator.attachFilesToReport(draftReport.fileIds, report.id)
updatedReport <- notifyProfessionalIfNeeded(maybeCompany, report)
_ <- emailNotificationOrchestrator.notifyDgccrfIfNeeded(updatedReport)
_ <- notifyConsumer(updatedReport, maybeCompany, files)
_ <- emailNotificationOrchestrator.notifyDgccrfIfNeeded(updatedReport, maybeSubcategoryLabel)
_ <- notifyConsumer(updatedReport, maybeSubcategoryLabel, maybeCompany, files)
_ = logger.debug(s"Report ${updatedReport.id} created")
} yield updatedReport

Expand Down Expand Up @@ -383,7 +386,12 @@ class ReportOrchestrator(
baseDate.plus(delay)
}

private def notifyConsumer(report: Report, maybeCompany: Option[Company], reportAttachements: List[ReportFile]) = {
private def notifyConsumer(
report: Report,
maybeSubcategoryLabel: Option[SubcategoryLabel],
maybeCompany: Option[Company],
reportAttachements: List[ReportFile]
) = {
val event = Event(
UUID.randomUUID(),
Some(report.id),
Expand All @@ -395,7 +403,14 @@ class ReportOrchestrator(
)
for {
_ <- mailService.send(
ConsumerReportAcknowledgment.Email(report, maybeCompany, event, reportAttachements, messagesApi)
ConsumerReportAcknowledgment.Email(
report,
maybeSubcategoryLabel,
maybeCompany,
event,
reportAttachements,
messagesApi
)
)
_ <- eventRepository.create(event)
} yield ()
Expand Down
17 changes: 16 additions & 1 deletion app/services/emails/EmailDefinitionsConsumer.scala
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import play.api.i18n.MessagesApi
import play.api.i18n.MessagesImpl
import play.api.i18n.MessagesProvider
import play.api.libs.mailer.Attachment
import repositories.subcategorylabel.SubcategoryLabel
import services.AttachmentService
import services.emails.EmailCategory.Consumer
import services.emails.EmailsExamplesUtils._
Expand Down Expand Up @@ -52,6 +53,7 @@ object EmailDefinitionsConsumer {
"report_ack" -> ((recipient, messagesApi) =>
Email(
genReport.copy(email = recipient),
None,
Some(genCompany),
genEvent,
Nil,
Expand All @@ -62,6 +64,7 @@ object EmailDefinitionsConsumer {
((recipient, messagesApi) =>
Email(
genReport.copy(status = ReportStatus.NA, tags = List(ReportTag.ReponseConso), email = recipient),
None,
Some(genCompany),
genEvent,
Nil,
Expand All @@ -72,6 +75,7 @@ object EmailDefinitionsConsumer {
((recipient, messagesApi) =>
Email(
genReport.copy(tags = List(ReportTag.LitigeContractuel), email = recipient),
None,
Some(genCompany),
genEvent,
Nil,
Expand All @@ -86,6 +90,7 @@ object EmailDefinitionsConsumer {
tags = List(ReportTag.ProduitDangereux, ReportTag.BauxPrecaire),
email = recipient
),
None,
Some(genCompany),
genEvent,
Nil,
Expand All @@ -100,6 +105,7 @@ object EmailDefinitionsConsumer {
companyAddress = Address(country = Some(Country.Italie)),
email = recipient
),
None,
Some(genCompany),
genEvent,
Nil,
Expand All @@ -115,6 +121,7 @@ object EmailDefinitionsConsumer {
companyAddress = Address(country = Some(Country.Islande)),
email = recipient
),
None,
Some(genCompany),
genEvent,
Nil,
Expand All @@ -129,6 +136,7 @@ object EmailDefinitionsConsumer {
companyAddress = Address(country = Some(Country.Andorre)),
email = recipient
),
None,
Some(genCompany),
genEvent,
Nil,
Expand All @@ -144,6 +152,7 @@ object EmailDefinitionsConsumer {
companyAddress = Address(country = Some(Country.Andorre)),
email = recipient
),
None,
Some(genCompany),
genEvent,
Nil,
Expand All @@ -158,6 +167,7 @@ object EmailDefinitionsConsumer {
companyAddress = Address(country = Some(Country.Suisse)),
email = recipient
),
None,
Some(genCompany),
genEvent,
Nil,
Expand All @@ -172,6 +182,7 @@ object EmailDefinitionsConsumer {
companyAddress = Address(country = Some(Country.Suisse)),
email = recipient
),
None,
Some(genCompany),
genEvent,
Nil,
Expand All @@ -186,6 +197,7 @@ object EmailDefinitionsConsumer {
email = recipient,
tags = List(ReportTag.CompagnieAerienne)
),
None,
Some(genCompany),
genEvent,
Nil,
Expand All @@ -200,6 +212,7 @@ object EmailDefinitionsConsumer {
companyAddress = Address(country = Some(Country.Bahamas)),
email = recipient
),
None,
Some(genCompany),
genEvent,
Nil,
Expand All @@ -214,6 +227,7 @@ object EmailDefinitionsConsumer {
companyAddress = Address(country = Some(Country.Bahamas)),
email = recipient
),
None,
Some(genCompany),
genEvent,
Nil,
Expand All @@ -224,6 +238,7 @@ object EmailDefinitionsConsumer {

final case class Email(
report: Report,
subcategoryLabel: Option[SubcategoryLabel],
maybeCompany: Option[Company],
event: Event,
files: Seq[ReportFile],
Expand All @@ -237,7 +252,7 @@ object EmailDefinitionsConsumer {

override def getBody: (FrontRoute, EmailAddress) => String = (frontRoute, _) =>
views.html.mails.consumer
.reportAcknowledgment(report, maybeCompany, files.toList)(frontRoute, messagesProvider)
.reportAcknowledgment(report, subcategoryLabel, maybeCompany, files.toList)(frontRoute, messagesProvider)
.toString

override def getAttachements: AttachmentService => Seq[Attachment] =
Expand Down
Loading

0 comments on commit 24da626

Please sign in to comment.