o
    }ajY                     @  s  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 d7d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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eZ&G d+d, d,eeZ'G d-d. d.eZ(G d/d0 d0eeZ)G d1d2 d2eeZ*G d3d4 d4eZ+G d5d6 d6eeZ,dS )8a'  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   5/var/www/html/flask_server/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_active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   rB   r   rF   rH   rJ   rL   rN   rP   rR   rT   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_verifiedrF   rD   Mapped['Tenant']rC   N)r!   r"   r#   r$   rU   r   __table_args__r   r   r   r]   r&   r   r-   rX   r   ra   rb   r   rC   r   r   r   r   rV   9   s   
  rV   c                   @  s   e Zd ZU dZdZee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Zded< ededdZded< dS )PlatformSitez<A WordPress or portal site authorized to act for one tenant.platform_sitesr)   Tr*   r,   site_idr^   Fr_   r-   r1   r2   issuerr<   audiencer:   rX   r4   r5   r   r   r6   Mapped[datetime | None]last_seen_atr@   rA   rB   N)r!   r"   r#   r$   rU   r   r   rh   r&   r   r-   ri   rj   rX   r6   r   rm   r   rB   r   r   r   r   rf   H   s   
  rf   c                   @  s   e Zd ZU dZdZeedddZded< eed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edd
ddZded< eeejd
dZded< eeddZded< dS )SiteSigningKeyzEVersioned public signing key belonging to a registered platform site.site_signing_keysr<   Tr*   r,   key_idr)   platform_sites.site_idFr_   rh      RS256rk   	algorithmr2   public_key_pemr4   r5   r6   r   r   activated_atrl   
revoked_atN)r!   r"   r#   r$   rU   r   r   rp   r&   r   rh   rt   r   ru   r6   r   r   r%   rv   rw   r   r   r   r   rn   W   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e	d	d
ddZ
ded< eed
ddZded< eeejd
dZded< dS )JWTReplayRecordz?A consumed external JWT identifier used to reject token replay.jwt_replay_recordsr<   Tr*   r,   jtir)   rq   Fr_   rh   r   
expires_atr   r   N)r!   r"   r#   r$   rU   r   r   rz   r&   r   rh   r   r{   r   r%   r   r   r   r   r   rx   e   s   
  rx   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``.rH   r)   Tr*   r,   app_idr1   Fr2   display_namemodule_pathroute_prefixr   r7   r8   r@   rA   rB   apprc   rG   tenant_appsrI   tenant_limitsrK   tenant_usagerM   tenant_secretsrO   rP   rQ   rR   rS   rT   N)r!   r"   r#   r$   rU   r   r   r}   r&   r~   r   r   r   r8   r   rB   r   r   r   r   r   rP   rR   rT   r   r   r   r   r|   p   s    
 r|   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.r   r-   r}   uq_tenant_apps_tenant_apprZ   r[   Tr\   r,   tenant_app_idr)   r^   Fr_   apps.app_idr   r7   
is_enabledconfigr2   rA   config_jsonrH   rc   rd   rC   zMapped['App']r   N)r!   r"   r#   r$   rU   r   re   r   r   r   r   r&   r   r-   r}   r   r   r   r   r   rC   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
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_monthlyrr   AUDr   currencyr:   descriptionr@   rA   rB   zMapped[list['Tenant']]r(   N)r!   r"   r#   r$   rU   r   r   r;   r&   r3   r   r
   r   r   r   r   r   rB   r   r(   r   r   r   r   r      s   
 r   c                   @  s6  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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e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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"< d#S )$TenantSubscriptionz8Commercial subscription state controlling tenant access.tenant_subscriptionsr-   uq_tenant_subscriptions_tenantrZ   r)   Tr\   r,   subscription_idr^   Fr_   r9   r;   r4   manualrk   providerr<   r2   r:   provider_customer_idprovider_subscription_idr5   r6   rl   current_period_startcurrent_period_endr7   cancel_at_period_endr@   rA   rB   N)r!   r"   r#   r$   rU   r   re   r   r   r   r   r&   r   r-   r;   r   r   r   r6   r   r   r   r   r   r   rB   r   r   r   r   r      s   
   r   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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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< dS )BillingProductMappingz2Map a payment-provider price to one platform plan.billing_product_mappingsr   price_id!uq_billing_mapping_provider_pricerZ   r)   Tr\   r,   
mapping_idr4   Fr2   r<   r:   
product_idr9   r;   rk   r7   r8   r@   rA   rB   N)r!   r"   r#   r$   rU   r   re   r   r   r   r   r&   r   r   r   r   r;   r   r8   r   rB   r   r   r   r   r      s   
 r   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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Zded< eeejddZded< eeddZded< dS )BillingWebhookEventz>Immutable receipt and processing state for one provider event.billing_webhook_eventsr   provider_event_iduq_billing_event_provider_idrZ   r)   Tr\   r,   billing_event_idr4   Fr_   r<   r2   
event_typepayload_hashreceivedrk   r6   r:   error_messager   r   received_atrl   processed_atN)r!   r"   r#   r$   rU   r   re   r   r   r   r   r&   r   r   r   r   r6   r   r   r   r   r%   r   r   r   r   r   r   r      s   
 r   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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Zd
