68 lines
2.7 KiB
Python
68 lines
2.7 KiB
Python
|
|
import uuid
|
|||
|
|
from sqlalchemy import Column, String, Integer, DateTime, ForeignKey, Text, Float
|
|||
|
|
from sqlalchemy.sql import func
|
|||
|
|
from sqlalchemy.orm import relationship
|
|||
|
|
from app.db.base import Base
|
|||
|
|
|
|||
|
|
|
|||
|
|
class AuditTask(Base):
|
|||
|
|
__tablename__ = "audit_tasks"
|
|||
|
|
|
|||
|
|
id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
|
|||
|
|
project_id = Column(String, ForeignKey("projects.id"), nullable=False)
|
|||
|
|
created_by = Column(String, ForeignKey("users.id"), nullable=False)
|
|||
|
|
|
|||
|
|
task_type = Column(String, nullable=False)
|
|||
|
|
status = Column(String, default="pending", index=True)
|
|||
|
|
branch_name = Column(String, nullable=True)
|
|||
|
|
|
|||
|
|
exclude_patterns = Column(Text, default="[]")
|
|||
|
|
scan_config = Column(Text, default="{}")
|
|||
|
|
|
|||
|
|
# Stats
|
|||
|
|
total_files = Column(Integer, default=0)
|
|||
|
|
scanned_files = Column(Integer, default=0)
|
|||
|
|
total_lines = Column(Integer, default=0)
|
|||
|
|
issues_count = Column(Integer, default=0)
|
|||
|
|
quality_score = Column(Float, default=0.0)
|
|||
|
|
|
|||
|
|
started_at = Column(DateTime(timezone=True), nullable=True)
|
|||
|
|
completed_at = Column(DateTime(timezone=True), nullable=True)
|
|||
|
|
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
|||
|
|
|
|||
|
|
# Relationships
|
|||
|
|
project = relationship("Project", back_populates="tasks")
|
|||
|
|
creator = relationship("User", foreign_keys=[created_by])
|
|||
|
|
issues = relationship("AuditIssue", back_populates="task", cascade="all, delete-orphan")
|
|||
|
|
|
|||
|
|
|
|||
|
|
class AuditIssue(Base):
|
|||
|
|
__tablename__ = "audit_issues"
|
|||
|
|
|
|||
|
|
id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()))
|
|||
|
|
task_id = Column(String, ForeignKey("audit_tasks.id"), nullable=False)
|
|||
|
|
|
|||
|
|
file_path = Column(String, nullable=False)
|
|||
|
|
line_number = Column(Integer, nullable=True)
|
|||
|
|
column_number = Column(Integer, nullable=True)
|
|||
|
|
issue_type = Column(String, nullable=False)
|
|||
|
|
severity = Column(String, nullable=False) # critical, high, medium, low
|
|||
|
|
|
|||
|
|
# 问题信息
|
|||
|
|
title = Column(String, nullable=True) # 问题标题
|
|||
|
|
message = Column(Text, nullable=True) # 兼容旧字段,同title
|
|||
|
|
description = Column(Text, nullable=True) # 详细描述
|
|||
|
|
suggestion = Column(Text, nullable=True) # 修复建议
|
|||
|
|
code_snippet = Column(Text, nullable=True) # 问题代码片段
|
|||
|
|
ai_explanation = Column(Text, nullable=True) # AI解释(JSON格式的xai字段)
|
|||
|
|
|
|||
|
|
status = Column(String, default="open") # open, resolved, false_positive
|
|||
|
|
resolved_by = Column(String, ForeignKey("users.id"), nullable=True)
|
|||
|
|
resolved_at = Column(DateTime(timezone=True), nullable=True)
|
|||
|
|
|
|||
|
|
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
|||
|
|
|
|||
|
|
# Relationships
|
|||
|
|
task = relationship("AuditTask", back_populates="issues")
|
|||
|
|
resolver = relationship("User", foreign_keys=[resolved_by])
|