Skip to content

Commit

Permalink
vastaanottajien suodatus sähköpostiosoitteella, pientä koodin siistintää
Browse files Browse the repository at this point in the history
  • Loading branch information
marjakari committed Feb 14, 2024
1 parent 111b9e6 commit ff939cb
Show file tree
Hide file tree
Showing 14 changed files with 207 additions and 122 deletions.
86 changes: 51 additions & 35 deletions integraatio/src/test/scala/fi/oph/viestinvalitys/LocalUtil.scala
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@ import software.amazon.awssdk.services.ses.model.{ConfigurationSet, CreateConfig
import software.amazon.awssdk.services.sns.model.{CreateTopicRequest, SubscribeRequest}
import software.amazon.awssdk.services.sqs.model.{CreateQueueRequest, ListQueuesRequest}
import com.amazonaws.services.lambda.runtime.{ClientContext, CognitoIdentity, Context, LambdaLogger}
import fi.oph.viestinvalitys.business.{KantaOperaatiot, Kayttooikeus, Kieli, Kontakti, Prioriteetti, SisallonTyyppi}
import fi.oph.viestinvalitys.business.{KantaOperaatiot, Kayttooikeus, Kieli, Kontakti, Prioriteetti, SisallonTyyppi, VastaanottajanTila}
import fi.oph.viestinvalitys.vastaanotto.security.SecurityConstants
import org.slf4j.LoggerFactory

import java.util.UUID
import scala.Range
Expand Down Expand Up @@ -41,6 +42,8 @@ case class TestAwsContext(
*/
object LocalUtil {

val LOG = LoggerFactory.getLogger(classOf[LocalUtil])

final val LOCAL_ATTACHMENTS_BUCKET_NAME = "local-viestinvalityspalvelu-attachments";

final val LOCAL_SKANNAUS_QUEUE_NAME = "local-viestinvalityspalvelu-skannaus"
Expand Down Expand Up @@ -164,29 +167,59 @@ object LocalUtil {
val kantaOperaatiot = new KantaOperaatiot(DbUtil.database)
val lahetyksia = kantaOperaatiot.getLahetykset(Option.empty, Option.apply(20), Set(kayttooikeus))
if(lahetyksia.isEmpty || lahetyksia.length < 3) {
// lähetyksiä massaviestillä jossa samalla viestillä useita vastaanottajia
Range(0, 20).map(counter => {
val lahetys2 = kantaOperaatiot.tallennaLahetys(
"Massalähetysotsikko "+counter,
"omistaja",
"hakemuspalvelu",
Option.apply("0.1.2.3"),
Kontakti(Option.apply("Joku Virkailija"), "[email protected]"),
Option.apply("[email protected]"),
Prioriteetti.NORMAALI,
365
)
kantaOperaatiot.tallennaViesti("Massaviestin " + counter +" testiotsikko",
"Massaviestin sisältö",
SisallonTyyppi.TEXT,
Set(Kieli.FI),
Map.empty, // maskit
Option.empty, // läh. oid
Option.empty, // lähettäjä
Option.empty, // replyto
Range(0, 20).map(suffix => Kontakti(Option.apply("Joku Vastaanottaja" + suffix), "vastaanottaja" + suffix + "@example.com")),
Seq.empty,
Option.empty,
Option.apply(lahetys2.tunniste),
Option.apply(Prioriteetti.NORMAALI),
Option.apply(365),
Set(kayttooikeus),
Map("avain" -> Seq("arvo")),
"omistaja")
})
// lähetyksiä joissa räätälöity viesti useilla vastaanottajilla
Range(0, 25).map(counter => {
Range(0, 6).map(counter => {
val lahetys = kantaOperaatiot.tallennaLahetys(
"Testiotsikko "+counter,
"Räätälöidyn massaviestin " + counter + " testiotsikko",
"omistaja",
"hakemuspalvelu",
Option.apply("0.1.2.3"),
Kontakti(Option.apply("Testi Virkailija"+counter), "[email protected]"),
Kontakti(Option.apply("Testi Virkailija" + counter), "[email protected]"),
Option.apply("[email protected]"),
Prioriteetti.NORMAALI,
365
)
// räätälöidyt viestit lähetystunnuksella, yksi vastaanottaja per viesti
Range(0, 25).map(viestinro => {
kantaOperaatiot.tallennaViesti("Viestin testiotsikko " + viestinro,
val (viesti, vastaanottajat) = kantaOperaatiot.tallennaViesti("Viestin testiotsikko " + viestinro,
"Viestin sisältö " + viestinro,
SisallonTyyppi.TEXT,
Set(Kieli.FI),
Map.empty,
Option.empty,
Option.empty,
Option.empty,
Seq(Kontakti(Option.apply("Vastaanottaja " + viestinro), "vastaanottaja" + viestinro + "@example.com")),
Seq(Kontakti(Option.apply("Testi Vastaanottaja " + viestinro), "testi.vastaanottaja" + viestinro + "@example.com")),
Seq.empty,
Option.empty,
Option.apply(lahetys.tunniste),
Expand All @@ -195,36 +228,19 @@ object LocalUtil {
Set(kayttooikeus),
Map("avain" -> Seq("arvo")),
"omistaja")
if (counter == 1) {
kantaOperaatiot.paivitaVastaanottajaLahetetyksi(vastaanottajat.head.tunniste, "ses-tunniste")
kantaOperaatiot.paivitaVastaanotonTila("ses-tunniste", VastaanottajanTila.DELIVERY, Option.empty)
} else {
if (viestinro <= 10) {
kantaOperaatiot.paivitaVastaanottajaLahetetyksi(vastaanottajat.head.tunniste, "ses-tunniste")
kantaOperaatiot.paivitaVastaanotonTila("ses-tunniste", VastaanottajanTila.DELIVERY, Option.empty)
}
if (viestinro > 10 && viestinro < 15)
kantaOperaatiot.paivitaVastaanottajaVirhetilaan(vastaanottajat.head.tunniste, "lisätiedot virheestä")
}
})
})
// lähetys massaviestillä jossa samalla viestillä useita vastaanottajia
val lahetys2 = kantaOperaatiot.tallennaLahetys(
"Massalähetysotsikko",
"omistaja",
"hakemuspalvelu",
Option.apply("0.1.2.3"),
Kontakti(Option.apply("Joku Virkailija"), "[email protected]"),
Option.apply("[email protected]"),
Prioriteetti.NORMAALI,
365
)
kantaOperaatiot.tallennaViesti("Massaviestin testiotsikko",
"Massaviestin sisältö",
SisallonTyyppi.TEXT,
Set(Kieli.FI),
Map.empty, // maskit
Option.empty, // läh. oid
Option.empty, // lähettäjä
Option.empty, // replyto
Range(0, 20).map(suffix => Kontakti(Option.apply("Vastaanottaja" + suffix), "vastaanottaja" + suffix + "@example.com")),
Seq.empty,
Option.empty,
Option.apply(lahetys2.tunniste),
Option.apply(Prioriteetti.NORMAALI),
Option.apply(365),
Set(kayttooikeus),
Map("avain" -> Seq("arvo")),
"omistaja")
// tyhjä lähetys
val lahetys3 = kantaOperaatiot.tallennaLahetys(
"Orpo lähetys",
Expand All @@ -245,7 +261,7 @@ object LocalUtil {
Option.apply("0.1.2.3"),
Option.apply(Kontakti(Option.apply("Testi Virkailija"), "[email protected]")),
Option.apply("[email protected]"),
Range(0, 3).map(suffix => Kontakti(Option.apply("Vastaanottaja" + suffix), "vastaanottaja" + suffix + "@example.com")),
Range(0, 3).map(suffix => Kontakti(Option.apply("Testi Vastaanottaja" + suffix), "testi.vastaanottaja" + suffix + "@example.com")),
Seq.empty,
Option.apply("testipalvelu"),
Option.empty,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,8 @@ class SecurityConfiguration {
.securityMatcher("/login")
.csrf(c => c.disable())
.formLogin(c => {
c.defaultSuccessUrl(LahetysAPIConstants.HEALTHCHECK_PATH)
// c.defaultSuccessUrl("http://localhost:3000/lahetykset")
// ohjataan lokaaliympäristön raportointikäliin
c.defaultSuccessUrl("http://localhost:3000/lahetykset")
})
.build()
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package fi.oph.viestinvalitys.raportointi.model

import fi.oph.viestinvalitys.raportointi.resource.RaportointiAPIConstants.*
import fi.oph.viestinvalitys.raportointi.resource.{ParametriUtil, RaportointiAPIConstants}

import java.util.Optional

case class VastaanottajatParams(lahetysTunniste: String,
alkaen: Optional[String],
enintaan: Optional[String],
sivutustila: Optional[String],
tila: Optional[String],
vastaanottajanEmail: Optional[String])
object LahetyksetParamValidator {

def validateLahetysTunniste(lahetysTunniste: String): Set[String] =
val uuid = ParametriUtil.asUUID(lahetysTunniste)
Right(Set.empty.asInstanceOf[Set[String]])
.flatMap(virheet =>
if (uuid.isEmpty) Left(virheet.incl(LAHETYSTUNNISTE_INVALID)) else Right(virheet))
.fold(l => l, r => r)

def validateEmailParam(emailParam: Optional[String], errorMessage: String): Set[String] =
val validatedEmail = ParametriUtil.asValidEmail(emailParam)
Right(Set.empty.asInstanceOf[Set[String]])
.flatMap(virheet =>
if (emailParam.isPresent && validatedEmail.isEmpty) Left(virheet.incl(errorMessage)) else Right(virheet))
.fold(l => l, r => r)

def validateEnintaan(enintaan: Optional[String], min: Int, max: Int, errorMessage: String): Set[String] =
val enintaanInt = ParametriUtil.asInt(enintaan)
Right(Set.empty.asInstanceOf[Set[String]])
.flatMap(virheet =>
if (enintaan.isPresent && (enintaanInt.isEmpty || enintaanInt.get < min || enintaanInt.get > max))
Left(virheet.incl(errorMessage))
else Right(virheet))
.fold(l => l, r => r)

def validateRaportointiTila(tila: Optional[String], errorMessage: String): Set[String] =
val raportointiTila = ParametriUtil.asValidRaportointitila(tila)
Right(Set.empty.asInstanceOf[Set[String]])
.flatMap(virheet =>
if (tila.isPresent && raportointiTila.isEmpty) Left(virheet.incl(errorMessage)) else Right(virheet))
.fold(l => l, r => r)

def validateVastaanottajatParams(params: VastaanottajatParams): Seq[String] =
Seq(
validateLahetysTunniste(params.lahetysTunniste),
validateEmailParam(params.alkaen, ALKAEN_EMAIL_TUNNISTE_INVALID),
validateEnintaan(params.enintaan, VASTAANOTTAJAT_ENINTAAN_MIN, VASTAANOTTAJAT_ENINTAAN_MAX, VASTAANOTTAJAT_ENINTAAN_INVALID),
validateRaportointiTila(params.sivutustila, SIVUTUS_TILA_INVALID),
validateEmailParam(params.vastaanottajanEmail, VASTAANOTTAJA_INVALID),
validateRaportointiTila(params.tila, TILA_INVALID)
).flatten

}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ case class PalautaLahetyksetSuccessResponse(
) extends PalautaLahetyksetResponse

case class PalautaLahetyksetFailureResponse(
@BeanProperty virhe: util.List[String],
@BeanProperty virheet: util.List[String],
) extends PalautaLahetyksetResponse


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import fi.oph.viestinvalitys.raportointi.resource.RaportointiAPIConstants.*
import fi.oph.viestinvalitys.raportointi.security.{SecurityConstants, SecurityOperaatiot}
import fi.oph.viestinvalitys.raportointi.model.*
import fi.oph.viestinvalitys.util.{DbUtil, LogContext}
import fi.oph.viestinvalitys.vastaanotto.model.ViestiValidator
import io.swagger.v3.oas.annotations.links.{Link, LinkParameter}
import io.swagger.v3.oas.annotations.media.{Content, Schema}
import io.swagger.v3.oas.annotations.responses.ApiResponse
Expand Down Expand Up @@ -217,7 +218,7 @@ class LahetysResource {
): ResponseEntity[VastaanottajatResponse] =
val securityOperaatiot = new SecurityOperaatiot
val kantaOperaatiot = new KantaOperaatiot(DbUtil.database)

LOG.info(vastaanottajanEmail.toString)
LogContext(lahetysTunniste = lahetysTunniste)(() =>
try
Right(None)
Expand All @@ -228,42 +229,11 @@ class LahetysResource {
else
Right(None))
.flatMap(_ =>
// validoidaan parametrit TODO tyypitä ja refaktoroi
val uuid = ParametriUtil.asUUID(lahetysTunniste)
val alkaenValidEmail = ParametriUtil.asValidEmail(alkaen)
val enintaanInt = ParametriUtil.asInt(enintaan)
val vastaanottajaValidEmail = ParametriUtil.asValidEmail(vastaanottajanEmail)
val raportointiTila = ParametriUtil.asValidRaportointitila(tila)
val sivutustilaValid = ParametriUtil.asValidRaportointitila(sivutustila)

val virheet = Some(Seq.empty.asInstanceOf[Seq[String]])
.map(virheet =>
if (uuid.isEmpty) virheet.appended(RaportointiAPIConstants.LAHETYSTUNNISTE_INVALID) else virheet)
.map(virheet =>
if (alkaen.isPresent && alkaenValidEmail.isEmpty) virheet.appended(RaportointiAPIConstants.ALKAEN_EMAIL_TUNNISTE_INVALID)
else virheet)
.map(virheet =>
if (enintaan.isPresent &&
(enintaanInt.isEmpty || enintaanInt.get < VASTAANOTTAJAT_ENINTAAN_MIN || enintaanInt.get > VASTAANOTTAJAT_ENINTAAN_MAX))
virheet.appended(VASTAANOTTAJAT_ENINTAAN_INVALID)
else virheet)
.map(virheet =>
if (vastaanottajanEmail.isPresent && vastaanottajaValidEmail.isEmpty)
virheet.appended(VASTAANOTTAJA_INVALID)
else virheet)
.map(virheet =>
if (tila.isPresent && raportointiTila.isEmpty)
virheet.appended(TILA_INVALID)
else virheet)
.map(virheet =>
if (sivutustila.isPresent && sivutustilaValid.isEmpty)
virheet.appended(SIVUTUS_TILA_INVALID)
else virheet)
.get
val virheet = LahetyksetParamValidator.validateVastaanottajatParams(VastaanottajatParams(lahetysTunniste, alkaen, enintaan, sivutustila, tila, vastaanottajanEmail))
if (!virheet.isEmpty)
Left(ResponseEntity.status(HttpStatus.BAD_REQUEST).body(VastaanottajatFailureResponse(virheet.asJava)))
else
Right(uuid.get))
Right(ParametriUtil.asUUID(lahetysTunniste).get))
.flatMap(tunniste =>
val lahetys = kantaOperaatiot.getLahetys(tunniste)
if (lahetys.isEmpty)
Expand All @@ -282,25 +252,26 @@ class LahetysResource {
// TODO tee tyylikkäämmin
// haetaan aina epäonnistuneet
val alkaenValidEmail = ParametriUtil.asValidEmail(alkaen)
val epaonnistuneet = kantaOperaatiot.haeLahetyksenVastaanottajia(lahetys.tunniste, Option.empty, Option.empty, Option.apply("epaonnistui"), securityOperaatiot.getKayttajanOikeudet())
val epaonnistuneet = kantaOperaatiot.haeLahetyksenVastaanottajia(lahetys.tunniste, Option.empty, Option.empty, Option.apply("epaonnistui"), securityOperaatiot.getKayttajanOikeudet(), vastaanottajanEmail.orElse(""))
var kesken: Seq[Vastaanottaja] = Seq.empty
var valmiit: Seq[Vastaanottaja] = Seq.empty
// sivutuksessa seuraavana on valmiit lähetykset, ei haeta keskeneräisiä
if (sivutustila.isPresent && sivutustila.equals("valmis"))
valmiit = kantaOperaatiot.haeLahetyksenVastaanottajia(lahetys.tunniste, alkaenValidEmail, Option.apply(enintaanInt), Option.apply("valmis"), securityOperaatiot.getKayttajanOikeudet())
valmiit = kantaOperaatiot.haeLahetyksenVastaanottajia(lahetys.tunniste, alkaenValidEmail, Option.apply(enintaanInt), Option.apply("valmis"), securityOperaatiot.getKayttajanOikeudet(), vastaanottajanEmail.orElse(""))
else
kesken = kantaOperaatiot.haeLahetyksenVastaanottajia(lahetys.tunniste, alkaenValidEmail, Option.apply(enintaanInt), Option.apply("kesken"), securityOperaatiot.getKayttajanOikeudet())
kesken = kantaOperaatiot.haeLahetyksenVastaanottajia(lahetys.tunniste, alkaenValidEmail, Option.apply(enintaanInt), Option.apply("kesken"), securityOperaatiot.getKayttajanOikeudet(), vastaanottajanEmail.orElse(""))
// jos sivu ei ole täynnä keskeneräisistä, haetaan valmiita
if (kesken.size < enintaanInt)
valmiit = kantaOperaatiot.haeLahetyksenVastaanottajia(lahetys.tunniste, Option.empty, Option.apply(enintaanInt), Option.apply("valmis"), securityOperaatiot.getKayttajanOikeudet())
valmiit = kantaOperaatiot.haeLahetyksenVastaanottajia(lahetys.tunniste, Option.empty, Option.apply(enintaanInt), Option.apply("valmis"), securityOperaatiot.getKayttajanOikeudet(), vastaanottajanEmail.orElse(""))
val vastaanottajat = epaonnistuneet++kesken++valmiit
if (vastaanottajat.isEmpty)
LOG.info("ei vastaanottajia")
Left(ResponseEntity.status(HttpStatus.OK).body(VastaanottajatSuccessResponse(Seq.empty.asJava, Optional.empty, Optional.empty)))
else
val viimeisenTila = ParametriUtil.getRaportointiTila(vastaanottajat.last.tila)
val seuraavatAlkaen = {
vastaanottajat match
case v if kantaOperaatiot.haeLahetyksenVastaanottajia(lahetys.tunniste, Option.apply(v.last.kontakti.sahkoposti), Option.apply(1), viimeisenTila,securityOperaatiot.getKayttajanOikeudet()).isEmpty => Optional.empty
case v if kantaOperaatiot.haeLahetyksenVastaanottajia(lahetys.tunniste, Option.apply(v.last.kontakti.sahkoposti), Option.apply(1), viimeisenTila,securityOperaatiot.getKayttajanOikeudet(), vastaanottajanEmail.orElse("")).isEmpty => Optional.empty
case _ => Optional.of(vastaanottajat.last.kontakti.sahkoposti)
}
Right(ResponseEntity.status(HttpStatus.OK).body(VastaanottajatSuccessResponse(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -702,7 +702,11 @@ class KantaOperaatiot(db: JdbcBackend.JdbcDatabaseDef) {
* @param kayttooikeudet käyttäjän oikeudet
* @return lähetyksen vastaanottajat
*/
def haeLahetyksenVastaanottajia(lahetysTunniste: UUID, alkaen: Option[String], enintaan: Option[Int], raportointiTila: Option[String], kayttooikeudet: Set[Kayttooikeus]): Seq[Vastaanottaja] =
def haeLahetyksenVastaanottajia(lahetysTunniste: UUID, alkaen: Option[String], enintaan: Option[Int], raportointiTila: Option[String], kayttooikeudet: Set[Kayttooikeus], vastaanottajanEmail : String = ""): Seq[Vastaanottaja] =

val vastaanottajatWhere = if vastaanottajanEmail.isEmpty() then ""
else s" AND vastaanottajat.sahkopostiosoite ='$vastaanottajanEmail'"
LOG.info(s" email: $vastaanottajanEmail")
val vastaanottajatQuery =
sql"""
SELECT vastaanottajat.tunniste, vastaanottajat.viesti_tunniste, vastaanottajat.nimi, vastaanottajat.sahkopostiosoite, vastaanottajat.tila, vastaanottajat.prioriteetti, vastaanottajat.ses_tunniste
Expand All @@ -711,10 +715,12 @@ class KantaOperaatiot(db: JdbcBackend.JdbcDatabaseDef) {
WHERE viestit.lahetys_tunniste=${lahetysTunniste.toString}::uuid AND vastaanottajat.sahkopostiosoite>${alkaen.getOrElse("")}
#${queryUtil.vastaanottajanTilaWhere(raportointiTila)}
#${queryUtil.kayttooikeudetWhere(kayttooikeudet)}
#$vastaanottajatWhere
ORDER BY vastaanottajat.sahkopostiosoite ASC, vastaanottajat.tunniste DESC
LIMIT ${enintaan.getOrElse(256)}
"""
.as[(String, String, String, String, String, String, String)]

Await.result(db.run(vastaanottajatQuery), DB_TIMEOUT)
.map((tunniste, viestiTunniste, nimi, sahkopostiOsoite, tila, prioriteetti, sesTunniste)
=> Vastaanottaja(UUID.fromString(tunniste), UUID.fromString(viestiTunniste), Kontakti(Option.apply(nimi), sahkopostiOsoite), VastaanottajanTila.valueOf(tila), Prioriteetti.valueOf(prioriteetti), Option.apply(sesTunniste)))
Expand Down
Loading

0 comments on commit ff939cb

Please sign in to comment.