From 910b3c4aefd77cbff239085ff184a59aeef7ce24 Mon Sep 17 00:00:00 2001 From: Michael Chihlas Date: Sat, 14 Mar 2026 21:53:57 -0400 Subject: [PATCH] feat: add Pydantic schemas for PSA connection CRUD MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PsaConnectionCreate, PsaConnectionUpdate, PsaConnectionResponse, and PsaConnectionTestResponse — registered in schemas __init__. Co-Authored-By: Claude Opus 4.6 (1M context) --- backend/app/schemas/__init__.py | 5 +++ backend/app/schemas/psa_connection.py | 47 +++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 backend/app/schemas/psa_connection.py diff --git a/backend/app/schemas/__init__.py b/backend/app/schemas/__init__.py index c761c02f..b02d0cc6 100644 --- a/backend/app/schemas/__init__.py +++ b/backend/app/schemas/__init__.py @@ -15,6 +15,9 @@ from .script_template import ( ScriptTemplateCreate, ScriptTemplateUpdate, ScriptTemplateListItem, ScriptTemplateDetail, ScriptGenerateRequest, ScriptGenerateResponse, ScriptGenerationRecord, ) +from .psa_connection import ( + PsaConnectionCreate, PsaConnectionUpdate, PsaConnectionResponse, PsaConnectionTestResponse, +) __all__ = [ # User @@ -39,4 +42,6 @@ __all__ = [ "ScriptCategoryResponse", "ScriptTemplateCreate", "ScriptTemplateUpdate", "ScriptTemplateListItem", "ScriptTemplateDetail", "ScriptGenerateRequest", "ScriptGenerateResponse", "ScriptGenerationRecord", + # PSA Connection + "PsaConnectionCreate", "PsaConnectionUpdate", "PsaConnectionResponse", "PsaConnectionTestResponse", ] diff --git a/backend/app/schemas/psa_connection.py b/backend/app/schemas/psa_connection.py new file mode 100644 index 00000000..b9591e9a --- /dev/null +++ b/backend/app/schemas/psa_connection.py @@ -0,0 +1,47 @@ +"""Pydantic schemas for PSA connection management.""" +from __future__ import annotations +from datetime import datetime +from uuid import UUID +from pydantic import BaseModel, Field + + +class PsaConnectionCreate(BaseModel): + provider: str = Field(default="connectwise", pattern="^(connectwise|autotask)$") + display_name: str = Field(min_length=1, max_length=100) + site_url: str = Field(min_length=1, max_length=255) + company_id: str = Field(min_length=1, max_length=100) + public_key: str = Field(min_length=1) + private_key: str = Field(min_length=1) + client_id: str = Field(min_length=1) + + +class PsaConnectionUpdate(BaseModel): + display_name: str | None = None + site_url: str | None = None + company_id: str | None = None + public_key: str | None = None + private_key: str | None = None + client_id: str | None = None + + +class PsaConnectionResponse(BaseModel): + id: UUID + account_id: UUID + provider: str + display_name: str + site_url: str + company_id: str + is_active: bool + last_validated_at: datetime | None + created_at: datetime + updated_at: datetime + public_key_hint: str + private_key_hint: str + + model_config = {"from_attributes": True} + + +class PsaConnectionTestResponse(BaseModel): + success: bool + message: str + server_version: str | None = None