Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/master' into pkalliok-EH-1491-1
Browse files Browse the repository at this point in the history
  • Loading branch information
pkalliok committed Jun 26, 2023
2 parents 7075616 + ca097b1 commit 5475d94
Show file tree
Hide file tree
Showing 12 changed files with 206 additions and 183 deletions.
1 change: 1 addition & 0 deletions project.clj
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
["snapshots" "https://artifactory.opintopolku.fi/artifactory/oph-sade-snapshot-local"]]
:dependencies [[org.clojure/clojure "1.10.1"]
[org.clojure/tools.logging "1.0.0"]
[org.clojure/core.memoize "1.0.257"]
[environ "1.1.0"]
[clj-http "3.10.0"]
[cheshire "5.8.1"]
Expand Down
16 changes: 9 additions & 7 deletions src/oph/heratepalvelu/amis/AMISDeleteTunnusHandler.clj
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,15 @@
"Tunnuksen poistoherätteen schema."
{:kyselylinkki (s/constrained s/Str not-empty)})

(def delete-tunnus-checker
(def deletion-schema-errors
"Tunnuksen poistoherätteen scheman tarkistusfunktio."
(s/checker delete-tunnus-schema))

(defn delete-one-item
"Poistaa yhden tietueen tietokannasta, jos item on olemassa."
"Poistaa yhden tietueen tietokannasta, jos se on olemassa."
[item]
(when item
(if-not item
(log/warn "Ei löytynyt tietuetta tällä kyselylinkillä")
(try
(ddb/delete-item {:toimija_oppija [:s (:toimija_oppija item)]
:tyyppi_kausi [:s (:tyyppi_kausi item)]})
Expand All @@ -44,10 +45,11 @@
(doseq [^SQSEvent$SQSMessage msg messages]
(try
(let [herate (parse-string (.getBody msg) true)
tunnus-checked (delete-tunnus-checker herate)]
(if (some? tunnus-checked)
(log/error {:herate herate :msg tunnus-checked})
schema-errors (deletion-schema-errors herate)]
(log/info "Käsitellään heräte" herate)
(if (some? schema-errors)
(log/error "schema validation:" schema-errors)
(delete-one-item
(ac/get-herate-by-kyselylinkki! (:kyselylinkki herate)))))
(catch JsonParseException e
(log/error "Virhe viestin lukemisessa: " msg "\n" e))))))
(log/error e "Virhe viestin lukemisessa: " msg))))))
94 changes: 55 additions & 39 deletions src/oph/heratepalvelu/amis/AMISehoksTimedOperationsHandler.clj
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
[environ.core :refer [env]]
[oph.heratepalvelu.common :as c]
[oph.heratepalvelu.db.dynamodb :as ddb]
[oph.heratepalvelu.external.ehoks :as ehoks]))
[oph.heratepalvelu.log.caller-log :refer [log-caller-details-sqs]]
[oph.heratepalvelu.external.ehoks :as ehoks])
(:import (com.amazonaws.services.lambda.runtime.events SQSEvent)))

(gen-class
:name "oph.heratepalvelu.amis.AMISehoksTimedOperationsHandler"
Expand All @@ -18,47 +20,60 @@
[com.amazonaws.services.lambda.runtime.events.ScheduledEvent
com.amazonaws.services.lambda.runtime.Context] void]])

(defn ehoks-request-missing-kyselylinkit!
"Pyytää ehoksia lähettämään käsittelemättömät herätteet uudestaan"
[]
(log/info "Pyydetään eHOKSia lähettämään uudestaan herätteet kaikille"
"aloittaneille tai suorituksia saaneille,"
"joilla ei ole vielä kyselylinkkiä")
(let [resp (ehoks/send-kasittelemattomat-heratteet!
"2021-07-01" (str (c/local-date-now)) 1000)]
(log/info "Lähetetty" (:data (:body resp)) "viestiä")))

