Skip to main content

Core App

The core app provides foundational infrastructure used by all other apps in the Maybern backend. It includes base models, custom field types, API utilities, and common services.

Base Models

All models in Maybern inherit from one of these base classes:
ModelDescription
TimeStampedModelAdds created_at and updated_at fields
CustomerTimeStampedModelAdds customer_id for multi-tenancy
AuditableModelEnables audit logging for changes
VersionModelFor type-2 versioned entities
from server.apps.core.models.customer_time_stamped import CustomerTimeStampedModel

class MyEntity(CustomerTimeStampedModel):
    name = model_fields.TextModelField()
    # customer_id, created_at, updated_at are automatic

Custom Field Types

All ORM fields are wrapped in server.apps.core.models.fields for additional functionality:
  • MUUIDField - UUID with prefix (e.g., INVS_abc123)
  • TextModelField - Text with validation
  • ForeignKeyModelField - FK with sensible defaults
  • DecimalModelField - Decimal with precision
  • DateModelField - Date field
  • BooleanModelField - Boolean field

Field Decorators

from server.apps.core.models.decorators import sensitive, encrypt

class User(CustomerTimeStampedModel):
    @sensitive
    ssn = model_fields.TextModelField()  # Masked in logs
    
    @encrypt
    api_key = model_fields.TextModelField()  # Encrypted at rest

API Utilities

Request Context

The RequestCtx dataclass contains request-scoped information:
@dataclass
class RequestCtx:
    customer_id: MUUID
    user_id: MUUID
    request_source: RequestSource
    feature_flags: list[str]

API Decorators

from server.apps.core.decorators.api import api_get, api_post

class MyAPI(GetAPIView, PostAPIView):
    @api_get(
        operation_id=OperationIds.MY_APP.value.GET_ENTITY,
        response=EntityResponse,
        description="Get an entity",
    )
    def get(self, *, url_params, ctx, param_data):
        return MyService.get_entity(ctx=ctx, entity_id=url_params["entity_id"])

Core Services

Cache Service

Distributed caching using Redis:
from server.apps.core.services.cache import CacheService

# Set a value
CacheService.set(key="my_key", value=data, ttl=3600)

# Get a value
data = CacheService.get(key="my_key")

Evaluate Expression Service

Execute dynamic calculations:
from server.apps.core.services.evaluate import EvaluateExpressionService

result = EvaluateExpressionService.evaluate(
    expression="value * rate",
    context={"value": 100, "rate": 0.05}
)

I18n Service

Internationalization support:
from server.apps.core.services.i18n import I18nService

translated = I18nService.translate(
    key="fee_types.management_fee",
    locale="en"
)

Generate MUUID Service

Create prefixed UUIDs:
from server.apps.core.services.muuid import GenerateMUUIDService

entity_id = GenerateMUUIDService.generate(prefix="ENTY")
# Returns: MUUID("ENTY_abc123...")

Rounding Service

Consistent rounding strategies:
from server.apps.core.services.rounding import RoundingService

rounded = RoundingService.round_to_cents(
    value=Decimal("100.555"),
    strategy=RoundingStrategy.HALF_UP
)

Managers and QuerySets

Custom managers wrap Django ORM functionality:
  • BaseTimeStampedModelManager - Core querying logic
  • TimeStampedModelManager - For non-tenant models
  • CustomerTimeStampedModelManager - Adds customer filtering
  • VersionableModelManager - For versioned models
# Customer filtering is automatic
entities = MyEntity.objects.filter(ctx=ctx, name="Test")

Constraints

Custom database constraints:
from server.apps.core.models.constraints import require_exactly_one_non_null_constraint

class Override(CustomerTimeStampedModel):
    user = models.ForeignKey(User, null=True)
    customer = models.ForeignKey(Customer, null=True)
    
    class Meta:
        constraints = [
            require_exactly_one_non_null_constraint(
                fields=["user", "customer"],
                name="exactly_one_target",
            ),
        ]

Exceptions

Standard exception types:
from server.apps.core.exceptions import MaybernError, MaybernExpectedUserError

# Internal system error
raise MaybernError("Database connection failed")

# User-facing error
raise MaybernExpectedUserError("Please provide a valid date")