11import sys
22
3- sys .path .append ('./lib/' )
43
5- import pybase64
6- import json
4+ sys .path .append ("./lib/" )
5+
6+ import datetime
77import hashlib
88import hmac
9+ import json
10+ import logging
911import re
10- import requests
1112import time
13+ from os import getenv
14+
1215import boto3
16+ import pybase64
17+ import requests
1318from dotenv import load_dotenv
14- from os import getenv
15- import datetime
16- import logging
19+
1720
1821logger = logging .getLogger ()
1922logger .setLevel (logging .INFO )
2023
2124
2225def remove_illegal_characters (string ):
2326 """Removes illegal characters from string"""
24- regex_list = [['=' , "" ], ['\/' , "_" ], ['+' , "-" ]]
27+ regex_list = [["=" , "" ], ["\/" , "_" ], ["+" , "-" ]]
2528 for r in regex_list :
26- string = re .sub (string = string ,
27- pattern = "[{}]" .format (r [0 ]),
28- repl = r [1 ])
29+ string = re .sub (string = string , pattern = "[{}]" .format (r [0 ]), repl = r [1 ])
2930 return string
3031
3132
@@ -44,37 +45,39 @@ def dictionary_to_string(dictionary):
4445def create_signature (header , payload , secret ):
4546 """Encode JSON string"""
4647 # hashed header, hashed payload, string secret
47- unsigned_token = header + '.' + payload
48- key_bytes = bytes (secret , 'utf-8' )
49- string_to_sign_bytes = bytes (unsigned_token , 'utf-8' )
50- signature_hash = hmac .new (key_bytes , string_to_sign_bytes , digestmod = hashlib .sha256 ).digest ()
48+ unsigned_token = header + "." + payload
49+ key_bytes = bytes (secret , "utf-8" )
50+ string_to_sign_bytes = bytes (unsigned_token , "utf-8" )
51+ signature_hash = hmac .new (
52+ key_bytes , string_to_sign_bytes , digestmod = hashlib .sha256
53+ ).digest ()
5154 encoded_signature = pybase64 .b64encode (signature_hash )
52- encoded_signature = encoded_signature .decode (' utf-8' )
55+ encoded_signature = encoded_signature .decode (" utf-8" )
5356 encoded_signature = remove_illegal_characters (encoded_signature )
5457 return encoded_signature
5558
5659
5760def get_token (url , encoded_header , encoded_payload , signature , headers ):
5861 """Get token"""
5962 assertion = encoded_header + "." + encoded_payload + "." + signature
60- data = f' assertion={ assertion } &grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer'
63+ data = f" assertion={ assertion } &grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer"
6164 response = requests .post (url , headers = headers , data = data )
6265 response_json = response .json ()
63- auth_token = response_json .get (' access_token' )
66+ auth_token = response_json .get (" access_token" )
6467 return auth_token
6568
6669
6770def get_icaseworks_report_from (report_id , from_date , auth_headers , auth_payload ):
6871 report_url = "https://hackneyreports.icasework.com/getreport?"
69- request_url = f' { report_url } ReportId={ report_id } &Format=json&From={ from_date } '
70- logger .info (f' Request url: { request_url } ' )
72+ request_url = f" { report_url } ReportId={ report_id } &Format=json&From={ from_date } "
73+ logger .info (f" Request url: { request_url } " )
7174 response = requests .get (request_url , headers = auth_headers , data = auth_payload )
72- logger .info (f' Status Code: { response .status_code } ' )
75+ logger .info (f" Status Code: { response .status_code } " )
7376 return response .content
7477
7578
7679def write_dataframe_to_s3 (s3_client , data , s3_bucket , output_folder , filename ):
77- filename = re .sub (' [^a-zA-Z0-9]+' , '-' , filename ).lower ()
80+ filename = re .sub (" [^a-zA-Z0-9]+" , "-" , filename ).lower ()
7881 current_date = datetime .datetime .now ()
7982 day = single_digit_to_zero_prefixed_string (current_date .day )
8083 month = single_digit_to_zero_prefixed_string (current_date .month )
@@ -83,7 +86,7 @@ def write_dataframe_to_s3(s3_client, data, s3_bucket, output_folder, filename):
8386 return s3_client .put_object (
8487 Bucket = s3_bucket ,
8588 Body = data ,
86- Key = f"{ output_folder } /import_year={ year } /import_month={ month } /import_day={ day } /import_date={ date } /{ filename } .json"
89+ Key = f"{ output_folder } /import_year={ year } /import_month={ month } /import_day={ day } /import_date={ date } /{ filename } .json" ,
8790 )
8891
8992
@@ -102,14 +105,16 @@ def lambda_handler(event, lambda_context):
102105 url = "https://hackney.icasework.com/token"
103106
104107 headers = {
105- ' Content-Type' : ' application/x-www-form-urlencoded' ,
108+ " Content-Type" : " application/x-www-form-urlencoded" ,
106109 }
107110
108111 # Get api api credentials from secrets manager
109112 secret_name = getenv ("SECRET_NAME" )
110- secrets_manager_client = boto3 .client ('secretsmanager' )
111- api_credentials_response = retrieve_credentials_from_secrets_manager (secrets_manager_client , secret_name )
112- api_credentials = json .loads (api_credentials_response ['SecretString' ])
113+ secrets_manager_client = boto3 .client ("secretsmanager" )
114+ api_credentials_response = retrieve_credentials_from_secrets_manager (
115+ secrets_manager_client , secret_name
116+ )
117+ api_credentials = json .loads (api_credentials_response ["SecretString" ])
113118 api_key = api_credentials .get ("api_key" )
114119 secret = api_credentials .get ("secret" )
115120
@@ -122,11 +127,7 @@ def lambda_handler(event, lambda_context):
122127 # Create payload
123128 current_unix_time = int (time .time ())
124129 str_time = str (current_unix_time )
125- payload_object = {
126- "iss" : api_key ,
127- "aud" : url ,
128- "iat" : str_time
129- }
130+ payload_object = {"iss" : api_key , "aud" : url , "iat" : str_time }
130131
131132 payload_object = dictionary_to_string (payload_object )
132133
@@ -136,16 +137,21 @@ def lambda_handler(event, lambda_context):
136137 signature = create_signature (header , payload , secret )
137138
138139 # Get token from response
139- auth_token = get_token (url = url , encoded_header = header , encoded_payload = payload , signature = signature ,
140- headers = headers )
140+ auth_token = get_token (
141+ url = url ,
142+ encoded_header = header ,
143+ encoded_payload = payload ,
144+ signature = signature ,
145+ headers = headers ,
146+ )
141147
142148 # Create auth header for API Calls and auth payload
143- authorization = f' Bearer { auth_token } '
149+ authorization = f" Bearer { auth_token } "
144150
145151 auth_payload = {}
146152
147153 auth_headers = {
148- ' Authorization' : authorization ,
154+ " Authorization" : authorization ,
149155 }
150156
151157 report_tables = [
@@ -164,22 +170,32 @@ def lambda_handler(event, lambda_context):
164170 date_to_track_from = today - datetime .timedelta (days = 1 )
165171 logger .info (f"Date to track from: { date_to_track_from } " )
166172
167- s3_client = boto3 .client ('s3' )
173+ s3_client = boto3 .client ("s3" )
168174
169175 for report_details in report_tables :
170- logger .info (f' Pulling report for { report_details [" name" ] } ' )
176+ logger .info (f" Pulling report for { report_details [' name' ] } " )
171177 case_id_report_id = report_details ["id" ]
172- case_id_list = get_icaseworks_report_from (case_id_report_id , date_to_track_from , auth_headers , auth_payload )
178+ case_id_list = get_icaseworks_report_from (
179+ case_id_report_id , date_to_track_from , auth_headers , auth_payload
180+ )
173181 report_details ["data" ] = case_id_list
174- write_dataframe_to_s3 (s3_client , report_details ["data" ], s3_bucket , output_folder_name , report_details ["name" ])
175- logger .info (f'Finished writing report for { report_details ["name" ]} to S3' )
182+ write_dataframe_to_s3 (
183+ s3_client ,
184+ report_details ["data" ],
185+ s3_bucket ,
186+ output_folder_name ,
187+ report_details ["name" ],
188+ )
189+ logger .info (f"Finished writing report for { report_details ['name' ]} to S3" )
176190
177191 # Trigger glue job to copy from landing to raw and convert to parquet
178- glue_client = boto3 .client (' glue' )
192+ glue_client = boto3 .client (" glue" )
179193 start_glue_trigger (glue_client , glue_trigger_name )
180194
195+
181196def single_digit_to_zero_prefixed_string (value ):
182- return str (value ) if value > 9 else '0' + str (value )
197+ return str (value ) if value > 9 else "0" + str (value )
198+
183199
184200def start_glue_trigger (glue_client , trigger_name ):
185201 trigger_details = glue_client .start_trigger (Name = trigger_name )
0 commit comments