diff --git a/README.md b/README.md index 3a09f3855877c70a7ea9be939f94dbdd6d6e0356..f675ab3282af70dd7b0c8414530478bfae07a31f 100644 --- a/README.md +++ b/README.md @@ -84,21 +84,6 @@ media-api/ The top-level `api/`, `services/`, `operations/`, `workers/`, `core/`, and `models/` packages mirror the canonical `app/` modules as import-compatible entry points for integrations that use the requested layout. Runtime composition uses the single implementation under `app/`, so business logic is not duplicated. -## Current implementation surface - -The current source tree exposes the following product areas. Missing docs or backend modules are recorded as omitted from this working tree, not as unimplemented capabilities elsewhere. - -- Brand Kit: `/v1/brand`, frontend brand-kit module, Python/TypeScript SDK resources, MCP brand tools, n8n MediaBrandKit node. -- Projects and collaboration: `/v1/projects`, editor persistence/render jobs, teams/members/invitations, approvals/review comments, notification preferences, Python/TypeScript SDK project resources, MCP collaboration tools, n8n MediaCollaboration node. -- Publishing and social automation: `/v1/social`, unified publishing, scheduling, retries, reconciliation, analytics sync, Python/TypeScript SDK social resources, MCP social tools, n8n MediaSocial node. -- Analytics: `/v1/analytics`, overview/timeseries/platform/post analytics, sync runs/cancellation, frontend analytics module, MCP analytics tools, SDK analytics resource. See [`docs/analytics.md`](docs/analytics.md) for implementation and runtime status. -- AI Studio / Copilot: `/v1/ai`, `/v1/copilot`, durable jobs, deterministic planner, frontend AI/Copilot modules, SDK resources, MCP tools. See [`docs/ai-copilot.md`](docs/ai-copilot.md) for implementation and runtime status. -- Templates: `/v1/templates`, `/v1/templates/catalog`, template execution, marketplace API, frontend template/marketplace modules, SDK/n8n/MCP coverage. See [`docs/template-marketplace.md`](docs/template-marketplace.md) for implementation and runtime status. -- Content Studio: editor state, optimistic revisioning, autosave, render jobs, timeline UX, SDK/n8n integration points. See [`docs/content-studio-foundation.md`](docs/content-studio-foundation.md) and [`docs/content-studio-persistence-rendering.md`](docs/content-studio-persistence-rendering.md) for current implementation surface. -- Brand Kit: `/v1/brand`, frontend brand-kit module, Python/TypeScript SDK resources, MCP brand tools, and an n8n `MediaBrandKit` package entry. See [`docs/brand-kits.md`](docs/brand-kits.md) for implementation and runtime status. - -Provider certification, PostgreSQL/RLS runtime, Docker, and Hugging Face runtime verification remain deferred until the planned product phases are complete. - ## Generation foundation MediaRouter includes a tenant-scoped generation request/job foundation at diff --git a/api/__init__.py b/api/__init__.py index d12cfd93588e432a2fd691517a2452d3397c6b03..ed2cfe0e64914f6af144ece3753b2fd9692a0ab5 100644 --- a/api/__init__.py +++ b/api/__init__.py @@ -1,14 +1 @@ """Compatibility exports for the canonical :mod:`app.api` package.""" - -from app.api.api_keys import * # noqa -from app.api.audio import * # noqa -from app.api.generation import * # noqa -from app.api.health import * # noqa -from app.api.image import * # noqa -from app.api.media import * # noqa -from app.api.probe import * # noqa -from app.api.social import * # noqa -from app.api.templates import * # noqa -from app.api.video import * # noqa -from app.api.whisper import * # noqa -from app.api.ytdlp import * # noqa diff --git a/api/__pycache__/__init__.cpython-310.pyc b/api/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b5009e42a2dc6ea7e1053f1b2615c0e78c5a9103 Binary files /dev/null and b/api/__pycache__/__init__.cpython-310.pyc differ diff --git a/api/__pycache__/audio.cpython-310.pyc b/api/__pycache__/audio.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..72c1dd0bafad08e2f5da0226ea7f444b0a8f7f67 Binary files /dev/null and b/api/__pycache__/audio.cpython-310.pyc differ diff --git a/api/__pycache__/health.cpython-310.pyc b/api/__pycache__/health.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0836bfa4aade665d108e1b1acf1179e0b4beff69 Binary files /dev/null and b/api/__pycache__/health.cpython-310.pyc differ diff --git a/api/__pycache__/image.cpython-310.pyc b/api/__pycache__/image.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..921df9598b4fd3651a6dc48acbee5608d43807ec Binary files /dev/null and b/api/__pycache__/image.cpython-310.pyc differ diff --git a/api/__pycache__/media.cpython-310.pyc b/api/__pycache__/media.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..09ba98672c2f24d9bedb55bf1912a46453ca67ed Binary files /dev/null and b/api/__pycache__/media.cpython-310.pyc differ diff --git a/api/__pycache__/probe.cpython-310.pyc b/api/__pycache__/probe.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d93eb4010595bf0a4f09b5fda15fe518bd083b80 Binary files /dev/null and b/api/__pycache__/probe.cpython-310.pyc differ diff --git a/api/__pycache__/video.cpython-310.pyc b/api/__pycache__/video.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f55df23731d9099a03fc3ca50e9681a880b1d01 Binary files /dev/null and b/api/__pycache__/video.cpython-310.pyc differ diff --git a/api/__pycache__/whisper.cpython-310.pyc b/api/__pycache__/whisper.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..93a70e7fc1c861bfcef7c14be1db847229cc3803 Binary files /dev/null and b/api/__pycache__/whisper.cpython-310.pyc differ diff --git a/api/__pycache__/ytdlp.cpython-310.pyc b/api/__pycache__/ytdlp.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b76f754bb02490c227adb20934c2315ecc71f7f0 Binary files /dev/null and b/api/__pycache__/ytdlp.cpython-310.pyc differ diff --git a/app/__pycache__/__init__.cpython-310.pyc b/app/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52bb1c03b7aa9721ff9644be41a865b6ec2c1dd1 Binary files /dev/null and b/app/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/__pycache__/container.cpython-310.pyc b/app/__pycache__/container.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2adc2a28099d1e8ad87337c8c36dcc826572e412 Binary files /dev/null and b/app/__pycache__/container.cpython-310.pyc differ diff --git a/app/ai/__pycache__/__init__.cpython-310.pyc b/app/ai/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7c9f0ee797f8a18b9f1b4c770ccbb70e0f85e27d Binary files /dev/null and b/app/ai/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/ai/__pycache__/api.cpython-310.pyc b/app/ai/__pycache__/api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2396d0b0f90cd4f5883a7ec18d977050bc16ba84 Binary files /dev/null and b/app/ai/__pycache__/api.cpython-310.pyc differ diff --git a/app/ai/__pycache__/schemas.cpython-310.pyc b/app/ai/__pycache__/schemas.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ac7a632cdbbc84cb1687036abd63375c5d5a419 Binary files /dev/null and b/app/ai/__pycache__/schemas.cpython-310.pyc differ diff --git a/app/ai/__pycache__/service.cpython-310.pyc b/app/ai/__pycache__/service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..71211251e0be31eb56a14c1f31f53cceb18657b0 Binary files /dev/null and b/app/ai/__pycache__/service.cpython-310.pyc differ diff --git a/app/analytics/__pycache__/__init__.cpython-310.pyc b/app/analytics/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..68ecb85794b81eb4f69e291f9ed9925df1bcab18 Binary files /dev/null and b/app/analytics/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/analytics/__pycache__/api.cpython-310.pyc b/app/analytics/__pycache__/api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e848f28b89c9b75c458dab0a19d376fb6ac4ee9a Binary files /dev/null and b/app/analytics/__pycache__/api.cpython-310.pyc differ diff --git a/app/analytics/__pycache__/errors.cpython-310.pyc b/app/analytics/__pycache__/errors.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7399b3c239f8d820a9ee832ce1a9ec9cd68a6d4f Binary files /dev/null and b/app/analytics/__pycache__/errors.cpython-310.pyc differ diff --git a/app/analytics/__pycache__/models.cpython-310.pyc b/app/analytics/__pycache__/models.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..74a8b124777f49b8e4386af5ae6fefc3cde0e0fd Binary files /dev/null and b/app/analytics/__pycache__/models.cpython-310.pyc differ diff --git a/app/analytics/__pycache__/repository.cpython-310.pyc b/app/analytics/__pycache__/repository.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7468cdbc54413a4bd56acedcbac82fbe2ae3438c Binary files /dev/null and b/app/analytics/__pycache__/repository.cpython-310.pyc differ diff --git a/app/analytics/__pycache__/schemas.cpython-310.pyc b/app/analytics/__pycache__/schemas.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..22af4cc3c5595d68fcd31db6b7f90da47ad22dff Binary files /dev/null and b/app/analytics/__pycache__/schemas.cpython-310.pyc differ diff --git a/app/analytics/__pycache__/service.cpython-310.pyc b/app/analytics/__pycache__/service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..76340597f967201c13a1694593dca63305fa377d Binary files /dev/null and b/app/analytics/__pycache__/service.cpython-310.pyc differ diff --git a/app/analytics/workers/__pycache__/__init__.cpython-310.pyc b/app/analytics/workers/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f88dd84b19de953acee798d5ddbbf49f5e3a290a Binary files /dev/null and b/app/analytics/workers/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/analytics/workers/__pycache__/sync.cpython-310.pyc b/app/analytics/workers/__pycache__/sync.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..344a99e4e386b56bb2d35a61b7e43c08aa49b571 Binary files /dev/null and b/app/analytics/workers/__pycache__/sync.cpython-310.pyc differ diff --git a/app/api/__pycache__/__init__.cpython-310.pyc b/app/api/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7bda2ad83a00212a6ed199c328e426786376e43e Binary files /dev/null and b/app/api/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/api/__pycache__/api_keys.cpython-310.pyc b/app/api/__pycache__/api_keys.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1ade13a2c75801cb90e0d1dc7d8fb9be1e079d40 Binary files /dev/null and b/app/api/__pycache__/api_keys.cpython-310.pyc differ diff --git a/app/api/__pycache__/audio.cpython-310.pyc b/app/api/__pycache__/audio.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..360858806551af7b6691306fdf9b7b1018f7c6df Binary files /dev/null and b/app/api/__pycache__/audio.cpython-310.pyc differ diff --git a/app/api/__pycache__/generation.cpython-310.pyc b/app/api/__pycache__/generation.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..772b5746fd4056c02e5099feea3caaaddac37059 Binary files /dev/null and b/app/api/__pycache__/generation.cpython-310.pyc differ diff --git a/app/api/__pycache__/health.cpython-310.pyc b/app/api/__pycache__/health.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d1223549c87f2ec903e4aa8512f83e01c0d5ed62 Binary files /dev/null and b/app/api/__pycache__/health.cpython-310.pyc differ diff --git a/app/api/__pycache__/image.cpython-310.pyc b/app/api/__pycache__/image.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..955567bb40f99c81a611fdb359fafab49a0e6d61 Binary files /dev/null and b/app/api/__pycache__/image.cpython-310.pyc differ diff --git a/app/api/__pycache__/media.cpython-310.pyc b/app/api/__pycache__/media.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c883ea97ecac2a619c401aaeedb90510044593f Binary files /dev/null and b/app/api/__pycache__/media.cpython-310.pyc differ diff --git a/app/api/__pycache__/probe.cpython-310.pyc b/app/api/__pycache__/probe.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cb1b25d56a5693b7ca9230c974b3a983856c2ac4 Binary files /dev/null and b/app/api/__pycache__/probe.cpython-310.pyc differ diff --git a/app/api/__pycache__/social.cpython-310.pyc b/app/api/__pycache__/social.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1ce5213b0d1ffe02e033ed87cc68cd13f284b3b1 Binary files /dev/null and b/app/api/__pycache__/social.cpython-310.pyc differ diff --git a/app/api/__pycache__/templates.cpython-310.pyc b/app/api/__pycache__/templates.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e78bd099897ffff33eabd68c7b4ffbf272f0de42 Binary files /dev/null and b/app/api/__pycache__/templates.cpython-310.pyc differ diff --git a/app/api/__pycache__/video.cpython-310.pyc b/app/api/__pycache__/video.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4dd7192fb9e0f57feb98f06ad8f53eef12beb059 Binary files /dev/null and b/app/api/__pycache__/video.cpython-310.pyc differ diff --git a/app/api/__pycache__/whisper.cpython-310.pyc b/app/api/__pycache__/whisper.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..433b1b41b9dacaf95a587cff2d61671615635016 Binary files /dev/null and b/app/api/__pycache__/whisper.cpython-310.pyc differ diff --git a/app/api/__pycache__/ytdlp.cpython-310.pyc b/app/api/__pycache__/ytdlp.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0d4d2f2557db4c40af35a27d766b9a81eeb2d913 Binary files /dev/null and b/app/api/__pycache__/ytdlp.cpython-310.pyc differ diff --git a/app/api/api_keys.py b/app/api/api_keys.py index c0fd6eabc109346752763746c266efc709812541..f989528cf003733aa1609ce0dbe118bce45dbcf1 100644 --- a/app/api/api_keys.py +++ b/app/api/api_keys.py @@ -40,6 +40,7 @@ async def current_auth_context(request: Request) -> AuthContextView: expires_at=context.expires_at, workspace_id=context.workspace_id, user_id=context.user_id, + membership_role=context.membership_role, ) diff --git a/app/brand/__pycache__/__init__.cpython-310.pyc b/app/brand/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..03d038e683f083dfe7f5eee7ffe031d2567905a9 Binary files /dev/null and b/app/brand/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/brand/__pycache__/api.cpython-310.pyc b/app/brand/__pycache__/api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dc3a8d5cb5f91b8dd94f5e0ca0aa43f8e0844fc7 Binary files /dev/null and b/app/brand/__pycache__/api.cpython-310.pyc differ diff --git a/app/brand/__pycache__/capabilities.cpython-310.pyc b/app/brand/__pycache__/capabilities.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b972bae6fb27031d9a0a20c5a7edcbaac98ff15c Binary files /dev/null and b/app/brand/__pycache__/capabilities.cpython-310.pyc differ diff --git a/app/brand/__pycache__/errors.cpython-310.pyc b/app/brand/__pycache__/errors.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c0d16d3f59653146322efd5c45227131b4f4035e Binary files /dev/null and b/app/brand/__pycache__/errors.cpython-310.pyc differ diff --git a/app/brand/__pycache__/models.cpython-310.pyc b/app/brand/__pycache__/models.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..64daa46bfc7deef547d32c239bf8303a23da8e80 Binary files /dev/null and b/app/brand/__pycache__/models.cpython-310.pyc differ diff --git a/app/brand/__pycache__/repository.cpython-310.pyc b/app/brand/__pycache__/repository.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..51824a05b925b04f552d99788019425a180b3e3e Binary files /dev/null and b/app/brand/__pycache__/repository.cpython-310.pyc differ diff --git a/app/brand/__pycache__/schemas.cpython-310.pyc b/app/brand/__pycache__/schemas.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..152e0835aa6bd12baa968d9ffb132536d0ece27b Binary files /dev/null and b/app/brand/__pycache__/schemas.cpython-310.pyc differ diff --git a/app/brand/__pycache__/service.cpython-310.pyc b/app/brand/__pycache__/service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3712fd57c9844f509174c4f5f09eb5a1298bc0ce Binary files /dev/null and b/app/brand/__pycache__/service.cpython-310.pyc differ diff --git a/app/brand/__pycache__/validation.cpython-310.pyc b/app/brand/__pycache__/validation.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cc1fe9cdb20b3ea0acdefcd9f0f4ba04af73517d Binary files /dev/null and b/app/brand/__pycache__/validation.cpython-310.pyc differ diff --git a/app/brand/errors.py b/app/brand/errors.py index 3f47ee638921577a2f54823261400acf897f782c..40cda2e0a9dfb46b7a3e23b3d5d079e8507cd5c1 100644 --- a/app/brand/errors.py +++ b/app/brand/errors.py @@ -7,3 +7,38 @@ class BrandKitNotFoundError(MediaAPIError): class BrandKitValidationError(MediaAPIError): code = "INVALID_BRAND_KIT" status_code = 422 + + +class BrandValidationError(MediaAPIError): + code = "INVALID_BRAND" + status_code = 422 + + +class BrandAssetInvalidError(MediaAPIError): + code = "INVALID_BRAND_ASSET" + status_code = 422 + + +class BrandGovernanceError(MediaAPIError): + code = "BRAND_GOVERNANCE_ERROR" + status_code = 403 + + +class BrandConflictError(MediaAPIError): + code = "BRAND_CONFLICT" + status_code = 409 + + +class BrandImmutableError(MediaAPIError): + code = "BRAND_IMMUTABLE" + status_code = 409 + + +class BrandNotFoundError(MediaAPIError): + code = "BRAND_NOT_FOUND" + status_code = 404 + + +class BrandVersionNotFoundError(MediaAPIError): + code = "BRAND_VERSION_NOT_FOUND" + status_code = 404 diff --git a/app/brand/models/__init__.py b/app/brand/models/__init__.py index 9731ddc5aeb3b407ef1d6b62c4ab02f79793e666..439ecefd0b824cf146305ae1e60daac6346f5063 100644 --- a/app/brand/models/__init__.py +++ b/app/brand/models/__init__.py @@ -1,3 +1,15 @@ -from app.brand.models.brand import BrandKit, BrandKitVersion +from app.brand.models.brand import ( + BrandGovernanceSetting, + BrandKit, + BrandKitAsset, + BrandKitPlatformSetting, + BrandKitVersion, +) -__all__ = ["BrandKit", "BrandKitVersion"] +__all__ = [ + "BrandGovernanceSetting", + "BrandKit", + "BrandKitAsset", + "BrandKitPlatformSetting", + "BrandKitVersion", +] diff --git a/app/brand/models/__pycache__/__init__.cpython-310.pyc b/app/brand/models/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..02f5b6fc0095926948af7b09ff19124047555d75 Binary files /dev/null and b/app/brand/models/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/brand/models/__pycache__/brand.cpython-310.pyc b/app/brand/models/__pycache__/brand.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f56eb7eebdfcec24be5bee612328bb946be7a377 Binary files /dev/null and b/app/brand/models/__pycache__/brand.cpython-310.pyc differ diff --git a/app/brand/models/brand.py b/app/brand/models/brand.py index edd418d4254c1b94644f378f248b9d66abb52504..81f6084e61bad892d8d3767b834fb8dac046009d 100644 --- a/app/brand/models/brand.py +++ b/app/brand/models/brand.py @@ -1,7 +1,18 @@ from __future__ import annotations from datetime import datetime from uuid import uuid4 -from sqlalchemy import String, JSON, DateTime, Integer, Index, ForeignKey, UniqueConstraint, Text, Numeric +from sqlalchemy import ( + Boolean, + String, + JSON, + DateTime, + Integer, + Index, + ForeignKey, + UniqueConstraint, + Text, + Numeric, +) from sqlalchemy.orm import Mapped, mapped_column from app.security.models import Base, utcnow @@ -57,8 +68,78 @@ class BrandKitVersion(Base): watermark_asset_id: Mapped[str | None] = mapped_column(String(36), ForeignKey("media_assets.id", ondelete="SET NULL")) watermark_position: Mapped[str | None] = mapped_column(String(20)) watermark_opacity: Mapped[float | None] = mapped_column(Numeric(precision=3, scale=2)) - metadata_json: Mapped[dict[str, object]] = mapped_column(JSON, name="metadata", nullable=False, default=dict) + metadata_json: Mapped[dict[str, object]] = mapped_column( + "metadata", JSON, nullable=False, default=dict + ) created_by: Mapped[str] = mapped_column(String(36), ForeignKey("users.id", ondelete="RESTRICT"), nullable=False) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False, default=utcnow) published_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True)) + + +class BrandKitAsset(Base): + __tablename__ = "brand_kit_assets" + __table_args__ = ( + UniqueConstraint("brand_kit_version_id", "role", name="uq_brand_asset_role"), + Index("ix_brand_assets_workspace_asset", "workspace_id", "asset_id"), + ) + + id: Mapped[str] = mapped_column(String(36), primary_key=True, default=lambda: str(uuid4())) + workspace_id: Mapped[str] = mapped_column( + String(36), ForeignKey("workspaces.id", ondelete="RESTRICT"), nullable=False + ) + brand_kit_version_id: Mapped[str] = mapped_column( + String(36), ForeignKey("brand_kit_versions.id", ondelete="CASCADE"), nullable=False + ) + asset_id: Mapped[str] = mapped_column( + String(36), ForeignKey("media_assets.id", ondelete="RESTRICT"), nullable=False + ) + role: Mapped[str] = mapped_column(String(32), nullable=False) + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False, default=utcnow) + + +class BrandKitPlatformSetting(Base): + __tablename__ = "brand_kit_platform_settings" + __table_args__ = ( + UniqueConstraint( + "brand_kit_version_id", "provider", name="uq_brand_platform_setting" + ), + Index("ix_brand_platform_settings_workspace", "workspace_id"), + ) + + id: Mapped[str] = mapped_column(String(36), primary_key=True, default=lambda: str(uuid4())) + workspace_id: Mapped[str] = mapped_column( + String(36), ForeignKey("workspaces.id", ondelete="RESTRICT"), nullable=False + ) + brand_kit_version_id: Mapped[str] = mapped_column( + String(36), ForeignKey("brand_kit_versions.id", ondelete="CASCADE"), nullable=False + ) + provider: Mapped[str] = mapped_column(String(32), nullable=False) + settings_json: Mapped[dict[str, object]] = mapped_column( + "settings", JSON, nullable=False, default=dict + ) + + +class BrandGovernanceSetting(Base): + __tablename__ = "brand_governance_settings" + __table_args__ = (UniqueConstraint("workspace_id", name="uq_brand_governance_workspace"),) + + id: Mapped[str] = mapped_column(String(36), primary_key=True, default=lambda: str(uuid4())) + workspace_id: Mapped[str] = mapped_column( + String(36), ForeignKey("workspaces.id", ondelete="CASCADE"), nullable=False + ) + require_brand_kit_for_publish: Mapped[bool] = mapped_column( + Boolean, nullable=False, default=False + ) + require_published_brand_version: Mapped[bool] = mapped_column( + Boolean, nullable=False, default=False + ) + allow_user_override_brand_defaults: Mapped[bool] = mapped_column( + Boolean, nullable=False, default=True + ) + updated_by: Mapped[str] = mapped_column( + String(36), ForeignKey("users.id", ondelete="RESTRICT"), nullable=False + ) + updated_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), nullable=False, default=utcnow, onupdate=utcnow + ) diff --git a/app/brand/repositories/__pycache__/brand_repository.cpython-310.pyc b/app/brand/repositories/__pycache__/brand_repository.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..83ab82db7a34457f802e63c5f4a159f3bb743b58 Binary files /dev/null and b/app/brand/repositories/__pycache__/brand_repository.cpython-310.pyc differ diff --git a/app/brand/repositories/brand_repository.py b/app/brand/repositories/brand_repository.py index 231fe695ccefab5e4e68cac17f630f55c69a098c..2e47e17f84149f6b9b5447eabc225eae0faeb481 100644 --- a/app/brand/repositories/brand_repository.py +++ b/app/brand/repositories/brand_repository.py @@ -29,7 +29,7 @@ class BrandKitRepository: "watermark_asset_id": data.get("watermark_asset_id"), "watermark_position": data.get("watermark_position"), "watermark_opacity": data.get("watermark_opacity"), - "metadata_json": data.get("metadata", {}), + "metadata": data.get("metadata", {}), } async def create(self, workspace_id: str, name: str, data: dict[str, object], *, user_id: str) -> tuple[BrandKit, BrandKitVersion]: diff --git a/app/brand/schemas.py b/app/brand/schemas.py index eb0d61726d5f7138efe8889deff5316723b0eeaf..81a892857fac5fa5775b1ca3c7cdf6853633d2f2 100644 --- a/app/brand/schemas.py +++ b/app/brand/schemas.py @@ -1,3 +1,5 @@ +from typing import Any + from pydantic import BaseModel, Field from datetime import datetime @@ -18,3 +20,145 @@ class BrandKitResponse(BaseModel): class Config: from_attributes = True + + +class BrandColor(BaseModel): + ... + + +class BrandTypography(BaseModel): + ... + + +class BrandVoice(BaseModel): + ... + + +class BrandCta(BaseModel): + ... + + +class BrandHashtags(BaseModel): + ... + + +class BrandWatermark(BaseModel): + ... + + +class BrandPlatformSetting(BaseModel): + provider: str + settings: dict[str, Any] + + +class BrandVersionContent(BaseModel): + colors: list[BrandColor] + typography: BrandTypography + voice: BrandVoice + ctas: BrandCta + hashtags: BrandHashtags + watermark: BrandWatermark + ai_guidance: dict[str, Any] | None = None + metadata: dict[str, Any] | None = None + platform_settings: list[BrandPlatformSetting] | None = None + + +class BrandVersionCreate(BrandVersionContent): + source_version_id: str | None = None + + +class BrandVersionUpdate(BrandVersionContent): + ... + + +class BrandAssetView(BaseModel): + id: str + version_id: str + asset_id: str + role: str + mime_type: str + filename: str + + +class BrandGovernance(BaseModel): + require_brand_kit_for_publish: bool = False + require_published_brand_version: bool = False + allow_user_override_brand_defaults: bool = True + + +class BrandCapabilities(BaseModel): + watermark_rendering: str = "configuration_only" + supported_asset_roles: list[str] = [ + "logo_primary", + "logo_secondary", + "watermark", + "favicon", + "social_avatar", + "social_cover", + ] + supported_providers: list[str] = [ + "facebook", + "instagram", + "tiktok", + "x", + "youtube", + "linkedin", + "telegram", + "whatsapp", + ] + + +class BrandKitUpdate(BaseModel): + name: str | None = None + description: str | None = None + + +class BrandKitView(BaseModel): + id: str + workspace_id: str + name: str + description: str | None + status: str + is_default: bool + active_version_id: str | None + active_version: "BrandVersionView | None" = None + created_by: str + created_at: str + updated_at: str + + +class BrandKitList(BaseModel): + items: list[BrandKitView] + offset: int + limit: int + total: int + + +class BrandVersionView(BaseModel): + id: str + brand_kit_id: str + version: int + status: str + colors: list[dict[str, Any]] + typography: dict[str, Any] + voice: dict[str, Any] + ctas: dict[str, Any] + hashtags: dict[str, Any] + watermark: dict[str, Any] + ai_guidance: dict[str, Any] | None = None + platform_settings: list[dict[str, Any]] + metadata: dict[str, Any] | None = None + assets: list[BrandAssetView] + created_by: str + created_at: str + published_at: str | None = None + + +class BrandApplyProject(BaseModel): + project_id: str + + +class BrandAssetAttach(BaseModel): + asset_id: str + role: str + version_id: str diff --git a/app/brand/services/__pycache__/brand_service.cpython-310.pyc b/app/brand/services/__pycache__/brand_service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ad37dd4caf48ef0f18b98a8a0fb9104253d4a227 Binary files /dev/null and b/app/brand/services/__pycache__/brand_service.cpython-310.pyc differ diff --git a/app/brand/services/__pycache__/validation_service.cpython-310.pyc b/app/brand/services/__pycache__/validation_service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7af002cd3ec1f77025d118953ba60de66cbe4ca3 Binary files /dev/null and b/app/brand/services/__pycache__/validation_service.cpython-310.pyc differ diff --git a/app/copilot/__pycache__/__init__.cpython-310.pyc b/app/copilot/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3a8802162de32d9fd0d8005efba934590fc48f93 Binary files /dev/null and b/app/copilot/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/copilot/__pycache__/actions.cpython-310.pyc b/app/copilot/__pycache__/actions.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb79ead3073d9f92cca4542af4c1e33a0e1f9651 Binary files /dev/null and b/app/copilot/__pycache__/actions.cpython-310.pyc differ diff --git a/app/copilot/__pycache__/api.cpython-310.pyc b/app/copilot/__pycache__/api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..390fe33c49eaf19b803b61714da24d2d74aa4881 Binary files /dev/null and b/app/copilot/__pycache__/api.cpython-310.pyc differ diff --git a/app/copilot/__pycache__/errors.cpython-310.pyc b/app/copilot/__pycache__/errors.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2fa56c0a62615cf85053dddf753b8e15d590f813 Binary files /dev/null and b/app/copilot/__pycache__/errors.cpython-310.pyc differ diff --git a/app/copilot/__pycache__/models.cpython-310.pyc b/app/copilot/__pycache__/models.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d11ec51d577c1c7ac14af27eef22e69c4be992b2 Binary files /dev/null and b/app/copilot/__pycache__/models.cpython-310.pyc differ diff --git a/app/copilot/__pycache__/planner.cpython-310.pyc b/app/copilot/__pycache__/planner.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..df6f275991ded2f2605f6a49763b1540a994bf24 Binary files /dev/null and b/app/copilot/__pycache__/planner.cpython-310.pyc differ diff --git a/app/copilot/__pycache__/repository.cpython-310.pyc b/app/copilot/__pycache__/repository.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eea9e9982797068c793d30ad978555942b064b17 Binary files /dev/null and b/app/copilot/__pycache__/repository.cpython-310.pyc differ diff --git a/app/copilot/__pycache__/schemas.cpython-310.pyc b/app/copilot/__pycache__/schemas.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ac821f817be5b1077b772e10e37d615101f101df Binary files /dev/null and b/app/copilot/__pycache__/schemas.cpython-310.pyc differ diff --git a/app/copilot/__pycache__/service.cpython-310.pyc b/app/copilot/__pycache__/service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..50f7a8aa1d74a5f40476352ff39f104c0d8f7d4c Binary files /dev/null and b/app/copilot/__pycache__/service.cpython-310.pyc differ diff --git a/app/core/__pycache__/__init__.cpython-310.pyc b/app/core/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b1558de9ccfe836946b369d2425494a52f8416a9 Binary files /dev/null and b/app/core/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/core/__pycache__/config.cpython-310.pyc b/app/core/__pycache__/config.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a086f273cfd01887d6c56aa024b98b392f12b10 Binary files /dev/null and b/app/core/__pycache__/config.cpython-310.pyc differ diff --git a/app/core/__pycache__/database_url.cpython-310.pyc b/app/core/__pycache__/database_url.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..65c6891d8425e848a8351412405ce3eac7643d72 Binary files /dev/null and b/app/core/__pycache__/database_url.cpython-310.pyc differ diff --git a/app/core/__pycache__/enums.cpython-310.pyc b/app/core/__pycache__/enums.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aae35487999dcc1ba81dad649fb5294a4a4175b8 Binary files /dev/null and b/app/core/__pycache__/enums.cpython-310.pyc differ diff --git a/app/core/__pycache__/exceptions.cpython-310.pyc b/app/core/__pycache__/exceptions.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e01e5118afe0b47583e45f0084e0268886b3fe27 Binary files /dev/null and b/app/core/__pycache__/exceptions.cpython-310.pyc differ diff --git a/app/core/__pycache__/logger.cpython-310.pyc b/app/core/__pycache__/logger.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8fcb8992dd0f2faaf0c8ed1bc1d5195442c42599 Binary files /dev/null and b/app/core/__pycache__/logger.cpython-310.pyc differ diff --git a/app/core/__pycache__/response.cpython-310.pyc b/app/core/__pycache__/response.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c8688863deaba8b7d06c76917a9918f607dbc18e Binary files /dev/null and b/app/core/__pycache__/response.cpython-310.pyc differ diff --git a/app/generation/__pycache__/__init__.cpython-310.pyc b/app/generation/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..607cc4ef6223470f87d79ba6a7d0ca827e39f1cc Binary files /dev/null and b/app/generation/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/generation/__pycache__/model_registry.cpython-310.pyc b/app/generation/__pycache__/model_registry.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7fd0544b53277972f2cc922055755b345c23b021 Binary files /dev/null and b/app/generation/__pycache__/model_registry.cpython-310.pyc differ diff --git a/app/generation/__pycache__/models.cpython-310.pyc b/app/generation/__pycache__/models.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..28ffac5f35929cce9c9ddb0690fd6d4e0cf383db Binary files /dev/null and b/app/generation/__pycache__/models.cpython-310.pyc differ diff --git a/app/generation/domain/__pycache__/__init__.cpython-310.pyc b/app/generation/domain/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f4ec345491afb555bb759c6beb1703b78b7d0945 Binary files /dev/null and b/app/generation/domain/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/generation/domain/__pycache__/capabilities.cpython-310.pyc b/app/generation/domain/__pycache__/capabilities.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d6a045c4a55acccfcdbf1156479a97f5a5176fe1 Binary files /dev/null and b/app/generation/domain/__pycache__/capabilities.cpython-310.pyc differ diff --git a/app/generation/domain/__pycache__/enums.cpython-310.pyc b/app/generation/domain/__pycache__/enums.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0f7c18ba3566f81750d9f6df177f051a2f68bc9 Binary files /dev/null and b/app/generation/domain/__pycache__/enums.cpython-310.pyc differ diff --git a/app/generation/domain/__pycache__/errors.cpython-310.pyc b/app/generation/domain/__pycache__/errors.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e1b47b64aead723788052be7c2ad2ac5cdab0b2c Binary files /dev/null and b/app/generation/domain/__pycache__/errors.cpython-310.pyc differ diff --git a/app/generation/domain/__pycache__/retry.cpython-310.pyc b/app/generation/domain/__pycache__/retry.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d60eb63835e1f0824851fbcab4e9a94f8abfd9d Binary files /dev/null and b/app/generation/domain/__pycache__/retry.cpython-310.pyc differ diff --git a/app/generation/domain/__pycache__/runtime.cpython-310.pyc b/app/generation/domain/__pycache__/runtime.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..72cb372baedbeb43a8bc3b1213136893f5406c9c Binary files /dev/null and b/app/generation/domain/__pycache__/runtime.cpython-310.pyc differ diff --git a/app/generation/domain/__pycache__/state_machine.cpython-310.pyc b/app/generation/domain/__pycache__/state_machine.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5550903bc29493bf6deede07f915fc4d1eb0baef Binary files /dev/null and b/app/generation/domain/__pycache__/state_machine.cpython-310.pyc differ diff --git a/app/generation/providers/__pycache__/__init__.cpython-310.pyc b/app/generation/providers/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e5d2db149e90817e7a685bbbadc471c5715be3fa Binary files /dev/null and b/app/generation/providers/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/generation/providers/__pycache__/base.cpython-310.pyc b/app/generation/providers/__pycache__/base.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2098a4a3d10fd920af7431598f1d771a422bab18 Binary files /dev/null and b/app/generation/providers/__pycache__/base.cpython-310.pyc differ diff --git a/app/generation/providers/__pycache__/flux.cpython-310.pyc b/app/generation/providers/__pycache__/flux.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..017016aaf2d5358a4e5059bedc47fc103bb059d0 Binary files /dev/null and b/app/generation/providers/__pycache__/flux.cpython-310.pyc differ diff --git a/app/generation/providers/__pycache__/registry.cpython-310.pyc b/app/generation/providers/__pycache__/registry.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5cffb1c39d728ecbe89484f6310d8a120fc57b2c Binary files /dev/null and b/app/generation/providers/__pycache__/registry.cpython-310.pyc differ diff --git a/app/generation/providers/__pycache__/wan.cpython-310.pyc b/app/generation/providers/__pycache__/wan.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d953c34196dd9611d28ccd6d89dfd200929ce09f Binary files /dev/null and b/app/generation/providers/__pycache__/wan.cpython-310.pyc differ diff --git a/app/generation/providers/__pycache__/worker_client.cpython-310.pyc b/app/generation/providers/__pycache__/worker_client.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..54ea3f7203a2909787bebdddd053ede8c0150b72 Binary files /dev/null and b/app/generation/providers/__pycache__/worker_client.cpython-310.pyc differ diff --git a/app/generation/repositories/__pycache__/__init__.cpython-310.pyc b/app/generation/repositories/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52e773939de38497e74ddfa399355ac1b6599e55 Binary files /dev/null and b/app/generation/repositories/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/generation/repositories/__pycache__/generation.cpython-310.pyc b/app/generation/repositories/__pycache__/generation.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fd175ff6f0fb8cb4cbf6658197a5524c1c3cd92c Binary files /dev/null and b/app/generation/repositories/__pycache__/generation.cpython-310.pyc differ diff --git a/app/generation/schemas/__pycache__/__init__.cpython-310.pyc b/app/generation/schemas/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e584f063434001709e57f67b44b66658921f9474 Binary files /dev/null and b/app/generation/schemas/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/generation/schemas/__pycache__/requests.cpython-310.pyc b/app/generation/schemas/__pycache__/requests.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..75e5ff3f2f3ca23ce261dd712cce82e3225a9dcf Binary files /dev/null and b/app/generation/schemas/__pycache__/requests.cpython-310.pyc differ diff --git a/app/generation/services/__pycache__/__init__.cpython-310.pyc b/app/generation/services/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2959505850e19ed44f99d9bcf67e97d8448ca545 Binary files /dev/null and b/app/generation/services/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/generation/services/__pycache__/generation_service.cpython-310.pyc b/app/generation/services/__pycache__/generation_service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..10e419c93a72a9d85b31120da41def8c1b48ef39 Binary files /dev/null and b/app/generation/services/__pycache__/generation_service.cpython-310.pyc differ diff --git a/app/generation/services/__pycache__/output_ingestion.cpython-310.pyc b/app/generation/services/__pycache__/output_ingestion.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1affc4d64677d97b6a860ca1db8ff3084c1671a0 Binary files /dev/null and b/app/generation/services/__pycache__/output_ingestion.cpython-310.pyc differ diff --git a/app/generation/workers/__pycache__/__init__.cpython-310.pyc b/app/generation/workers/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..525af849969ec6cd1cdb624117a93a893379f50c Binary files /dev/null and b/app/generation/workers/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/generation/workers/__pycache__/generation_worker.cpython-310.pyc b/app/generation/workers/__pycache__/generation_worker.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86b5f5338c90faa8a9622a7a594826d14ff0e716 Binary files /dev/null and b/app/generation/workers/__pycache__/generation_worker.cpython-310.pyc differ diff --git a/app/mcp/__pycache__/__init__.cpython-310.pyc b/app/mcp/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..805be4c68ca22baf9b69baa7faf59a5d515ff853 Binary files /dev/null and b/app/mcp/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/mcp/__pycache__/prompts.cpython-310.pyc b/app/mcp/__pycache__/prompts.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d59d40938424cc666b3f5523d820a4e40e48f4e2 Binary files /dev/null and b/app/mcp/__pycache__/prompts.cpython-310.pyc differ diff --git a/app/mcp/__pycache__/registry.cpython-310.pyc b/app/mcp/__pycache__/registry.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7d4114883f7435776d8ad088019c7edb18c05963 Binary files /dev/null and b/app/mcp/__pycache__/registry.cpython-310.pyc differ diff --git a/app/mcp/__pycache__/resources.cpython-310.pyc b/app/mcp/__pycache__/resources.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b7fc0f77138a34be899f9628725254887e1c758d Binary files /dev/null and b/app/mcp/__pycache__/resources.cpython-310.pyc differ diff --git a/app/mcp/__pycache__/server.cpython-310.pyc b/app/mcp/__pycache__/server.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e840a11b7d97e9e6f419299079bde5266bbe0bf5 Binary files /dev/null and b/app/mcp/__pycache__/server.cpython-310.pyc differ diff --git a/app/mcp/server.py b/app/mcp/server.py index 42fd4cf135b967e0638c4e15fdf8c4e3b7f79e55..e41b0ce4e5f8076ce67b8e62c132d0c13352c75c 100644 --- a/app/mcp/server.py +++ b/app/mcp/server.py @@ -21,7 +21,6 @@ from app.mcp.tools.analytics import register_analytics_tools from app.mcp.tools.audio import register_audio_tools from app.mcp.tools.brand import register_brand_tools from app.mcp.tools.image import register_image_tools -from app.mcp.tools.collaboration import register_collaboration_tools from app.mcp.tools.probe import register_probe_tools from app.mcp.tools.social import register_social_tools from app.mcp.tools.system import register_system_tools @@ -63,7 +62,6 @@ def create_mcp_server(container: Container) -> FastMCP[Any]: register_template_tools(server, registry) register_social_tools(server, registry) register_brand_tools(server, registry) - register_collaboration_tools(server, registry) register_ai_tools(server, registry) register_analytics_tools(server, registry) register_resources(server, registry) diff --git a/app/mcp/tools/__pycache__/__init__.cpython-310.pyc b/app/mcp/tools/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dd035ac563b5ee71ef3b5bc44b636b7e6aeaac80 Binary files /dev/null and b/app/mcp/tools/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/mcp/tools/__pycache__/ai.cpython-310.pyc b/app/mcp/tools/__pycache__/ai.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7cead430010286d65e6645d216938b3aee5d4ea1 Binary files /dev/null and b/app/mcp/tools/__pycache__/ai.cpython-310.pyc differ diff --git a/app/mcp/tools/__pycache__/analytics.cpython-310.pyc b/app/mcp/tools/__pycache__/analytics.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b140465f107fa4d24fafbdc4e55a50116d694147 Binary files /dev/null and b/app/mcp/tools/__pycache__/analytics.cpython-310.pyc differ diff --git a/app/mcp/tools/__pycache__/audio.cpython-310.pyc b/app/mcp/tools/__pycache__/audio.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..94291549e038c7577cf617b6f43e6d50ce3bf739 Binary files /dev/null and b/app/mcp/tools/__pycache__/audio.cpython-310.pyc differ diff --git a/app/mcp/tools/__pycache__/brand.cpython-310.pyc b/app/mcp/tools/__pycache__/brand.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ad71dc7e1ab636e515c2e1b5b37c69312e3e2707 Binary files /dev/null and b/app/mcp/tools/__pycache__/brand.cpython-310.pyc differ diff --git a/app/mcp/tools/__pycache__/collaboration.cpython-310.pyc b/app/mcp/tools/__pycache__/collaboration.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8bd792313ead57c7492b246a8d5657f54083d690 Binary files /dev/null and b/app/mcp/tools/__pycache__/collaboration.cpython-310.pyc differ diff --git a/app/mcp/tools/__pycache__/image.cpython-310.pyc b/app/mcp/tools/__pycache__/image.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f446658fc41e3ddee158471cacc8ccc36d2b535e Binary files /dev/null and b/app/mcp/tools/__pycache__/image.cpython-310.pyc differ diff --git a/app/mcp/tools/__pycache__/probe.cpython-310.pyc b/app/mcp/tools/__pycache__/probe.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..80426a4d8f7ecb935bfd17f692c2b404fb065f49 Binary files /dev/null and b/app/mcp/tools/__pycache__/probe.cpython-310.pyc differ diff --git a/app/mcp/tools/__pycache__/social.cpython-310.pyc b/app/mcp/tools/__pycache__/social.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a19e5a036fbedb5ddcfc002ccf97668297b66fef Binary files /dev/null and b/app/mcp/tools/__pycache__/social.cpython-310.pyc differ diff --git a/app/mcp/tools/__pycache__/system.cpython-310.pyc b/app/mcp/tools/__pycache__/system.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..63a708de3df63ea392a53c363a06c955cfbcbc8e Binary files /dev/null and b/app/mcp/tools/__pycache__/system.cpython-310.pyc differ diff --git a/app/mcp/tools/__pycache__/templates.cpython-310.pyc b/app/mcp/tools/__pycache__/templates.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ccc84d5372c0cce31c540708d98be8058ec2d398 Binary files /dev/null and b/app/mcp/tools/__pycache__/templates.cpython-310.pyc differ diff --git a/app/mcp/tools/__pycache__/video.cpython-310.pyc b/app/mcp/tools/__pycache__/video.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bae32761fa7d25140412d1812caa070dac779abd Binary files /dev/null and b/app/mcp/tools/__pycache__/video.cpython-310.pyc differ diff --git a/app/mcp/tools/__pycache__/whisper.cpython-310.pyc b/app/mcp/tools/__pycache__/whisper.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ff99516a72567bf9526988603abd5e6e3a8ed4d Binary files /dev/null and b/app/mcp/tools/__pycache__/whisper.cpython-310.pyc differ diff --git a/app/mcp/tools/__pycache__/ytdlp.cpython-310.pyc b/app/mcp/tools/__pycache__/ytdlp.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..db605724407b4b73e2c46a1afdcdf848fd908154 Binary files /dev/null and b/app/mcp/tools/__pycache__/ytdlp.cpython-310.pyc differ diff --git a/app/mcp/tools/collaboration.py b/app/mcp/tools/collaboration.py index 83a80ffe5ed67a210d5481d9ecc5929b073fa434..cfc72db1e7010e34e250d8cf1389f574a0982a66 100644 --- a/app/mcp/tools/collaboration.py +++ b/app/mcp/tools/collaboration.py @@ -1,35 +1,25 @@ from __future__ import annotations from typing import Any -from mcp.server.fastmcp import FastMCP - -from app.mcp.registry import MCPRegistry +from app.mcp.registry import register_tool from app.projects.services.collaboration_service import CollaborationService from app.security.context import auth_context - -def register_collaboration_tools(server: FastMCP[Any], registry: MCPRegistry) -> None: - @server.tool(description="List teams in the current workspace.") - async def list_teams() -> dict[str, Any]: - auth = auth_context.get() - if not auth or not auth.workspace_id: - raise ValueError("Unauthorized") - - async def action() -> list[dict[str, Any]]: - service: CollaborationService = registry.container.collaboration - return [item.model_dump(mode="json") for item in await service.list_teams(auth.workspace_id)] - - return await registry.run_metadata_tool("collaboration.list_teams", action) - - @server.tool(description="Create a team in the current workspace.") - async def create_team(name: str) -> dict[str, Any]: - auth = auth_context.get() - if not auth or not auth.workspace_id: - raise ValueError("Unauthorized") - - async def action() -> dict[str, Any]: - service: CollaborationService = registry.container.collaboration - return (await service.create_team(auth.workspace_id, name)).model_dump(mode="json") - - return await registry.run_metadata_tool("collaboration.create_team", action) - -register_collaboration_tools # re-export registration symbol for compatibility +@register_tool("collaboration.list_teams") +async def list_teams(ctx: Any) -> list[dict[str, Any]]: + """List all teams in the workspace.""" + auth = auth_context.get() + if not auth or not auth.workspace_id: + raise Exception("Unauthorized") + + service: CollaborationService = ctx.container.collaboration + return await service.list_teams(auth.workspace_id) + +@register_tool("collaboration.create_team") +async def create_team(ctx: Any, name: str) -> dict[str, Any]: + """Create a new team in the workspace.""" + auth = auth_context.get() + if not auth or not auth.workspace_id: + raise Exception("Unauthorized") + + service: CollaborationService = ctx.container.collaboration + return (await service.create_team(auth.workspace_id, name)).model_dump() diff --git a/app/models/__pycache__/__init__.cpython-310.pyc b/app/models/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..69e16812ab59076a0c057a800e7502696157aaf7 Binary files /dev/null and b/app/models/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/models/__pycache__/media.cpython-310.pyc b/app/models/__pycache__/media.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e967dd46d4df6c04b53397309d75a9368ad484d7 Binary files /dev/null and b/app/models/__pycache__/media.cpython-310.pyc differ diff --git a/app/models/__pycache__/requests.cpython-310.pyc b/app/models/__pycache__/requests.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1f6a404dfccc63b1a8cee134fb8f36917f4f2752 Binary files /dev/null and b/app/models/__pycache__/requests.cpython-310.pyc differ diff --git a/app/operations/__pycache__/__init__.cpython-310.pyc b/app/operations/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..36a4da178e5c0bf4506103184580a68aa070e467 Binary files /dev/null and b/app/operations/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/operations/__pycache__/common.cpython-310.pyc b/app/operations/__pycache__/common.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6b8d904661c1260ddf5ef6599c59cc76e48b1e07 Binary files /dev/null and b/app/operations/__pycache__/common.cpython-310.pyc differ diff --git a/app/operations/__pycache__/compress.cpython-310.pyc b/app/operations/__pycache__/compress.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3c287878380a541f67f6e4f50043f3150dd3d985 Binary files /dev/null and b/app/operations/__pycache__/compress.cpython-310.pyc differ diff --git a/app/operations/__pycache__/concat.cpython-310.pyc b/app/operations/__pycache__/concat.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..89aaf2452633978c12c0b7dc97256d238162ef2b Binary files /dev/null and b/app/operations/__pycache__/concat.cpython-310.pyc differ diff --git a/app/operations/__pycache__/convert.cpython-310.pyc b/app/operations/__pycache__/convert.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..56574d716fef64aab9d3280837db23b36138af11 Binary files /dev/null and b/app/operations/__pycache__/convert.cpython-310.pyc differ diff --git a/app/operations/__pycache__/crop.cpython-310.pyc b/app/operations/__pycache__/crop.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..781baad1d99785c58144bf810c3eb31687ce00d0 Binary files /dev/null and b/app/operations/__pycache__/crop.cpython-310.pyc differ diff --git a/app/operations/__pycache__/extract_audio.cpython-310.pyc b/app/operations/__pycache__/extract_audio.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0258c5f2f4f27ed387e961867bce5232c7c53406 Binary files /dev/null and b/app/operations/__pycache__/extract_audio.cpython-310.pyc differ diff --git a/app/operations/__pycache__/merge.cpython-310.pyc b/app/operations/__pycache__/merge.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a2597e82a3070603972ad9812c2d199aebf442c0 Binary files /dev/null and b/app/operations/__pycache__/merge.cpython-310.pyc differ diff --git a/app/operations/__pycache__/resize.cpython-310.pyc b/app/operations/__pycache__/resize.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..659a849f0779afc1df62474f2c502778ac0b0063 Binary files /dev/null and b/app/operations/__pycache__/resize.cpython-310.pyc differ diff --git a/app/operations/__pycache__/rotate.cpython-310.pyc b/app/operations/__pycache__/rotate.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e2bbe8722281e5ee380fe64b74b91dae36f7c617 Binary files /dev/null and b/app/operations/__pycache__/rotate.cpython-310.pyc differ diff --git a/app/operations/__pycache__/subtitles.cpython-310.pyc b/app/operations/__pycache__/subtitles.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..67b86fb896099e1f3f6dd55161948e2d0fc573bd Binary files /dev/null and b/app/operations/__pycache__/subtitles.cpython-310.pyc differ diff --git a/app/operations/__pycache__/thumbnails.cpython-310.pyc b/app/operations/__pycache__/thumbnails.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fd342484822d732e72f42a2e3f2da6ec42d001cb Binary files /dev/null and b/app/operations/__pycache__/thumbnails.cpython-310.pyc differ diff --git a/app/operations/__pycache__/trim.cpython-310.pyc b/app/operations/__pycache__/trim.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..36120e43680f2c1a5c839a2d64122c855d48b24a Binary files /dev/null and b/app/operations/__pycache__/trim.cpython-310.pyc differ diff --git a/app/operations/__pycache__/watermark.cpython-310.pyc b/app/operations/__pycache__/watermark.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..477d3d419446d24607a7c48751e7fc680a56f7b3 Binary files /dev/null and b/app/operations/__pycache__/watermark.cpython-310.pyc differ diff --git a/app/projects/__pycache__/__init__.cpython-310.pyc b/app/projects/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7325125269de905972fd2095614ed65258e729b3 Binary files /dev/null and b/app/projects/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/projects/__pycache__/api.cpython-310.pyc b/app/projects/__pycache__/api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f346a6a7b7f34571d48690230e1428495469dabe Binary files /dev/null and b/app/projects/__pycache__/api.cpython-310.pyc differ diff --git a/app/projects/__pycache__/editor_schemas.cpython-310.pyc b/app/projects/__pycache__/editor_schemas.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..91071cf774c5f8857082b85845d90b0bdedebb51 Binary files /dev/null and b/app/projects/__pycache__/editor_schemas.cpython-310.pyc differ diff --git a/app/projects/__pycache__/errors.cpython-310.pyc b/app/projects/__pycache__/errors.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0d8b0658e181c358dc34583c2675aa238ecaf7a3 Binary files /dev/null and b/app/projects/__pycache__/errors.cpython-310.pyc differ diff --git a/app/projects/__pycache__/models.cpython-310.pyc b/app/projects/__pycache__/models.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fbd0fe42c3e76ec275515097a496878b450bcf4e Binary files /dev/null and b/app/projects/__pycache__/models.cpython-310.pyc differ diff --git a/app/projects/__pycache__/render_state.cpython-310.pyc b/app/projects/__pycache__/render_state.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3168af9687111538f8b4cf4aade2c017020b2f87 Binary files /dev/null and b/app/projects/__pycache__/render_state.cpython-310.pyc differ diff --git a/app/projects/__pycache__/schemas.cpython-310.pyc b/app/projects/__pycache__/schemas.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9b97a98c6645580cf1db7512477559e893f56f96 Binary files /dev/null and b/app/projects/__pycache__/schemas.cpython-310.pyc differ diff --git a/app/projects/api.py b/app/projects/api.py index c799267b3130a0f1d5c06328de74d2848790488c..582e55df285e7e7a151a84ac17692371f8ac6f15 100644 --- a/app/projects/api.py +++ b/app/projects/api.py @@ -32,7 +32,7 @@ from app.projects.schemas.collaboration import ( TeamBase, MemberResponse ) -from app.projects.schemas.approval import ApprovalRequest, ApprovalRequestCreate, ReviewComment +from app.projects.schemas.approval import ApprovalRequest, ReviewComment from app.security.errors import ForbiddenError router = APIRouter(prefix="/v1/projects", tags=["projects"]) @@ -82,24 +82,7 @@ async def archive_team(request: Request, team_id: str) -> Response: @router.get("/workspace/workflows/{workflow_id}/requests", response_model=list[ApprovalRequest]) async def list_approval_requests(request: Request, workflow_id: str) -> list[ApprovalRequest]: - workspace_id, _, _, _ = _identity(request) - return await request.app.state.container.approval.list_requests(workspace_id, workflow_id) - - - -@router.post("/workspace/workflows/{workflow_id}/requests", response_model=ApprovalRequest, status_code=status.HTTP_201_CREATED) -async def create_approval_request( - request: Request, - workflow_id: str, - payload: ApprovalRequestCreate, -) -> ApprovalRequest: - workspace_id, user_id, _, _ = _identity(request) - return await request.app.state.container.approval.create_request( - workspace_id=workspace_id, - workflow_id=workflow_id, - project_id=payload.project_id, - user_id=user_id, - ) + return await request.app.state.container.approval.list_requests(workflow_id) @router.post("/workspace/requests/{request_id}/approve", response_model=ApprovalRequest) @@ -107,16 +90,16 @@ async def approve_request( request: Request, request_id: str ) -> ApprovalRequest: - workspace_id, user_id, _, _ = _identity(request) - return await request.app.state.container.approval.approve_request(workspace_id, request_id, user_id) + _, user_id, _, _ = _identity(request) + return await request.app.state.container.approval.approve_request(request_id, user_id) @router.post("/workspace/requests/{request_id}/reject", response_model=ApprovalRequest) async def reject_request( request: Request, request_id: str ) -> ApprovalRequest: - workspace_id, user_id, _, _ = _identity(request) - return await request.app.state.container.approval.reject_request(workspace_id, request_id, user_id) + _, user_id, _, _ = _identity(request) + return await request.app.state.container.approval.reject_request(request_id, user_id) @router.post("/workspace/requests/{request_id}/comments", response_model=ReviewComment) async def add_review_comment( @@ -326,10 +309,7 @@ async def list_project_collaborators( request: Request, project_id: UUID ) -> list[MemberResponse]: - workspace_id, user_id, _, _ = _identity(request) - return await request.app.state.container.collaboration.list_project_collaborators( - workspace_id, str(project_id), user_id=user_id - ) + return await request.app.state.container.collaboration.list_project_collaborators(str(project_id)) @router.post("/{project_id}/collaborators", response_model=MemberResponse) async def add_project_collaborator( @@ -349,10 +329,7 @@ async def remove_project_collaborator( project_id: UUID, user_id: str ) -> Response: - workspace_id, _, _, _ = _identity(request) - await request.app.state.container.collaboration.remove_project_collaborator( - workspace_id, str(project_id), user_id - ) + await request.app.state.container.collaboration.remove_project_collaborator(str(project_id), user_id) return Response(status_code=status.HTTP_204_NO_CONTENT) diff --git a/app/projects/models/__init__.py b/app/projects/models/__init__.py index 61df0feba2a72deed964ca2683bfeb3e70fc9bd9..d9b931ddd73064830e19134c00cfa752e31cc3b1 100644 --- a/app/projects/models/__init__.py +++ b/app/projects/models/__init__.py @@ -1,32 +1,131 @@ from __future__ import annotations -from app.projects.models.collaboration import ( - ApprovalRequest, - ApprovalWorkflow, - CollaborationActivity, - Invitation, - ProjectCollaborator, - ReviewComment, - Team, - TeamMember, +from datetime import datetime +from uuid import uuid4 + +from sqlalchemy import ( + JSON, + CheckConstraint, + DateTime, + ForeignKey, + Index, + Integer, + String, + Text, + UniqueConstraint, ) -from app.projects.models.editor import ProjectEditorState -from app.projects.models.notifications import NotificationPreference -from app.projects.models.project import Project, ProjectGenerationJob +from sqlalchemy.orm import Mapped, mapped_column + from app.projects.models.rendering import ProjectRenderJob +from app.security.models import Base, utcnow + + +class Project(Base): + """A durable workspace-owned container for future creative resources.""" + + __tablename__ = "projects" + __table_args__ = ( + CheckConstraint("status in ('active', 'archived')", name="ck_projects_status"), + Index("ix_projects_workspace", "workspace_id"), + Index("ix_projects_workspace_status", "workspace_id", "status"), + Index("ix_projects_workspace_updated", "workspace_id", "updated_at"), + Index("ix_projects_created_by", "created_by"), + ) + + id: Mapped[str] = mapped_column(String(36), primary_key=True, default=lambda: str(uuid4())) + workspace_id: Mapped[str] = mapped_column( + String(36), ForeignKey("workspaces.id", ondelete="RESTRICT"), nullable=False + ) + created_by: Mapped[str] = mapped_column( + String(36), ForeignKey("users.id", ondelete="RESTRICT"), nullable=False + ) + name: Mapped[str] = mapped_column(String(200), nullable=False) + description: Mapped[str | None] = mapped_column(Text) + status: Mapped[str] = mapped_column(String(16), nullable=False, default="active") + thumbnail_asset_id: Mapped[str | None] = mapped_column( + String(36), ForeignKey("media_assets.id", ondelete="SET NULL") + ) + brand_kit_id: Mapped[str | None] = mapped_column( + String(36), ForeignKey("brand_kits.id", ondelete="RESTRICT") + ) + metadata_json: Mapped[dict[str, object]] = mapped_column( + "metadata", JSON, nullable=False, default=dict + ) + created_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), nullable=False, default=utcnow + ) + updated_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), nullable=False, default=utcnow, onupdate=utcnow + ) + archived_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True)) + + +class ProjectGenerationJob(Base): + """Associates the existing durable generation job with one project.""" + + __tablename__ = "project_generation_jobs" + __table_args__ = ( + UniqueConstraint("generation_job_id", name="uq_project_generation_job"), + Index( + "ix_project_generation_jobs_workspace_project_created", + "workspace_id", + "project_id", + "created_at", + ), + ) + + id: Mapped[str] = mapped_column(String(36), primary_key=True, default=lambda: str(uuid4())) + workspace_id: Mapped[str] = mapped_column( + String(36), ForeignKey("workspaces.id", ondelete="RESTRICT"), nullable=False + ) + project_id: Mapped[str] = mapped_column( + String(36), ForeignKey("projects.id", ondelete="RESTRICT"), nullable=False + ) + generation_job_id: Mapped[str] = mapped_column( + String(36), ForeignKey("generation_jobs.id", ondelete="RESTRICT"), nullable=False + ) + attached_by: Mapped[str] = mapped_column( + String(36), ForeignKey("users.id", ondelete="RESTRICT"), nullable=False + ) + created_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), nullable=False, default=utcnow + ) + + +class ProjectEditorState(Base): + """The one authoritative current editor document for a project.""" + + __tablename__ = "project_editor_states" + __table_args__ = ( + UniqueConstraint("project_id", name="uq_project_editor_state_project"), + Index("ix_project_editor_states_workspace_project", "workspace_id", "project_id"), + ) + + id: Mapped[str] = mapped_column(String(36), primary_key=True, default=lambda: str(uuid4())) + workspace_id: Mapped[str] = mapped_column( + String(36), ForeignKey("workspaces.id", ondelete="RESTRICT"), nullable=False + ) + project_id: Mapped[str] = mapped_column( + String(36), ForeignKey("projects.id", ondelete="RESTRICT"), nullable=False + ) + revision: Mapped[int] = mapped_column(Integer, nullable=False, default=1) + schema_version: Mapped[int] = mapped_column(Integer, nullable=False) + state_json: Mapped[dict[str, object]] = mapped_column( + "state", JSON, nullable=False, default=dict + ) + created_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), nullable=False, default=utcnow + ) + updated_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), nullable=False, default=utcnow, onupdate=utcnow + ) + updated_by: Mapped[str] = mapped_column( + String(36), ForeignKey("users.id", ondelete="RESTRICT"), nullable=False + ) __all__ = [ "Project", "ProjectGenerationJob", "ProjectEditorState", "ProjectRenderJob", - "Team", - "TeamMember", - "Invitation", - "ApprovalWorkflow", - "ApprovalRequest", - "ReviewComment", - "ProjectCollaborator", - "CollaborationActivity", - "NotificationPreference", ] diff --git a/app/projects/models/__pycache__/__init__.cpython-310.pyc b/app/projects/models/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..95a93e654b6c5f4000027726d88e10434c64e357 Binary files /dev/null and b/app/projects/models/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/projects/models/__pycache__/collaboration.cpython-310.pyc b/app/projects/models/__pycache__/collaboration.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9440583b264d89eda7122417a76a7c03d312e99e Binary files /dev/null and b/app/projects/models/__pycache__/collaboration.cpython-310.pyc differ diff --git a/app/projects/models/__pycache__/notifications.cpython-310.pyc b/app/projects/models/__pycache__/notifications.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..623c90c740a3ddf778d6d8518175ad758ad5c23a Binary files /dev/null and b/app/projects/models/__pycache__/notifications.cpython-310.pyc differ diff --git a/app/projects/models/__pycache__/rendering.cpython-310.pyc b/app/projects/models/__pycache__/rendering.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1dbc6b860f684b192e728b93ff2749015d907e0a Binary files /dev/null and b/app/projects/models/__pycache__/rendering.cpython-310.pyc differ diff --git a/app/projects/models/collaboration.py b/app/projects/models/collaboration.py index 316d24f8f8379f460a20dc4bbaf0a3e4be1a38b4..9cb87fb060e3ebc4e7f9466b2ac1399d6f62c6ea 100644 --- a/app/projects/models/collaboration.py +++ b/app/projects/models/collaboration.py @@ -10,8 +10,8 @@ from sqlalchemy import ( Integer, String, UniqueConstraint, + JSON, ) -from sqlalchemy import JSON from sqlalchemy.orm import Mapped, mapped_column from app.security.models import Base, utcnow @@ -97,8 +97,8 @@ class ReviewComment(Base): class ProjectCollaborator(Base): __tablename__ = "project_collaborators" __table_args__ = ( - UniqueConstraint("project_id", "user_id", name="uq_project_collaborator"), - Index("ix_project_collaborators_project", "project_id"), + UniqueConstraint("project_id", "user_id", name="uq_project_collaborators_project_user"), + Index("ix_project_collaborators_project_id", "project_id"), ) id: Mapped[str] = mapped_column(String(36), primary_key=True, default=lambda: str(uuid4())) @@ -110,10 +110,9 @@ class ProjectCollaborator(Base): class CollaborationActivity(Base): - __tablename__ = "collaboration_activities" + __tablename__ = "collaboration_activity" __table_args__ = ( - Index("ix_collaboration_activities_workspace", "workspace_id"), - Index("ix_collaboration_activities_entity", "entity_type", "entity_id"), + Index("ix_collaboration_activity_workspace_id", "workspace_id"), ) id: Mapped[str] = mapped_column(String(36), primary_key=True, default=lambda: str(uuid4())) @@ -122,5 +121,7 @@ class CollaborationActivity(Base): action: Mapped[str] = mapped_column(String(100), nullable=False) entity_id: Mapped[str] = mapped_column(String(36), nullable=False) entity_type: Mapped[str] = mapped_column(String(50), nullable=False) - activity_metadata: Mapped[dict[str, object]] = mapped_column("metadata", JSON, nullable=False, default=dict) + metadata_json: Mapped[dict[str, object]] = mapped_column( + "metadata", JSON, nullable=False, default=dict + ) created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False, default=utcnow) diff --git a/app/projects/models/rendering.py b/app/projects/models/rendering.py index 2f3a83fdcbd1b76debdf5ec0f29ce48219558d9f..633745e503eb6a315f5b27dbb9f4d33baa1e7847 100644 --- a/app/projects/models/rendering.py +++ b/app/projects/models/rendering.py @@ -68,8 +68,12 @@ class ProjectRenderJob(Base): ) error_code: Mapped[str | None] = mapped_column(String(100)) error_message: Mapped[str | None] = mapped_column(Text) - created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False, default=utcnow) + created_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), nullable=False, default=utcnow + ) started_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True)) completed_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True)) cancelled_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True)) - updated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), nullable=False, default=utcnow, onupdate=utcnow) + updated_at: Mapped[datetime] = mapped_column( + DateTime(timezone=True), nullable=False, default=utcnow, onupdate=utcnow + ) diff --git a/app/projects/repositories/__pycache__/__init__.cpython-310.pyc b/app/projects/repositories/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8beef133b5f0f60fe74bdddd5ea5bb363155562b Binary files /dev/null and b/app/projects/repositories/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/projects/repositories/__pycache__/approval_repository.cpython-310.pyc b/app/projects/repositories/__pycache__/approval_repository.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ad8b7c31eeef6eaae3f01a68a5be255945dabc77 Binary files /dev/null and b/app/projects/repositories/__pycache__/approval_repository.cpython-310.pyc differ diff --git a/app/projects/repositories/__pycache__/collaboration_repository.cpython-310.pyc b/app/projects/repositories/__pycache__/collaboration_repository.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd7cf6326c0f223a9f88ed9358791204b0bb289d Binary files /dev/null and b/app/projects/repositories/__pycache__/collaboration_repository.cpython-310.pyc differ diff --git a/app/projects/repositories/__pycache__/editor_repository.cpython-310.pyc b/app/projects/repositories/__pycache__/editor_repository.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c03d96be16860d37a05ed4d384dec604f47ccab8 Binary files /dev/null and b/app/projects/repositories/__pycache__/editor_repository.cpython-310.pyc differ diff --git a/app/projects/repositories/__pycache__/notification_repository.cpython-310.pyc b/app/projects/repositories/__pycache__/notification_repository.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ecfcfe9a4d74f9bc8e76cffca895a7846427bfdb Binary files /dev/null and b/app/projects/repositories/__pycache__/notification_repository.cpython-310.pyc differ diff --git a/app/projects/repositories/__pycache__/project_repository.cpython-310.pyc b/app/projects/repositories/__pycache__/project_repository.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1820a02ac8167fa6a53afc264f9eeb4b2f557134 Binary files /dev/null and b/app/projects/repositories/__pycache__/project_repository.cpython-310.pyc differ diff --git a/app/projects/repositories/__pycache__/render_repository.cpython-310.pyc b/app/projects/repositories/__pycache__/render_repository.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..118c07008cedb3bde40eaf96ff51c34775957747 Binary files /dev/null and b/app/projects/repositories/__pycache__/render_repository.cpython-310.pyc differ diff --git a/app/projects/repositories/approval_repository.py b/app/projects/repositories/approval_repository.py index ac81c4774596a67c61d4b6fb08962fff9b237809..57a087072e442cabaf6c184bc3f76111b8554ac0 100644 --- a/app/projects/repositories/approval_repository.py +++ b/app/projects/repositories/approval_repository.py @@ -30,14 +30,9 @@ class ApprovalRepository: await session.refresh(request) return request - async def update_request_status(self, request_id: str, workspace_id: str, status: str) -> ApprovalRequest: + async def update_request_status(self, request_id: str, status: str) -> ApprovalRequest: async with self.database.session() as session: - request = await session.scalar( - select(ApprovalRequest).where( - ApprovalRequest.id == request_id, - ApprovalRequest.workspace_id == workspace_id, - ) - ) + request = await session.get(ApprovalRequest, request_id) if not request: raise Exception("Request not found") request.status = status @@ -45,14 +40,9 @@ class ApprovalRepository: await session.refresh(request) return request - async def get_request(self, request_id: str, workspace_id: str) -> ApprovalRequest: + async def get_request(self, request_id: str) -> ApprovalRequest: async with self.database.session() as session: - request = await session.scalar( - select(ApprovalRequest).where( - ApprovalRequest.id == request_id, - ApprovalRequest.workspace_id == workspace_id, - ) - ) + request = await session.get(ApprovalRequest, request_id) if not request: raise Exception("Request not found") return request @@ -70,12 +60,10 @@ class ApprovalRepository: await session.refresh(comment) return comment - async def list_requests(self, workspace_id: str, workflow_id: str) -> list[ApprovalRequest]: + async def list_requests(self, workflow_id: str) -> list[ApprovalRequest]: async with self.database.session() as session: result = await session.scalars( - select(ApprovalRequest).where( - ApprovalRequest.workflow_id == workflow_id, - ApprovalRequest.workspace_id == workspace_id, - ) + select(ApprovalRequest).where(ApprovalRequest.workflow_id == workflow_id) ) return list(result.all()) + diff --git a/app/projects/repositories/collaboration_repository.py b/app/projects/repositories/collaboration_repository.py index b8957f5e65a911c1c3bdcab66220d6e0e5582ff6..29fb2ca9f96b8b6cb836007134e490e1ad2983d4 100644 --- a/app/projects/repositories/collaboration_repository.py +++ b/app/projects/repositories/collaboration_repository.py @@ -133,7 +133,7 @@ class CollaborationRepository: action=action, entity_id=entity_id, entity_type=entity_type, - activity_metadata=metadata + metadata=metadata ) session.add(activity) await session.commit() @@ -149,23 +149,14 @@ class CollaborationRepository: return list(result.all()) async def list_project_collaborators(self, project_id: str) -> list[ProjectCollaborator]: - project = await self._project_for_resources(project_id) - async with self.database.tenant_session( - workspace_id=project.workspace_id, user_id=None - ) as session: + async with self.database.session() as session: result = await session.scalars( - select(ProjectCollaborator).where( - ProjectCollaborator.project_id == project_id, - ProjectCollaborator.workspace_id == project.workspace_id, - ) + select(ProjectCollaborator).where(ProjectCollaborator.project_id == project_id) ) return list(result.all()) async def add_project_collaborator(self, workspace_id: str, project_id: str, user_id: str, role: str) -> ProjectCollaborator: - await self._project_for_resources(project_id) - async with self.database.tenant_session( - workspace_id=workspace_id, user_id=user_id - ) as session: + async with self.database.session() as session: collaborator = ProjectCollaborator( workspace_id=workspace_id, project_id=project_id, @@ -177,28 +168,14 @@ class CollaborationRepository: await session.refresh(collaborator) return collaborator - async def remove_project_collaborator(self, workspace_id: str, project_id: str, user_id: str) -> None: - await self._project_for_resources(project_id) - async with self.database.tenant_session( - workspace_id=workspace_id, user_id=user_id - ) as session: + async def remove_project_collaborator(self, project_id: str, user_id: str) -> None: + async with self.database.session() as session: collaborator = await session.scalar( select(ProjectCollaborator).where( ProjectCollaborator.project_id == project_id, - ProjectCollaborator.workspace_id == workspace_id, ProjectCollaborator.user_id == user_id ) ) if collaborator: await session.delete(collaborator) await session.commit() - - @staticmethod - async def _project_for_resources(project_id: str) -> Project: - async with CollaborationRepository(None).database.session() as session: - project = await session.scalar( - select(Project).where(Project.id == project_id) - ) - if project is None: - raise Exception("Project not found") - return project diff --git a/app/projects/schemas/__init__.py b/app/projects/schemas/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..fcb1a7f99f1d6e08c0bf02710be109cbc127caf0 --- /dev/null +++ b/app/projects/schemas/__init__.py @@ -0,0 +1,184 @@ +from __future__ import annotations + +import json +import re +from datetime import datetime +from enum import Enum +from typing import Any, Literal + +from pydantic import BaseModel, ConfigDict, Field, field_validator, model_validator + +PROJECT_NAME_MAX_LENGTH = 200 +PROJECT_DESCRIPTION_MAX_LENGTH = 4000 +PROJECT_METADATA_MAX_BYTES = 16 * 1024 + + +class ProjectStatus(str, Enum): + ACTIVE = "active" + ARCHIVED = "archived" + + +def normalize_project_name(value: str) -> str: + normalized = re.sub(r"\s+", " ", value).strip() + if not normalized: + raise ValueError("Project name cannot be blank") + if len(normalized) > PROJECT_NAME_MAX_LENGTH: + raise ValueError(f"Project name cannot exceed {PROJECT_NAME_MAX_LENGTH} characters") + return normalized + + +def validate_metadata_size(value: dict[str, Any]) -> dict[str, Any]: + try: + encoded = json.dumps( + value, ensure_ascii=False, separators=(",", ":"), allow_nan=False + ).encode("utf-8") + except (TypeError, ValueError) as exc: + raise ValueError("Project metadata must be valid JSON") from exc + if len(encoded) > PROJECT_METADATA_MAX_BYTES: + raise ValueError(f"Project metadata cannot exceed {PROJECT_METADATA_MAX_BYTES} bytes") + return value + + +class ProjectCreate(BaseModel): + model_config = ConfigDict(extra="forbid") + + name: str + description: str | None = Field(default=None, max_length=PROJECT_DESCRIPTION_MAX_LENGTH) + thumbnail_asset_id: str | None = Field(default=None, min_length=1, max_length=36) + metadata: dict[str, Any] = Field(default_factory=dict) + + _normalize_name = field_validator("name")(normalize_project_name) + _validate_metadata = field_validator("metadata")(validate_metadata_size) + + +class ProjectUpdate(BaseModel): + model_config = ConfigDict(extra="forbid") + + name: str | None = None + description: str | None = Field(default=None, max_length=PROJECT_DESCRIPTION_MAX_LENGTH) + thumbnail_asset_id: str | None = Field(default=None, min_length=1, max_length=36) + metadata: dict[str, Any] | None = None + status: ProjectStatus | None = None + + @field_validator("name") + @classmethod + def normalize_name(cls, value: str | None) -> str | None: + if value is None: + return value + return normalize_project_name(value) + + @field_validator("metadata") + @classmethod + def validate_metadata(cls, value: dict[str, Any] | None) -> dict[str, Any] | None: + return None if value is None else validate_metadata_size(value) + + @model_validator(mode="after") + def validate_patch(self) -> ProjectUpdate: + if not self.model_fields_set: + raise ValueError("At least one project field must be supplied") + if "name" in self.model_fields_set and self.name is None: + raise ValueError("Project name cannot be null") + if "metadata" in self.model_fields_set and self.metadata is None: + raise ValueError("Project metadata cannot be null") + if "status" in self.model_fields_set and self.status is None: + raise ValueError("Project status cannot be null") + return self + + +class ProjectResponse(BaseModel): + model_config = ConfigDict(from_attributes=True) + + id: str + workspace_id: str + name: str + description: str | None + status: ProjectStatus + thumbnail_asset_id: str | None + brand_kit_id: str | None = None + brand_kit_version_id: str | None = None + metadata: dict[str, Any] + created_by: str + created_at: datetime + updated_at: datetime + archived_at: datetime | None + + +class ProjectListResponse(BaseModel): + items: list[ProjectResponse] + next_cursor: str | None = None + limit: int = Field(ge=1, le=100) + + +class ProjectAssetAttach(BaseModel): + model_config = ConfigDict(extra="forbid") + + asset_id: str = Field(min_length=1, max_length=36) + + +class ProjectAssetResponse(BaseModel): + id: str + project_id: str + request_id: str + filename: str + mime_type: str + file_size: int + metadata: dict[str, Any] + created_by_user_id: str | None + created_at: datetime + updated_at: datetime + + +class ProjectAssetListResponse(BaseModel): + items: list[ProjectAssetResponse] + + +class ProjectGenerationJobAttach(BaseModel): + model_config = ConfigDict(extra="forbid") + + generation_job_id: str = Field(min_length=1, max_length=36) + + +class ProjectGenerationJobResponse(BaseModel): + id: str + project_id: str + job_type: Literal["generation"] = "generation" + generation_request_id: str + provider: str + status: str + output_asset_id: str | None + error_code: str | None + created_at: datetime + started_at: datetime | None + completed_at: datetime | None + updated_at: datetime + attached_at: datetime + + +class ProjectGenerationJobListResponse(BaseModel): + items: list[ProjectGenerationJobResponse] + + +class ProjectRenderCreate(BaseModel): + model_config = ConfigDict(extra="forbid") + + template_id: str = Field(min_length=1) + payload: dict[str, Any] = Field(default_factory=dict) + + +class ProjectRenderResponse(BaseModel): + id: str + project_id: str + request_id: str + template_id: str + status: str + output_asset_id: str | None + error_code: str | None + payload: dict[str, Any] + created_at: datetime + started_at: datetime | None + completed_at: datetime | None + updated_at: datetime + + +class ProjectRenderListResponse(BaseModel): + items: list[ProjectRenderResponse] diff --git a/app/projects/schemas/__pycache__/__init__.cpython-310.pyc b/app/projects/schemas/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3710236e1d42ce1fab2a6b70fe5b6a03759070ea Binary files /dev/null and b/app/projects/schemas/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/projects/schemas/__pycache__/approval.cpython-310.pyc b/app/projects/schemas/__pycache__/approval.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8aedd15dedd0bacfa163b7a8cec870ee3147a66f Binary files /dev/null and b/app/projects/schemas/__pycache__/approval.cpython-310.pyc differ diff --git a/app/projects/schemas/__pycache__/collaboration.cpython-310.pyc b/app/projects/schemas/__pycache__/collaboration.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0592b3005ff481f4ee6e94ad5af11e4151ee7469 Binary files /dev/null and b/app/projects/schemas/__pycache__/collaboration.cpython-310.pyc differ diff --git a/app/projects/schemas/approval.py b/app/projects/schemas/approval.py index af7eca21348c326122b03e93d4a86e84c12fa5f1..cf590a65ee384a49b1095004154a0b58f2f1e3c2 100644 --- a/app/projects/schemas/approval.py +++ b/app/projects/schemas/approval.py @@ -9,11 +9,6 @@ class ApprovalRequest(BaseModel): created_by: str created_at: str - -class ApprovalRequestCreate(BaseModel): - project_id: str - - class ReviewComment(BaseModel): id: str request_id: str diff --git a/app/projects/schemas/collaboration.py b/app/projects/schemas/collaboration.py index a47150c55bdb28c63e42efe125c7ba420177ba7f..3003944d449d86d786378200a33d8021db5668e1 100644 --- a/app/projects/schemas/collaboration.py +++ b/app/projects/schemas/collaboration.py @@ -20,6 +20,7 @@ class InvitationResponse(InvitationCreate): status: str expires_at: str created_at: str + token: str | None = None class TeamBase(BaseModel): name: str diff --git a/app/projects/services/__pycache__/__init__.cpython-310.pyc b/app/projects/services/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf3cc0dfca4c405b9cb8e69e7e3b36d2465404d6 Binary files /dev/null and b/app/projects/services/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/projects/services/__pycache__/approval_service.cpython-310.pyc b/app/projects/services/__pycache__/approval_service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f14cfb534fdee8ee85d4369b3174c69745e14e7f Binary files /dev/null and b/app/projects/services/__pycache__/approval_service.cpython-310.pyc differ diff --git a/app/projects/services/__pycache__/collaboration_service.cpython-310.pyc b/app/projects/services/__pycache__/collaboration_service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..16ae509e2e205e9e2cfe76b4608d0d9938f0a478 Binary files /dev/null and b/app/projects/services/__pycache__/collaboration_service.cpython-310.pyc differ diff --git a/app/projects/services/__pycache__/editor_service.cpython-310.pyc b/app/projects/services/__pycache__/editor_service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5c2d18e74d3da2386f3e09550675827e410242ab Binary files /dev/null and b/app/projects/services/__pycache__/editor_service.cpython-310.pyc differ diff --git a/app/projects/services/__pycache__/notification_service.cpython-310.pyc b/app/projects/services/__pycache__/notification_service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b157ca1c7a3168b14b285acebfa890087d851b02 Binary files /dev/null and b/app/projects/services/__pycache__/notification_service.cpython-310.pyc differ diff --git a/app/projects/services/__pycache__/project_service.cpython-310.pyc b/app/projects/services/__pycache__/project_service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..002ad923063eed79cebfef9879f353d7360d95e1 Binary files /dev/null and b/app/projects/services/__pycache__/project_service.cpython-310.pyc differ diff --git a/app/projects/services/__pycache__/render_compiler.cpython-310.pyc b/app/projects/services/__pycache__/render_compiler.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..10d86dc52d0f47fb6d4824369b9c4e045e7e9f3a Binary files /dev/null and b/app/projects/services/__pycache__/render_compiler.cpython-310.pyc differ diff --git a/app/projects/services/__pycache__/render_service.cpython-310.pyc b/app/projects/services/__pycache__/render_service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a46239f2e84c987adb60410a561f83db8471d65e Binary files /dev/null and b/app/projects/services/__pycache__/render_service.cpython-310.pyc differ diff --git a/app/projects/services/approval_service.py b/app/projects/services/approval_service.py index b8385f030d8db5ce46c0571735f38838393672c4..16cec16292e8f3d2b3e4f162462d7fb862180953 100644 --- a/app/projects/services/approval_service.py +++ b/app/projects/services/approval_service.py @@ -33,5 +33,5 @@ class ApprovalService: async def add_comment(self, request_id: str, user_id: str, workspace_id: str, content: str) -> ReviewComment: return await self.repository.add_review_comment(request_id, user_id, workspace_id, content) - async def list_requests(self, workspace_id: str, workflow_id: str) -> list[ApprovalRequest]: - return await self.repository.list_requests(workspace_id, workflow_id) + async def list_requests(self, workflow_id: str) -> list[ApprovalRequest]: + return await self.repository.list_requests(workflow_id) diff --git a/app/projects/services/collaboration_service.py b/app/projects/services/collaboration_service.py index 5b55c302c095bcdb4eb6bd52e56207f608c12c35..db3f29930a68333ec0b1d57ecdf910c398ddc13e 100644 --- a/app/projects/services/collaboration_service.py +++ b/app/projects/services/collaboration_service.py @@ -50,6 +50,7 @@ class CollaborationService: expires_at=invitation.expires_at.isoformat(), created_at=invitation.created_at.isoformat() ) + setattr(response, "token", token) return response async def list_members(self, workspace_id: str) -> list[MemberResponse]: @@ -106,17 +107,14 @@ class CollaborationService: async def get_membership(self, workspace_id: str, user_id: str) -> WorkspaceMembership | None: return await self.repository.get_membership(workspace_id, user_id) - async def list_project_collaborators(self, workspace_id: str, project_id: str, *, user_id: str) -> list[MemberResponse]: - collaborators = await self.repository.list_project_collaborators(workspace_id, project_id) + async def list_project_collaborators(self, project_id: str) -> list[MemberResponse]: + collaborators = await self.repository.list_project_collaborators(project_id) return [MemberResponse(id=c.id, workspace_id=c.workspace_id, user_id=c.user_id, role=c.role, created_at=c.created_at.isoformat()) for c in collaborators] async def add_project_collaborator(self, workspace_id: str, project_id: str, user_id: str, role: str) -> MemberResponse: collaborator = await self.repository.add_project_collaborator(workspace_id, project_id, user_id, role) return MemberResponse(id=collaborator.id, workspace_id=collaborator.workspace_id, user_id=collaborator.user_id, role=collaborator.role, created_at=collaborator.created_at.isoformat()) - async def remove_project_collaborator(self, workspace_id: str, project_id: str, user_id: str) -> None: - await self.repository.remove_project_collaborator(workspace_id, project_id, user_id) - async def record_activity(self, workspace_id: str, user_id: str, action: str, entity_id: str, entity_type: str, metadata: dict[str, Any]) -> None: await self.repository.record_activity(workspace_id, user_id, action, entity_id, entity_type, metadata) @@ -129,7 +127,7 @@ class CollaborationService: "action": a.action, "entity_id": a.entity_id, "entity_type": a.entity_type, - "metadata": a.activity_metadata, + "metadata": a.metadata, "created_at": a.created_at.isoformat(), } for a in activities diff --git a/app/projects/workers/__pycache__/render_worker.cpython-310.pyc b/app/projects/workers/__pycache__/render_worker.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cda2b1ed1fa389e6559dbd4fb24d335e3415ba77 Binary files /dev/null and b/app/projects/workers/__pycache__/render_worker.cpython-310.pyc differ diff --git a/app/security/__pycache__/__init__.cpython-310.pyc b/app/security/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a36b8d0441c09dc3903bc53207f6fe59082265ac Binary files /dev/null and b/app/security/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/security/__pycache__/assets.cpython-310.pyc b/app/security/__pycache__/assets.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d779c072021c127f2188de620d1b32afa61c0e4 Binary files /dev/null and b/app/security/__pycache__/assets.cpython-310.pyc differ diff --git a/app/security/__pycache__/audit.cpython-310.pyc b/app/security/__pycache__/audit.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..531053d08f92da3ba03e73284e279f067013cf35 Binary files /dev/null and b/app/security/__pycache__/audit.cpython-310.pyc differ diff --git a/app/security/__pycache__/cli.cpython-310.pyc b/app/security/__pycache__/cli.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..10a7a6905fa7e80cc1581f122b8c1d8da94f9b3d Binary files /dev/null and b/app/security/__pycache__/cli.cpython-310.pyc differ diff --git a/app/security/__pycache__/context.cpython-310.pyc b/app/security/__pycache__/context.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..59b4e46c843bf0a8f2434f9cbdbab8d101dcf163 Binary files /dev/null and b/app/security/__pycache__/context.cpython-310.pyc differ diff --git a/app/security/__pycache__/database.cpython-310.pyc b/app/security/__pycache__/database.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c77fb18ff4cebc2870745edd7198a282084063b1 Binary files /dev/null and b/app/security/__pycache__/database.cpython-310.pyc differ diff --git a/app/security/__pycache__/errors.cpython-310.pyc b/app/security/__pycache__/errors.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f544433755d4f8320a036350921c5e5a3f31865d Binary files /dev/null and b/app/security/__pycache__/errors.cpython-310.pyc differ diff --git a/app/security/__pycache__/middleware.cpython-310.pyc b/app/security/__pycache__/middleware.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f0f4f5c462b8abf0af115a6968c9bda12909af82 Binary files /dev/null and b/app/security/__pycache__/middleware.cpython-310.pyc differ diff --git a/app/security/__pycache__/models.cpython-310.pyc b/app/security/__pycache__/models.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ed8b342fb305b5c10f90e6bef2125fe4f350649e Binary files /dev/null and b/app/security/__pycache__/models.cpython-310.pyc differ diff --git a/app/security/__pycache__/policy.cpython-310.pyc b/app/security/__pycache__/policy.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b6bf09affc4f98256f990230d1fbc8fc2653790c Binary files /dev/null and b/app/security/__pycache__/policy.cpython-310.pyc differ diff --git a/app/security/__pycache__/rate_limit.cpython-310.pyc b/app/security/__pycache__/rate_limit.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..537052ea57419e22aea7af22b9603d55856779ab Binary files /dev/null and b/app/security/__pycache__/rate_limit.cpython-310.pyc differ diff --git a/app/security/__pycache__/schemas.cpython-310.pyc b/app/security/__pycache__/schemas.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..825297771930a88bce5190f91a3c2727953125d8 Binary files /dev/null and b/app/security/__pycache__/schemas.cpython-310.pyc differ diff --git a/app/security/__pycache__/scopes.cpython-310.pyc b/app/security/__pycache__/scopes.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2da282eff91c939f8faf7b651617d49569968eb8 Binary files /dev/null and b/app/security/__pycache__/scopes.cpython-310.pyc differ diff --git a/app/security/__pycache__/service.cpython-310.pyc b/app/security/__pycache__/service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..37bac04f6cb7a0059db59b103d9641ffa5f8200e Binary files /dev/null and b/app/security/__pycache__/service.cpython-310.pyc differ diff --git a/app/security/__pycache__/tenancy.cpython-310.pyc b/app/security/__pycache__/tenancy.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4687fea4fb3088bdac01d5311eed2ed968d6f48e Binary files /dev/null and b/app/security/__pycache__/tenancy.cpython-310.pyc differ diff --git a/app/security/database.py b/app/security/database.py index 412d19972e2c1ba304f0486362e7fba25689e4b1..c0fb665e97ceb0a4997e17f2f3983489b9d5afb4 100644 --- a/app/security/database.py +++ b/app/security/database.py @@ -15,11 +15,6 @@ from sqlalchemy.ext.asyncio import ( # and production schema checks see the full security-owned domain even when a # caller constructs SecurityDatabase without first building the application # container. -__import__("app.generation.models") -__import__("app.projects.models") -__import__("app.copilot.models") -__import__("app.templates.marketplace_models") -__import__("app.brand.models") from app.core.database_url import normalize_async_database_url from app.security.models import Base @@ -117,6 +112,11 @@ class SecurityDatabase: async def initialize(self) -> None: if not self.auto_migrate: return + __import__("app.generation.models") + __import__("app.projects.models") + __import__("app.copilot.models") + __import__("app.templates.marketplace_models") + __import__("app.brand.models") async with self.engine.begin() as connection: await connection.run_sync(Base.metadata.create_all) diff --git a/app/security/schemas.py b/app/security/schemas.py index cb67704ca8793acc5e536a5f90a387f206ca52f3..a68d709c59652ed37438003e344ddffc76b30c9a 100644 --- a/app/security/schemas.py +++ b/app/security/schemas.py @@ -133,6 +133,7 @@ class AuthContextView(BaseModel): expires_at: datetime | None workspace_id: str | None = None user_id: str | None = None + membership_role: str | None = None class AuditLogView(BaseModel): diff --git a/app/services/__pycache__/__init__.cpython-310.pyc b/app/services/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..01e16f11ce2e6fdca8312e826f4696ceee280835 Binary files /dev/null and b/app/services/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/services/__pycache__/cleanup.cpython-310.pyc b/app/services/__pycache__/cleanup.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f22dec266542484d76b0a9285aa12339c08d059 Binary files /dev/null and b/app/services/__pycache__/cleanup.cpython-310.pyc differ diff --git a/app/services/__pycache__/downloader.cpython-310.pyc b/app/services/__pycache__/downloader.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2bf998951334e0f14f33a402198c193662a376b9 Binary files /dev/null and b/app/services/__pycache__/downloader.cpython-310.pyc differ diff --git a/app/services/__pycache__/ffmpeg_service.cpython-310.pyc b/app/services/__pycache__/ffmpeg_service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eea1a96bc3876bde9663fbac6a66f13696be77d6 Binary files /dev/null and b/app/services/__pycache__/ffmpeg_service.cpython-310.pyc differ diff --git a/app/services/__pycache__/ffprobe_service.cpython-310.pyc b/app/services/__pycache__/ffprobe_service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b7ebc71d49b10519ac40e19801332f4fa67a5326 Binary files /dev/null and b/app/services/__pycache__/ffprobe_service.cpython-310.pyc differ diff --git a/app/services/__pycache__/input_resolver.cpython-310.pyc b/app/services/__pycache__/input_resolver.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..87d82bf79be4850808911e74b2f7b18f67a9efbe Binary files /dev/null and b/app/services/__pycache__/input_resolver.cpython-310.pyc differ diff --git a/app/services/__pycache__/media_service.cpython-310.pyc b/app/services/__pycache__/media_service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb5acb66e158a6e083009565d25e85eabca99599 Binary files /dev/null and b/app/services/__pycache__/media_service.cpython-310.pyc differ diff --git a/app/services/__pycache__/validator.cpython-310.pyc b/app/services/__pycache__/validator.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0f22445e6deacffeee54e0b02fc632b2168a827b Binary files /dev/null and b/app/services/__pycache__/validator.cpython-310.pyc differ diff --git a/app/services/__pycache__/whisper_service.cpython-310.pyc b/app/services/__pycache__/whisper_service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8fe2410ad6e1ae45b0833a99a9753b4132d6fb48 Binary files /dev/null and b/app/services/__pycache__/whisper_service.cpython-310.pyc differ diff --git a/app/services/__pycache__/ytdlp_service.cpython-310.pyc b/app/services/__pycache__/ytdlp_service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4f195a86999af2648d858ca96bd2756927ae95d1 Binary files /dev/null and b/app/services/__pycache__/ytdlp_service.cpython-310.pyc differ diff --git a/app/services/media_service.py b/app/services/media_service.py index 2a6aafafb671b7474368519a4d411096ee8a24e9..5819e80331002cd2619e4f05c90ea8cd119f8d10 100644 --- a/app/services/media_service.py +++ b/app/services/media_service.py @@ -5,7 +5,6 @@ import time from collections.abc import Awaitable, Callable, Sequence from pathlib import Path from typing import Any -from typing import Optional from app.core.config import Settings from app.core.logger import get_logger @@ -18,6 +17,7 @@ from app.services.input_resolver import InputResolver from app.services.validator import MediaValidator from app.services.whisper_service import WhisperService from app.services.ytdlp_service import YTDLPService +from app.security.assets import CanonicalAssetService from app.security.context import auth_context logger = get_logger(__name__) @@ -37,7 +37,7 @@ class MediaProcessor: ffprobe: FFprobeService, ytdlp: YTDLPService, whisper: WhisperService, - assets: Optional["CanonicalAssetService"] = None, + assets: CanonicalAssetService | None = None, ) -> None: self.settings = settings self.resolver = resolver diff --git a/app/social/__pycache__/__init__.cpython-310.pyc b/app/social/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6917e7573fb46089dd01c5fa8773c0bc106f33bc Binary files /dev/null and b/app/social/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/social/__pycache__/database.cpython-310.pyc b/app/social/__pycache__/database.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d8dc5c161eec1b135066544ef8146df2ff9a891b Binary files /dev/null and b/app/social/__pycache__/database.cpython-310.pyc differ diff --git a/app/social/__pycache__/models.cpython-310.pyc b/app/social/__pycache__/models.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dec0c2f33418251d5c966170884838666978797a Binary files /dev/null and b/app/social/__pycache__/models.cpython-310.pyc differ diff --git a/app/social/__pycache__/security.cpython-310.pyc b/app/social/__pycache__/security.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a29f78bc5b6dafebc82633388000d7eede309e1 Binary files /dev/null and b/app/social/__pycache__/security.cpython-310.pyc differ diff --git a/app/social/domain/__pycache__/__init__.cpython-310.pyc b/app/social/domain/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f75f4b5818583717788491c6513abdb18d5d99fe Binary files /dev/null and b/app/social/domain/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/social/domain/__pycache__/capabilities.cpython-310.pyc b/app/social/domain/__pycache__/capabilities.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..726bbf998a06c375d3000446933878d8d6eb74ce Binary files /dev/null and b/app/social/domain/__pycache__/capabilities.cpython-310.pyc differ diff --git a/app/social/domain/__pycache__/enums.cpython-310.pyc b/app/social/domain/__pycache__/enums.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..30af2111e0a4f9722be5d4dbcb650279fb90df92 Binary files /dev/null and b/app/social/domain/__pycache__/enums.cpython-310.pyc differ diff --git a/app/social/domain/__pycache__/errors.cpython-310.pyc b/app/social/domain/__pycache__/errors.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f78652ae934b2e9e9cb1d0b192cc018a1f1b3133 Binary files /dev/null and b/app/social/domain/__pycache__/errors.cpython-310.pyc differ diff --git a/app/social/domain/__pycache__/models.cpython-310.pyc b/app/social/domain/__pycache__/models.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e41dd0d8e49395c8f58040b6cec41f5a8f7b8d0 Binary files /dev/null and b/app/social/domain/__pycache__/models.cpython-310.pyc differ diff --git a/app/social/domain/__pycache__/retry.cpython-310.pyc b/app/social/domain/__pycache__/retry.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e2ecb0741c3381d4777a5a03eaa14043c2f44602 Binary files /dev/null and b/app/social/domain/__pycache__/retry.cpython-310.pyc differ diff --git a/app/social/domain/__pycache__/state_machine.cpython-310.pyc b/app/social/domain/__pycache__/state_machine.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..034aaef55c34bd3a5430cb5988335a30c9605488 Binary files /dev/null and b/app/social/domain/__pycache__/state_machine.cpython-310.pyc differ diff --git a/app/social/oauth/__pycache__/__init__.cpython-310.pyc b/app/social/oauth/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f0c4275abe9003d2d7f20b00a206aa8bc2f2fa5d Binary files /dev/null and b/app/social/oauth/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/social/oauth/__pycache__/base.cpython-310.pyc b/app/social/oauth/__pycache__/base.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..69cc6a91b0f3e1b45d3e2e3889b72c8f85b0a671 Binary files /dev/null and b/app/social/oauth/__pycache__/base.cpython-310.pyc differ diff --git a/app/social/oauth/__pycache__/encryption.cpython-310.pyc b/app/social/oauth/__pycache__/encryption.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..92039cfac51c82a788aed68138e38ff45f46918c Binary files /dev/null and b/app/social/oauth/__pycache__/encryption.cpython-310.pyc differ diff --git a/app/social/oauth/__pycache__/state.cpython-310.pyc b/app/social/oauth/__pycache__/state.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..718edd1a1483d434ac82de31639ef15926dc1be1 Binary files /dev/null and b/app/social/oauth/__pycache__/state.cpython-310.pyc differ diff --git a/app/social/providers/__pycache__/__init__.cpython-310.pyc b/app/social/providers/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..73dcc12286daf5955331b30413c6c8f5755446d8 Binary files /dev/null and b/app/social/providers/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/social/providers/__pycache__/base.cpython-310.pyc b/app/social/providers/__pycache__/base.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d1fef4d9b614ec4eaf420cfccc3ce037e75793a0 Binary files /dev/null and b/app/social/providers/__pycache__/base.cpython-310.pyc differ diff --git a/app/social/providers/__pycache__/facebook.cpython-310.pyc b/app/social/providers/__pycache__/facebook.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b3d65f0e31af7033a9551d76e94533ef42ba016b Binary files /dev/null and b/app/social/providers/__pycache__/facebook.cpython-310.pyc differ diff --git a/app/social/providers/__pycache__/instagram.cpython-310.pyc b/app/social/providers/__pycache__/instagram.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bf10db560b1a1bcce353089fd170225b430a6282 Binary files /dev/null and b/app/social/providers/__pycache__/instagram.cpython-310.pyc differ diff --git a/app/social/providers/__pycache__/linkedin.cpython-310.pyc b/app/social/providers/__pycache__/linkedin.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..658282bf3297549b74738d037a3fcf742ccc220b Binary files /dev/null and b/app/social/providers/__pycache__/linkedin.cpython-310.pyc differ diff --git a/app/social/providers/__pycache__/meta.cpython-310.pyc b/app/social/providers/__pycache__/meta.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..07d89de1d35b2b75c0c17992ad32a6ce66eee240 Binary files /dev/null and b/app/social/providers/__pycache__/meta.cpython-310.pyc differ diff --git a/app/social/providers/__pycache__/meta_graph.cpython-310.pyc b/app/social/providers/__pycache__/meta_graph.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..797dc7af2df0e9380b859b3a26f383fbf6970510 Binary files /dev/null and b/app/social/providers/__pycache__/meta_graph.cpython-310.pyc differ diff --git a/app/social/providers/__pycache__/oauth.cpython-310.pyc b/app/social/providers/__pycache__/oauth.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de9766eddd61c3e969331fcb137fb42dcf924280 Binary files /dev/null and b/app/social/providers/__pycache__/oauth.cpython-310.pyc differ diff --git a/app/social/providers/__pycache__/registry.cpython-310.pyc b/app/social/providers/__pycache__/registry.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..96c59b8b4a87c3f3fdacd938e4d6fa6efa5abb72 Binary files /dev/null and b/app/social/providers/__pycache__/registry.cpython-310.pyc differ diff --git a/app/social/providers/__pycache__/telegram.cpython-310.pyc b/app/social/providers/__pycache__/telegram.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3b97ebe03dbb57e00b4f35c81bf204d4e901e82 Binary files /dev/null and b/app/social/providers/__pycache__/telegram.cpython-310.pyc differ diff --git a/app/social/providers/__pycache__/tiktok.cpython-310.pyc b/app/social/providers/__pycache__/tiktok.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..aef01f8cf398e080166efb66851dbd97160d05ac Binary files /dev/null and b/app/social/providers/__pycache__/tiktok.cpython-310.pyc differ diff --git a/app/social/providers/__pycache__/whatsapp.cpython-310.pyc b/app/social/providers/__pycache__/whatsapp.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..11ca9ed4c3fa8965a081d2c298e68c3da1daf4e0 Binary files /dev/null and b/app/social/providers/__pycache__/whatsapp.cpython-310.pyc differ diff --git a/app/social/providers/__pycache__/x.cpython-310.pyc b/app/social/providers/__pycache__/x.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..81d5dd39d3ea7f55c5e55f9a016f007868d8284e Binary files /dev/null and b/app/social/providers/__pycache__/x.cpython-310.pyc differ diff --git a/app/social/providers/__pycache__/youtube.cpython-310.pyc b/app/social/providers/__pycache__/youtube.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..08777681d59a07576351afbe19924a6be9eafc61 Binary files /dev/null and b/app/social/providers/__pycache__/youtube.cpython-310.pyc differ diff --git a/app/social/repositories/__pycache__/__init__.cpython-310.pyc b/app/social/repositories/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0bea7e8676ba0c69171ec2133d8fcbbddabf936 Binary files /dev/null and b/app/social/repositories/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/social/repositories/__pycache__/accounts.cpython-310.pyc b/app/social/repositories/__pycache__/accounts.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ead5704e5306f828d4a12a640e55a6547fbd4788 Binary files /dev/null and b/app/social/repositories/__pycache__/accounts.cpython-310.pyc differ diff --git a/app/social/repositories/__pycache__/assets.cpython-310.pyc b/app/social/repositories/__pycache__/assets.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39422f6e0ee0bcd042a709058e8ccdb64da4ce7b Binary files /dev/null and b/app/social/repositories/__pycache__/assets.cpython-310.pyc differ diff --git a/app/social/repositories/__pycache__/batches.cpython-310.pyc b/app/social/repositories/__pycache__/batches.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..81ec28e6be07a48f9abd6960030f506ff9d07a76 Binary files /dev/null and b/app/social/repositories/__pycache__/batches.cpython-310.pyc differ diff --git a/app/social/repositories/__pycache__/jobs.cpython-310.pyc b/app/social/repositories/__pycache__/jobs.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c3f41353aada06402c6c95bad4d0c1468445247a Binary files /dev/null and b/app/social/repositories/__pycache__/jobs.cpython-310.pyc differ diff --git a/app/social/repositories/__pycache__/posts.cpython-310.pyc b/app/social/repositories/__pycache__/posts.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..82166c16cf640f716236ec04fb42f17a42e596e0 Binary files /dev/null and b/app/social/repositories/__pycache__/posts.cpython-310.pyc differ diff --git a/app/social/repositories/__pycache__/tokens.cpython-310.pyc b/app/social/repositories/__pycache__/tokens.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5d6b4702337ad95f8d2f2b6e8e440f344d2a10c8 Binary files /dev/null and b/app/social/repositories/__pycache__/tokens.cpython-310.pyc differ diff --git a/app/social/schemas/__pycache__/__init__.cpython-310.pyc b/app/social/schemas/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7848269f0fd1bf7a66006463b7ff5186697c79a Binary files /dev/null and b/app/social/schemas/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/social/schemas/__pycache__/accounts.cpython-310.pyc b/app/social/schemas/__pycache__/accounts.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39c4cf92e7cde8f4cd5fe3f9da6300f0128f4bfd Binary files /dev/null and b/app/social/schemas/__pycache__/accounts.cpython-310.pyc differ diff --git a/app/social/schemas/__pycache__/assets.cpython-310.pyc b/app/social/schemas/__pycache__/assets.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..46d807e1fc2bbc520aabf8446a5b354f1a43f39f Binary files /dev/null and b/app/social/schemas/__pycache__/assets.cpython-310.pyc differ diff --git a/app/social/schemas/__pycache__/jobs.cpython-310.pyc b/app/social/schemas/__pycache__/jobs.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9a761c5d5bf4fe55cd261b1ed565a0d8b3351731 Binary files /dev/null and b/app/social/schemas/__pycache__/jobs.cpython-310.pyc differ diff --git a/app/social/schemas/__pycache__/linkedin.cpython-310.pyc b/app/social/schemas/__pycache__/linkedin.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1ad6df346378ede179ffbdcd245669d2c137d9d9 Binary files /dev/null and b/app/social/schemas/__pycache__/linkedin.cpython-310.pyc differ diff --git a/app/social/schemas/__pycache__/operations.cpython-310.pyc b/app/social/schemas/__pycache__/operations.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3a61294d1ef0c1683161e7829386fbb97b04ba6e Binary files /dev/null and b/app/social/schemas/__pycache__/operations.cpython-310.pyc differ diff --git a/app/social/schemas/__pycache__/posts.cpython-310.pyc b/app/social/schemas/__pycache__/posts.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..452f532b5890533c7f8754ec92fde57977030912 Binary files /dev/null and b/app/social/schemas/__pycache__/posts.cpython-310.pyc differ diff --git a/app/social/schemas/__pycache__/scheduling.cpython-310.pyc b/app/social/schemas/__pycache__/scheduling.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a0b97b853403dc6180cfb6a5a677b65813095c9b Binary files /dev/null and b/app/social/schemas/__pycache__/scheduling.cpython-310.pyc differ diff --git a/app/social/schemas/__pycache__/tiktok.cpython-310.pyc b/app/social/schemas/__pycache__/tiktok.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0661f379193808d080937dd3b19c7d3851c0663 Binary files /dev/null and b/app/social/schemas/__pycache__/tiktok.cpython-310.pyc differ diff --git a/app/social/schemas/__pycache__/x.cpython-310.pyc b/app/social/schemas/__pycache__/x.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e1aa4d3947d3a78d7e66669797af9a021a56a60 Binary files /dev/null and b/app/social/schemas/__pycache__/x.cpython-310.pyc differ diff --git a/app/social/schemas/__pycache__/youtube.cpython-310.pyc b/app/social/schemas/__pycache__/youtube.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8680d8514f7ed012d64a499bb2745fa9f46722aa Binary files /dev/null and b/app/social/schemas/__pycache__/youtube.cpython-310.pyc differ diff --git a/app/social/services/__pycache__/account_service.cpython-310.pyc b/app/social/services/__pycache__/account_service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9d6f5f757b116adec5e9bcfca0f791344bff837f Binary files /dev/null and b/app/social/services/__pycache__/account_service.cpython-310.pyc differ diff --git a/app/social/services/__pycache__/analytics_service.cpython-310.pyc b/app/social/services/__pycache__/analytics_service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9ef291d5e763104c5888bf8e62b520cf9da68751 Binary files /dev/null and b/app/social/services/__pycache__/analytics_service.cpython-310.pyc differ diff --git a/app/social/services/__pycache__/audit_service.cpython-310.pyc b/app/social/services/__pycache__/audit_service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7b1b51cf3ca8d64a3a8476f9ede8154992a425bd Binary files /dev/null and b/app/social/services/__pycache__/audit_service.cpython-310.pyc differ diff --git a/app/social/services/__pycache__/job_service.cpython-310.pyc b/app/social/services/__pycache__/job_service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..957560e4030b0ffac011973c00f5619c4cf288ef Binary files /dev/null and b/app/social/services/__pycache__/job_service.cpython-310.pyc differ diff --git a/app/social/services/__pycache__/media_asset_service.cpython-310.pyc b/app/social/services/__pycache__/media_asset_service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..850b6b269132002c9c33e9e969d021f728f21f47 Binary files /dev/null and b/app/social/services/__pycache__/media_asset_service.cpython-310.pyc differ diff --git a/app/social/services/__pycache__/oauth_service.cpython-310.pyc b/app/social/services/__pycache__/oauth_service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..16a7cc83bd2f34139135154a23f1067fb45d5d7a Binary files /dev/null and b/app/social/services/__pycache__/oauth_service.cpython-310.pyc differ diff --git a/app/social/services/__pycache__/publishing_operations_service.cpython-310.pyc b/app/social/services/__pycache__/publishing_operations_service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e3314dea72829e1370ce46153863eac5b1a47c74 Binary files /dev/null and b/app/social/services/__pycache__/publishing_operations_service.cpython-310.pyc differ diff --git a/app/social/services/__pycache__/publishing_service.cpython-310.pyc b/app/social/services/__pycache__/publishing_service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d0abf01ff7f019b65c8fbb19ae4d56cc5c83116 Binary files /dev/null and b/app/social/services/__pycache__/publishing_service.cpython-310.pyc differ diff --git a/app/social/services/__pycache__/scheduling_service.cpython-310.pyc b/app/social/services/__pycache__/scheduling_service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cba2eedce9df13043a927c016db331c3b3878345 Binary files /dev/null and b/app/social/services/__pycache__/scheduling_service.cpython-310.pyc differ diff --git a/app/social/services/__pycache__/social_service.cpython-310.pyc b/app/social/services/__pycache__/social_service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2e10586e3dcd00e2b89a31da33a973b43dec98d7 Binary files /dev/null and b/app/social/services/__pycache__/social_service.cpython-310.pyc differ diff --git a/app/social/services/__pycache__/token_service.cpython-310.pyc b/app/social/services/__pycache__/token_service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5b9b04a88bd172ee4a979b23027358b0b0edfe38 Binary files /dev/null and b/app/social/services/__pycache__/token_service.cpython-310.pyc differ diff --git a/app/social/webhooks/__pycache__/__init__.cpython-310.pyc b/app/social/webhooks/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..43dfa4c28da0b06c506e07b539faebf160fad0cc Binary files /dev/null and b/app/social/webhooks/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/social/webhooks/__pycache__/base.cpython-310.pyc b/app/social/webhooks/__pycache__/base.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..48e7ca0e56541e8b9bad79b190f1456bf832f2ed Binary files /dev/null and b/app/social/webhooks/__pycache__/base.cpython-310.pyc differ diff --git a/app/social/webhooks/__pycache__/registry.cpython-310.pyc b/app/social/webhooks/__pycache__/registry.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4d0a1b62f13ced3f050fce142c0afed5afa0ac02 Binary files /dev/null and b/app/social/webhooks/__pycache__/registry.cpython-310.pyc differ diff --git a/app/social/workers/__pycache__/__init__.cpython-310.pyc b/app/social/workers/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cf4e7e9c436209713a41eb446b7c9a20240af9d0 Binary files /dev/null and b/app/social/workers/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/social/workers/__pycache__/publisher.cpython-310.pyc b/app/social/workers/__pycache__/publisher.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c9a29d1c0c75e188b6fde1b0dc8d2574e28d6838 Binary files /dev/null and b/app/social/workers/__pycache__/publisher.cpython-310.pyc differ diff --git a/app/social/workers/__pycache__/scheduler.cpython-310.pyc b/app/social/workers/__pycache__/scheduler.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e84f4161a13ffddadf98f970227159593d23770b Binary files /dev/null and b/app/social/workers/__pycache__/scheduler.cpython-310.pyc differ diff --git a/app/templates/__pycache__/__init__.cpython-310.pyc b/app/templates/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d4db9d2cc55cdfd03cebd93558618eb33916cd3d Binary files /dev/null and b/app/templates/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/templates/__pycache__/executor.cpython-310.pyc b/app/templates/__pycache__/executor.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..47e5af51f069af286048240f6e4bb43b972ee805 Binary files /dev/null and b/app/templates/__pycache__/executor.cpython-310.pyc differ diff --git a/app/templates/__pycache__/loader.cpython-310.pyc b/app/templates/__pycache__/loader.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..48ab2569e477906a88ead5f02365db91a6e429af Binary files /dev/null and b/app/templates/__pycache__/loader.cpython-310.pyc differ diff --git a/app/templates/__pycache__/marketplace_api.cpython-310.pyc b/app/templates/__pycache__/marketplace_api.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..abeba884bf4a9c2fb9f5409da619a46fb2239e11 Binary files /dev/null and b/app/templates/__pycache__/marketplace_api.cpython-310.pyc differ diff --git a/app/templates/__pycache__/marketplace_errors.cpython-310.pyc b/app/templates/__pycache__/marketplace_errors.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..daab5dc2d178f3f067ae9c9a2469407c3d0ce95a Binary files /dev/null and b/app/templates/__pycache__/marketplace_errors.cpython-310.pyc differ diff --git a/app/templates/__pycache__/marketplace_models.cpython-310.pyc b/app/templates/__pycache__/marketplace_models.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8d313453e5d4c6914e5b255745254132f4a3902e Binary files /dev/null and b/app/templates/__pycache__/marketplace_models.cpython-310.pyc differ diff --git a/app/templates/__pycache__/marketplace_repository.cpython-310.pyc b/app/templates/__pycache__/marketplace_repository.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..080f0db3806bcf59624edf00ff30ee35358b7934 Binary files /dev/null and b/app/templates/__pycache__/marketplace_repository.cpython-310.pyc differ diff --git a/app/templates/__pycache__/marketplace_schemas.cpython-310.pyc b/app/templates/__pycache__/marketplace_schemas.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f8cc3767a70ae5c9799e5ad9d79abe03942f0641 Binary files /dev/null and b/app/templates/__pycache__/marketplace_schemas.cpython-310.pyc differ diff --git a/app/templates/__pycache__/marketplace_service.cpython-310.pyc b/app/templates/__pycache__/marketplace_service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0cc472d52840039ad83452256602f6f9cfac672c Binary files /dev/null and b/app/templates/__pycache__/marketplace_service.cpython-310.pyc differ diff --git a/app/templates/__pycache__/models.cpython-310.pyc b/app/templates/__pycache__/models.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5d6e002e885968beb99bf31b0ec7de8bc2bcf180 Binary files /dev/null and b/app/templates/__pycache__/models.cpython-310.pyc differ diff --git a/app/templates/__pycache__/registry.cpython-310.pyc b/app/templates/__pycache__/registry.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de01afb56700c4397abbd1aa3f3b0157f5be2750 Binary files /dev/null and b/app/templates/__pycache__/registry.cpython-310.pyc differ diff --git a/app/templates/__pycache__/schema.cpython-310.pyc b/app/templates/__pycache__/schema.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..79fdfd165c2f0b0ee1ef3fa43f723190178e9131 Binary files /dev/null and b/app/templates/__pycache__/schema.cpython-310.pyc differ diff --git a/app/templates/__pycache__/validator.cpython-310.pyc b/app/templates/__pycache__/validator.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7499d3a86858e06d89b180d1186582b0bbe0083f Binary files /dev/null and b/app/templates/__pycache__/validator.cpython-310.pyc differ diff --git a/app/workers/__pycache__/__init__.cpython-310.pyc b/app/workers/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..38fe1d6048550a4595d0369b2b41b418966792d4 Binary files /dev/null and b/app/workers/__pycache__/__init__.cpython-310.pyc differ diff --git a/app/workers/__pycache__/cleanup_worker.cpython-310.pyc b/app/workers/__pycache__/cleanup_worker.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d640b56389378626a5b06b6970b0ce2ae0974391 Binary files /dev/null and b/app/workers/__pycache__/cleanup_worker.cpython-310.pyc differ diff --git a/core/__init__.py b/core/__init__.py index 3b5668e81019a7de84cd3e00e121cbcbf5f4f0b9..bd3863139fadb8241362b7c098686e159d45fd32 100644 --- a/core/__init__.py +++ b/core/__init__.py @@ -1,6 +1 @@ """Compatibility exports for the canonical :mod:`app.core` package.""" - -from app.core.config import * # noqa -from app.core.exceptions import * # noqa -from app.core.logger import * # noqa -from app.core.response import * # noqa diff --git a/core/__pycache__/__init__.cpython-310.pyc b/core/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..861bce640622e5d790cc310200d45aef871be487 Binary files /dev/null and b/core/__pycache__/__init__.cpython-310.pyc differ diff --git a/core/__pycache__/config.cpython-310.pyc b/core/__pycache__/config.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ff5cb7699acd09492d6e0f532e9b5d49a186e021 Binary files /dev/null and b/core/__pycache__/config.cpython-310.pyc differ diff --git a/core/__pycache__/exceptions.cpython-310.pyc b/core/__pycache__/exceptions.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7ee58d25093e6980438ce44d42d9117b23e83a82 Binary files /dev/null and b/core/__pycache__/exceptions.cpython-310.pyc differ diff --git a/core/__pycache__/logger.cpython-310.pyc b/core/__pycache__/logger.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa4e6bc3cc2ccd810681634765cfadc4f3b8e310 Binary files /dev/null and b/core/__pycache__/logger.cpython-310.pyc differ diff --git a/core/__pycache__/response.cpython-310.pyc b/core/__pycache__/response.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..957ba0e1992a6ff621acc08d2328da2c366e4d0f Binary files /dev/null and b/core/__pycache__/response.cpython-310.pyc differ diff --git a/models/__init__.py b/models/__init__.py index 1350c3baf095082d37a144b0cde3d0ddd1b17088..3e3320ee5b8bdd882002a45c5bd33b1036ecbc89 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -1,4 +1 @@ """Compatibility exports for the canonical :mod:`app.models` package.""" - -from app.models.media import * # noqa -from app.models.requests import * # noqa diff --git a/models/__pycache__/__init__.cpython-310.pyc b/models/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f303ab363b3f7e09021831847ca7cc815298ee99 Binary files /dev/null and b/models/__pycache__/__init__.cpython-310.pyc differ diff --git a/models/__pycache__/media.cpython-310.pyc b/models/__pycache__/media.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5f0d503824e7d82ea4f2d1ad30e337e89ac668e3 Binary files /dev/null and b/models/__pycache__/media.cpython-310.pyc differ diff --git a/models/__pycache__/requests.cpython-310.pyc b/models/__pycache__/requests.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eb1c18f962306f1abf4bc3fcfcb0c3c6a51240eb Binary files /dev/null and b/models/__pycache__/requests.cpython-310.pyc differ diff --git a/operations/__init__.py b/operations/__init__.py index 819b36cd54833a0b3081c5a83335b8b386c6df31..88769466fca84a24de040f25600dfb5a43ab175a 100644 --- a/operations/__init__.py +++ b/operations/__init__.py @@ -1,15 +1 @@ """Compatibility exports for the canonical :mod:`app.operations` package.""" - -from app.operations.common import * # noqa -from app.operations.compress import * # noqa -from app.operations.concat import * # noqa -from app.operations.convert import * # noqa -from app.operations.crop import * # noqa -from app.operations.extract_audio import * # noqa -from app.operations.merge import * # noqa -from app.operations.resize import * # noqa -from app.operations.rotate import * # noqa -from app.operations.subtitles import * # noqa -from app.operations.thumbnails import * # noqa -from app.operations.trim import * # noqa -from app.operations.watermark import * # noqa diff --git a/operations/__pycache__/__init__.cpython-310.pyc b/operations/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f2f6de119bddde965fdb0ea3a0d7f1307173a97a Binary files /dev/null and b/operations/__pycache__/__init__.cpython-310.pyc differ diff --git a/operations/__pycache__/compress.cpython-310.pyc b/operations/__pycache__/compress.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f45ae27bcbb4c9db3c00bc89c50961877a83d9ce Binary files /dev/null and b/operations/__pycache__/compress.cpython-310.pyc differ diff --git a/operations/__pycache__/concat.cpython-310.pyc b/operations/__pycache__/concat.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dbb9e95e6e62b2209a28ea487a61750953890e24 Binary files /dev/null and b/operations/__pycache__/concat.cpython-310.pyc differ diff --git a/operations/__pycache__/convert.cpython-310.pyc b/operations/__pycache__/convert.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..84e83be1d962c5270185bb74fca29c46acbcd08a Binary files /dev/null and b/operations/__pycache__/convert.cpython-310.pyc differ diff --git a/operations/__pycache__/crop.cpython-310.pyc b/operations/__pycache__/crop.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..80c77923527bdaf1ac240092d4e270daf11b2deb Binary files /dev/null and b/operations/__pycache__/crop.cpython-310.pyc differ diff --git a/operations/__pycache__/extract_audio.cpython-310.pyc b/operations/__pycache__/extract_audio.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..45277d054c2e8b2a029890200e34b292d50f7dbe Binary files /dev/null and b/operations/__pycache__/extract_audio.cpython-310.pyc differ diff --git a/operations/__pycache__/merge.cpython-310.pyc b/operations/__pycache__/merge.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8cacdaedf9667a24048b4db4cc6b2d1a0ece85de Binary files /dev/null and b/operations/__pycache__/merge.cpython-310.pyc differ diff --git a/operations/__pycache__/resize.cpython-310.pyc b/operations/__pycache__/resize.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3dc14e95bb3099fae41a098bce4afcabe29f6605 Binary files /dev/null and b/operations/__pycache__/resize.cpython-310.pyc differ diff --git a/operations/__pycache__/rotate.cpython-310.pyc b/operations/__pycache__/rotate.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c243b281b971f7884b562377c09cab0b3a6a213a Binary files /dev/null and b/operations/__pycache__/rotate.cpython-310.pyc differ diff --git a/operations/__pycache__/subtitles.cpython-310.pyc b/operations/__pycache__/subtitles.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..68265236db3a15650475292732e455e6e7b8a7b9 Binary files /dev/null and b/operations/__pycache__/subtitles.cpython-310.pyc differ diff --git a/operations/__pycache__/thumbnails.cpython-310.pyc b/operations/__pycache__/thumbnails.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1017080fe5f1e835e1f9f75e7d74657a0335aa28 Binary files /dev/null and b/operations/__pycache__/thumbnails.cpython-310.pyc differ diff --git a/operations/__pycache__/trim.cpython-310.pyc b/operations/__pycache__/trim.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5009bd96ace239d92c0ad189677067e46b8bd693 Binary files /dev/null and b/operations/__pycache__/trim.cpython-310.pyc differ diff --git a/operations/__pycache__/watermark.cpython-310.pyc b/operations/__pycache__/watermark.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..755166e32d317added2820d0906a565634467e56 Binary files /dev/null and b/operations/__pycache__/watermark.cpython-310.pyc differ diff --git a/services/__init__.py b/services/__init__.py index 774f43c602072c37a4b81210d15921b77de2eba7..8b208a40f76f2a300c43d87b80305db9206d7eca 100644 --- a/services/__init__.py +++ b/services/__init__.py @@ -1,11 +1 @@ """Compatibility exports for the canonical :mod:`app.services` package.""" - -from app.services.cleanup import * # noqa -from app.services.downloader import * # noqa -from app.services.ffmpeg_service import * # noqa -from app.services.ffprobe_service import * # noqa -from app.services.input_resolver import * # noqa -from app.services.media_service import * # noqa -from app.services.validator import * # noqa -from app.services.whisper_service import * # noqa -from app.services.ytdlp_service import * # noqa diff --git a/services/__pycache__/__init__.cpython-310.pyc b/services/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a45887cc391e632468f0c715d9314778de96a2e9 Binary files /dev/null and b/services/__pycache__/__init__.cpython-310.pyc differ diff --git a/services/__pycache__/cleanup.cpython-310.pyc b/services/__pycache__/cleanup.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..06a369b99eae4bcf17fcdcd2741b161e5b31f4a1 Binary files /dev/null and b/services/__pycache__/cleanup.cpython-310.pyc differ diff --git a/services/__pycache__/downloader.cpython-310.pyc b/services/__pycache__/downloader.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4756504ac58e4ff378f3f8934d716097ad8b77e0 Binary files /dev/null and b/services/__pycache__/downloader.cpython-310.pyc differ diff --git a/services/__pycache__/ffmpeg_service.cpython-310.pyc b/services/__pycache__/ffmpeg_service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a90055a65c5e76b89132de821d22daa36f0285b4 Binary files /dev/null and b/services/__pycache__/ffmpeg_service.cpython-310.pyc differ diff --git a/services/__pycache__/ffprobe_service.cpython-310.pyc b/services/__pycache__/ffprobe_service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..10bde30645eab4ef6db3b665617654501b857275 Binary files /dev/null and b/services/__pycache__/ffprobe_service.cpython-310.pyc differ diff --git a/services/__pycache__/input_resolver.cpython-310.pyc b/services/__pycache__/input_resolver.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ccdde9db4a8224d8e8b1cf489a273fc3b7196f05 Binary files /dev/null and b/services/__pycache__/input_resolver.cpython-310.pyc differ diff --git a/services/__pycache__/media_service.cpython-310.pyc b/services/__pycache__/media_service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c80ab15d8f00ea0cebe5d5296b482f4ea9eae873 Binary files /dev/null and b/services/__pycache__/media_service.cpython-310.pyc differ diff --git a/services/__pycache__/validator.cpython-310.pyc b/services/__pycache__/validator.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c6dca097b0546436b3a60b48de993ef4e411399a Binary files /dev/null and b/services/__pycache__/validator.cpython-310.pyc differ diff --git a/services/__pycache__/whisper_service.cpython-310.pyc b/services/__pycache__/whisper_service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bdfe0a0576f32ef0a77ab9c8c486cd4563ccd087 Binary files /dev/null and b/services/__pycache__/whisper_service.cpython-310.pyc differ diff --git a/services/__pycache__/ytdlp_service.cpython-310.pyc b/services/__pycache__/ytdlp_service.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e54e100df45f838654a00b03c135d1fcab504cb4 Binary files /dev/null and b/services/__pycache__/ytdlp_service.cpython-310.pyc differ diff --git a/workers/__init__.py b/workers/__init__.py index e1a071c3d48104549283fb8acebac70d5c9fe906..208531ac0e86ec393554ec147cc80381813bfcad 100644 --- a/workers/__init__.py +++ b/workers/__init__.py @@ -1,3 +1 @@ """Compatibility exports for the canonical :mod:`app.workers` package.""" - -from app.workers.cleanup_worker import * # noqa diff --git a/workers/__pycache__/__init__.cpython-310.pyc b/workers/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b044292e00adf34b4f63c983d04016df08eff999 Binary files /dev/null and b/workers/__pycache__/__init__.cpython-310.pyc differ diff --git a/workers/__pycache__/cleanup_worker.cpython-310.pyc b/workers/__pycache__/cleanup_worker.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..57a9595d8f7ebac50ae73cc044e19dcfaf74b732 Binary files /dev/null and b/workers/__pycache__/cleanup_worker.cpython-310.pyc differ