o
    i3                     @  sN  d Z ddlmZ ddlZddlmZ ddlmZmZmZm	Z	m
Z
mZmZmZmZ ddlmZmZmZ ddlmZ d$d
dZG dd dZG dd deeZG dd deeZG dd deeZG dd deeZG dd deeZG dd deeZG dd deZG dd deeZG dd deeZG d d! d!eZ G d"d# d#eeZ!dS )%a'  Control-plane SQLAlchemy models for ``absolutems_control_plane``.

These models define the platform metadata layer that wraps the existing apps.
They are intentionally isolated from application-specific schemas under
``/apps`` and can be migrated later without touching existing business logic.
    )annotationsN)datetime)	JSONBooleanDateTime
ForeignKeyIntegerNumericStringTextUniqueConstraint)Mappedmapped_columnrelationship)Basereturnstrc                   C  s   t t S )N)r   uuiduuid4 r   r   platform/tenants/models.py_uuid   s   r   c                   @  sF   e Zd ZU dZeeejddZde	d< eeejejddZ
de	d< dS )	TimestampMixinz"Shared created/updated timestamps.FdefaultnullableMapped[datetime]
created_at)r   onupdater   
updated_atN)__name__
__module____qualname____doc__r   r   r   utcnowr   __annotations__r   r   r   r   r   r      s   
  r   c                   @  s  e Zd ZU dZdZeedddZded< eedddd	Z	ded
< eedddZ
ded< eeddddZded< eedddZded< eededddZded< eedddZded< eedddZded< eedddZded< ededdZded< eddd Zd!ed"< eddd Zd#ed$< eddd Zd%ed&< eddd Zd'ed(< eddd Zd)ed*< eddd Zd+ed,< eddd Zd-ed.< eddd Zd/ed0< d1S )2Tenantz2A customer tenant registered in the control plane.tenants@   Tprimary_keyMapped[str]	tenant_idFuniquer   slug   r   name    activer   statusMapped[bool]	is_activezplans.plan_idMapped[str | None]plan_id   data_db_namestorage_keytimezonemetadataMapped[dict | None]metadata_jsontenantzall, delete-orphan)back_populatescascadezMapped[list['TenantDomain']]domainsMapped[list['TenantApp']]appsMapped[list['TenantLimit']]limitsMapped[list['TenantUsage']]usage_recordsMapped[list['TenantSecret']]secrets!Mapped[list['TenantIntegration']]integrationsMapped[list['AuditEvent']]audit_events!Mapped[list['JobRegistryRecord']]jobsN)r    r!   r"   r#   __tablename__r   r
   r,   r%   r/   r2   r5   r   r7   r   r9   r;   r<   r=   r   r@   r   rD   rF   rH   rJ   rL   rN   rP   rR   r   r   r   r   r&      s*   
 r&   c                   @  s   e Zd ZU dZdZedddfZeedde	dZ
