This commit is contained in:
Primakov Alexandr Alexandrovich
2025-10-12 23:15:09 +03:00
commit 09cdd06307
88 changed files with 15007 additions and 0 deletions

View File

@@ -0,0 +1,9 @@
"""Database models"""
from app.models.repository import Repository
from app.models.pull_request import PullRequest
from app.models.review import Review
from app.models.comment import Comment
__all__ = ["Repository", "PullRequest", "Review", "Comment"]

View File

@@ -0,0 +1,39 @@
"""Comment model"""
from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, Boolean, Text, Enum
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
from datetime import datetime
import enum
from app.database import Base
class SeverityEnum(str, enum.Enum):
"""Comment severity levels"""
INFO = "info"
WARNING = "warning"
ERROR = "error"
class Comment(Base):
"""Review comment model"""
__tablename__ = "comments"
id = Column(Integer, primary_key=True, index=True)
review_id = Column(Integer, ForeignKey("reviews.id"), nullable=False)
file_path = Column(String, nullable=False)
line_number = Column(Integer, nullable=False)
content = Column(Text, nullable=False)
severity = Column(Enum(SeverityEnum), default=SeverityEnum.INFO)
posted = Column(Boolean, default=False)
posted_at = Column(DateTime, nullable=True)
created_at = Column(DateTime, default=datetime.utcnow, server_default=func.now())
# Relationships
review = relationship("Review", back_populates="comments")
def __repr__(self):
return f"<Comment(id={self.id}, file={self.file_path}:{self.line_number}, severity={self.severity})>"

View File

@@ -0,0 +1,43 @@
"""Pull Request model"""
from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, Enum
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
from datetime import datetime
import enum
from app.database import Base
class PRStatusEnum(str, enum.Enum):
"""Pull Request status"""
OPEN = "open"
REVIEWING = "reviewing"
REVIEWED = "reviewed"
CLOSED = "closed"
class PullRequest(Base):
"""Pull Request model"""
__tablename__ = "pull_requests"
id = Column(Integer, primary_key=True, index=True)
repository_id = Column(Integer, ForeignKey("repositories.id"), nullable=False)
pr_number = Column(Integer, nullable=False)
title = Column(String, nullable=False)
author = Column(String, nullable=False)
source_branch = Column(String, nullable=False)
target_branch = Column(String, nullable=False)
status = Column(Enum(PRStatusEnum), default=PRStatusEnum.OPEN)
url = Column(String, nullable=False)
created_at = Column(DateTime, default=datetime.utcnow, server_default=func.now())
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, server_default=func.now())
# Relationships
repository = relationship("Repository", back_populates="pull_requests")
reviews = relationship("Review", back_populates="pull_request", cascade="all, delete-orphan")
def __repr__(self):
return f"<PullRequest(id={self.id}, pr_number={self.pr_number}, title={self.title})>"

View File

@@ -0,0 +1,40 @@
"""Repository model"""
from sqlalchemy import Column, Integer, String, Boolean, DateTime, JSON, Enum
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
from datetime import datetime
import enum
from app.database import Base
class PlatformEnum(str, enum.Enum):
"""Git platform types"""
GITEA = "gitea"
GITHUB = "github"
BITBUCKET = "bitbucket"
class Repository(Base):
"""Repository model for tracking Git repositories"""
__tablename__ = "repositories"
id = Column(Integer, primary_key=True, index=True)
name = Column(String, nullable=False)
platform = Column(Enum(PlatformEnum), nullable=False)
url = Column(String, nullable=False)
api_token = Column(String, nullable=True) # Encrypted, optional (uses master token if not set)
webhook_secret = Column(String, nullable=False)
config = Column(JSON, default=dict) # Review configuration
is_active = Column(Boolean, default=True)
created_at = Column(DateTime, default=datetime.utcnow, server_default=func.now())
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, server_default=func.now())
# Relationships
pull_requests = relationship("PullRequest", back_populates="repository", cascade="all, delete-orphan")
def __repr__(self):
return f"<Repository(id={self.id}, name={self.name}, platform={self.platform})>"

View File

@@ -0,0 +1,43 @@
"""Review model"""
from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, Enum
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
from datetime import datetime
import enum
from typing import Optional
from app.database import Base
class ReviewStatusEnum(str, enum.Enum):
"""Review status"""
PENDING = "pending"
FETCHING = "fetching"
ANALYZING = "analyzing"
COMMENTING = "commenting"
COMPLETED = "completed"
FAILED = "failed"
class Review(Base):
"""Code review model"""
__tablename__ = "reviews"
id = Column(Integer, primary_key=True, index=True)
pull_request_id = Column(Integer, ForeignKey("pull_requests.id"), nullable=False)
status = Column(Enum(ReviewStatusEnum), default=ReviewStatusEnum.PENDING)
started_at = Column(DateTime, default=datetime.utcnow, server_default=func.now())
completed_at = Column(DateTime, nullable=True)
files_analyzed = Column(Integer, default=0)
comments_generated = Column(Integer, default=0)
error_message = Column(String, nullable=True)
# Relationships
pull_request = relationship("PullRequest", back_populates="reviews")
comments = relationship("Comment", back_populates="review", cascade="all, delete-orphan")
def __repr__(self):
return f"<Review(id={self.id}, status={self.status}, pr_id={self.pull_request_id})>"