Skip to content

Commit

Permalink
Add cascade delete to cleaner
Browse files Browse the repository at this point in the history
fixes #106
  • Loading branch information
lincmba committed Jan 25, 2024
1 parent 3613058 commit dd3eca6
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 10 deletions.
1 change: 1 addition & 0 deletions cleaner/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ The following are command options for running the script
* `value` : (Required) This is the actual value of the parameter provided to filter the resources e.g Nairobi, lt2023-08-02 etc
* `batch_size`: (Not required) This is the batch size of resources pulled. The default value is 1000
* `expunge`: (Not required) This is a boolean value that tells the function whether it should expunge the deleted data or not. The default is set to false. __NOTE: This does not work with a filter, it will expunge all deleted resources of the specified resource type__
* `cascade`: (Not required) This is a boolean value that tells the function whether it should cascade in deleting data or not. The default is set to false. __NOTE: This works with all filter types, it will delete all resources specified and their related resources__

### To run script
1. Create virtualenv
Expand Down
24 changes: 18 additions & 6 deletions cleaner/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@


# This function makes the request to the provided url
def post_request(request_type, payload, url):
def handle_request(request_type, payload, url):
logging.debug("Posting request")
logging.debug("Request type: " + request_type)
logging.debug("Url: " + url)
Expand Down Expand Up @@ -54,6 +54,13 @@ def post_request(request_type, payload, url):
else:
logging.error("[" + str(r.status_code) + "]" + r.text)
return r.text
elif request_type == "DELETE":
r = requests.delete(url, headers=headers)
if r.status_code == 200 or r.status_code == 201:
logging.debug("[" + str(r.status_code) + "]" + ": SUCCESS!")
else:
logging.error("[" + str(r.status_code) + "]" + r.text)
return r.text
else:
logging.error("Unsupported request type!")
except Exception as err:
Expand All @@ -77,7 +84,7 @@ def build_payload(resource_ids, resource_type):
def delete_resources(resource_url, resource_type):
# Get the resources from the url
logging.info("Getting resources")
response = post_request("GET", "", resource_url)
response = handle_request("GET", "", resource_url)

try:
json_response = json.loads(response)
Expand All @@ -93,7 +100,7 @@ def delete_resources(resource_url, resource_type):
resource_ids.append(resource_id)

del_payload = build_payload(resource_ids, resource_type)
post_request("POST", del_payload, config.fhir_base_url)
handle_request("POST", del_payload, config.fhir_base_url)
logging.info(str(len(resource_ids)) + " resources deleted")
time.sleep(20)
delete_resources(resource_url, resource_type)
Expand All @@ -102,7 +109,7 @@ def delete_resources(resource_url, resource_type):
# confirm the count and that we are done
logging.info("Checking count")
count_url = resource_url + "&_summary=count"
count_response = post_request("GET", "", count_url)
count_response = handle_request("GET", "", count_url)
json_count = json.loads(count_response)
count = json_count["total"]
if count == 0:
Expand All @@ -112,9 +119,10 @@ def delete_resources(resource_url, resource_type):
logging.info("Call delete_resources again")
delete_resources(resource_url, resource_type)


def expunge_resources(expunge_url):
full_payload = """ { "resourceType": "Parameters", "parameter": [{ "name": "expungeDeletedResources", "valueBoolean": true }]} """
response = post_request("POST", full_payload, expunge_url)
response = handle_request("POST", full_payload, expunge_url)
json_response = json.loads(response.text)
counter = json_response["parameter"][0]["valueInteger"]
if counter > 0:
Expand All @@ -129,10 +137,11 @@ def expunge_resources(expunge_url):
@click.option("--value", required=True)
@click.option("--batch_size", default=1000)
@click.option("--expunge", default=False)
@click.option("--cascade", default=False)
@click.option(
"--log_level", type=click.Choice(["DEBUG", "INFO", "ERROR"], case_sensitive=False)
)
def main(resource_type, parameter, value, batch_size, expunge, log_level):
def main(resource_type, parameter, value, batch_size, expunge, cascade, log_level):
if log_level == "DEBUG":
logging.basicConfig(level=logging.DEBUG)
elif log_level == "INFO":
Expand All @@ -158,6 +167,9 @@ def main(resource_type, parameter, value, batch_size, expunge, log_level):
if expunge:
expunge_url = config.fhir_base_url + "/" + resource_type + "/$expunge"
expunge_resources(expunge_url)
if cascade:
resource_url = resource_url + "&_cascade=delete"
handle_request("DELETE", "", resource_url)


if __name__ == "__main__":
Expand Down
8 changes: 4 additions & 4 deletions cleaner/test_main.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
import json
import unittest
from unittest.mock import patch
from main import post_request, build_payload
from main import handle_request, build_payload


class TestMainFunctions(unittest.TestCase):

@patch('main.config')
@patch('main.requests.post')
@patch('main.OAuth2Session')
def test_post_request_successful(self, oauth_session, mock_post,
mock_config):
def test_handle_request_successful(self, oauth_session, mock_post,
mock_config):
oauth_session.fetch_token.return_value = "token"
mock_config.client_id = 1
mock_config.client_secret = "client_secret"
Expand All @@ -21,7 +21,7 @@ def test_post_request_successful(self, oauth_session, mock_post,
mock_response = mock_post.return_value
mock_response.status_code = 200
mock_response.text = "Success"
result = post_request("POST", "payload", "url")
result = handle_request("POST", "payload", "url")
self.assertEqual(result.status_code, 200)

def test_build_payload(self):
Expand Down

0 comments on commit dd3eca6

Please sign in to comment.