Skip to content

Commit 362b891

Browse files
author
Nick Bragdon
committed
Initial commit for adding in a fhirrequests wrapper
1 parent 85ff42e commit 362b891

3 files changed

Lines changed: 63 additions & 0 deletions

File tree

.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,12 @@ dmypy.json
148148
# Cython debug symbols
149149
cython_debug/
150150

151+
# VS Code
152+
.vscode/
153+
154+
# Virtual Env
155+
bb2_env/
156+
151157
# PyCharm
152158
# JetBrains specific template is maintainted in a separate JetBrains.gitignore that can
153159
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore

src/constants.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
SDK_HEADER = "python"
2+
SDK_HEADER_KEY = "X-BLUEBUTTON-SDK"
3+
REFRESH_TOKEN_ENDPOINT = "/o/token/"

src/fhirRequest.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import datetime
2+
from constants import REFRESH_TOKEN_ENDPOINT, SDK_HEADER, SDK_HEADER_KEY
3+
import requests
4+
from requests.adapters import HTTPAdapter, Retry
5+
6+
7+
def fhirRequest(bb, config):
8+
auth_token = config.auth_token
9+
new_auth_token = handle_expired(bb, auth_token, config.refresh_token)
10+
11+
if new_auth_token is not None:
12+
auth_token = new_auth_token
13+
14+
retry_config = Retry(
15+
total=3, backoff_factor=0.2, status_forcelist=[500, 502, 503, 504]
16+
)
17+
full_url = bb.base_url + "/v" + bb.version + config.url
18+
headers = {
19+
"Authorization": "Bearer " + auth_token.access_token,
20+
[SDK_HEADER_KEY]: SDK_HEADER,
21+
}
22+
adapter = HTTPAdapter(max_retries=retry_config)
23+
sesh = requests.Session()
24+
sesh.mount("https://", adapter)
25+
sesh.mount("http://", adapter)
26+
response = sesh.get(url=full_url, params=config.params, headers=headers)
27+
28+
return {"auth_token": new_auth_token, "response": response}
29+
30+
31+
def handle_expired(bb, auth_token):
32+
if datetime.datetime.now() > auth_token.expires_at:
33+
return refresh_access_token(bb, auth_token.refresh_token)
34+
35+
return None
36+
37+
38+
def refresh_access_token(bb, refresh_token):
39+
full_url = bb.base_url + "/v" + bb.version + REFRESH_TOKEN_ENDPOINT
40+
41+
params = {
42+
"client_id": bb.client_id,
43+
"grant_type": "refresh_token",
44+
"refresh_token": refresh_token,
45+
}
46+
47+
my_response = requests.post(
48+
url=full_url, params=params, auth=(bb.client_id, bb.client_secret)
49+
)
50+
response_json = my_response.json()
51+
response_json["expires_at"] = datetime.datetime.now() + datetime.timedelta(
52+
seconds=response_json["expires_in"]
53+
)
54+
return response_json

0 commit comments

Comments
 (0)