veza/scripts/audit_backend_endpoints.py

128 lines
5.2 KiB
Python
Raw Normal View History

#!/usr/bin/env python3
"""
Script to extract all backend API endpoints from router.go
and compare with frontend usage.
"""
import re
import os
import sys
from collections import defaultdict
def extract_backend_endpoints():
"""Extract all endpoints from router.go with full paths."""
router_file = 'veza-backend-api/internal/api/router.go'
if not os.path.exists(router_file):
return {}
endpoints = defaultdict(set)
with open(router_file, 'r', encoding='utf-8') as f:
content = f.read()
# Known route groups and their base paths
# Based on reading router.go structure
route_groups = {
'auth': '/auth',
'users': '/users',
'tracks': '/tracks',
'playlists': '/playlists',
'conversations': '/conversations',
'chat': '/chat',
'roles': '/roles',
'webhooks': '/webhooks',
'marketplace': '/marketplace',
'analytics': '/analytics',
'notifications': '/notifications',
'comments': '/comments',
'sessions': '/sessions',
'uploads': '/uploads',
'audit': '/audit',
}
# Extract endpoints by reading setup functions
# Pattern: setupXxxRoutes function defines routes
patterns = [
# Auth routes
(r'authGroup\.(GET|POST|PUT|PATCH|DELETE)\s*\(\s*["\']([^"\']+)["\']', '/auth'),
(r'protected\.(GET|POST|PUT|PATCH|DELETE)\s*\(\s*["\']([^"\']+)["\']', '/auth'),
(r'registerGroup\.(GET|POST|PUT|PATCH|DELETE)\s*\(\s*["\']([^"\']+)["\']', '/auth/register'),
(r'loginGroup\.(GET|POST|PUT|PATCH|DELETE)\s*\(\s*["\']([^"\']+)["\']', '/auth/login'),
(r'verifyEmailGroup\.(GET|POST|PUT|PATCH|DELETE)\s*\(\s*["\']([^"\']+)["\']', '/auth/verify-email'),
(r'resendVerificationGroup\.(GET|POST|PUT|PATCH|DELETE)\s*\(\s*["\']([^"\']+)["\']', '/auth/resend-verification'),
(r'passwordGroup\.(GET|POST|PUT|PATCH|DELETE)\s*\(\s*["\']([^"\']+)["\']', '/password'),
(r'oauthGroup\.(GET|POST|PUT|PATCH|DELETE)\s*\(\s*["\']([^"\']+)["\']', '/auth/oauth'),
# User routes
(r'users\.(GET|POST|PUT|PATCH|DELETE)\s*\(\s*["\']([^"\']+)["\']', '/users'),
(r'protected\.(GET|POST|PUT|PATCH|DELETE)\s*\(\s*["\']([^"\']+)["\']', '/users'), # In users group
# Track routes
(r'tracks\.(GET|POST|PUT|PATCH|DELETE)\s*\(\s*["\']([^"\']+)["\']', '/tracks'),
(r'uploadGroup\.(GET|POST|PUT|PATCH|DELETE)\s*\(\s*["\']([^"\']+)["\']', '/tracks'),
(r'comments\.(GET|POST|PUT|PATCH|DELETE)\s*\(\s*["\']([^"\']+)["\']', '/tracks'),
(r'commentsProtected\.(GET|POST|PUT|PATCH|DELETE)\s*\(\s*["\']([^"\']+)["\']', '/comments'),
# Playlist routes
(r'playlists\.(GET|POST|PUT|PATCH|DELETE)\s*\(\s*["\']([^"\']+)["\']', '/playlists'),
# Chat routes
(r'chat\.(GET|POST|PUT|PATCH|DELETE)\s*\(\s*["\']([^"\']+)["\']', '/chat'),
(r'conversations\.(GET|POST|PUT|PATCH|DELETE)\s*\(\s*["\']([^"\']+)["\']', '/conversations'),
# Role routes
(r'roles\.(GET|POST|PUT|PATCH|DELETE)\s*\(\s*["\']([^"\']+)["\']', '/roles'),
(r'protected\.(GET|POST|PUT|PATCH|DELETE)\s*\(\s*["\']([^"\']+)["\']', '/roles'), # In roles group
# Webhook routes
(r'webhooks\.(GET|POST|PUT|PATCH|DELETE)\s*\(\s*["\']([^"\']+)["\']', '/webhooks'),
# Marketplace routes
(r'group\.(GET|POST|PUT|PATCH|DELETE)\s*\(\s*["\']([^"\']+)["\']', '/marketplace'),
(r'protected\.(GET|POST|PUT|PATCH|DELETE)\s*\(\s*["\']([^"\']+)["\']', '/marketplace'), # In marketplace group
(r'createGroup\.(GET|POST|PUT|PATCH|DELETE)\s*\(\s*["\']([^"\']+)["\']', '/marketplace/products'),
# Analytics routes
(r'analyticsGroup\.(GET|POST|PUT|PATCH|DELETE)\s*\(\s*["\']([^"\']+)["\']', '/analytics'),
# Notification routes
(r'notifications\.(GET|POST|PUT|PATCH|DELETE)\s*\(\s*["\']([^"\']+)["\']', '/notifications'),
# Session routes
(r'sessions\.(GET|POST|PUT|PATCH|DELETE)\s*\(\s*["\']([^"\']+)["\']', '/sessions'),
# Upload routes
(r'uploads\.(GET|POST|PUT|PATCH|DELETE)\s*\(\s*["\']([^"\']+)["\']', '/uploads'),
# Audit routes
(r'audit\.(GET|POST|PUT|PATCH|DELETE)\s*\(\s*["\']([^"\']+)["\']', '/audit'),
]
for pattern, base_path in patterns:
for match in re.finditer(pattern, content):
method = match.group(1)
path = match.group(2)
# Build full path
if path.startswith('/'):
full_path = base_path + path
else:
full_path = base_path.rstrip('/') + '/' + path
# Normalize
full_path = full_path.replace('//', '/')
if not full_path.startswith('/'):
full_path = '/' + full_path
endpoints[full_path].add(method)
return endpoints
if __name__ == '__main__':
endpoints = extract_backend_endpoints()
print(f"Found {len(endpoints)} backend endpoints:\n")
for endpoint in sorted(endpoints.keys()):
methods = ', '.join(sorted(endpoints[endpoint]))
print(f"{endpoint} - {methods}")