d	ed
< eededdddZd	ed< eedddZd	ed< eedddZded< eedddZded< eddZded< dS )TenantDomainzDomains assigned to a tenant.tenant_domainsdomainuq_tenant_domains_domainr2   $   Tr*   r   r+   	domain_idr(   tenants.tenant_idFr   indexr,   r0   r1   r   r6   
is_primaryis_verifiedrD   rB   Mapped['Tenant']rA   N)r    r!   r"   r#   rS   r   __table_args__r   r
   r   r[   r%   r   r,   rV   r   r_   r`   r   rA   r   r   r   r   rT   8   s   
  rT   c                   @  s   e Zd ZU dZdZeedddZded< eedd	d
Z	ded< eedd	d
Z
ded< eedd	d
Zded< eedd	dZded< ededd
Zded< eddZded< eddZded< eddZded< eddZded< eddZded< eddZd ed!< eddZd"ed#< d$S )%Appz9App catalog entry for an existing module under ``/apps``.rF   r(   Tr)   r+   app_idr0   Fr1   display_namemodule_pathroute_prefixr   r6   r7   r>   r?   r@   appra   rE   tenant_appsrG   tenant_limitsrI   tenant_usagerK   tenant_secretsrM   rN   rO   rP   rQ   rR   N)r    r!   r"   r#   rS   r   r
   re   r%   rf   rg   rh   r   r7   r   r@   r   rj   rk   rl   rm   rN   rP   rR   r   r   r   r   rd   G   s    
 rd   c                   @  s   e Zd ZU dZdZeddddfZeedde	d	Z
d
ed< eededdddZd
ed< eededdddZd
ed< eedddZded< ededdZded< eddZded< eddZded< dS )	TenantAppz/App enablement and routing settings per tenant.rj   r,   re   uq_tenant_apps_tenant_apprX   rY   TrZ   r+   tenant_app_idr(   r\   Fr]   apps.app_idr   r6   
is_enabledconfigr1   r?   config_jsonrF   ra   rb   rA   zMapped['App']ri   N)r    r!   r"   r#   rS   r   rc   r   r
   r   rp   r%   r   r,   re   r   rr   r   rt   r   rA   ri   r   r   r   r   rn   \   s   
   rn   c                   @  s   e Zd ZU dZdZeedddZded< eedd	d
Z	ded< eeddd	dZ
ded< eedddd
Zded< eeddd	dZded< eedd
Zded< ededd
Zded< e Zded< dS )Planz(Commercial plan for tenant entitlements.plansr(   Tr)   r+   r9   r0   Fr1   r2   r-   code      zMapped[float | None]price_monthly   AUDr   currencyr8   descriptionr>   r?   r@   zMapped[list['Tenant']]r'   N)r    r!   r"   r#   rS   r   r
   r9   r%   r2   rw   r	   rz   r}   r   r~   r   r@   r   r'   r   r   r   r   ru   l   s   
 ru   c                   @  s  e Zd ZU dZdZedddddfZeedd	e	d
Z
ded< eededdd	dZded< eededd	d	dZded< eedddZded< eed	dZded< eed	dZded< eedd	dZded< eded	dZded< eddZded< eddZd ed!< d"S )#TenantLimitz;Effective limits applied to a tenant or tenant-app pairing.rk   r,   re   
limit_nameuq_tenant_limits_scoperX   rY   TrZ   r+   tenant_limit_idr(   r\   Fr]   rq   r8   r:   r1   zMapped[int | None]limit_valuewindow_secondsoverage_policyr>   r?   r@   rH   ra   rb   rA   Mapped['App' | None]ri   N)r    r!   r"   r#   rS   r   rc   r   r
   r   r   r%   r   r,   re   r   r   r   r   r   r   r@   r   rA   ri   r   r   r   r   r   |   s   
   r   c                   @  s  e Zd ZU dZdZeeddedZde	d< eede
d	d
ddZde	d< eede
ddddZde	d< eedd
dZde	d< eeddd
ddZde	d< eeddZde	d< eeddZde	d< eeejd
dZde	d< ededdZd e	d!< ed"d#Zd$e	d%< edd#Zd&e	d'< d(S ))TenantUsagez7Recorded usage data for billing, quotas, and analytics.rl   rY   TrZ   r+   usage_idr(   r\   Fr]   r,   rq   r8   re   r:   r1   metric_name      r   )r   r   zMapped[float]metric_valueMapped[datetime | None]usage_period_startusage_period_endr   r   recorded_atr>   r?   r@   rJ   ra   rb   rA   r   ri   N)r    r!   r"   r#   rS   r   r
   r   r   r%   r   r,   re   r   r	   r   r   r   r   r   r$   r   r   r@   r   rA   ri   r   r   r   r   r      s   
   r   c                   @  s   e Zd ZU dZdZedddddfZeedd	e	d
Z
ded< eededdd	dZded< eededd	d	dZded< eedddZded< eeddZded< eedd	dZded< eded	dZded< eddZded< eddZded< d S )!TenantSecretz6Encrypted secrets scoped to a tenant and optional app.rm   r,   re   secret_nameuq_tenant_secrets_scoperX   rY   TrZ   r+   tenant_secret_idr(   r\   Fr]   rq   r8   r:   r1   secret_value_encryptedkey_versionr>   r?   r@   rL   ra   rb   rA   r   ri   N)r    r!   r"   r#   rS   r   rc   r   r
   r   r   r%   r   r,   re   r   r   r   r   r   r@   r   rA   ri   r   r   r   r   r      s   
   r   c                   @  s  e Zd ZU dZdZedddddfZeedd	e	d
Z
ded< eededdd	dZded< eededd	d	dZded< eedddZded< eeddddZded< eded	dZded< eedd	dZded< eddZded < eddZd!ed"< d#S )$TenantIntegrationz4External integrations configured per tenant and app.tenant_integrationsr,   re   integration_nameuq_tenant_integrations_scoperX   rY   TrZ   r+   tenant_integration_idr(   r\   Fr]   rq   r8   r:   r1   r3   r4   r   r5   rs   r?   rt   
secret_refrN   ra   rb   rA   r   ri   N)r    r!   r"   r#   rS   r   rc   r   r
   r   r   r%   r   r,   re   r   r5   r   rt   r   r   rA   ri   r   r   r   r   r      s   
   r   c                   @  sV  e Zd ZU dZdZeeddedZde	d< eede
d	ddd
Zde	d< eede
dddd
Zde	d< eedddZde	d< eedddZde	d< eedddZde	d< eeddddZde	d< eedddd
Zde	d< eedddZde	d< ededdZde	d< eeejddZde	d< edd Zd!e	d"< edd Zd#e	d$< d%S )&
AuditEventz>Immutable audit trail for administrative and security actions.rP   rY   TrZ   r+   audit_event_idr(   r\   r]   r8   r,   rq   re   r:   r1   actor_id
actor_typeF
event_typer3   successr   r5   
request_id
ip_addresspayloadr?   payload_jsonr   r   ra   Mapped['Tenant' | None]rA   r   ri   N)r    r!   r"   r#   rS   r   r
   r   r   r%   r   r,   re   r   r   r   r5   r   r   r   r   r   r   r$   r   r   rA   ri   r   r   r   r   r      s    
   r   c                   @  sJ  e Zd ZU dZdZeeddedZde	d< eede
d	ddd
Zde	d< eede
dddd
Zde	d< eedddZde	d< eeddddZde	d< eeddddZde	d< ededdZde	d< ededdZde	d< eedddZde	d < eeddZd!e	d"< eeddZd!e	d#< ed$d%Zd&e	d'< ed$d%Zd(e	d)< d*S )+JobRegistryRecordzELifecycle records for background jobs submitted through the platform.job_registryrY   TrZ   r+   job_idr(   r\   r]   r8   r,   rq   re   r:   Fr1   job_namer   r   
queue_namer3   queuedr5   r   r?   r   resultresult_jsonr   zMapped[int]attemptsr   
started_atfinished_atrR   ra   r   rA   r   ri   N)r    r!   r"   r#   rS   r   r
   r   r   r%   r   r,   re   r   r   r5   r   r   r   r   r   r   r   r   r   rA   ri   r   r   r   r   r      s    
   r   )r   r   )"r#   
__future__r   r   r   
sqlalchemyr   r   r   r   r   r	   r
   r   r   sqlalchemy.ormr   r   r   	config.dbr   r   r   r&   rT   rd   rn   ru   r   r   r   r   r   r   r   r   r   r   <module>   s(    ,
