Shared utilities and models for Agrifrika microservices
Project description
Agrifrika Shared Package
Shared utilities, models, and AWS clients for all Agrifrika microservices.
Features
- Response Builders: Standardized API response formatting
- Request Parsers: Lambda event parsing with Pydantic validation
- Structured Logging: JSON-formatted logs for CloudWatch Logs Insights
- AWS Clients: Singleton boto3 clients with retry logic
- DynamoDB Client: High-level DynamoDB operations wrapper
- Cognito Client: User management operations wrapper
- Exception Classes: Custom business and validation exceptions
- Validators: Common validation utilities (email, phone, etc.)
Installation
Development Installation (Editable Mode)
For local development, install in editable mode so changes are reflected immediately:
cd agrifrika-backend/shared
pip install -e .
Production Installation
pip install agrifrika-shared
With Development Dependencies
pip install -e ".[dev]"
Usage
Response Builders
from agrifrika_shared.utils.response_builder import success_response, error_response
# Success response
return success_response({"user_id": "123"}, "User created successfully", 201)
# Error response
return error_response("User not found", 404, error_code="USER_NOT_FOUND")
Request Parsing
from agrifrika_shared.utils.request_parser import parse_lambda_event
from pydantic import BaseModel
class CreateUserRequest(BaseModel):
email: str
name: str
def handler(event, context):
# Automatically parse and validate
request = parse_lambda_event(event, CreateUserRequest)
print(request.email) # Validated email
Structured Logging
from agrifrika_shared.utils.logger import get_logger
logger = get_logger(__name__)
logger.info("user_created", user_id="123", email="test@example.com")
# Output: {"timestamp": "2025-01-15T10:30:00Z", "level": "INFO", "message": "user_created", ...}
AWS Clients
from agrifrika_shared.aws.clients import get_dynamodb_resource, get_cognito_client
# DynamoDB
dynamodb = get_dynamodb_resource()
table = dynamodb.Table('users')
# Cognito
cognito = get_cognito_client()
response = cognito.admin_get_user(UserPoolId='...', Username='...')
DynamoDB Client
from agrifrika_shared.aws.dynamo_client import DynamoDBClient
client = DynamoDBClient()
# Put item
client.put_item('users', {'id': '123', 'name': 'John'})
# Get item
user = client.get_item('users', {'id': '123'})
# Query
from boto3.dynamodb.conditions import Key
result = client.query('users', Key('status').eq('active'), index_name='StatusIndex')
Cognito Client
from agrifrika_shared.aws.cognito_client import CognitoClient
client = CognitoClient()
# Create user
user = client.create_user(
'test@example.com',
'TempPass123!',
attributes={'given_name': 'John', 'family_name': 'Doe'}
)
# Add to group
client.add_user_to_group('test@example.com', 'Admins')
Custom Exceptions
from agrifrika_shared.utils.exceptions import NotFoundError, ValidationError
# Raise exceptions
if not user:
raise NotFoundError('User', user_id)
if not validate_email(email):
raise ValidationError('Invalid email format', field='email')
Project Structure
agrifrika_shared/
├── __init__.py
├── models/ # Pydantic models (to be added)
│ ├── __init__.py
│ ├── base.py
│ ├── user.py
│ └── ...
├── utils/ # Utility functions
│ ├── __init__.py
│ ├── request_parser.py
│ ├── response_builder.py
│ ├── logger.py
│ ├── exceptions.py
│ └── validators.py
├── aws/ # AWS client wrappers
│ ├── __init__.py
│ ├── clients.py
│ ├── dynamo_client.py
│ └── cognito_client.py
└── config/ # Configuration
├── __init__.py
└── settings.py
Development
Running Tests
pytest
Running Tests with Coverage
pytest --cov=agrifrika_shared --cov-report=html
Code Formatting
# Format with black
black agrifrika_shared/
# Sort imports
isort agrifrika_shared/
# Lint with ruff
ruff check agrifrika_shared/
Type Checking
mypy agrifrika_shared/ --strict
Integration with Services
To use the shared package in a service:
-
Add to
requirements.txt:-e ../../../shared boto3==1.28.0 pydantic==2.5.0 -
Install dependencies:
cd services/aggregator_service pip install -r requirements.txt
-
Import and use:
from agrifrika_shared.utils import success_response, parse_lambda_event from agrifrika_shared.aws.dynamo_client import DynamoDBClient
Environment Variables
The shared package uses the following environment variables:
AWS_REGION: AWS region (default: us-east-1)COGNITO_USER_POOL_ID: Cognito user pool ID (required for CognitoClient)LOG_LEVEL: Logging level (default: INFO)
Contributing
- Make changes to the shared package
- Add tests for new functionality
- Run tests and linting
- Update this README if adding new features
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
agrifrika_shared-0.3.5.tar.gz
(29.6 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters