Skip to content

Commit

Permalink
AE-2274: Add capability to destroy viestit
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
solita-juhohaa committed Oct 15, 2024
1 parent 68d7ef1 commit a6bbfaa
Show file tree
Hide file tree
Showing 3 changed files with 231 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down Expand Up @@ -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 check-oikeellisuuden-valvonta-viestiketjut 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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand All @@ -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}
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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))))))
(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)))))))

0 comments on commit a6bbfaa

Please sign in to comment.