init
This commit is contained in:
9
backend/app/models/__init__.py
Normal file
9
backend/app/models/__init__.py
Normal 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"]
|
||||
|
||||
39
backend/app/models/comment.py
Normal file
39
backend/app/models/comment.py
Normal 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})>"
|
||||
|
||||
43
backend/app/models/pull_request.py
Normal file
43
backend/app/models/pull_request.py
Normal 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})>"
|
||||
|
||||
40
backend/app/models/repository.py
Normal file
40
backend/app/models/repository.py
Normal 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})>"
|
||||
|
||||
43
backend/app/models/review.py
Normal file
43
backend/app/models/review.py
Normal 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})>"
|
||||
|
||||
Reference in New Issue
Block a user