Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 27 additions & 18 deletions iac/iac/lambda_stack.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,23 +71,23 @@ def __init__(self, scope: Construct, api_gateway_resource: Resource, environment
code=lambda_.Code.from_asset("./lambda_requirements_layer_temp/xlsxwriter"),
compatible_runtimes=[lambda_.Runtime.PYTHON_3_9]
)

self.create_action_function = self.create_lambda_api_gateway_integration(
module_name="create_action",
method="POST",
api_resource=api_gateway_resource,
environment_variables=environment_variables,
authorizer=authorizer
)

self.create_project_function = self.create_lambda_api_gateway_integration(
module_name="create_project",
method="POST",
api_resource=api_gateway_resource,
environment_variables=environment_variables,
authorizer=authorizer
)

self.create_member_function = self.create_lambda_api_gateway_integration(
module_name="create_member",
method="POST",
Expand All @@ -103,15 +103,15 @@ def __init__(self, scope: Construct, api_gateway_resource: Resource, environment
environment_variables=environment_variables,
authorizer=authorizer
)

self.delete_project_function = self.create_lambda_api_gateway_integration(
module_name="delete_project",
method="DELETE",
api_resource=api_gateway_resource,
environment_variables=environment_variables,
authorizer=authorizer
)

self.delete_member_function = self.create_lambda_api_gateway_integration(
module_name="delete_member",
method="DELETE",
Expand Down Expand Up @@ -143,7 +143,7 @@ def __init__(self, scope: Construct, api_gateway_resource: Resource, environment
environment_variables=environment_variables,
authorizer=authorizer
)

self.get_history_function = self.create_lambda_api_gateway_integration(
module_name="get_history",
method="POST",
Expand All @@ -159,23 +159,31 @@ def __init__(self, scope: Construct, api_gateway_resource: Resource, environment
environment_variables=environment_variables,
authorizer=authorizer
)

self.get_member_function = self.create_lambda_api_gateway_integration(
module_name="get_member",
method="POST",
api_resource=api_gateway_resource,
environment_variables=environment_variables,
authorizer=authorizer
)


self.get_member_info_function = self.create_lambda_api_gateway_integration(
module_name="get_member_info",
method="GET",
api_resource=api_gateway_resource,
environment_variables=environment_variables,
authorizer=authorizer
)

Comment thread
lseixas marked this conversation as resolved.
self.get_project_function = self.create_lambda_api_gateway_integration(
module_name="get_project",
method="GET",
api_resource=api_gateway_resource,
environment_variables=environment_variables,
authorizer=authorizer
)

self.get_all_members_function = self.create_lambda_api_gateway_integration(
module_name="get_all_members",
method="POST",
Expand All @@ -191,31 +199,31 @@ def __init__(self, scope: Construct, api_gateway_resource: Resource, environment
environment_variables=environment_variables,
authorizer=authorizer
)

self.update_project_function = self.create_lambda_api_gateway_integration(
module_name="update_project",
method="PUT",
api_resource=api_gateway_resource,
environment_variables=environment_variables,
authorizer=authorizer
)

self.update_member_function = self.create_lambda_api_gateway_integration(
module_name="update_member",
method="PUT",
api_resource=api_gateway_resource,
environment_variables=environment_variables,
authorizer=authorizer
)

self.update_action_function = self.create_lambda_api_gateway_integration(
module_name="update_action",
method="PUT",
api_resource=api_gateway_resource,
environment_variables=environment_variables,
authorizer=authorizer
)

self.batch_get_member_function = self.create_lambda_api_gateway_integration(
module_name="batch_get_member",
method="GET",
Expand Down Expand Up @@ -243,13 +251,13 @@ def __init__(self, scope: Construct, api_gateway_resource: Resource, environment
self.download_members_function = self.create_lambda_event_bridge_integration(
module_name="download_members",
cron_schedule=Schedule.cron(week_day="TUE", hour="18", minute="0"),
environment_variables=environment_variables
environment_variables=environment_variables
)

self.download_actions_function = self.create_lambda_event_bridge_integration(
module_name="download_actions",
cron_schedule=Schedule.cron(week_day="TUE", hour="18", minute="0"),
environment_variables=environment_variables
environment_variables=environment_variables
)

self.download_projects_function = self.create_lambda_api_gateway_integration(
Expand Down Expand Up @@ -281,6 +289,7 @@ def __init__(self, scope: Construct, api_gateway_resource: Resource, environment
self.get_history_function,
self.get_history_project_function,
self.get_member_function,
self.get_member_info_function,
self.get_project_function,
self.get_all_members_function,
self.get_all_members_admin_function,
Expand All @@ -293,7 +302,7 @@ def __init__(self, scope: Construct, api_gateway_resource: Resource, environment
self.download_members_function,
self.download_actions_function,
]

self.functions_that_need_dynamo_member_permissions = [
self.create_action_function,
self.create_project_function,
Expand All @@ -309,6 +318,7 @@ def __init__(self, scope: Construct, api_gateway_resource: Resource, environment
self.get_all_members_admin_function,
self.batch_get_member_function,
self.get_member_function,
self.get_member_info_function,
self.get_all_projects_function,
self.get_history_function,
self.get_history_project_function,
Expand All @@ -320,7 +330,7 @@ def __init__(self, scope: Construct, api_gateway_resource: Resource, environment
self.download_actions_function,
self.get_strike_function
]
Comment thread
lseixas marked this conversation as resolved.

self.functions_that_need_ses_permissions = [
self.update_member_function,
self.update_action_validation_function,
Expand All @@ -339,4 +349,3 @@ def __init__(self, scope: Construct, api_gateway_resource: Resource, environment
self.download_members_function
]


Empty file.
Empty file.
50 changes: 50 additions & 0 deletions src/modules/get_member_info/app/get_member_info_controller.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
from src.shared.helpers.errors.domain_errors import EntityError
from src.shared.helpers.errors.usecase_errors import UnregisteredUser, UserNotAllowed
from .get_member_info_usecase import GetMemberInfoUsecase
from .get_member_info_viewmodel import GetMemberInfoViewModel
from src.shared.helpers.errors.controller_errors import MissingParameters
from src.shared.helpers.external_interfaces.external_interface import IRequest
from src.shared.helpers.external_interfaces.http_codes import OK, BadRequest, Forbidden, InternalServerError
from src.shared.infra.dto.user_api_gateway_dto import UserApiGatewayDTO


class GetMemberInfoController:
def __init__(self, usecase: GetMemberInfoUsecase):
self.usecase = usecase

def __call__(self, request: IRequest):
try:
if request.data.get('requester_user') is None:
raise MissingParameters('requester_user')

requester_user = UserApiGatewayDTO.from_api_gateway(request.data.get('requester_user'))

print(f"Fetching member info for user_id: {requester_user.user_id}")

member = self.usecase(user_id=requester_user.user_id)

viewmodel = GetMemberInfoViewModel(member=member)

print("Member info retrieved successfully")

return OK(viewmodel.to_dict())

except MissingParameters as err:
print(f"Missing parameters error: {err.message}")
return BadRequest(body=err.message)

except EntityError as err:
print(f"Entity error: {err.message}")
return BadRequest(body=err.message)

except UnregisteredUser as err:
print(f"Unregistered user error: {err.message}")
return Forbidden(body=err.message)

except UserNotAllowed as err:
print(f"User not allowed error: {err.message}")
return Forbidden(body=err.message)

except Exception as err:
print(f"Unexpected error: {str(err)}")
return InternalServerError(body=err.args[0])
30 changes: 30 additions & 0 deletions src/modules/get_member_info/app/get_member_info_presenter.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
from .get_member_info_usecase import GetMemberInfoUsecase
from .get_member_info_controller import GetMemberInfoController
from src.shared.environments import Environments
from src.shared.helpers.external_interfaces.http_lambda_requests import LambdaHttpRequest, LambdaHttpResponse


member_repo = Environments.get_member_repo()()
action_repo = Environments.get_action_repo()()

usecase = GetMemberInfoUsecase(member_repo=member_repo, action_repo=action_repo)
controller = GetMemberInfoController(usecase=usecase)


def lambda_handler(event, context):
"""
Lambda handler para buscar informações de membro para portfólio.
Espera um requester_user autenticado via API Gateway.
"""
httpRequest = LambdaHttpRequest(data=event)
httpRequest.data['requester_user'] = event.get('requestContext', {}).get('authorizer', {}).get('claims', None)

response = controller(httpRequest)

httpResponse = LambdaHttpResponse(
status_code=response.status_code,
body=response.body,
headers=response.headers
)

return httpResponse.toDict()
38 changes: 38 additions & 0 deletions src/modules/get_member_info/app/get_member_info_usecase.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
from src.shared.domain.entities.member import Member
from src.shared.domain.repositories.member_repository_interface import IMemberRepository
from src.shared.domain.repositories.action_repository_interface import IActionRepository
from src.shared.helpers.errors.domain_errors import EntityError
from src.shared.helpers.errors.usecase_errors import UnregisteredUser, UserNotAllowed


class GetMemberInfoUsecase:
def __init__(self, member_repo: IMemberRepository, action_repo: IActionRepository):
self.member_repo = member_repo
self.action_repo = action_repo

def __call__(self, user_id: str) -> Member:

if not Member.validate_user_id(user_id):
raise EntityError('user_id')

member = self.member_repo.get_member(user_id=user_id)

if member is None:
raise UnregisteredUser()

is_active = Member.validate_active(member.active)

if not is_active:
raise UserNotAllowed()

# Puxa os projetos do membro para incluir no portfólio
projects = self.action_repo.get_all_projects()
member_projects = []

for project in projects:
if member.user_id in project.members_user_ids:
member_projects.append(project.name)

member.project = member_projects

return member
44 changes: 44 additions & 0 deletions src/modules/get_member_info/app/get_member_info_viewmodel.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
from src.shared.domain.entities.member import Member
from src.shared.domain.enums.role_enum import ROLE
from src.shared.domain.enums.stack_enum import STACK
from src.shared.domain.enums.course_enum import COURSE
from typing import List, Optional


class GetMemberInfoViewModel:
name: str
ra: str
role: ROLE
stack: STACK
year: int
course: COURSE
project: List[str]
hired_date: int
photo: Optional[str]

def __init__(self, member: Member):
self.name = member.name
self.ra = member.ra
self.role = member.role
self.stack = member.stack
self.year = member.year
self.course = member.course
self.project = member.project if hasattr(member, 'project') else []
self.hired_date = member.hired_date
self.photo = member.photo

def to_dict(self):
return {
'member_info': {
'name': self.name,
'ra': self.ra,
'role': self.role.value,
'stack': self.stack.value,
'year': self.year,
'course': self.course.value,
'project': self.project,
'hired_date': self.hired_date,
'photo': self.photo
},
"message": "the member info was retrieved successfully"
}
Empty file.
Empty file.
Loading