o
    i3                     @  sZ  d Z ddlmZ ddlZddlm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)Optional)	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&   r0   r3   r6   r   r8   r   r:   r<   r=   r>   r   rA   r   rE   rG   rI   rK   rM   rO   rQ   rS   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r3   $   Tr+   r   r,   	domain_idr)   tenants.tenant_idFr   indexr-   r1   r2   r   r7   
is_primaryis_verifiedrE   rC   Mapped['Tenant']rB   N)r!   r"   r#   r$   rT   r   __table_args__r   r   r   r\   r&   r   r-   rW   r   r`   ra   r   rB   r   r   r   r   rU   9   s   
  rU   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``.rG   r)   Tr*   r,   app_idr1   Fr2   display_namemodule_pathroute_prefixr   r7   r8   r?   r@   rA   apprb   rF   tenant_appsrH   tenant_limitsrJ   tenant_usagerL   tenant_secretsrN   rO   rP   rQ   rR   rS   N)r!   r"   r#   r$   rT   r   r   rf   r&   rg   rh   ri   r   r8   r   rA   r   rk   rl   rm   rn   rO   rQ   rS   r   r   r   r   re   H   s    
 re   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.rk   r-   rf   uq_tenant_apps_tenant_apprY   rZ   Tr[   r,   tenant_app_idr)   r]   Fr^   apps.app_idr   r7   
is_enabledconfigr2   r@   config_jsonrG   rb   rc   rB   zMapped['App']rj   N)r!   r"   r#   r$   rT   r   rd   r   r   r   rq   r&   r   r-   rf   r   rs   r   ru   r   rB   rj   r   r   r   r   ro   ]   s   
   ro   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,   r:   r1   Fr2   r3   r.   code      zMapped[float | None]price_monthly   AUDr   currencyr9   descriptionr?   r@   rA   zMapped[list['Tenant']]r(   N)r!   r"   r#   r$   rT   r   r   r:   r&   r3   rx   r
   r{   r~   r   r   r   rA   r   r(   r   r   r   r   rv   m   s   
 rv   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.rl   r-   rf   
limit_nameuq_tenant_limits_scoperY   rZ   Tr[   r,   tenant_limit_idr)   r]   Fr^   rr   r9   r;   r2   zMapped[int | None]limit_valuewindow_secondsoverage_policyr?   r@   rA   rI   rb   rc   rB   Mapped[Optional['App']]rj   N)r!   r"   r#   r$   rT   r   rd   r   r   r   r   r&   r   r-   rf   r   r	   r   r   r   r   rA   r   rB   rj   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.rm   rZ   Tr[   r,   usage_idr)   r]   Fr^   r-   rr   r9   rf   r;   r2   metric_name      r   )r   r   zMapped[float]metric_valueMapped[datetime | None]usage_period_startusage_period_endr   r   recorded_atr?   r@   rA   rK   rb   rc   rB   r   rj   N)r!   r"   r#   r$   rT   r   r   r   r   r&   r   r-   rf   r   r
   r   r   r   r   r   r%   r   r   rA   r   rB   rj   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.rn   r-   rf   secret_nameuq_tenant_secrets_scoperY   rZ   Tr[   r,   tenant_secret_idr)   r]   Fr^   rr   r9   r;   r2   secret_value_encryptedkey_versionr?   r@   rA   rM   rb   rc   rB   r   rj   N)r!   r"   r#   r$   rT   r   rd   r   r   r   r   r&   r   r-   rf   r   r   r   r   r   rA   r   rB   rj   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-   rf   integration_nameuq_tenant_integrations_scoperY   rZ   Tr[   r,   tenant_integration_idr)   r]   Fr^   rr   r9   r;   r2   r4   r5   r   r6   rt   r@   ru   
secret_refrO   rb   rc   rB   r   rj   N)r!   r"   r#   r$   rT   r   rd   r   r   r   r   r&   r   r-   rf   r   r6   r   ru   r   r   rB   rj   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.rQ   rZ   Tr[   r,   audit_event_idr)   r]   r^   r9   r-   rr   rf   r;   r2   actor_id
actor_typeF
event_typer4   successr   r6   
request_id
ip_addresspayloadr@   payload_jsonr   r   rb   Mapped[Optional['Tenant']]rB   r   rj   N)r!   r"   r#   r$   rT   r   r   r   r   r&   r   r-   rf   r   r   r   r6   r   r   r   r   r   r   r%   r   r   rB   rj   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_registryrZ   Tr[   r,   job_idr)   r]   r^   r9   r-   rr   rf   r;   Fr2   job_namer   r   
queue_namer4   queuedr6   r   r@   r   resultresult_jsonr   zMapped[int]attemptsr   
started_atfinished_atrS   rb   r   rB   r   rj   N)r!   r"   r#   r$   rT   r   r   r   r   r&   r   r-   rf   r   r   r6   r   r   r   r	   r   r   r   r   r   rB   rj   r   r   r   r   r      s    
   r   )r   r   )$r$   
__future__r   r   r   typingr   
sqlalchemyr   r   r   r   r	   r
   r   r   r   sqlalchemy.ormr   r   r   	config.dbr   r   r   r'   rU   re   ro   rv   r   r   r   r   r   r   r   r   r   r   <module>   s*    ,