(defn delete-oppija-contact!
"Poistaa yhden oppijat yhteystiedot tietokannasta HOKS-id:n perusteella."
[hoks-id]
(log/info "Hoks ID" hoks-id)
(let [resp (ddb/scan {:filter-expression "#id = :id"
:expr-attr-names {"#id" "ehoks-id"}
:expr-attr-vals {":id" [:n hoks-id]}}
(:herate-table env))
items (:items resp)]
(doseq [item items]
(log/info "Poistetaan opiskelijan yhteystiedot; toimija_oppija ="
(:toimija_oppija item) ", tyyppi_kausi =" (:tyyppi_kausi item))
(ddb/update-item
{:toimija_oppija [:s (:toimija_oppija item)]
:tyyppi_kausi [:s (:tyyppi_kausi item)]}
{:update-expr "SET #eml = :eml_value, #puh = :puh_value"
:expr-attr-names {"#eml" "sahkoposti"
"#puh" "puhelinnumero"}
:expr-attr-vals {":eml_value" [:s ""] ":puh_value" [:s ""]}}
(:herate-table env)))))

(defn delete-oppija-contacts-from-old-hoksit-and-heratteet!
"Pyytää ehoksia poistamaan opiskelijoiden yhteystiedot vanhoista HOKSeista
ja poistaa herätepalvelun tiedot samoista HOKSeista."
[]
(log/info "Käynnistetään opiskelijan yhteystietojen poisto")
(let [hoks-ids (get-in (ehoks/delete-opiskelijan-yhteystiedot)
[:body :data :hoks-ids])]
(log/info "Käydään läpi" (count hoks-ids) "hoksin tiedot")
(doseq [hoks-id hoks-ids]
(delete-oppija-contact! hoks-id))))

(defn -handleAMISTimedOperations
"Pyytää ehoksia lähettämään käsittelemättömät herätteet uudestaan ja
käynnistää opiskelijan yhteystietojen poiston."
[_ _ _]
(log/info "Käynnistetään herätteiden lähetys")
(let [resp (ehoks/get-retry-kyselylinkit "2021-07-01"
(str (c/local-date-now))
1000)]
(log/info "Lähetetty" (:data (:body resp)) "viestiä"))

(log/info "Käynnistetään opiskelijan yhteystietojen poisto")
(let [hoksit (get-in (ehoks/delete-opiskelijan-yhteystiedot)
[:body :data :hoks-ids])]
(log/info "Käydään läpi" (count hoksit) "hoksin tiedot")
(doseq [hoks hoksit]
(let [resp (ddb/scan {:filter-expression "#id = :id"
:expr-attr-names {"#id" "ehoks-id"}
:expr-attr-vals {":id" [:n hoks]}}
(:herate-table env))
items (:items resp)]
(doseq [item items]
(log/info
(str "Poistetaan opiskelijan yhteystiedot (toimija_oppija = "
(:toimija_oppija item)
", tyyppi_kausi = "
(:tyyppi_kausi item)
")"))
(ddb/update-item
{:toimija_oppija [:s (:toimija_oppija item)]
:tyyppi_kausi [:s (:tyyppi_kausi item)]}
{:update-expr "SET #eml = :eml_value, #puh = :puh_value"
:expr-attr-names {"#eml" "sahkoposti"
"#puh" "puhelinnumero"}
:expr-attr-vals {":eml_value" [:s ""] ":puh_value" [:s ""]}}
(:herate-table env)))))
(log/info "Opiskelijan yhteystietojen poisto valmis")))
[_ ^SQSEvent event context]
(log-caller-details-sqs "handleAMISTimedOperations" context)
(ehoks-request-missing-kyselylinkit!)
(delete-oppija-contacts-from-old-hoksit-and-heratteet!))

