Files
StandOut/lambda_redirect/lambda_redirect.py
2024-04-25 12:54:31 +02:00

115 lines
3.1 KiB
Python

import os
import boto3
import json
import boto3.exceptions
from pydantic import BaseModel
from typing import Optional
s3_client = None
bucket_config = ''
bucket_data = ''
class RequestParams(BaseModel):
id: str
tag_id: str
face_id: Optional[str] = None
class Content(BaseModel):
type: str
key: str
url: Optional[str] = None
def lambda_handler(event: dict, context):
global s3_client, bucket_config, bucket_data
if s3_client is None:
print("Init Function")
bucket_config = os.environ.get('BUCKET_CONFIG', 'standout-config')
bucket_data = os.environ.get('BUCKET_DATA', 'standout-data')
print(f'Bucket Config: {bucket_config}')
print(f' Bucket Data: {bucket_data}')
s3_client = boto3.client('s3')
## Download redirects file
try:
resp = s3_client.get_object(
Bucket=bucket_config,
Key='redirects.json'
)
except s3_client.exceptions.NoSuchKey as e:
print(e)
# Oppure pagina "siamo spiacenti ma il contenuto non e' disponibile"
return {
"statusCode": 404
}
## Parse request and get content
try:
redirects = json.load(resp['Body'])
params = RequestParams(**event.get('queryStringParameters', {}))
customer = redirects.get(params.id, {})
tag = customer.get(params.tag_id, {})
content = tag.get('content', None)
# In case of multi face tag select the correct face
if isinstance(content, dict) and params.face_id:
content = content.get(params.face_id, None)
if content is None:
return {
"statusCode": 404
}
content = Content(**content)
match content.type:
case "s3":
key = f'{params.id}/{params.tag_id}/{content.key}'
final_redirect = s3_client.generate_presigned_url('get_object',
Params={'Bucket': bucket_data,
'Key': key},
ExpiresIn=120)
case "url":
final_redirect = content.url
except json.decoder.JSONDecodeError as je:
print(je)
return {
"statusCode": 500
}
except KeyError as ke:
print(ke)
return {
"statusCode": 404
}
except Exception as e:
print(e)
return {
"statusCode": 500
}
return {
"statusCode": 301,
"headers": {
"Cache-Control": "no-cache",
"Location": str(final_redirect)
}
}
if __name__ == "__main__":
event = {
"resource": "/",
"path": "/",
"httpMethod": "GET",
"queryStringParameters": {
"id": "customer1",
"tag_id": "tag3",
"face_id": "face1"
},
}
print(json.dumps(lambda_handler(
event,
None
), indent=2))