ed< e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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Zd$ed%< eeddZd$ed&< eeddZd'ed(< d)S )*WordPressPackageReleasez,Immutable signed WordPress App Pack release.wordpress_package_releases
package_idversionuq_wp_package_releaserZ   r)   Tr\   r,   
release_idFr_   r   r}   r2   r1   artifact_nameartifact_pathMapped[int]artifact_sizesha256	signaturer4   Ed25519rk   signature_algorithmtestr6   compatibilityrA   compatibility_jsoncapabilitiesMapped[list | None]capabilities_jsonrl   published_atrw   r:   revoked_reasonN) r!   r"   r#   r$   rU   r   re   r   r   r   r   r&   r   r   r}   r   r   r   r   r	   r   r   r   r   r6   r   r   r   r   r   rw   r   r   r   r   r   r      s*   
  r   c                   @  sX  e Zd ZU dZdZeeddedZde	d< eed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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e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eddZde	d< eeddZde	d < eeddZd!e	d"< d#S )$WordPressBridgeReleasez2Signed release of the WordPress Bridge trust core.wordpress_bridge_releasesr)   Tr\   r,   r   F)r/   r   r`   r   r4   developmentrk   channelr1   r2   r   r   r   r   r   r   r   r   r   r6   r@   rA   rB   rl   r   rw   r:   r   N)r!   r"   r#   r$   rU   r   r   r   r   r&   r   r   r   r   r   r	   r   r   r   r   r6   r   rB   r   r   rw   r   r   r   r   r   r      s"   
 r   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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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deddZd ed!< ed"eddZd ed#< ed$eddZd ed%< d&S )'AgentProfilez?Versioned per-tenant policy for single-app or multi-app agents.agent_profilesr-   	agent_keyuq_agent_profile_tenant_keyrZ   r)   Tr\   r,   agent_profile_idr^   Fr_   r2   r1   r~   r   z1.0.0rk   profile_versioninstructions_versionr4   r5   r6   allowed_capabilitiesr   allowed_capabilities_jsonallowed_rolesallowed_roles_jsonconfirmation_policyrA   confirmation_policy_jsonrJ   limits_jsonr@   rB   N)r!   r"   r#   r$   rU   r   re   r   r   r   r   r&   r   r-   r   r~   r   r   r   r   r6   r   r   r   r   r   rB   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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.r   r-   r}   
limit_nameuq_tenant_limits_scoperZ   r[   Tr\   r,   tenant_limit_idr)   r^   Fr_   r   r:   r<   r2   zMapped[int | None]limit_valuewindow_secondsoverage_policyr@   rA   rB   rJ   rc   rd   rC   Mapped[Optional['App']]r   N)r!   r"   r#   r$   rU   r   re   r   r   r   r   r&   r   r-   r}   r   r	   r   r   r   r   rB   r   rC   r   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.r   r[   Tr\   r,   usage_idr)   r^   Fr_   r-   r   r:   r}   r<   r2   metric_name      r   rk   zMapped[float]metric_valuerl   usage_period_startusage_period_endr   r   recorded_atr@   rA   rB   rL   rc   rd   rC   r   r   N)r!   r"   r#   r$   rU   r   r   r   r   r&   r   r-   r}   r   r
   r   r   r   r   r   r%   r   r   rB   r   rC   r   r   r   r   r   r   3  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.r   r-   r}   secret_nameuq_tenant_secrets_scoperZ   r[   Tr\   r,   tenant_secret_idr)   r^   Fr_   r   r:   r<   r2   secret_value_encryptedkey_versionr@   rA   rB   rN   rc   rd   rC   r   r   N)r!   r"   r#   r$   rU   r   re   r   r   r   r   r&   r   r-   r}   r   r   r   r   r   rB   r   rC   r   r   r   r   r   r   F  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-   r}   integration_nameuq_tenant_integrations_scoperZ   r[   Tr\   r,   tenant_integration_idr)   r^   Fr_   r   r:   r<   r2   r4   r5   r   r6   r   rA   r   
secret_refrP   rc   rd   rC   r   r   N)r!   r"   r#   r$   rU   r   re   r   r   r   r   r&   r   r-   r}   r   r6   r   r   r   r   rC   r   r   r   r   r   r   X  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.rR   r[   Tr\   r,   audit_event_idr)   r^   r_   r:   r-   r   r}   r<   r2   actor_id
actor_typeFr   r4   successr   r6   
request_id
ip_addresspayloadrA   payload_jsonr   r   rc   Mapped[Optional['Tenant']]rC   r   r   N)r!   r"   r#   r$   rU   r   r   r   r   r&   r   r-   r}   r   r   r   r6   r   r   r   r   r   r   r%   r   r   rC   r   r   r   r   r   r   j  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_registryr[   Tr\   r,   job_idr)   r^   r_   r:   r-   r   r}   r<   Fr2   job_namer   r   
queue_namer4   queuedr6   r   rA   r   resultresult_jsonr   r   attemptsrl   
started_atfinished_atrT   rc   r   rC   r   r   N)r!   r"   r#   r$   rU   r   r   r   r  r&   r   r-   r}   r  r  r6   r   r   r  r	   r	  r   r
  r  r   rC   r   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'   rV   rf   rn   rx   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r   <module>   s<    ,