(defn -handleMassHerateResend
"Pyytää ehoksia lähettämäan viime 2 viikon herätteet uudestaan."
[_ _ _]
(log/info "Käynnistetään herätteiden massauudelleenlähetys")
[_ ^SQSEvent event context]
(log-caller-details-sqs "handleMassHerateResend" context)
(let [now (c/local-date-now)
start (str (.minusDays now 14))
end (str now)
Expand All @@ -72,6 +87,7 @@

(defn -handleEhoksOpiskeluoikeusUpdate
"Pyytää ehoksia päivittämään opiskeluoikeuksien hankintakoulutukset."
[_ _ _]
(log/info "Käynnistetään ehoksin opiskeluoikeuksien päivitys")
(ehoks/update-ehoks-opiskeluoikeudet))
[_ ^SQSEvent event context]
(log-caller-details-sqs "handleEhoksOpiskeluoikeusUpdate" context)
(let [result (ehoks/update-ehoks-opiskeluoikeudet)]
(log/info "update-ehoks-opiskeluoikeudet result:" result)))
2 changes: 1 addition & 1 deletion src/oph/heratepalvelu/external/ehoks.clj
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@
:end end
:limit limit}}))

(defn get-retry-kyselylinkit
(defn send-kasittelemattomat-heratteet!
"Pyytää eHOKS-palvelua lähettämään käsittelemättömät AMIS-herätteet
SQS:iin."
[start end limit]
Expand Down
84 changes: 44 additions & 40 deletions src/oph/heratepalvelu/tpk/tpkArvoCallHandler.clj
Original file line number Diff line number Diff line change
Expand Up @@ -25,17 +25,14 @@
niput. Muuten käsittelee seuraavan kauden niput."
([] (do-scan nil))
([exclusive-start-key]
(let [resp (ddb/scan {:filter-expression
"attribute_not_exists(#linkki) AND #kausi = :kausi"
:exclusive-start-key exclusive-start-key
:expr-attr-names {"#kausi" "tiedonkeruu-alkupvm"
"#linkki" "kyselylinkki"}
:expr-attr-vals
{":kausi" [:s (str
(tpkc/get-current-kausi-alkupvm))]}}
(:tpk-nippu-table env))]
(log/info "TPK-Arvovälitysfunktion scan" (count (:items resp)))
resp)))
(ddb/scan {:filter-expression
"attribute_not_exists(#linkki) AND #kausi = :kausi"
:exclusive-start-key exclusive-start-key
:expr-attr-names {"#kausi" "tiedonkeruu-alkupvm"
"#linkki" "kyselylinkki"}
:expr-attr-vals
{":kausi" [:s (str (tpkc/get-current-kausi-alkupvm))]}}
(:tpk-nippu-table env))))

(defn make-arvo-request
"Pyytää TPK-kyselylinkin Arvosta."
Expand All @@ -44,44 +41,51 @@
(arvo/create-tpk-kyselylinkki
(arvo/build-tpk-request-body (assoc nippu :request-id request-id)))
(catch ExceptionInfo e
(log/error "Ei luonut kyselylinkkiä nipulle:" (:nippu-id nippu)))))
(log/error e "Ei luonut kyselylinkkiä nipulle:" nippu))))

(defn update-kyselylinkki-in-nippu!
"Päivittää nipun kyselylinkin Arvon API-vastauksesta."
[nippu arvo-resp request-id]
(log/info "Päivitetään nippuun" (:nippu-id nippu)
"kyselylinkki" (:kysely_linkki arvo-resp))
(try
(ddb/update-item
{:nippu-id [:s (:nippu-id nippu)]}
{:update-expr (str "SET #linkki = :linkki, #tunnus = :tunnus, "
"#pvm = :pvm, #req = :req")
:expr-attr-names {"#linkki" "kyselylinkki"
"#tunnus" "tunnus"
"#pvm" "voimassa-loppupvm"
"#req" "request-id"}
:expr-attr-vals {":linkki" [:s (:kysely_linkki arvo-resp)]
":tunnus" [:s (:tunnus arvo-resp)]
":pvm" [:s (:voimassa_loppupvm arvo-resp)]
":req" [:s request-id]}}
(:tpk-nippu-table env))
(catch AwsServiceException e
(log/error e "päivitettäessä Arvo-vastausta" arvo-resp))))

