feat: Freelancer Match — полная продакшн версия с AI-матчингом и escrow

This commit is contained in:
root
2026-07-03 12:12:43 +00:00
commit ec2e9bf508
37 changed files with 1564 additions and 0 deletions
+17
View File
@@ -0,0 +1,17 @@
"""Pydantic схемы для валидации запросов/ответов."""
from app.schemas.user import UserCreate, UserLogin, UserProfileUpdate, FreelancerProfileCreate
from app.schemas.project import ProjectCreate, ProjectUpdate, ProjectResponse
from app.schemas.proposal import ProposalCreate, ProposalResponse
from app.schemas.ai_match import AIMatchRequest, AIMatchResponse
from app.schemas.escrow import EscrowCreate, EscrowRelease
from app.schemas.auth import TokenPair
__all__ = [
"UserCreate", "UserLogin", "UserProfileUpdate", "FreelancerProfileCreate",
"ProjectCreate", "ProjectUpdate", "ProjectResponse",
"ProposalCreate", "ProposalResponse",
"AIMatchRequest", "AIMatchResponse",
"EscrowCreate", "EscrowRelease",
"TokenPair",
]
+36
View File
@@ -0,0 +1,36 @@
"""Схемы проектов."""
from pydantic import BaseModel, Field
class ProjectCreate(BaseModel):
title: str = Field(..., min_length=5, max_length=255)
description: str = Field(..., min_length=20)
category: str | None = None
required_skills: list[str] = []
budget_min: float | None = None
budget_max: float | None = None
deadline: str | None = None # ISO format
class ProjectUpdate(BaseModel):
title: str | None = None
description: str | None = None
status: str | None = None
budget_min: float | None = None
budget_max: float | None = None
deadline: str | None = None
class ProjectResponse(BaseModel):
id: str
title: str
description: str
category: str | None
required_skills: list[str]
budget_min: float | None
budget_max: float | None
status: str
deadline: str | None
created_at: str
updated_at: str
+20
View File
@@ -0,0 +1,20 @@
"""Схемы заявок."""
from pydantic import BaseModel
class ProposalCreate(BaseModel):
cover_letter: str | None = None
proposed_price: float | None = None
estimated_days: int | None = None
class ProposalResponse(BaseModel):
id: str
project_id: str
freelancer_id: str
cover_letter: str | None
proposed_price: float | None
estimated_days: int | None
status: str
created_at: str
+28
View File
@@ -0,0 +1,28 @@
"""Схемы пользователей."""
from pydantic import BaseModel, EmailStr
class UserCreate(BaseModel):
email: EmailStr
password: str # min 12 chars
role: str = "freelancer" # client | freelancer | both
full_name: str | None = None
class UserLogin(BaseModel):
email: EmailStr
password: str
class UserProfileUpdate(BaseModel):
full_name: str | None = None
avatar_url: str | None = None
class FreelancerProfileCreate(BaseModel):
bio: str | None = None
skills: list[str] = []
hourly_rate: float | None = None
experience_years: int | None = None
languages: list[str] = []