
- Implemented comprehensive multi-tenant data isolation using database-level security - Built JWT authentication system with role-based access control (Super Admin, Org Admin, User, Viewer) - Created RESTful API endpoints for user and organization operations - Added complete audit logging for all data modifications with IP tracking - Implemented API rate limiting and input validation with security middleware - Built webhook processing engine with async event handling and retry logic - Created external API call handlers with circuit breaker pattern and error handling - Implemented data synchronization between external services and internal data - Added integration health monitoring and status tracking - Created three mock external services (User Management, Payment, Communication) - Implemented idempotency for webhook processing to handle duplicates gracefully - Added comprehensive security headers and XSS/CSRF protection - Set up Alembic database migrations with proper SQLite configuration - Included extensive documentation and API examples Architecture features: - Multi-tenant isolation at database level - Circuit breaker pattern for external API resilience - Async background task processing - Complete audit trail with user context - Role-based permission system - Webhook signature verification - Request validation and sanitization - Health monitoring endpoints Co-Authored-By: Claude <noreply@anthropic.com>
118 lines
3.3 KiB
INI
118 lines
3.3 KiB
INI
# A generic, single database configuration.
|
|
|
|
[alembic]
|
|
# path to migration scripts
|
|
script_location = alembic
|
|
|
|
# template used to generate migration file names; The default value is %%(rev)s_%%(slug)s
|
|
# Uncomment the line below if you want the files to be prepended with date and time
|
|
# file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d-%%(rev)s_%%(slug)s
|
|
|
|
# sys.path path, will be prepended to sys.path if present.
|
|
# defaults to the current working directory.
|
|
prepend_sys_path = .
|
|
|
|
# timezone to use when rendering the date within the migration file
|
|
# as well as the filename.
|
|
# If specified, requires the python-dateutil library that can be
|
|
# installed by adding `alembic[tz]` to the pip requirements
|
|
# string value is passed to dateutil.tz.gettz()
|
|
# leave blank for localtime
|
|
# timezone =
|
|
|
|
# max length of characters to apply to the
|
|
# "slug" field
|
|
# truncate_slug_length = 40
|
|
|
|
# set to 'true' to run the environment during
|
|
# the 'revision' command, regardless of autogenerate
|
|
# revision_environment = false
|
|
|
|
# set to 'true' to allow .pyc and .pyo files without
|
|
# a source .py file to be detected as revisions in the
|
|
# versions/ directory
|
|
# sourceless = false
|
|
|
|
# version number format. This value may include strftime
|
|
# characters, to vary the precision of the version number
|
|
# based on the date of the revision command execution.
|
|
# When processing this value, the following strftime characters are
|
|
# available:
|
|
# %d - zero-padded day of the month
|
|
# %m - zero-padded month
|
|
# %y - zero-padded year
|
|
# %Y - four digit year
|
|
# %H - zero-padded hour
|
|
# %M - zero-padded minute
|
|
# %S - zero-padded second
|
|
# %f - zero-padded microsecond as a decimal number; value will be 0 when the
|
|
# datetime's timezone is not UTC
|
|
#
|
|
# The Alembic Config object can be used to access the
|
|
# configuration file values within the env.py file
|
|
version_path_separator = os
|
|
version_path_separator = space
|
|
|
|
# set to 'true' to search source files recursively
|
|
# in each "version_locations" directory
|
|
# new in Alembic version 1.10
|
|
# recursive_version_locations = false
|
|
|
|
# the output encoding used when revision files
|
|
# are written from script.py.mako
|
|
# output_encoding = utf-8
|
|
|
|
sqlalchemy.url = sqlite:////app/storage/db/db.sqlite
|
|
|
|
|
|
[post_write_hooks]
|
|
# post_write_hooks defines scripts or Python functions that are run
|
|
# on newly generated revision scripts. See the documentation for further
|
|
# detail and examples
|
|
|
|
# format using "black" - use the console_scripts runner, against the "black" entrypoint
|
|
# hooks = black
|
|
# black.type = console_scripts
|
|
# black.entrypoint = black
|
|
# black.options = -l 79 REVISION_SCRIPT_FILENAME
|
|
|
|
# lint with attempts to fix using "ruff" - use the exec runner, execute a binary
|
|
# hooks = ruff
|
|
# ruff.type = exec
|
|
# ruff.executable = %(here)s/.venv/bin/ruff
|
|
# ruff.options = --fix REVISION_SCRIPT_FILENAME
|
|
|
|
# Logging configuration
|
|
[loggers]
|
|
keys = root,sqlalchemy,alembic
|
|
|
|
[handlers]
|
|
keys = console
|
|
|
|
[formatters]
|
|
keys = generic
|
|
|
|
[logger_root]
|
|
level = WARN
|
|
handlers = console
|
|
qualname =
|
|
|
|
[logger_sqlalchemy]
|
|
level = WARN
|
|
handlers =
|
|
qualname = sqlalchemy.engine
|
|
|
|
[logger_alembic]
|
|
level = INFO
|
|
handlers =
|
|
qualname = alembic
|
|
|
|
[handler_console]
|
|
class = StreamHandler
|
|
args = (sys.stderr,)
|
|
level = NOTSET
|
|
formatter = generic
|
|
|
|
[formatter_generic]
|
|
format = %(levelname)-5.5s [%(name)s] %(message)s
|
|
datefmt = %H:%M:%S |