(defn handle-single-nippu!
"Luo kyselylinkin yhdelle TPK-nipulle."
[nippu]
(log/info "Käsitellään nippu" (:nippu-id nippu))
(let [request-id (c/generate-uuid)
arvo-resp (make-arvo-request nippu request-id)]
(if (some? (:kysely_linkki arvo-resp))
(update-kyselylinkki-in-nippu! nippu arvo-resp request-id)
(log/error "Kyselylinkkiä ei saatu Arvolta. Nippu:" (:nippu-id nippu)
"Request ID:" request-id))))

(defn -handleTpkArvoCalls
"Hakee TPK-nipuille kyselylinkkejä Arvosta. Luo vain yhden kyselylinkin per
nippu, vaikka siihen kuuluisi useita jaksoja."
[_ event ^Context context]
(log-caller-details-scheduled "handleTpkArvoCalls" event context)
(loop [scan-results (do-scan)]
(log/info "Käsitellään" (count (:items scan-results)) "nippua.")
(doseq [nippu (:items scan-results)]
(when (< 30000 (.getRemainingTimeInMillis context))
(let [request-id (c/generate-uuid)
arvo-resp (make-arvo-request nippu request-id)]
(if (some? (:kysely_linkki arvo-resp))
(try
(ddb/update-item
{:nippu-id [:s (:nippu-id nippu)]}
{:update-expr (str "SET #linkki = :linkki, #tunnus = :tunnus, "
"#pvm = :pvm, #req = :req")
:expr-attr-names {"#linkki" "kyselylinkki"
"#tunnus" "tunnus"
"#pvm" "voimassa-loppupvm"
"#req" "request-id"}
:expr-attr-vals {":linkki" [:s (:kysely_linkki arvo-resp)]
":tunnus" [:s (:tunnus arvo-resp)]
":pvm" [:s (:voimassa_loppupvm arvo-resp)]
":req" [:s request-id]}}
(:tpk-nippu-table env))
(catch AwsServiceException e
(log/error "Virhe DynamoDBissa (TPK Arvo Calls). Nippu:"
(:nippu-id nippu)
"Request ID:"
request-id
"Virhe:"
e)))
(log/error "Kyselylinkkiä ei saatu Arvolta. Nippu:"
(:nippu-id nippu)
"Request ID:"
request-id)))))
(handle-single-nippu! nippu)))
(when (and (< 30000 (.getRemainingTimeInMillis context))
(:last-evaluated-key scan-results))
(recur (do-scan (:last-evaluated-key scan-results))))))
71 changes: 39 additions & 32 deletions src/oph/heratepalvelu/tpk/tpkNiputusHandler.clj
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
(ns oph.heratepalvelu.tpk.tpkNiputusHandler
"Käsittelee TPK:n niputusta ja tallennusta herätepalvelun tietokantaan."
(:require [clojure.tools.logging :as log]
[clojure.core.memoize :refer [memo]]
[environ.core :refer [env]]
[oph.heratepalvelu.common :as c]
[oph.heratepalvelu.db.dynamodb :as ddb]
Expand All @@ -15,7 +16,7 @@
[com.amazonaws.services.lambda.runtime.events.ScheduledEvent
com.amazonaws.services.lambda.runtime.Context] void]])

