From 9ae97faf5505de41940c2d6b108c6603a5abe835 Mon Sep 17 00:00:00 2001 From: Juho Haapakoski Date: Wed, 16 Oct 2024 00:27:06 +0300 Subject: [PATCH] AE-2274: Add capability to destroy viestit There is a possible problem that is handled in `check-oikeellisuuden-valvonta-viestiketjut` for now by just logging out an error if it happens. There are foreign key reference chain viestiketju->vo_toimenpide->energiatodistus and viestiketju->energiatodistus which could possibly cause problems as viestiketju can reference energiatodistus and a toimenpide that references different energiatodistus. --- .../service/energiatodistus_destruction.clj | 45 +++++- .../etp/db/energiatodistus-destruction.sql | 60 ++++++++ .../energiatodistus_destruction_test.clj | 130 +++++++++++++++++- 3 files changed, 231 insertions(+), 4 deletions(-) diff --git a/etp-core/etp-backend/src/main/clj/solita/etp/service/energiatodistus_destruction.clj b/etp-core/etp-backend/src/main/clj/solita/etp/service/energiatodistus_destruction.clj index 9c81e6458..a92df9048 100644 --- a/etp-core/etp-backend/src/main/clj/solita/etp/service/energiatodistus_destruction.clj +++ b/etp-core/etp-backend/src/main/clj/solita/etp/service/energiatodistus_destruction.clj @@ -7,7 +7,8 @@ [solita.etp.service.complete-energiatodistus :as complete-energiatodistus-service] [solita.etp.service.energiatodistus :as energiatodistus-service] [solita.etp.service.liite :as liite-service] - [solita.etp.service.file :as file])) + [solita.etp.service.file :as file] + [solita.etp.service.viesti :as viesti-service])) (db/require-queries 'energiatodistus-destruction) @@ -65,8 +66,50 @@ (let [liitteet (energiatodistus-destruction-db/select-to-be-destroyed-liitteet-by-energiatodistus-id db {:energiatodistus_id energiatodistus-id})] (mapv #(delete-energiatodistus-liite db aws-s3-client %) liitteet))) +(defn- destroy-viesti! [db viesti-id] + (energiatodistus-destruction-db/destroy-viesti-reader! db {:viesti_id viesti-id}) + (energiatodistus-destruction-db/destroy-viesti! db {:viesti_id viesti-id})) + +(defn- delete-viestiketju-liite-s3 [aws-s3-client viestiketju-id liite-id] + (let [file-key (viesti-service/file-path viestiketju-id liite-id)] + ;; Some liitteet are only links and do not have files. + (when (file/file-exists? aws-s3-client file-key) + (delete-from-s3 aws-s3-client file-key)))) + +(defn- destroy-viestiketju-liitteet [db aws-s3-client viestiketju-id] + (let [viestiketju-liite-ids (energiatodistus-destruction-db/select-liitteet-by-viestiketju db {:viestiketju_id viestiketju-id})] + (mapv #(delete-viestiketju-liite-s3 aws-s3-client viestiketju-id (:viesti-liite-id %)) viestiketju-liite-ids) + (energiatodistus-destruction-db/destroy-viestiketju-liite! db {:viestiketju_id viestiketju-id}) + (energiatodistus-destruction-db/destroy-viestiketju-liite-audit! db {:viestiketju_id viestiketju-id}))) + +(defn- destroy-viestiketju [db aws-s3-client viestiketju-id] + (let [viestit (energiatodistus-destruction-db/select-viestit-by-viestiketju db {:viestiketju_id viestiketju-id})] + (energiatodistus-destruction-db/destroy-vastaanottaja! db {:viestiketju_id viestiketju-id}) + (destroy-viestiketju-liitteet db aws-s3-client viestiketju-id) + (mapv #(destroy-viesti! db (:viesti-id %)) viestit) + (energiatodistus-destruction-db/destroy-viestiketju! db {:viestiketju_id viestiketju-id}) + (energiatodistus-destruction-db/destroy-viestiketju-audit! db {:viestiketju_id viestiketju-id}))) + +(defn- check-oikeellisuuden-valvonta-viestiketjut [db vo-toimenpide-id] + (let [viestiketjut (energiatodistus-destruction-db/select-viestiketjut-by-oikeellisuuden-valvonta db {:vo_toimenpide_id vo-toimenpide-id})] + ;; These should be empty as they are destroyed via energiatodistus? Do something if they are not? + ;; Maybe unlink the valvonta from viestiketju or just delete them? + ;; For now just log an error if this happens as this should not happen. + (when-not (empty? viestiketjut) + (log/error "There exists one or many viestiketju for oikeellisuuden valvonta (id: " vo-toimenpide-id ")")))) + +(defn- check-oikeellisuuden-valvontojen-viestiketjut [db energiatodistus-id] + (let [vo-toimenpide-ids (map :id (energiatodistus-destruction-db/select-vo-toimenpiteet-by-energiatodistus-id db {:energiatodistus_id energiatodistus-id}))] + (mapv (partial check-oikeellisuuden-valvonta-viestiketjut db) vo-toimenpide-ids))) + +(defn- destroy-energiatodistus-viestiketjut [db aws-s3-client energiatodistus-id] + (let [viestiketjut (energiatodistus-destruction-db/select-vo-toimenpiteet-by-energiatodistus-id db {:energiatodistus_id energiatodistus-id})] + (mapv #(destroy-viestiketju db aws-s3-client %) viestiketjut) + (check-oikeellisuuden-valvontojen-viestiketjut db energiatodistus-id))) + (defn- destroy-expired-energiatodistus! [db aws-s3-client energiatodistus-id] (jdbc/with-db-transaction [db db] + (destroy-energiatodistus-viestiketjut db aws-s3-client energiatodistus-id) (destroy-energiatodistus-liitteet db aws-s3-client energiatodistus-id) (destroy-energiatodistus-oikeellisuuden-valvonta! db energiatodistus-id) (destroy-energiatodistus-oikeellisuuden-valvonta-toimenpide-audit! db energiatodistus-id) diff --git a/etp-core/etp-backend/src/main/sql/solita/etp/db/energiatodistus-destruction.sql b/etp-core/etp-backend/src/main/sql/solita/etp/db/energiatodistus-destruction.sql index 85afb531f..518586a55 100644 --- a/etp-core/etp-backend/src/main/sql/solita/etp/db/energiatodistus-destruction.sql +++ b/etp-core/etp-backend/src/main/sql/solita/etp/db/energiatodistus-destruction.sql @@ -14,6 +14,11 @@ delete from audit.energiatodistus where id = :energiatodistus_id; +-- name: select-vo-toimenpiteet-by-energiatodistus-id +select id as vo_toimenpide_id +from vo_toimenpide +where energiatodistus_id = :energiatodistus_id; + -- name: destroy-energiatodistus-oikeellisuuden-valvonta-toimenpide! delete from vo_toimenpide @@ -59,6 +64,61 @@ delete from audit.liite where id = :liite_id; +-- name: destroy-viesti-reader! +delete +from viesti_reader +where viesti_id = :viesti_id; + +-- name: select-liitteet-by-viestiketju +select id as viesti_liite_id +from viesti_liite +where viestiketju_id = :viestiketju_id; + +-- name: destroy-viestiketju-liite! +delete +from viesti_liite +where viestiketju_id = :viestiketju_id; + +-- name: destroy-viestiketju-liite-audit! +delete +from audit.viesti_liite +where viestiketju_id = :viestiketju_id; + +-- name: destroy-viesti! +delete +from viesti +where id = :viesti_id; + +-- name: select-viestiketjut-by-energiatodistus +select id as viestiketju_id +from viestiketju +where energiatodistus_id = :energiatodistus_id; + +-- name: select-viestiketjut-by-oikeellisuuden-valvonta +select id as viestiketju_id +from viestiketju +where vo_toimenpide_id = :vo_toimenpide_id; + +-- name: select-viestit-by-viestiketju +select id as viesti_id +from viesti +where viestiketju_id = :viestiketju_id; + +-- name: destroy-viestiketju! +delete +from viestiketju +where id = :viestiketju_id; + +-- name: destroy-viestiketju-audit! +delete +from audit.viestiketju +where id = :viestiketju_id; + +-- name: destroy-vastaanottaja! +delete +from vastaanottaja +where viestiketju_id = :viestiketju_id; + -- name: anonymize-energiatodistus! update energiatodistus set diff --git a/etp-core/etp-backend/src/test/clj/solita/etp/service/energiatodistus_destruction_test.clj b/etp-core/etp-backend/src/test/clj/solita/etp/service/energiatodistus_destruction_test.clj index 89269e1b8..5d38ec8de 100644 --- a/etp-core/etp-backend/src/test/clj/solita/etp/service/energiatodistus_destruction_test.clj +++ b/etp-core/etp-backend/src/test/clj/solita/etp/service/energiatodistus_destruction_test.clj @@ -5,8 +5,10 @@ [solita.etp.service.energiatodistus :as energiatodistus-service] [solita.etp.service.valvonta-oikeellisuus :as valvonta-oikeellisuus-service] [solita.etp.service.energiatodistus-destruction :as service] + [solita.etp.service.viesti-test :as viesti-test] [solita.etp.service.file :as file-service] [solita.etp.service.liite :as liite-service] + [solita.etp.service.viesti :as viesti-service] [solita.etp.test-data.energiatodistus :as energiatodistus-test-data] [solita.etp.test-data.liite :as liite-test-data] [solita.etp.test-data.laatija :as laatija-test-data] @@ -17,6 +19,8 @@ (t/use-fixtures :each ts/fixture) +(defn file-exists? [file-key] (file-service/file-exists? ts/*aws-s3-client* file-key)) + (defn update-energiatodistus! [energiatodistus-id energiatodistus laatija-id] (energiatodistus-service/update-energiatodistus! (ts/db-user laatija-id) {:id laatija-id :rooli 0} @@ -421,8 +425,7 @@ (map #(liite-service/file-key %))) link-liitteet-keys-2 (->> link-liitteet-2 keys - (map #(liite-service/file-key %))) - file-exists? #(file-service/file-exists? ts/*aws-s3-client* %)] + (map #(liite-service/file-key %)))] (t/testing "The liitteet exist before deletion" (let [liitteet-1-in-db (select-liitteet energiatodistus-id-1) @@ -458,4 +461,125 @@ (t/testing "Audit for energiatodistus-1's liitteet do not exist after deletion" (t/is (empty? (select-liitteet-audit energiatodistus-id-1))) - (t/is (not-empty (select-liitteet-audit energiatodistus-id-2)))))) \ No newline at end of file + (t/is (not-empty (select-liitteet-audit energiatodistus-id-2)))))) + +(t/deftest destroy-viestiketju-test + (let [paakayttaja-id (kayttaja-test-data/insert-paakayttaja!) + laatija-id (-> (laatija-test-data/generate-and-insert! 1) keys first) + + select-vastaanottajat #(jdbc/query ts/*db* ["select * from vastaanottaja where viestiketju_id = ?" %]) + select-viestit #(jdbc/query ts/*db* ["select * from viesti where viestiketju_id = ?" %]) + select-viesti-readers #(jdbc/query ts/*db* ["select * from viesti v right outer join viesti_reader vr on v.id = vr.viesti_id where v.viestiketju_id = ?" %]) + select-viesti-liitteet #(jdbc/query ts/*db* ["select * from viesti_liite where viestiketju_id = ?" %]) + select-viestiketju #(jdbc/query ts/*db* ["select id from viestiketju where id = ?" %]) + + + select-viestiketju-audit #(jdbc/query ts/*db* ["select id from audit.viestiketju where id = ?" %]) + select-viesti-liite-audit #(jdbc/query ts/*db* ["select * from audit.viesti_liite where viestiketju_id = ?" %]) + + viestiketju-1-id (viesti-service/add-ketju! (ts/db-user paakayttaja-id) + (test-whoami/paakayttaja paakayttaja-id) + (viesti-test/complete-ketju-add + {:vastaanottajat [laatija-id] + :vastaanottajaryhma-id nil + :energiatodistus-id nil})) + viestiketju-2-id (viesti-service/add-ketju! (ts/db-user paakayttaja-id) + (test-whoami/paakayttaja paakayttaja-id) + (viesti-test/complete-ketju-add + {:vastaanottajat [laatija-id] + :vastaanottajaryhma-id nil + :energiatodistus-id nil})) + _ (liite-test-data/generate-and-insert-files-to-viestiketju! 2 + laatija-id + viestiketju-1-id) + file-liitteet-1 (mapv :id (viesti-service/find-liitteet ts/*db* + (test-whoami/paakayttaja paakayttaja-id) + viestiketju-1-id)) + link-liitteet-1 (liite-test-data/generate-and-insert-links-to-viestiketju! 2 + laatija-id + viestiketju-1-id) + _ (liite-test-data/generate-and-insert-files-to-viestiketju! 2 + laatija-id + viestiketju-2-id) + file-liitteet-2 (mapv :id (viesti-service/find-liitteet ts/*db* + (test-whoami/paakayttaja paakayttaja-id) + viestiketju-2-id)) + link-liitteet-2 (liite-test-data/generate-and-insert-links-to-viestiketju! 2 + laatija-id + viestiketju-2-id) + file-liitteet-keys-1 (->> file-liitteet-1 + (map #(viesti-service/file-path viestiketju-1-id %))) + link-liitteet-keys-1 (->> link-liitteet-1 + keys + (map #(viesti-service/file-path viestiketju-1-id %))) + file-liitteet-keys-2 (->> file-liitteet-2 + (map #(viesti-service/file-path viestiketju-2-id %))) + link-liitteet-keys-2 (->> link-liitteet-2 + keys + (map #(viesti-service/file-path viestiketju-2-id %)))] + (t/testing "Viestiketjut exists before deletion" + (t/is (not (empty? (select-viestiketju viestiketju-1-id)))) + (t/is (not (empty? (select-viestiketju viestiketju-2-id))))) + (t/testing "The liitteet exist before deletion" + (let [liitteet-1-in-db (select-viesti-liitteet viestiketju-1-id) + liitteet-2-in-db (select-viesti-liitteet viestiketju-2-id)] + (t/is (every? file-exists? file-liitteet-keys-1)) + (t/is (every? file-exists? file-liitteet-keys-2)) + + (t/is (not-any? file-exists? link-liitteet-keys-1)) + (t/is (not-any? file-exists? link-liitteet-keys-2)) + + (t/is (= 4 (count liitteet-1-in-db))) + (t/is (= 4 (count liitteet-2-in-db))))) + (t/testing "Vastaanottaja for both ketjus exists before deletion" + (t/is (not (empty? (select-vastaanottajat viestiketju-1-id)))) + (t/is (not (empty? (select-vastaanottajat viestiketju-2-id))))) + (t/testing "Viesti for both ketjus exists before deletion" + (t/is (not (empty? (select-viestit viestiketju-1-id)))) + (t/is (not (empty? (select-viestit viestiketju-2-id))))) + (t/testing "Viesti readers for both ketjus exists before deletion" + (t/is (not (empty? (select-viesti-readers viestiketju-1-id)))) + (t/is (not (empty? (select-viesti-readers viestiketju-2-id))))) + (t/testing "Viesti liite for both ketjus exists before deletion" + (t/is (not (empty? (select-viesti-liitteet viestiketju-1-id)))) + (t/is (not (empty? (select-viesti-liitteet viestiketju-2-id))))) + + (t/testing "Viestiketju audit for both ketjus exists before deletion" + (t/is (not (empty? (select-viestiketju-audit viestiketju-1-id)))) + (t/is (not (empty? (select-viestiketju-audit viestiketju-2-id))))) + (t/testing "Viesti liite audit for both ketjus exists before deletion" + (t/is (not (empty? (select-viesti-liite-audit viestiketju-1-id)))) + (t/is (not (empty? (select-viesti-liite-audit viestiketju-2-id))))) + + (#'service/destroy-viestiketju ts/*db* ts/*aws-s3-client* viestiketju-1-id) + + (t/testing "Only viestiketju 2 exists after deletion" + (t/is (empty? (select-viestiketju viestiketju-1-id))) + (t/is (not (empty? (select-viestiketju viestiketju-2-id))))) + (t/testing "Liitteet is removed only from viestiketju-1 after deletion" + (let [liitteet-1-in-db (select-viesti-liitteet viestiketju-1-id) + liitteet-2-in-db (select-viesti-liitteet viestiketju-2-id)] + (t/is (not-any? file-exists? file-liitteet-keys-1)) + (t/is (every? file-exists? file-liitteet-keys-2)) + + (t/is (not-any? file-exists? link-liitteet-keys-1)) + (t/is (not-any? file-exists? link-liitteet-keys-2)) + + (t/is (= 0 (count liitteet-1-in-db))) + (t/is (= 4 (count liitteet-2-in-db))))) + (t/testing "Vastaanottaja is removed only from viestiketju-1 after deletion" + (t/is (empty? (select-vastaanottajat viestiketju-1-id))) + (t/is (not (empty? (select-vastaanottajat viestiketju-2-id))))) + (t/testing "Viesti is removed only for viestiketju-1-id afted deletion" + (t/is (empty? (select-viestit viestiketju-1-id))) + (t/is (not (empty? (select-viestit viestiketju-2-id))))) + (t/testing "Viesti readers is removed only for viestiketju-1-id after deletion" + (t/is (empty? (select-viesti-readers viestiketju-1-id))) + (t/is (not (empty? (select-viesti-readers viestiketju-2-id))))) + + (t/testing "Viestiketju audit for viestiketju-1-id does not exist after deletion" + (t/is (empty? (select-viestiketju-audit viestiketju-1-id))) + (t/is (not (empty? (select-viestiketju-audit viestiketju-2-id))))) + (t/testing "Viesti liite audit for viestiketju-1-id does not exist after deletion" + (t/is (empty? (select-viesti-liite-audit viestiketju-1-id))) + (t/is (not (empty? (select-viesti-liite-audit viestiketju-2-id)))))))