CodeAnalysis / index.html
Gyaneshere's picture
updated index.html
a975cf2 verified
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AI-Powered Code Analysis Platform</title>
<script src="https://cdn.tailwindcss.com"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
.gradient-bg {
background: linear-gradient(135deg, #1e3a8a 0%, #7c3aed 100%);
}
.code-block {
font-family: 'Courier New', monospace;
background-color: #1e293b;
color: #f8fafc;
}
.sidebar-item:hover .sidebar-tooltip {
display: block;
}
.animate-float {
animation: float 6s ease-in-out infinite;
}
@keyframes float {
0% { transform: translateY(0px); }
50% { transform: translateY(-20px); }
100% { transform: translateY(0px); }
}
</style>
</head>
<body class="bg-gray-50 min-h-screen">
<!-- Solution Definition & Architecture Overview -->
<div class="container mx-auto px-4 py-12 max-w-7xl">
<div class="gradient-bg text-white rounded-2xl p-8 mb-12 shadow-2xl">
<h1 class="text-4xl font-bold mb-4">CodeReviewApp Architecture</h1>
<h2 class="text-2xl font-semibold mb-6">AI-Powered Code Analysis Platform</h2>
<div class="grid grid-cols-1 md:grid-cols-2 gap-8">
<div>
<h3 class="text-xl font-semibold mb-3">Use Case Strategy</h3>
<ul class="space-y-3">
<li class="flex items-start">
<i class="fas fa-check-circle mt-1 mr-3 text-emerald-300"></i>
<span>Automated code quality analysis using AI models</span>
</li>
<li class="flex items-start">
<i class="fas fa-check-circle mt-1 mr-3 text-emerald-300"></i>
<span>Security vulnerability detection in source code</span>
</li>
<li class="flex items-start">
<i class="fas fa-check-circle mt-1 mr-3 text-emerald-300"></i>
<span>Technical debt visualization and recommendations</span>
</li>
</ul>
</div>
<div>
<h3 class="text-xl font-semibold mb-3">Enterprise Benefits</h3>
<ul class="space-y-3">
<li class="flex items-start">
<i class="fas fa-chart-line mt-1 mr-3 text-amber-300"></i>
<span>30-50% reduction in code review time</span>
</li>
<li class="flex items-start">
<i class="fas fa-shield-alt mt-1 mr-3 text-amber-300"></i>
<span>Early detection of security vulnerabilities</span>
</li>
<li class="flex items-start">
<i class="fas fa-money-bill-wave mt-1 mr-3 text-amber-300"></i>
<span>Reduced technical debt maintenance costs</span>
</li>
</ul>
</div>
</div>
</div>
<!-- UX/UI Blueprint -->
<div class="bg-white rounded-2xl shadow-xl p-8 mb-12">
<h2 class="text-3xl font-bold mb-6 text-gray-800">UX/UI Blueprint</h2>
<div class="grid grid-cols-1 lg:grid-cols-3 gap-8 mb-8">
<div class="lg:col-span-2">
<h3 class="text-xl font-semibold mb-4 text-gray-700">Dashboard Layout</h3>
<div class="border-2 border-dashed border-gray-300 rounded-xl p-6 h-96 bg-gradient-to-br from-gray-50 to-gray-100">
<div class="flex h-full">
<!-- Sidebar -->
<div class="w-16 bg-gray-800 rounded-l-lg flex flex-col items-center py-4">
<div class="mb-8 relative sidebar-item">
<div class="w-10 h-10 bg-indigo-600 rounded-lg flex items-center justify-center text-white">
<i class="fas fa-code"></i>
</div>
<div class="sidebar-tooltip absolute left-full ml-2 bg-gray-900 text-white px-2 py-1 rounded text-xs whitespace-nowrap hidden">
Code Analysis
</div>
</div>
<div class="mb-8 relative sidebar-item">
<div class="w-10 h-10 bg-gray-700 rounded-lg flex items-center justify-center text-gray-300">
<i class="fas fa-shield-alt"></i>
</div>
<div class="sidebar-tooltip absolute left-full ml-2 bg-gray-900 text-white px-2 py-1 rounded text-xs whitespace-nowrap hidden">
Security Scan
</div>
</div>
<div class="mb-8 relative sidebar-item">
<div class="w-10 h-10 bg-gray-700 rounded-lg flex items-center justify-center text-gray-300">
<i class="fas fa-chart-pie"></i>
</div>
<div class="sidebar-tooltip absolute left-full ml-2 bg-gray-900 text-white px-2 py-1 rounded text-xs whitespace-nowrap hidden">
Metrics
</div>
</div>
</div>
<!-- Main Content -->
<div class="flex-1 bg-white rounded-r-lg p-4 flex flex-col">
<div class="flex justify-between items-center mb-4">
<h4 class="font-semibold text-gray-700">Code Analysis Report</h4>
<div class="flex space-x-2">
<button class="px-3 py-1 bg-indigo-100 text-indigo-700 rounded text-sm">Export</button>
<button class="px-3 py-1 bg-gray-100 text-gray-700 rounded text-sm">Share</button>
</div>
</div>
<div class="flex-1 grid grid-cols-3 gap-4">
<div class="bg-blue-50 rounded-lg p-3 col-span-2">
<div class="h-6 bg-blue-200 rounded animate-pulse mb-2"></div>
<div class="h-4 bg-blue-200 rounded animate-pulse w-3/4"></div>
</div>
<div class="bg-purple-50 rounded-lg p-3">
<div class="h-6 bg-purple-200 rounded animate-pulse mb-2"></div>
<div class="h-4 bg-purple-200 rounded animate-pulse w-1/2"></div>
</div>
<div class="bg-green-50 rounded-lg p-3">
<div class="h-6 bg-green-200 rounded animate-pulse mb-2"></div>
<div class="h-4 bg-green-200 rounded animate-pulse w-2/3"></div>
</div>
<div class="bg-yellow-50 rounded-lg p-3 col-span-3">
<div class="h-6 bg-yellow-200 rounded animate-pulse mb-2"></div>
<div class="h-4 bg-yellow-200 rounded animate-pulse w-full"></div>
</div>
</div>
</div>
</div>
</div>
</div>
<div>
<h3 class="text-xl font-semibold mb-4 text-gray-700">Design System</h3>
<div class="space-y-4">
<div>
<p class="text-sm font-medium text-gray-500 mb-1">Primary Colors</p>
<div class="flex space-x-2">
<div class="w-12 h-12 rounded-lg bg-indigo-600"></div>
<div class="w-12 h-12 rounded-lg bg-indigo-500"></div>
<div class="w-12 h-12 rounded-lg bg-indigo-400"></div>
</div>
</div>
<div>
<p class="text-sm font-medium text-gray-500 mb-1">Secondary Colors</p>
<div class="flex space-x-2">
<div class="w-12 h-12 rounded-lg bg-emerald-500"></div>
<div class="w-12 h-12 rounded-lg bg-amber-500"></div>
<div class="w-12 h-12 rounded-lg bg-rose-500"></div>
</div>
</div>
<div>
<p class="text-sm font-medium text-gray-500 mb-1">Typography</p>
<div class="space-y-2">
<p class="text-lg font-bold text-gray-800">Heading 1</p>
<p class="text-base font-medium text-gray-700">Body Text</p>
<p class="text-sm text-gray-500">Caption</p>
</div>
</div>
</div>
</div>
</div>
<div class="bg-gray-50 rounded-xl p-6">
<h3 class="text-xl font-semibold mb-4 text-gray-700">Accessibility Features</h3>
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
<div class="bg-white p-4 rounded-lg shadow-sm">
<div class="w-10 h-10 bg-indigo-100 rounded-full flex items-center justify-center text-indigo-600 mb-3">
<i class="fas fa-eye"></i>
</div>
<h4 class="font-medium mb-1">Color Contrast</h4>
<p class="text-sm text-gray-600">4.5:1 minimum contrast ratio for all text</p>
</div>
<div class="bg-white p-4 rounded-lg shadow-sm">
<div class="w-10 h-10 bg-indigo-100 rounded-full flex items-center justify-center text-indigo-600 mb-3">
<i class="fas fa-keyboard"></i>
</div>
<h4 class="font-medium mb-1">Keyboard Nav</h4>
<p class="text-sm text-gray-600">Full keyboard navigation support</p>
</div>
<div class="bg-white p-4 rounded-lg shadow-sm">
<div class="w-10 h-10 bg-indigo-100 rounded-full flex items-center justify-center text-indigo-600 mb-3">
<i class="fas fa-assistive-listening-systems"></i>
</div>
<h4 class="font-medium mb-1">Screen Reader</h4>
<p class="text-sm text-gray-600">ARIA labels and semantic HTML</p>
</div>
</div>
</div>
</div>
<!-- Frontend Engineering -->
<div class="bg-white rounded-2xl shadow-xl p-8 mb-12">
<h2 class="text-3xl font-bold mb-6 text-gray-800">Frontend Engineering</h2>
<div class="mb-8">
<h3 class="text-xl font-semibold mb-4 text-gray-700">React/TypeScript Architecture</h3>
<div class="bg-gray-800 rounded-lg p-4 mb-4">
<div class="flex items-center text-gray-400 text-sm mb-2">
<i class="fas fa-folder-open mr-2"></i>
<span>src/</span>
</div>
<div class="ml-6">
<div class="flex items-center text-gray-400 text-sm mb-1">
<i class="fas fa-folder mr-2"></i>
<span>components/</span>
</div>
<div class="flex items-center text-gray-400 text-sm mb-1 ml-6">
<i class="fas fa-file-code mr-2"></i>
<span>CodeEditor.tsx</span>
</div>
<div class="flex items-center text-gray-400 text-sm mb-1 ml-6">
<i class="fas fa-file-code mr-2"></i>
<span>AnalysisResults.tsx</span>
</div>
<div class="flex items-center text-gray-400 text-sm mb-1 ml-6">
<i class="fas fa-file-code mr-2"></i>
<span>SecurityFindings.tsx</span>
</div>
<div class="flex items-center text-gray-400 text-sm mb-1">
<i class="fas fa-folder mr-2"></i>
<span>hooks/</span>
</div>
<div class="flex items-center text-gray-400 text-sm mb-1 ml-6">
<i class="fas fa-file-code mr-2"></i>
<span>useCodeAnalysis.ts</span>
</div>
<div class="flex items-center text-gray-400 text-sm mb-1">
<i class="fas fa-folder mr-2"></i>
<span>store/</span>
</div>
<div class="flex items-center text-gray-400 text-sm mb-1 ml-6">
<i class="fas fa-file-code mr-2"></i>
<span>analysisSlice.ts</span>
</div>
</div>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
<div>
<h4 class="font-medium mb-2 text-gray-700">State Management</h4>
<div class="bg-gray-50 p-4 rounded-lg">
<pre class="text-xs code-block overflow-x-auto p-3 rounded">
// analysisSlice.ts
import { createSlice, PayloadAction } from '@reduxjs/toolkit';
interface AnalysisState {
code: string;
isLoading: boolean;
results: CodeAnalysisResult | null;
error: string | null;
}
const initialState: AnalysisState = {
code: '',
isLoading: false,
results: null,
error: null
};
const analysisSlice = createSlice({
name: 'analysis',
initialState,
reducers: {
setCode: (state, action: PayloadAction&lt;string&gt;) => {
state.code = action.payload;
},
analyzeCodeStart: (state) => {
state.isLoading = true;
state.error = null;
},
analyzeCodeSuccess: (state, action: PayloadAction&lt;CodeAnalysisResult&gt;) => {
state.isLoading = false;
state.results = action.payload;
},
analyzeCodeFailure: (state, action: PayloadAction&lt;string&gt;) => {
state.isLoading = false;
state.error = action.payload;
}
}
});
export const {
setCode,
analyzeCodeStart,
analyzeCodeSuccess,
analyzeCodeFailure
} = analysisSlice.actions;
export default analysisSlice.reducer;</pre>
</div>
</div>
<div>
<h4 class="font-medium mb-2 text-gray-700">Custom Hook</h4>
<div class="bg-gray-50 p-4 rounded-lg">
<pre class="text-xs code-block overflow-x-auto p-3 rounded">
// useCodeAnalysis.ts
import { useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { analyzeCodeStart, analyzeCodeSuccess, analyzeCodeFailure } from '../store/analysisSlice';
import { RootState } from '../store/store';
import api from '../services/api';
export const useCodeAnalysis = () => {
const dispatch = useDispatch();
const { code, isLoading, results, error } = useSelector(
(state: RootState) => state.analysis
);
const analyzeCode = async () => {
try {
dispatch(analyzeCodeStart());
const response = await api.post('/analyze', { code });
dispatch(analyzeCodeSuccess(response.data));
} catch (err) {
dispatch(analyzeCodeFailure(err.message));
}
};
return {
code,
isLoading,
results,
error,
analyzeCode
};
};</pre>
</div>
</div>
</div>
</div>
<div class="mb-8">
<h3 class="text-xl font-semibold mb-4 text-gray-700">Component Implementation</h3>
<div class="bg-gray-50 p-4 rounded-lg mb-6">
<pre class="text-xs code-block overflow-x-auto p-3 rounded">
// CodeEditor.tsx
import React, { useState, useEffect } from 'react';
import { useDispatch } from 'react-redux';
import { setCode } from '../store/analysisSlice';
import MonacoEditor from '@monaco-editor/react';
import { LoadingSpinner } from './ui/LoadingSpinner';
interface CodeEditorProps {
initialValue?: string;
language?: string;
}
export const CodeEditor: React.FC&lt;CodeEditorProps&gt; = ({
initialValue = '',
language = 'javascript'
}) => {
const [value, setValue] = useState(initialValue);
const dispatch = useDispatch();
useEffect(() => {
const timer = setTimeout(() => {
dispatch(setCode(value));
}, 500);
return () => clearTimeout(timer);
}, [value, dispatch]);
return (
&lt;div className="border border-gray-200 rounded-lg overflow-hidden"&gt;
&lt;div className="bg-gray-800 px-4 py-2 flex justify-between items-center"&gt;
&lt;span className="text-sm text-gray-300"&gt;{language.toUpperCase()}&lt;/span&gt;
&lt;button className="text-xs bg-indigo-600 text-white px-2 py-1 rounded"&gt;
Analyze
&lt;/button&gt;
&lt;/div&gt;
&lt;MonacoEditor
height="500px"
language={language}
theme="vs-dark"
value={value}
onChange={(newValue) => setValue(newValue || '')}
loading={&lt;LoadingSpinner /&gt;}
options={{
minimap: { enabled: false },
fontSize: 14,
wordWrap: 'on',
automaticLayout: true
}}
/&gt;
&lt;/div&gt;
);
};</pre>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
<div class="bg-gray-50 p-4 rounded-lg">
<pre class="text-xs code-block overflow-x-auto p-3 rounded">
// AnalysisResults.tsx
import React from 'react';
import { CodeIssue } from '../types';
import { IssueSeverityBadge } from './ui/IssueSeverityBadge';
interface AnalysisResultsProps {
issues: CodeIssue[];
loading?: boolean;
}
export const AnalysisResults: React.FC&lt;AnalysisResultsProps&gt; = ({
issues,
loading = false
}) => {
if (loading) {
return &lt;div className="text-center py-8"&gt;Analyzing code...&lt;/div&gt;;
}
if (!issues || issues.length === 0) {
return &lt;div className="text-center py-8 text-gray-500"&gt;No issues found&lt;/div&gt;;
}
return (
&lt;div className="space-y-4"&gt;
{issues.map((issue, index) => (
&lt;div key={index} className="border border-gray-200 rounded-lg p-4"&gt;
&lt;div className="flex justify-between items-start mb-2"&gt;
&lt;h4 className="font-medium"&gt;{issue.message}&lt;/h4&gt;
&lt;IssueSeverityBadge severity={issue.severity} /&gt;
&lt;/div&gt;
&lt;p className="text-sm text-gray-600 mb-2"&gt;
Line {issue.line}: {issue.codeSnippet}
&lt;/p&gt;
&lt;p className="text-xs text-gray-500"&gt;{issue.ruleId}&lt;/p&gt;
&lt;/div&gt;
))}
&lt;/div&gt;
);
};</pre>
</div>
<div class="bg-gray-50 p-4 rounded-lg">
<pre class="text-xs code-block overflow-x-auto p-3 rounded">
// SecurityFindings.tsx
import React from 'react';
import { SecurityFinding } from '../types';
import { CveBadge } from './ui/CveBadge';
interface SecurityFindingsProps {
findings: SecurityFinding[];
}
export const SecurityFindings: React.FC&lt;SecurityFindingsProps&gt; = ({
findings
}) => {
return (
&lt;div className="space-y-4"&gt;
{findings.map((finding, index) => (
&lt;div key={index} className="border border-red-200 rounded-lg p-4 bg-red-50"&gt;
&lt;div className="flex justify-between items-start mb-2"&gt;
&lt;h4 className="font-medium text-red-800"&gt;{finding.title}&lt;/h4&gt;
&lt;CveBadge cveId={finding.cveId} /&gt;
&lt;/div&gt;
&lt;p className="text-sm text-red-700 mb-2"&gt;{finding.description}&lt;/p&gt;
&lt;div className="flex space-x-2"&gt;
&lt;span className="text-xs px-2 py-1 bg-red-100 text-red-800 rounded"&gt;
Severity: {finding.severity}
&lt;/span&gt;
&lt;span className="text-xs px-2 py-1 bg-red-100 text-red-800 rounded"&gt;
Line: {finding.line}
&lt;/span&gt;
&lt;/div&gt;
&lt;/div&gt;
))}
&lt;/div&gt;
);
};</pre>
</div>
</div>
</div>
</div>
<!-- Backend & API Architecture -->
<div class="bg-white rounded-2xl shadow-xl p-8 mb-12">
<h2 class="text-3xl font-bold mb-6 text-gray-800">Backend & API Architecture</h2>
<div class="mb-8">
<h3 class="text-xl font-semibold mb-4 text-gray-700">FastAPI Service Structure</h3>
<div class="bg-gray-800 rounded-lg p-4 mb-4">
<div class="flex items-center text-gray-400 text-sm mb-2">
<i class="fas fa-folder-open mr-2"></i>
<span>app/</span>
</div>
<div class="ml-6">
<div class="flex items-center text-gray-400 text-sm mb-1">
<i class="fas fa-folder mr-2"></i>
<span>api/</span>
</div>
<div class="flex items-center text-gray-400 text-sm mb-1 ml-6">
<i class="fas fa-file-code mr-2"></i>
<span>v1/</span>
</div>
<div class="flex items-center text-gray-400 text-sm mb-1 ml-12">
<i class="fas fa-file-code mr-2"></i>
<span>endpoints/</span>
</div>
<div class="flex items-center text-gray-400 text-sm mb-1 ml-6">
<i class="fas fa-file-code mr-2"></i>
<span>dependencies.py</span>
</div>
<div class="flex items-center text-gray-400 text-sm mb-1">
<i class="fas fa-folder mr-2"></i>
<span>core/</span>
</div>
<div class="flex items-center text-gray-400 text-sm mb-1 ml-6">
<i class="fas fa-file-code mr-2"></i>
<span>config.py</span>
</div>
<div class="flex items-center text-gray-400 text-sm mb-1">
<i class="fas fa-folder mr-2"></i>
<span>services/</span>
</div>
<div class="flex items-center text-gray-400 text-sm mb-1 ml-6">
<i class="fas fa-file-code mr-2"></i>
<span>code_analysis.py</span>
</div>
</div>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
<div>
<h4 class="font-medium mb-2 text-gray-700">Main Application</h4>
<div class="bg-gray-50 p-4 rounded-lg">
<pre class="text-xs code-block overflow-x-auto p-3 rounded">
# main.py
from fastapi import FastAPI, Depends
from fastapi.middleware.cors import CORSMiddleware
from app.api.v1.endpoints import code_analysis, auth
from app.core.config import settings
app = FastAPI(
title="Deepsite API",
description="AI-powered code analysis platform",
version="1.0.0",
docs_url="/api/docs",
redoc_url="/api/redoc"
)
# CORS middleware
app.add_middleware(
CORSMiddleware,
allow_origins=settings.BACKEND_CORS_ORIGINS,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# Include API routers
app.include_router(
auth.router,
prefix="/api/v1/auth",
tags=["authentication"]
)
app.include_router(
code_analysis.router,
prefix="/api/v1/analysis",
tags=["code analysis"],
dependencies=[Depends(auth.get_current_active_user)]
)</pre>
</div>
</div>
<div>
<h4 class="font-medium mb-2 text-gray-700">Authentication</h4>
<div class="bg-gray-50 p-4 rounded-lg">
<pre class="text-xs code-block overflow-x-auto p-3 rounded">
# auth.py
from datetime import datetime, timedelta
from typing import Optional
from fastapi import Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer
from jose import JWTError, jwt
from passlib.context import CryptContext
from pydantic import BaseModel
from app.core.config import settings
# Password hashing
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
class Token(BaseModel):
access_token: str
token_type: str
class TokenData(BaseModel):
username: Optional[str] = None
def verify_password(plain_password: str, hashed_password: str):
return pwd_context.verify(plain_password, hashed_password)
def create_access_token(data: dict, expires_delta: Optional[timedelta] = None):
to_encode = data.copy()
if expires_delta:
expire = datetime.utcnow() + expires_delta
else:
expire = datetime.utcnow() + timedelta(minutes=15)
to_encode.update({"exp": expire})
encoded_jwt = jwt.encode(
to_encode,
settings.SECRET_KEY,
algorithm=settings.ALGORITHM
)
return encoded_jwt
async def get_current_user(token: str = Depends(oauth2_scheme)):
credentials_exception = HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Could not validate credentials",
headers={"WWW-Authenticate": "Bearer"},
)
try:
payload = jwt.decode(
token,
settings.SECRET_KEY,
algorithms=[settings.ALGORITHM]
)
username: str = payload.get("sub")
if username is None:
raise credentials_exception
token_data = TokenData(username=username)
except JWTError:
raise credentials_exception
user = get_user(fake_db, username=token_data.username)
if user is None:
raise credentials_exception
return user</pre>
</div>
</div>
</div>
</div>
<div class="mb-8">
<h3 class="text-xl font-semibold mb-4 text-gray-700">API Endpoints</h3>
<div class="bg-gray-50 p-4 rounded-lg mb-6">
<pre class="text-xs code-block overflow-x-auto p-3 rounded">
# endpoints/code_analysis.py
from fastapi import APIRouter, Depends, HTTPException
from fastapi import status
from typing import List
from app.services.code_analysis import analyze_code
from app.models.schemas import CodeAnalysisRequest, CodeAnalysisResult
from app.api.v1.dependencies import get_current_active_user
router = APIRouter()
@router.post(
"/",
response_model=CodeAnalysisResult,
summary="Analyze code for quality and security issues",
description="""Analyzes the provided code for:
- Code quality issues
- Security vulnerabilities
- Performance anti-patterns
- Style violations""",
response_description="Analysis results with found issues"
)
async def analyze_code_endpoint(
request: CodeAnalysisRequest,
current_user: str = Depends(get_current_active_user)
) -> CodeAnalysisResult:
try:
result = await analyze_code(request.code, request.language)
return result
except Exception as e:
raise HTTPException(
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
detail=f"Error analyzing code: {str(e)}"
)
@router.get(
"/history/",
response_model=List[CodeAnalysisResult],
summary="Get analysis history",
description="Returns the user's previous code analysis results",
response_description="List of previous analysis results"
)
async def get_analysis_history(
current_user: str = Depends(get_current_active_user)
) -> List[CodeAnalysisResult]:
# Implementation would query database for user's history
return []</pre>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
<div class="bg-gray-50 p-4 rounded-lg">
<pre class="text-xs code-block overflow-x-auto p-3 rounded">
# services/code_analysis.py
from typing import Optional
from app.models.schemas import CodeAnalysisResult, CodeIssue, SecurityFinding
from app.integrations.huggingface import query_hf_model
from app.integrations.sonarqube import analyze_with_sonarqube
async def analyze_code(
code: str,
language: str = "python"
) -> CodeAnalysisResult:
"""Analyze code using multiple analysis methods"""
# Initialize result objects
quality_issues: List[CodeIssue] = []
security_findings: List[SecurityFinding] = []
# 1. Static analysis with SonarQube
sonar_results = await analyze_with_sonarqube(code, language)
quality_issues.extend(sonar_results.issues)
# 2. AI-powered analysis with HuggingFace
hf_prompt = f"""
Analyze this {language} code for quality and security issues:
{code}
Return findings in JSON format with:
- issue_type (quality|security|performance|style)
- severity (low|medium|high|critical)
- message
- line_number
- recommendation
"""
hf_response = await query_hf_model(
model="codellama/CodeLlama-34b-Instruct-hf",
prompt=hf_prompt
)
# Process HF response and add to findings
if hf_response and hf_response.get("findings"):
for finding in hf_response["findings"]:
if finding["issue_type"] == "security":
security_findings.append(
SecurityFinding.from_hf_response(finding)
)
else:
quality_issues.append(
CodeIssue.from_hf_response(finding)
)
return CodeAnalysisResult(
quality_issues=quality_issues,
security_findings=security_findings,
summary=generate_summary(quality_issues, security_findings)
)</pre>
</div>
<div class="bg-gray-50 p-4 rounded-lg">
<pre class="text-xs code-block overflow-x-auto p-3 rounded">
# models/schemas.py
from pydantic import BaseModel, Field
from typing import List, Optional
from enum import Enum
class Severity(str, Enum):
LOW = "low"
MEDIUM = "medium"
HIGH = "high"
CRITICAL = "critical"
class CodeIssue(BaseModel):
rule_id: str = Field(..., example="S100")
message: str = Field(..., example="Avoid using 'eval' function")
severity: Severity = Field(..., example="high")
line: int = Field(..., example=42)
code_snippet: str = Field(..., example="eval(user_input)")
category: str = Field(..., example="security")
@classmethod
def from_hf_response(cls, data: dict):
return cls(
rule_id=data.get("rule_id", "AI-"+data["issue_type"]),
message=data["message"],
severity=data["severity"],
line=data["line_number"],
code_snippet=data.get("code_snippet", ""),
category=data["issue_type"]
)
class SecurityFinding(BaseModel):
cve_id: Optional[str] = Field(None, example="CVE-2021-1234")
title: str = Field(..., example="SQL Injection Vulnerability")
description: str = Field(..., example="User input directly concatenated into SQL query")
severity: Severity = Field(..., example="critical")
line: int = Field(..., example=15)
recommendation: str = Field(..., example="Use parameterized queries")
@classmethod
def from_hf_response(cls, data: dict):
return cls(
title=data["message"],
description=data.get("recommendation", ""),
severity=data["severity"],
line=data["line_number"],
recommendation=data.get("recommendation", "")
)
class CodeAnalysisRequest(BaseModel):
code: str = Field(..., example="def foo():\n pass")
language: str = Field("python", example="python")
class CodeAnalysisResult(BaseModel):
quality_issues: List[CodeIssue] = []
security_findings: List[SecurityFinding] = []
summary: str = Field(..., example="Found 3 critical issues")</pre>
</div>
</div>
</div>
</div>
<!-- AI/ML Integration -->
<div class="bg-white rounded-2xl shadow-xl p-8 mb-12">
<h2 class="text-3xl font-bold mb-6 text-gray-800">AI/ML Integration</h2>
<div class="grid grid-cols-1 md:grid-cols-2 gap-8 mb-8">
<div>
<h3 class="text-xl font-semibold mb-4 text-gray-700">HuggingFace Integration</h3>
<div class="bg-gray-50 p-4 rounded-lg">
<pre class="text-xs code-block overflow-x-auto p-3 rounded">
# integrations/huggingface.py
import os
from typing import Optional, Dict, Any
import httpx
from app.core.config import settings
from app.core.logging import logger
HF_API_URL = "https://api-inference.huggingface.co/models"
HF_API_KEY = settings.HF_API_KEY
async def query_hf_model(
model: str,
prompt: str,
parameters: Optional[Dict[str, Any]] = None
) -> Optional[Dict[str, Any]]:
"""Query HuggingFace inference API"""
headers = {
"Authorization": f"Bearer {HF_API_KEY}",
"Content-Type": "application/json"
}
payload = {
"inputs": prompt,
"parameters": parameters or {
"max_new_tokens": 1024,
"temperature": 0.7,
"return_full_text": False
}
}
try:
async with httpx.AsyncClient(timeout=30.0) as client:
response = await client.post(
f"{HF_API_URL}/{model}",
headers=headers,
json=payload
)
if response.status_code == 200:
return response.json()
elif response.status_code == 503:
# Model is loading, wait and retry
logger.info(f"Model {model} is loading, retrying...")
await asyncio.sleep(10)
return await query_hf_model(model, prompt, parameters)
else:
logger.error(
f"HF API error: {response.status_code} - {response.text}"
)
return None
except Exception as e:
logger.error(f"Error querying HF API: {str(e)}")
return None</pre>
</div>
</div>
<div>
<h3 class="text-xl font-semibold mb-4 text-gray-700">Model Selection Strategy</h3>
<div class="bg-gray-50 p-4 rounded-lg">
<pre class="text-xs code-block overflow-x-auto p-3 rounded">
# services/model_selector.py
from enum import Enum
from typing import Optional, Dict, Any
from app.integrations.huggingface import query_hf_model
class ModelType(str, Enum):
CODE_ANALYSIS = "code_analysis"
SECURITY = "security"
DOCUMENTATION = "documentation"
MODEL_MAP = {
ModelType.CODE_ANALYSIS: "codellama/CodeLlama-34b-Instruct-hf",
ModelType.SECURITY: "deepset/roberta-base-squad2",
ModelType.DOCUMENTATION: "bigcode/starcoder"
}
def get_model_for_task(task_type: ModelType) -> str:
"""Get appropriate model for given task type"""
return MODEL_MAP.get(task_type, MODEL_MAP[ModelType.CODE_ANALYSIS])
async def analyze_with_model(
code: str,
task_type: ModelType,
language: str = "python"
) -> Optional[Dict[str, Any]]:
"""Analyze code with task-specific model"""
model = get_model_for_task(task_type)
prompt = generate_prompt_for_task(task_type, code, language)
parameters = {
"max_new_tokens": 1024,
"temperature": 0.5 if task_type == ModelType.SECURITY else 0.7
}
return await query_hf_model(model, prompt, parameters)
def generate_prompt_for_task(
task_type: ModelType,
code: str,
language: str
) -> str:
"""Generate task-specific prompt"""
if task_type == ModelType.SECURITY:
return f"""Analyze this {language} code for security vulnerabilities:
{code}
Return JSON with:
- vulnerability_type
- severity (low/medium/high/critical)
- description
- line_number
- recommendation
"""
elif task_type == ModelType.DOCUMENTATION:
return f"""Generate documentation for this {language} code:
{code}
Include:
- Function description
- Parameters
- Return value
- Usage example
"""
else: # Default code analysis
return f"""Analyze this {language} code for quality issues:
{code}
Return JSON with:
- issue_type (style/performance/bug)
- severity (low/medium/high)
- message
- line_number
- recommendation
"""</pre>
</div>
</div>
</div>
<div class="bg-gray-50 rounded-xl p-6">
<h3 class="text-xl font-semibold mb-4 text-gray-700">AI Pipeline Architecture</h3>
<div class="flex justify-center">
<div class="relative w-full max-w-3xl">
<!-- AI Pipeline Visualization -->
<div class="flex flex-col items-center space-y-8">
<!-- Step 1 -->
<div class="flex items-center w-full">
<div class="w-12 h-12 rounded-full bg-indigo-600 flex items-center justify-center text-white z-10">
<i class="fas fa-code"></i>
</div>
<div class="ml-4 bg-white p-4 rounded-lg shadow-sm flex-1">
<h4 class="font-medium">Code Input</h4>
<p class="text-sm text-gray-600">User submits code for analysis</p>
</div>
</div>
<!-- Arrow -->
<div class="h-8 w-0.5 bg-indigo-300 ml-6 -my-4"></div>
<!-- Step 2 -->
<div class="flex items-center w-full">
<div class="w-12 h-12 rounded-full bg-indigo-600 flex items-center justify-center text-white z-10">
<i class="fas fa-shield-alt"></i>
</div>
<div class="ml-4 bg-white p-4 rounded-lg shadow-sm flex-1">
<h4 class="font-medium">Static Analysis</h4>
<p class="text-sm text-gray-600">SonarQube scans for common issues</p>
</div>
</div>
<!-- Arrow -->
<div class="h-8 w-0.5 bg-indigo-300 ml-6 -my-4"></div>
<!-- Step 3 -->
<div class="flex items-center w-full">
<div class="w-12 h-12 rounded-full bg-indigo-600 flex items-center justify-center text-white z-10">
<i class="fas fa-brain"></i>
</div>
<div class="ml-4 bg-white p-4 rounded-lg shadow-sm flex-1">
<h4 class="font-medium">AI Analysis</h4>
<p class="text-sm text-gray-600">CodeLlama analyzes for complex patterns</p>
</div>
</div>
<!-- Arrow -->
<div class="h-8 w-0.5 bg-indigo-300 ml-6 -my-4"></div>
<!-- Step 4 -->
<div class="flex items-center w-full">
<div class="w-12 h-12 rounded-full bg-indigo-600 flex items-center justify-center text-white z-10">
<i class="fas fa-chart-bar"></i>
</div>
<div class="ml-4 bg-white p-4 rounded-lg shadow-sm flex-1">
<h4 class="font-medium">Results Aggregation</h4>
<p class="text-sm text-gray-600">Combine findings from all sources</p>
</div>
</div>
<!-- Arrow -->
<div class="h-8 w-0.5 bg-indigo-300 ml-6 -my-4"></div>
<!-- Step 5 -->
<div class="flex items-center w-full">
<div class="w-12 h-12 rounded-full bg-indigo-600 flex items-center justify-center text-white z-10">
<i class="fas fa-file-alt"></i>
</div>
<div class="ml-4 bg-white p-4 rounded-lg shadow-sm flex-1">
<h4 class="font-medium">Report Generation</h4>
<p class="text-sm text-gray-600">Create comprehensive report</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Deployment & Scalability -->
<div class="bg-white rounded-2xl shadow-xl p-8 mb-12">
<h2 class="text-3xl font-bold mb-6 text-gray-800">Deployment & Scalability</h2>
<div class="grid grid-cols-1 md:grid-cols-2 gap-8 mb-8">
<div>
<h3 class="text-xl font-semibold mb-4 text-gray-700">Docker Configuration</h3>
<div class="bg-gray-50 p-4 rounded-lg">
<pre class="text-xs code-block overflow-x-auto p-3 rounded">
# Dockerfile
FROM python:3.9-slim as base
# Install system dependencies
RUN apt-get update && apt-get install -y \
build-essential \
curl \
&& rm -rf /var/lib/apt/lists/*
# Create and activate virtual environment
ENV VIRTUAL_ENV=/opt/venv
RUN python3 -m venv $VIRTUAL_ENV
ENV PATH="$VIRTUAL_ENV/bin:$PATH"
# Install Python dependencies
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# Copy application code
COPY . .
# Frontend build stage
FROM node:16 as frontend-builder
WORKDIR /app/frontend
COPY frontend/package.json frontend/package-lock.json ./
RUN npm install
COPY frontend .
RUN npm run build
# Final production image
FROM base as production
COPY --from=frontend-builder /app/frontend/dist /app/frontend/dist
# Set environment variables
ENV PYTHONUNBUFFERED=1
ENV PORT=8000
ENV MODE=production
# Run application
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "$PORT"]</pre>
</div>
</div>
<div>
<h3 class="text-xl font-semibold mb-4 text-gray-700">CI/CD Pipeline</h3>
<div class="bg-gray-50 p-4 rounded-lg">
<pre class="text-xs code-block overflow-x-auto p-3 rounded">
# .github/workflows/deploy.yml
name: Deploy to HuggingFace Spaces
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.9'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: '16'
- name: Build frontend
working-directory: ./frontend
run: |
npm install
npm run build
- name: Configure Docker
run: |
echo "${{ secrets.HF_TOKEN }}" | docker login \
-u ${{ secrets.HF_USERNAME }} \
--password-stdin \
ghcr.io
- name: Build and push Docker image
run: |
docker build -t ghcr.io/${{ secrets.HF_USERNAME }}/deepsite:latest .
docker push ghcr.io/${{ secrets.HF_USERNAME }}/deepsite:latest
- name: Deploy to Spaces
uses: huggingface/huggingface_hub@main
with:
huggingface_token: ${{ secrets.HF_TOKEN }}
repo_id: ${{ secrets.HF_USERNAME }}/deepsite
space_sdk: docker
space_hardware: cpu-basic
space_storage: small</pre>
</div>
</div>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 gap-8">
<div>
<h3 class="text-xl font-semibold mb-4 text-gray-700">Rate Limiting</h3>
<div class="bg-gray-50 p-4 rounded-lg">
<pre class="text-xs code-block overflow-x-auto p-3 rounded">
# app/api/dependencies.py
from fastapi import Depends, Request
from fastapi.security import HTTPBearer
from fastapi import HTTPException, status
from redis import Redis
from app.core.config import settings
security = HTTPBearer()
redis = Redis.from_url(settings.REDIS_URL)
async def rate_limit(
request: Request,
credentials: str = Depends(security)
) -> None:
"""Rate limiting middleware"""
# Get user ID from token
try:
payload = jwt.decode(
credentials.credentials,
settings.SECRET_KEY,
algorithms=[settings.ALGORITHM]
)
user_id = payload.get("sub")
except JWTError:
user_id = request.client.host # Fallback to IP
# Check rate limit
key = f"rate_limit:{user_id}"
current = redis.incr(key)
if current == 1:
redis.expire(key, 60) # 1 minute window
if current > settings.RATE_LIMIT:
raise HTTPException(
status_code=status.HTTP_429_TOO_MANY_REQUESTS,
detail="Too many requests"
)</pre>
</div>
</div>
<div>
<h3 class="text-xl font-semibold mb-4 text-gray-700">HuggingFace Space Config</h3>
<div class="bg-gray-50 p-4 rounded-lg">
<pre class="text-xs code-block overflow-x-auto p-3 rounded">
# README.md
---
title: Deepsite
emoji: 🚀
colorFrom: indigo
colorTo: purple
sdk: docker
app_file: app/main.py
pinned: true
license: apache-2.0
# Hardware resources
resources:
cpu: 2
memory: 8Gi
# Environment variables
env:
- HF_API_KEY: your_huggingface_api_key
- MODE: production
- PORT: 8000
# Health check
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:$PORT/api/health"]
interval: 30s
timeout: 10s
retries: 3</pre>
</div>
</div>
</div>
</div>
<!-- Integration Strategy & Maintenance -->
<div class="bg-white rounded-2xl shadow-xl p-8">
<h2 class="text-3xl font-bold mb-6 text-gray-800">Integration Strategy & Maintenance</h2>
<div class="grid grid-cols-1 md:grid-cols-2 gap-8 mb-8">
<div>
<h3 class="text-xl font-semibold mb-4 text-gray-700">Deployment Steps</h3>
<div class="bg-gray-50 p-4 rounded-lg">
<ol class="list-decimal pl-5 space-y-2 text-sm text-gray-700">
<li>Set up HuggingFace Space with Docker SDK</li>
<li>Configure environment variables in Space settings</li>
<li>Connect GitHub repository for CI/CD</li>
<li>Set up Redis for rate limiting (if needed)</li>
<li>Configure custom domain (optional)</li>
<li>Enable monitoring and alerts</li>
</ol>
</div>
<h3 class="text-xl font-semibold mb-4 text-gray-700 mt-6">Monitoring</h3>
<div class="bg-gray-50 p-4 rounded-lg">
<ul class="list-disc pl-5 space-y-2 text-sm text-gray-700">
<li>Prometheus metrics endpoint at <code>/metrics</code></li>
<li>Health check endpoint at <code>/api/health</code></li>
<li>Log aggregation with ELK stack</li>
<li>Performance monitoring with Grafana</li>
</ul>
</div>
</div>
<div>
<h3 class="text-xl font-semibold mb-4 text-gray-700">Maintenance Plan</h3>
<div class="bg-gray-50 p-4 rounded-lg">
<div class="space-y-4">
<div>
<h4 class="font-medium text-gray-700">Weekly</h4>
<ul class="list-disc pl-5 text-sm text-gray-700 mt-2">
<li>Review error logs and metrics</li>
<li>Check for model updates on HuggingFace</li>
<li>Verify backup systems</li>
</ul>
</div>
<div>
<h4 class="font-medium text-gray-700">Monthly</h4>
<ul class="list-disc pl-5 text-sm text-gray-700 mt-2">
<li>Update dependencies</li>
<li>Review rate limit thresholds</li>
<li>Test failover procedures</li>
</ul>
</div>
<div>
<h4 class="font-medium text-gray-700">Quarterly</h4>
<ul class="list-disc pl-5 text-sm text-gray-700 mt-2">
<li>Security audit</li>
<li>Performance benchmark</li>
<li>User feedback review</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<div class="bg-indigo-50 rounded-xl p-6">
<h3 class="text-xl font-semibold mb-4 text-indigo-800">Final Integration Strategy</h3>
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
<div class="bg-white p-4 rounded-lg shadow-sm">
<div class="w-10 h-10 bg-indigo-100 rounded-full flex items-center justify-center text-indigo-600 mb-3">
<i class="fas fa-layer-group"></i>
</div>
<h4 class="font-medium mb-1">Layered Architecture</h4>
<p class="text-sm text-gray-600">Clear separation between frontend, backend, and AI components</p>
</div>
<div class="bg-white p-4 rounded-lg shadow-sm">
<div class="w-10 h-10 bg-indigo-100 rounded-full flex items-center justify-center text-indigo-600 mb-3">
<i class="fas fa-plug"></i>
</div>
<h4 class="font-medium mb-1">API-First Design</h4>
<p class="text-sm text-gray-600">RESTful interfaces between all components</p>
</div>
<div class="bg-white p-4 rounded-lg shadow-sm">
<div class="w-10 h-10 bg-indigo-100 rounded-full flex items-center justify-center text-indigo-600 mb-3">
<i class="fas fa-box-open"></i>
</div>
<h4 class="font-medium mb-1">Containerized Deployment</h4>
<p class="text-sm text-gray-600">Docker containers for easy deployment on HuggingFace Spaces</p>
</div>
</div>
</div>
</div>
</div>
<script>
// Simple animation for the architecture diagram
document.addEventListener('DOMContentLoaded', () => {
const architectureSteps = document.querySelectorAll('.flex.items-center.w-full');
architectureSteps.forEach((step, index) => {
step.style.opacity = '0';
step.style.transform = 'translateY(20px)';
step.style.transition = `all 0.5s ease ${index * 0.2}s`;
setTimeout(() => {
step.style.opacity = '1';
step.style.transform = 'translateY(0)';
}, 100);
});
});
</script>
<p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=Boobs00/deepsite-architecture" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
</html>