(defn check-jakso?
(defn jakso-valid-for-tpk?
"Varmistaa, että jaksossa on kaikki pakolliset kentät ja oppisopimuksen
perusta ei ole 02 (yrittäjä)."
[jakso]
Expand Down Expand Up @@ -112,40 +113,46 @@
kausi-end-date (tpkc/get-current-kausi-loppupvm)
end-date (if (.isAfter today kausi-end-date)
(str kausi-end-date)
(str today))
resp (ddb/scan {:filter-expression
"#tpkNpvm = :tpkNpvm AND #jl BETWEEN :start AND :end"
:exclusive-start-key exclusive-start-key
:expr-attr-names {"#tpkNpvm" "tpk-niputuspvm"
"#jl" "jakso_loppupvm"}
:expr-attr-vals {":tpkNpvm" [:s "ei_maaritelty"]
":end" [:s end-date]
":start" [:s start-date]}}
(:jaksotunnus-table env))]
(log/info "TPK-Niputusfunktion scan" (count (:items resp)))
resp))
(str today))]
(ddb/scan {:filter-expression
"#tpkNpvm = :tpkNpvm AND #jl BETWEEN :start AND :end"
:exclusive-start-key exclusive-start-key
:expr-attr-names {"#tpkNpvm" "tpk-niputuspvm"
"#jl" "jakso_loppupvm"}
:expr-attr-vals {":tpkNpvm" [:s "ei_maaritelty"]
":end" [:s end-date]
":start" [:s start-date]}}
(:jaksotunnus-table env))))

(def ensure-nippu!
"Huolehtii, että jaksolle on nippu tietokannassa, ja palauttaa sen."
(memo
^{:clojure.core.memoize/args-fn (partial mapv create-nippu-id)}
(fn [jakso]
(or (not-empty (get-existing-nippu jakso))
(let [nippu (create-tpk-nippu jakso)]
(log/info "Luodaan uusi nippu tietokantaan:" nippu)
(save-tpk-nippu nippu)
nippu)))))

(defn handle-jakso!
"Luo tpk-nipun yhdestä työpaikkajaksosta tai lisää jakson olemassa olevaan."
[jakso]
(log/info "Käsitellään jakso" jakso)
(update-tpk-niputuspvm
jakso
(if (jakso-valid-for-tpk? jakso)
(let [nippu (ensure-nippu! jakso)] (:niputuspvm nippu))
"ei_niputeta")))

(defn -handleTpkNiputus
"Käsittelee työpaikkajaksoja ja luo vastaavia TPK-nippuja. Yhteen nippuun voi
kuulua useita jaksoja."
[_ event ^com.amazonaws.services.lambda.runtime.Context context]
(log-caller-details-scheduled "handleTpkNiputus" event context)
(let [memoization (atom {})]
(loop [niputettavat (query-niputtamattomat nil)]
(doseq [jakso (:items niputettavat)]
(if (check-jakso? jakso)
(let [memoized-nippu (get @memoization (create-nippu-id jakso))
existing-nippu (when-not memoized-nippu
(get-existing-nippu jakso))]
(if (and (empty? existing-nippu) (not memoized-nippu))
(let [nippu (create-tpk-nippu jakso)]
(save-tpk-nippu nippu)
(swap! memoization assoc (create-nippu-id jakso) nippu)
(update-tpk-niputuspvm jakso (:niputuspvm nippu)))
(update-tpk-niputuspvm
jakso
(:niputuspvm (or memoized-nippu existing-nippu)))))
(update-tpk-niputuspvm jakso "ei_niputeta")))
(when (and (< 30000 (.getRemainingTimeInMillis context))
(:last-evaluated-key niputettavat))
(recur (query-niputtamattomat (:last-evaluated-key niputettavat)))))))
(loop [niputettavat (query-niputtamattomat nil)]
(log/info "Käsitellään" (count (:items niputettavat)) "työpaikkajaksoa")
(doseq [jakso (:items niputettavat)] (handle-jakso! jakso))
(when (and (< 30000 (.getRemainingTimeInMillis context))
(:last-evaluated-key niputettavat))
(recur (query-niputtamattomat (:last-evaluated-key niputettavat))))))
Loading

0 comments on commit 5475d94

Please sign in to comment.