feat(media): implement nextjs media proxy API routes (/api/uploads & /api/media) with server-side caching and streaming
This commit is contained in:
parent
d9c693c41b
commit
fa1a35c835
113
frontend/application/app/api/media/[...path]/route.ts
Normal file
113
frontend/application/app/api/media/[...path]/route.ts
Normal file
@ -0,0 +1,113 @@
|
||||
import { NextRequest, NextResponse } from 'next/server';
|
||||
|
||||
export const dynamic = 'force-dynamic';
|
||||
|
||||
export async function GET(
|
||||
request: NextRequest,
|
||||
{ params }: { params: Promise<{ path: string[] }> }
|
||||
) {
|
||||
try {
|
||||
const { path } = await params;
|
||||
if (!path || path.length === 0) {
|
||||
return new NextResponse('Bad Request: Missing file path', { status: 400 });
|
||||
}
|
||||
|
||||
const filePath = path.map(segment => encodeURIComponent(segment)).join('/');
|
||||
const backendBase = (
|
||||
process.env.INTERNAL_API_URL ||
|
||||
process.env.NEXT_PUBLIC_API_URL ||
|
||||
'http://127.0.0.1:4001'
|
||||
).replace(/\/api\/?$/, '');
|
||||
|
||||
const targetUrl = `${backendBase}/uploads/${filePath}`;
|
||||
|
||||
const forwardedHeaders: HeadersInit = {};
|
||||
const rangeHeader = request.headers.get('range');
|
||||
if (rangeHeader) forwardedHeaders['range'] = rangeHeader;
|
||||
const ifNoneMatch = request.headers.get('if-none-match');
|
||||
if (ifNoneMatch) forwardedHeaders['if-none-match'] = ifNoneMatch;
|
||||
const ifModifiedSince = request.headers.get('if-modified-since');
|
||||
if (ifModifiedSince) forwardedHeaders['if-modified-since'] = ifModifiedSince;
|
||||
|
||||
const backendRes = await fetch(targetUrl, {
|
||||
method: 'GET',
|
||||
headers: forwardedHeaders,
|
||||
cache: 'no-store',
|
||||
});
|
||||
|
||||
if (!backendRes.ok && backendRes.status !== 304 && backendRes.status !== 206) {
|
||||
return new NextResponse(`Media not found or error from upstream (${backendRes.status})`, {
|
||||
status: backendRes.status,
|
||||
});
|
||||
}
|
||||
|
||||
const responseHeaders = new Headers();
|
||||
const contentType = backendRes.headers.get('content-type') || 'application/octet-stream';
|
||||
responseHeaders.set('Content-Type', contentType);
|
||||
|
||||
const contentLength = backendRes.headers.get('content-length');
|
||||
if (contentLength) responseHeaders.set('Content-Length', contentLength);
|
||||
|
||||
const contentRange = backendRes.headers.get('content-range');
|
||||
if (contentRange) responseHeaders.set('Content-Range', contentRange);
|
||||
|
||||
const acceptRanges = backendRes.headers.get('accept-ranges') || 'bytes';
|
||||
responseHeaders.set('Accept-Ranges', acceptRanges);
|
||||
|
||||
const etag = backendRes.headers.get('etag');
|
||||
if (etag) responseHeaders.set('ETag', etag);
|
||||
|
||||
const lastModified = backendRes.headers.get('last-modified');
|
||||
if (lastModified) responseHeaders.set('Last-Modified', lastModified);
|
||||
|
||||
responseHeaders.set('Cache-Control', 'public, max-age=31536000, s-maxage=31536000, immutable');
|
||||
responseHeaders.set('X-Content-Type-Options', 'nosniff');
|
||||
|
||||
return new Response(backendRes.body, {
|
||||
status: backendRes.status,
|
||||
statusText: backendRes.statusText,
|
||||
headers: responseHeaders,
|
||||
});
|
||||
} catch (err: unknown) {
|
||||
console.error('[Media Proxy Error]', err);
|
||||
return new NextResponse('Internal Media Proxy Error', { status: 502 });
|
||||
}
|
||||
}
|
||||
|
||||
export async function HEAD(
|
||||
request: NextRequest,
|
||||
{ params }: { params: Promise<{ path: string[] }> }
|
||||
) {
|
||||
try {
|
||||
const { path } = await params;
|
||||
if (!path || path.length === 0) {
|
||||
return new NextResponse(null, { status: 400 });
|
||||
}
|
||||
|
||||
const filePath = path.map(segment => encodeURIComponent(segment)).join('/');
|
||||
const backendBase = (
|
||||
process.env.INTERNAL_API_URL ||
|
||||
process.env.NEXT_PUBLIC_API_URL ||
|
||||
'http://127.0.0.1:4001'
|
||||
).replace(/\/api\/?$/, '');
|
||||
|
||||
const targetUrl = `${backendBase}/uploads/${filePath}`;
|
||||
const backendRes = await fetch(targetUrl, { method: 'HEAD', cache: 'no-store' });
|
||||
|
||||
const responseHeaders = new Headers();
|
||||
const contentType = backendRes.headers.get('content-type') || 'application/octet-stream';
|
||||
responseHeaders.set('Content-Type', contentType);
|
||||
const contentLength = backendRes.headers.get('content-length');
|
||||
if (contentLength) responseHeaders.set('Content-Length', contentLength);
|
||||
responseHeaders.set('Accept-Ranges', 'bytes');
|
||||
responseHeaders.set('Cache-Control', 'public, max-age=31536000, s-maxage=31536000, immutable');
|
||||
|
||||
return new NextResponse(null, {
|
||||
status: backendRes.status,
|
||||
headers: responseHeaders,
|
||||
});
|
||||
} catch (err: unknown) {
|
||||
console.error('[Media Proxy HEAD Error]', err);
|
||||
return new NextResponse(null, { status: 502 });
|
||||
}
|
||||
}
|
||||
132
frontend/application/app/api/uploads/[...path]/route.ts
Normal file
132
frontend/application/app/api/uploads/[...path]/route.ts
Normal file
@ -0,0 +1,132 @@
|
||||
import { NextRequest, NextResponse } from 'next/server';
|
||||
|
||||
export const dynamic = 'force-dynamic';
|
||||
|
||||
export async function GET(
|
||||
request: NextRequest,
|
||||
{ params }: { params: Promise<{ path: string[] }> }
|
||||
) {
|
||||
try {
|
||||
const { path } = await params;
|
||||
if (!path || path.length === 0) {
|
||||
return new NextResponse('Bad Request: Missing file path', { status: 400 });
|
||||
}
|
||||
|
||||
const filePath = path.map(segment => encodeURIComponent(segment)).join('/');
|
||||
const backendBase = (
|
||||
process.env.INTERNAL_API_URL ||
|
||||
process.env.NEXT_PUBLIC_API_URL ||
|
||||
'http://127.0.0.1:4001'
|
||||
).replace(/\/api\/?$/, '');
|
||||
|
||||
const targetUrl = `${backendBase}/uploads/${filePath}`;
|
||||
|
||||
// Forward streaming/caching headers from client to backend
|
||||
const forwardedHeaders: HeadersInit = {};
|
||||
const rangeHeader = request.headers.get('range');
|
||||
if (rangeHeader) {
|
||||
forwardedHeaders['range'] = rangeHeader;
|
||||
}
|
||||
const ifNoneMatch = request.headers.get('if-none-match');
|
||||
if (ifNoneMatch) {
|
||||
forwardedHeaders['if-none-match'] = ifNoneMatch;
|
||||
}
|
||||
const ifModifiedSince = request.headers.get('if-modified-since');
|
||||
if (ifModifiedSince) {
|
||||
forwardedHeaders['if-modified-since'] = ifModifiedSince;
|
||||
}
|
||||
|
||||
const backendRes = await fetch(targetUrl, {
|
||||
method: 'GET',
|
||||
headers: forwardedHeaders,
|
||||
cache: 'no-store', // Always stream directly or use Next.js response headers
|
||||
});
|
||||
|
||||
if (!backendRes.ok && backendRes.status !== 304 && backendRes.status !== 206) {
|
||||
return new NextResponse(`Media not found or error from upstream (${backendRes.status})`, {
|
||||
status: backendRes.status,
|
||||
});
|
||||
}
|
||||
|
||||
// Build response headers with long-term caching and media streaming support
|
||||
const responseHeaders = new Headers();
|
||||
|
||||
// Forward essential media headers
|
||||
const contentType = backendRes.headers.get('content-type') || 'application/octet-stream';
|
||||
responseHeaders.set('Content-Type', contentType);
|
||||
|
||||
const contentLength = backendRes.headers.get('content-length');
|
||||
if (contentLength) {
|
||||
responseHeaders.set('Content-Length', contentLength);
|
||||
}
|
||||
|
||||
const contentRange = backendRes.headers.get('content-range');
|
||||
if (contentRange) {
|
||||
responseHeaders.set('Content-Range', contentRange);
|
||||
}
|
||||
|
||||
const acceptRanges = backendRes.headers.get('accept-ranges') || 'bytes';
|
||||
responseHeaders.set('Accept-Ranges', acceptRanges);
|
||||
|
||||
const etag = backendRes.headers.get('etag');
|
||||
if (etag) {
|
||||
responseHeaders.set('ETag', etag);
|
||||
}
|
||||
|
||||
const lastModified = backendRes.headers.get('last-modified');
|
||||
if (lastModified) {
|
||||
responseHeaders.set('Last-Modified', lastModified);
|
||||
}
|
||||
|
||||
// Set aggressive caching for static media (1 year with immutable)
|
||||
responseHeaders.set('Cache-Control', 'public, max-age=31536000, s-maxage=31536000, immutable');
|
||||
responseHeaders.set('X-Content-Type-Options', 'nosniff');
|
||||
|
||||
return new Response(backendRes.body, {
|
||||
status: backendRes.status,
|
||||
statusText: backendRes.statusText,
|
||||
headers: responseHeaders,
|
||||
});
|
||||
} catch (err: unknown) {
|
||||
console.error('[Media Proxy Error]', err);
|
||||
return new NextResponse('Internal Media Proxy Error', { status: 502 });
|
||||
}
|
||||
}
|
||||
|
||||
export async function HEAD(
|
||||
request: NextRequest,
|
||||
{ params }: { params: Promise<{ path: string[] }> }
|
||||
) {
|
||||
try {
|
||||
const { path } = await params;
|
||||
if (!path || path.length === 0) {
|
||||
return new NextResponse(null, { status: 400 });
|
||||
}
|
||||
|
||||
const filePath = path.map(segment => encodeURIComponent(segment)).join('/');
|
||||
const backendBase = (
|
||||
process.env.INTERNAL_API_URL ||
|
||||
process.env.NEXT_PUBLIC_API_URL ||
|
||||
'http://127.0.0.1:4001'
|
||||
).replace(/\/api\/?$/, '');
|
||||
|
||||
const targetUrl = `${backendBase}/uploads/${filePath}`;
|
||||
const backendRes = await fetch(targetUrl, { method: 'HEAD', cache: 'no-store' });
|
||||
|
||||
const responseHeaders = new Headers();
|
||||
const contentType = backendRes.headers.get('content-type') || 'application/octet-stream';
|
||||
responseHeaders.set('Content-Type', contentType);
|
||||
const contentLength = backendRes.headers.get('content-length');
|
||||
if (contentLength) responseHeaders.set('Content-Length', contentLength);
|
||||
responseHeaders.set('Accept-Ranges', 'bytes');
|
||||
responseHeaders.set('Cache-Control', 'public, max-age=31536000, s-maxage=31536000, immutable');
|
||||
|
||||
return new NextResponse(null, {
|
||||
status: backendRes.status,
|
||||
headers: responseHeaders,
|
||||
});
|
||||
} catch (err: unknown) {
|
||||
console.error('[Media Proxy HEAD Error]', err);
|
||||
return new NextResponse(null, { status: 502 });
|
||||
}
|
||||
}
|
||||
@ -1,6 +1,7 @@
|
||||
import BlogPage from "../../components/BlogPage";
|
||||
import type { Metadata } from 'next';
|
||||
import { getPageMetadata } from "../../lib/seo";
|
||||
import { getMediaUrl } from "../../lib/media";
|
||||
|
||||
export async function generateMetadata(): Promise<Metadata> {
|
||||
return getPageMetadata('blog', {
|
||||
@ -58,7 +59,7 @@ async function getBlogs() {
|
||||
? new Date(String(b.createdAt)).toLocaleDateString('fa-IR')
|
||||
: '',
|
||||
readingTime: b.readingTime || 3,
|
||||
image: String(b.imageUrl || b.coverImage || '/assets/images/blog-placeholder.png'),
|
||||
image: getMediaUrl(String(b.imageUrl || b.coverImage || '/assets/images/blog-placeholder.png')),
|
||||
imageAlt: b.imageAlt || b.title,
|
||||
author: authorName || 'نویسنده کنینا',
|
||||
content: String(b.content || ''),
|
||||
|
||||
@ -17,6 +17,7 @@ import {
|
||||
ChevronUp
|
||||
} from "lucide-react";
|
||||
import SafeImage from "./SafeImage";
|
||||
import { getMediaUrl } from "../lib/media";
|
||||
|
||||
interface PodcastInlinePlayerProps {
|
||||
podcast: {
|
||||
@ -177,7 +178,7 @@ export default function PodcastInlinePlayer({ podcast }: PodcastInlinePlayerProp
|
||||
return `${mins.toString().padStart(2, "0")}:${remainingSecs.toString().padStart(2, "0")}`;
|
||||
};
|
||||
|
||||
const displayCover = podcast.cover || podcast.fallbackCover || '/images/default-podcast.png';
|
||||
const displayCover = getMediaUrl(podcast.cover || podcast.fallbackCover || '/images/default-podcast.png');
|
||||
const progressPercent = duration > 0 ? (currentTime / duration) * 100 : 0;
|
||||
const volumePercent = isMuted ? 0 : volume * 100;
|
||||
|
||||
@ -186,7 +187,7 @@ export default function PodcastInlinePlayer({ podcast }: PodcastInlinePlayerProp
|
||||
{/* Hidden Audio Tag */}
|
||||
<audio
|
||||
ref={audioRef}
|
||||
src={podcast.audioUrl}
|
||||
src={getMediaUrl(podcast.audioUrl)}
|
||||
preload="none"
|
||||
onPlay={() => setIsPlaying(true)}
|
||||
onPause={() => setIsPlaying(false)}
|
||||
|
||||
@ -4,6 +4,7 @@ import Image from "next/image";
|
||||
import { Sparkles } from "lucide-react";
|
||||
import { cn } from "../lib/utils";
|
||||
import { useSettingsStore } from "../lib/store/settingsStore";
|
||||
import { getMediaUrl } from "../lib/media";
|
||||
|
||||
interface SafeImageProps extends Omit<React.ImgHTMLAttributes<HTMLImageElement>, 'src'> {
|
||||
src?: string;
|
||||
@ -19,7 +20,7 @@ interface SafeImageProps extends Omit<React.ImgHTMLAttributes<HTMLImageElement>,
|
||||
}
|
||||
|
||||
export default function SafeImage({
|
||||
src,
|
||||
src: rawSrc,
|
||||
alt = "تصویر مکمل کنینا",
|
||||
className,
|
||||
imgClassName,
|
||||
@ -34,6 +35,8 @@ export default function SafeImage({
|
||||
const [loading, setLoading] = React.useState(!priority);
|
||||
const logoUrl = useSettingsStore(state => state.getText('site_logo', ''));
|
||||
|
||||
const src = React.useMemo(() => getMediaUrl(rawSrc), [rawSrc]);
|
||||
|
||||
// Check if external domain is in allowed remote patterns or relative path
|
||||
const isExternal = typeof src === 'string' && (src.startsWith('http://') || src.startsWith('https://'));
|
||||
const isBlobOrData = typeof src === 'string' && (src.startsWith('blob:') || src.startsWith('data:'));
|
||||
|
||||
@ -19,6 +19,7 @@ import {
|
||||
Sparkles,
|
||||
Loader2
|
||||
} from "lucide-react";
|
||||
import { getMediaUrl } from "../lib/media";
|
||||
|
||||
interface VideoModalPlayerProps {
|
||||
isOpen: boolean;
|
||||
@ -317,8 +318,8 @@ export default function VideoModalPlayer({ isOpen, onClose, video }: VideoModalP
|
||||
>
|
||||
<video
|
||||
ref={videoRef}
|
||||
src={video.videoUrl}
|
||||
poster={video.thumbnail}
|
||||
src={getMediaUrl(video.videoUrl)}
|
||||
poster={getMediaUrl(video.thumbnail)}
|
||||
autoPlay
|
||||
playsInline
|
||||
onPlay={() => setIsPlaying(true)}
|
||||
|
||||
51
frontend/application/lib/media.ts
Normal file
51
frontend/application/lib/media.ts
Normal file
@ -0,0 +1,51 @@
|
||||
/**
|
||||
* Normalizes any media/upload URL to use the local frontend Next.js media proxy (/api/uploads/...)
|
||||
* instead of directly exposing or calling backend domains (api.canina.ir, etc.).
|
||||
*
|
||||
* Benefits:
|
||||
* 1. Leverages Next.js server caching and optimization.
|
||||
* 2. Hides internal backend URLs and avoids ugly direct backend domain calls.
|
||||
* 3. Supports HTTP Range requests for seamless video/audio seeking and streaming.
|
||||
*/
|
||||
export function getMediaUrl(url?: string | null): string {
|
||||
if (!url) return '';
|
||||
const trimmed = url.trim();
|
||||
if (!trimmed) return '';
|
||||
|
||||
// Data URLs or blob URLs stay as-is
|
||||
if (trimmed.startsWith('data:') || trimmed.startsWith('blob:')) {
|
||||
return trimmed;
|
||||
}
|
||||
|
||||
// If already proxied via /api/uploads/ or /api/media/
|
||||
if (trimmed.startsWith('/api/uploads/') || trimmed.startsWith('/api/media/')) {
|
||||
return trimmed;
|
||||
}
|
||||
|
||||
// If relative path starting with /uploads/
|
||||
if (trimmed.startsWith('/uploads/')) {
|
||||
return `/api/uploads/${trimmed.replace(/^\/uploads\//, '')}`;
|
||||
}
|
||||
|
||||
// If relative path starting with uploads/
|
||||
if (trimmed.startsWith('uploads/')) {
|
||||
return `/api/uploads/${trimmed.replace(/^uploads\//, '')}`;
|
||||
}
|
||||
|
||||
// If relative path starting with /media/ or media/
|
||||
if (trimmed.startsWith('/media/')) {
|
||||
return `/api/uploads/${trimmed.replace(/^\/media\//, '')}`;
|
||||
}
|
||||
if (trimmed.startsWith('media/')) {
|
||||
return `/api/uploads/${trimmed.replace(/^media\//, '')}`;
|
||||
}
|
||||
|
||||
// If full backend URL containing /uploads/ (e.g. http://localhost:4001/uploads/..., https://api.canina.ir/uploads/...)
|
||||
const uploadsMatch = trimmed.match(/^https?:\/\/[^/]+\/uploads\/(.+)$/i);
|
||||
if (uploadsMatch && uploadsMatch[1]) {
|
||||
return `/api/uploads/${uploadsMatch[1]}`;
|
||||
}
|
||||
|
||||
// External URLs (like unsplash, cdn, youtube, aparat) stay as-is
|
||||
return trimmed;
|
||||
}
|
||||
@ -1,6 +1,7 @@
|
||||
import api from './api';
|
||||
import { PRODUCTS, Product, PetType } from "../data/products";
|
||||
import { Banner } from "../types";
|
||||
import { getMediaUrl } from "../media";
|
||||
|
||||
const CATEGORY_SLUG_TO_NAME: Record<string, string> = {
|
||||
'joints': 'مفاصل و استخوان',
|
||||
@ -136,20 +137,12 @@ export class ProductService {
|
||||
feedingAdvice: data.dosageLogic || data.feedingAdvice || '',
|
||||
slug: data.slug,
|
||||
image: (() => {
|
||||
const apiBase = (process.env.NEXT_PUBLIC_API_URL || '').replace(/\/api$/, '');
|
||||
if (!data.imageUrl) return local?.image || '/assets/images/hero-section-image.png';
|
||||
if (data.imageUrl.startsWith('http://') || data.imageUrl.startsWith('https://')) return data.imageUrl;
|
||||
if (data.imageUrl.startsWith('/uploads/')) return `${apiBase}${data.imageUrl}`;
|
||||
if (data.imageUrl.startsWith('/products/')) return local?.image || '/assets/images/hero-section-image.png';
|
||||
return local?.image || data.imageUrl || '/assets/images/hero-section-image.png';
|
||||
return getMediaUrl(data.imageUrl) || local?.image || '/assets/images/hero-section-image.png';
|
||||
})(),
|
||||
images: Array.isArray(data.images) && data.images.length > 0
|
||||
? data.images.map((img: string) => {
|
||||
const apiBase = (process.env.NEXT_PUBLIC_API_URL || '').replace(/\/api$/, '');
|
||||
if (img.startsWith('http://') || img.startsWith('https://')) return img;
|
||||
if (img.startsWith('/uploads/')) return `${apiBase}${img}`;
|
||||
return img;
|
||||
})
|
||||
? data.images.map((img: string) => getMediaUrl(img)).filter(Boolean)
|
||||
: (local?.images || []),
|
||||
|
||||
main_ingredients: data.ingredientList?.map(i => i.ingredient) || data.ingredients?.split(/[،,-]/).map(s => s.trim()).filter(Boolean) || [],
|
||||
@ -160,56 +153,20 @@ export class ProductService {
|
||||
specialist: safeParse<Product['specialist']>(data.specialist, defaultSpecialist),
|
||||
|
||||
calculateDosage: local?.calculateDosage,
|
||||
podcastUrl: (() => {
|
||||
const apiBase = (process.env.NEXT_PUBLIC_API_URL || '').replace(/\/api$/, '');
|
||||
if (!data.podcastUrl) return undefined;
|
||||
if (data.podcastUrl.startsWith('http://') || data.podcastUrl.startsWith('https://')) return data.podcastUrl;
|
||||
if (data.podcastUrl.startsWith('/uploads/')) return `${apiBase}${data.podcastUrl}`;
|
||||
return data.podcastUrl;
|
||||
})(),
|
||||
podcastUrl: data.podcastUrl ? getMediaUrl(data.podcastUrl) : undefined,
|
||||
podcastTitle: data.podcastTitle || undefined,
|
||||
podcastDescription: data.podcastDescription || undefined,
|
||||
podcastCover: (() => {
|
||||
const apiBase = (process.env.NEXT_PUBLIC_API_URL || '').replace(/\/api$/, '');
|
||||
if (!data.podcastCover) return undefined;
|
||||
if (data.podcastCover.startsWith('http://') || data.podcastCover.startsWith('https://')) return data.podcastCover;
|
||||
if (data.podcastCover.startsWith('/uploads/')) return `${apiBase}${data.podcastCover}`;
|
||||
return data.podcastCover;
|
||||
})(),
|
||||
podcastCover: data.podcastCover ? getMediaUrl(data.podcastCover) : undefined,
|
||||
|
||||
videoUrl: (() => {
|
||||
const apiBase = (process.env.NEXT_PUBLIC_API_URL || '').replace(/\/api$/, '');
|
||||
if (!data.videoUrl) return undefined;
|
||||
if (data.videoUrl.startsWith('http://') || data.videoUrl.startsWith('https://')) return data.videoUrl;
|
||||
if (data.videoUrl.startsWith('/uploads/')) return `${apiBase}${data.videoUrl}`;
|
||||
return data.videoUrl;
|
||||
})(),
|
||||
videoUrl: data.videoUrl ? getMediaUrl(data.videoUrl) : undefined,
|
||||
videoTitle: data.videoTitle || undefined,
|
||||
videoDescription: data.videoDescription || undefined,
|
||||
videoCover: (() => {
|
||||
const apiBase = (process.env.NEXT_PUBLIC_API_URL || '').replace(/\/api$/, '');
|
||||
if (!data.videoCover) return undefined;
|
||||
if (data.videoCover.startsWith('http://') || data.videoCover.startsWith('https://')) return data.videoCover;
|
||||
if (data.videoCover.startsWith('/uploads/')) return `${apiBase}${data.videoCover}`;
|
||||
return data.videoCover;
|
||||
})(),
|
||||
videoCover: data.videoCover ? getMediaUrl(data.videoCover) : undefined,
|
||||
|
||||
pdfUrl: (() => {
|
||||
const apiBase = (process.env.NEXT_PUBLIC_API_URL || '').replace(/\/api$/, '');
|
||||
if (!data.pdfUrl) return undefined;
|
||||
if (data.pdfUrl.startsWith('http://') || data.pdfUrl.startsWith('https://')) return data.pdfUrl;
|
||||
if (data.pdfUrl.startsWith('/uploads/')) return `${apiBase}${data.pdfUrl}`;
|
||||
return data.pdfUrl;
|
||||
})(),
|
||||
pdfUrl: data.pdfUrl ? getMediaUrl(data.pdfUrl) : undefined,
|
||||
pdfTitle: data.pdfTitle || undefined,
|
||||
pdfDescription: data.pdfDescription || undefined,
|
||||
pdfCover: (() => {
|
||||
const apiBase = (process.env.NEXT_PUBLIC_API_URL || '').replace(/\/api$/, '');
|
||||
if (!data.pdfCover) return undefined;
|
||||
if (data.pdfCover.startsWith('http://') || data.pdfCover.startsWith('https://')) return data.pdfCover;
|
||||
if (data.pdfCover.startsWith('/uploads/')) return `${apiBase}${data.pdfCover}`;
|
||||
return data.pdfCover;
|
||||
})(),
|
||||
pdfCover: data.pdfCover ? getMediaUrl(data.pdfCover) : undefined,
|
||||
barcode: (inputData.barcode as string) || undefined,
|
||||
metaTitle: (inputData.metaTitle as string) || undefined,
|
||||
metaDescription: (inputData.metaDescription as string) || undefined,
|
||||
@ -218,14 +175,7 @@ export class ProductService {
|
||||
stockStatus: (inputData.stockStatus as 'IN_STOCK' | 'OUT_OF_STOCK' | 'PRE_ORDER' | 'DISCONTINUED') || 'IN_STOCK',
|
||||
noIndex: Boolean(inputData.noIndex),
|
||||
noFollow: Boolean(inputData.noFollow),
|
||||
ogImage: (() => {
|
||||
const apiBase = (process.env.NEXT_PUBLIC_API_URL || '').replace(/\/api$/, '');
|
||||
const og = inputData.ogImage as string;
|
||||
if (!og) return undefined;
|
||||
if (og.startsWith('http://') || og.startsWith('https://')) return og;
|
||||
if (og.startsWith('/uploads/')) return `${apiBase}${og}`;
|
||||
return og;
|
||||
})(),
|
||||
ogImage: inputData.ogImage ? getMediaUrl(inputData.ogImage as string) : undefined,
|
||||
featuredImageAlt: (inputData.featuredImageAlt as string) || undefined,
|
||||
updatedAt: (inputData.updatedAt as string) || (inputData.createdAt as string) || undefined,
|
||||
reviews: Array.isArray(inputData.reviews) ? inputData.reviews as Product['reviews'] : undefined,
|
||||
@ -372,7 +322,11 @@ export class ProductService {
|
||||
public async getBanners(): Promise<Banner[]> {
|
||||
try {
|
||||
const response = await api.get('/banners');
|
||||
return response.data || [];
|
||||
const data = response.data || [];
|
||||
return data.map((b: Banner) => ({
|
||||
...b,
|
||||
imageUrl: getMediaUrl(b.imageUrl),
|
||||
}));
|
||||
} catch (error) {
|
||||
console.error("[ProductService] Failed to fetch banners:", error);
|
||||
return [];
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
import api from './api';
|
||||
import { getMediaUrl } from '../media';
|
||||
|
||||
export interface Video {
|
||||
id: string;
|
||||
@ -12,16 +13,31 @@ export interface Video {
|
||||
isFeatured?: boolean;
|
||||
}
|
||||
|
||||
function normalizeVideo(v: any): Video {
|
||||
return {
|
||||
id: String(v.id || ''),
|
||||
title: String(v.title || ''),
|
||||
doctor: String(v.doctor || 'کادر علمی کنینا'),
|
||||
duration: String(v.duration || '۳:۰۰'),
|
||||
thumbnail: getMediaUrl(v.thumbnail || v.coverUrl || '/assets/images/hero-section-image.png'),
|
||||
videoUrl: getMediaUrl(v.videoUrl || ''),
|
||||
description: String(v.description || ''),
|
||||
viewsCount: Number(v.viewsCount) || 0,
|
||||
isFeatured: Boolean(v.isFeatured),
|
||||
};
|
||||
}
|
||||
|
||||
export const videoService = {
|
||||
getVideos: async (params?: { featured?: boolean; limit?: number; search?: string }) => {
|
||||
getVideos: async (params?: { featured?: boolean; limit?: number; search?: string }): Promise<Video[]> => {
|
||||
try {
|
||||
const res = await api.get('/videos', { params });
|
||||
const raw = res.data;
|
||||
if (Array.isArray(raw?.videos)) return raw.videos;
|
||||
if (Array.isArray(raw?.data?.videos)) return raw.data.videos;
|
||||
if (Array.isArray(raw?.data)) return raw.data;
|
||||
if (Array.isArray(raw)) return raw;
|
||||
return [];
|
||||
let items: any[] = [];
|
||||
if (Array.isArray(raw?.videos)) items = raw.videos;
|
||||
else if (Array.isArray(raw?.data?.videos)) items = raw.data.videos;
|
||||
else if (Array.isArray(raw?.data)) items = raw.data;
|
||||
else if (Array.isArray(raw)) items = raw;
|
||||
return items.map(normalizeVideo);
|
||||
} catch (error) {
|
||||
console.error('Failed to fetch videos from API:', error);
|
||||
return [];
|
||||
|
||||
@ -2,26 +2,26 @@
|
||||
"0": "Roles",
|
||||
"1": "app.module.ts",
|
||||
"2": "SettingsController",
|
||||
"3": "ProductService",
|
||||
"3": "productService.ts",
|
||||
"4": "ProductPage.tsx",
|
||||
"5": "CmsController",
|
||||
"6": "tickets.controller.ts",
|
||||
"7": "Button.tsx",
|
||||
"8": "SettingsService",
|
||||
"8": "reviews.controller.ts",
|
||||
"9": "devDependencies",
|
||||
"10": "CreateReviewDto",
|
||||
"10": "ReviewsController",
|
||||
"11": "MediaSelector.tsx",
|
||||
"12": "index.ts",
|
||||
"13": "app-audit-verification.e2e-spec.js",
|
||||
"14": "userStore.ts",
|
||||
"14": "lib/services/api.ts",
|
||||
"15": "src/services/api.ts",
|
||||
"16": "DoctorQueryDto",
|
||||
"17": "schema.ts",
|
||||
"18": "JwtAuthGuard",
|
||||
"19": "ProductsService",
|
||||
"19": "ProductsController",
|
||||
"20": "CreateVideoDto",
|
||||
"21": "ReportsController",
|
||||
"22": "components/Skeleton.tsx",
|
||||
"21": "admin.module.ts",
|
||||
"22": "RevalidationService",
|
||||
"23": "MenuService",
|
||||
"24": "BE-001",
|
||||
"25": "FE-001",
|
||||
@ -51,23 +51,23 @@
|
||||
"49": "devDependencies",
|
||||
"50": "devDependencies",
|
||||
"51": "BlogsController",
|
||||
"52": "PrescriptionsService",
|
||||
"52": "PrescriptionsController",
|
||||
"53": "SmartAdvisorService",
|
||||
"54": "Modal.tsx",
|
||||
"55": "UITexts.tsx",
|
||||
"56": "Orders.tsx",
|
||||
"57": "Role & Core Objective",
|
||||
"58": "ContactController",
|
||||
"58": "ContactService",
|
||||
"59": "compilerOptions",
|
||||
"60": "PaymentService",
|
||||
"61": "usePetStore",
|
||||
"61": "PetProfile.tsx",
|
||||
"62": "SmsService",
|
||||
"63": "dependencies",
|
||||
"64": "compilerOptions",
|
||||
"65": "BlogsService",
|
||||
"66": "ApiOperation",
|
||||
"67": "PetsController",
|
||||
"68": "lib/services/api.ts",
|
||||
"68": "UserDashboard.tsx",
|
||||
"69": "Required Review Group Closures",
|
||||
"70": "compilerOptions",
|
||||
"71": "getPageMetadata",
|
||||
@ -84,17 +84,17 @@
|
||||
"82": "scripts",
|
||||
"83": "dependencies",
|
||||
"84": "Role & Core Objective",
|
||||
"85": "trust-seals/page.tsx",
|
||||
"85": "useSettingsStore",
|
||||
"86": "zibal.service.ts",
|
||||
"87": "dependencies",
|
||||
"88": "CreateEBankCheckoutDto",
|
||||
"89": "seed-products.ts",
|
||||
"90": "users.service.ts",
|
||||
"90": "ProductsService",
|
||||
"91": "Reconciled Audit Roles & Assignments",
|
||||
"92": "OrdersService",
|
||||
"93": "useSettingsStore",
|
||||
"93": "HomeClient.tsx",
|
||||
"94": "Phase 3.1 — Human Review Preparation and Master Backlog Critique",
|
||||
"95": "wiki/[slug]/page.tsx",
|
||||
"95": "blog/[slug]/page.tsx",
|
||||
"96": "compilerOptions",
|
||||
"97": "InitiatePaymentDto",
|
||||
"98": "scripts",
|
||||
@ -112,7 +112,7 @@
|
||||
"110": "Operational Rules & Boundaries",
|
||||
"111": "Operational Rules & Boundaries",
|
||||
"112": "Operational Rules & Boundaries",
|
||||
"113": "RegisterDto",
|
||||
"113": "AdminTransactionFilterDto",
|
||||
"114": "AppService",
|
||||
"115": "Blogs.tsx",
|
||||
"116": "Vazirmatn Changelog",
|
||||
@ -122,13 +122,13 @@
|
||||
"120": "compilerOptions",
|
||||
"121": "backend/README.md",
|
||||
"122": "AdminController",
|
||||
"123": "AuthService",
|
||||
"123": "MetricsController",
|
||||
"124": "Repository Map",
|
||||
"125": "validate_integrity.js",
|
||||
"126": "admin-panel/package.json",
|
||||
"127": "Sahel-Font",
|
||||
"128": "Body",
|
||||
"129": "auth.controller.ts",
|
||||
"129": "wiki/[slug]/page.tsx",
|
||||
"130": "Sahel-Font",
|
||||
"131": "Role & Core Objective",
|
||||
"132": "orchestrate.py",
|
||||
@ -143,21 +143,21 @@
|
||||
"141": "application/package.json",
|
||||
"142": "start-dev.js",
|
||||
"143": "generate-openapi.js",
|
||||
"144": "VetGallery.tsx",
|
||||
"144": "SafeImage.tsx",
|
||||
"145": "ProductDto",
|
||||
"146": "System Discovery",
|
||||
"147": "HomeController",
|
||||
"148": "admin.service.ts",
|
||||
"149": "SmsSettingsPage.tsx",
|
||||
"150": "Product Requirement Document (PRD)",
|
||||
"151": "class-transformer",
|
||||
"151": "zibal-ebank.service.ts",
|
||||
"152": "useCartStore",
|
||||
"153": "exclude",
|
||||
"154": "Baseline Command Plan & Reconciled Command History",
|
||||
"155": "seo-backfill.ts",
|
||||
"156": "manual-test-scenarios.md",
|
||||
"157": "ErrorPages.tsx",
|
||||
"158": "js-yaml",
|
||||
"158": "media/[...path]/route.ts",
|
||||
"159": "with-vpn.sh",
|
||||
"160": "Architecture Specification",
|
||||
"161": "Project Health Audit Report",
|
||||
@ -175,16 +175,15 @@
|
||||
"173": "Phase 3 Audit Traceability Matrix",
|
||||
"174": "rebuild_honest_ledger.js",
|
||||
"175": "validate_evidence_grade.js",
|
||||
"176": "@nestjs/core",
|
||||
"177": "auth.module.ts",
|
||||
"176": "uploads/[...path]/route.ts",
|
||||
"177": "UsersService",
|
||||
"178": "نقشه جامع پوشش تستهای سرتاسری (E2E Test Coverage Map) — پروژه Canina",
|
||||
"179": "@nestjs/jwt",
|
||||
"179": "prisma",
|
||||
"180": "API Contract Specification",
|
||||
"181": "⚙️ Backend Technical Review (05_dev_backend)",
|
||||
"182": "🎨 Frontend & Admin Panel Technical Review (06_dev_frontend)",
|
||||
"183": "🚀 SEO & Content Strategy Review (12_seo_content)",
|
||||
"184": "CheckoutPage.tsx",
|
||||
"185": "@eslint/eslintrc",
|
||||
"184": "@types/node",
|
||||
"186": "seed-ui-texts.ts",
|
||||
"187": "seed-wiki.ts",
|
||||
"188": "update-blog.dto.ts",
|
||||
@ -196,14 +195,10 @@
|
||||
"194": "Raw Finding Verification & Disposition Report",
|
||||
"195": "React + TypeScript + Vite",
|
||||
"196": "Select.tsx",
|
||||
"197": "UsersService",
|
||||
"198": "@nestjs/throttler",
|
||||
"199": "passport",
|
||||
"200": "application/README.md",
|
||||
"201": "deploy.sh",
|
||||
"202": "🔒 Security & Performance Review (09_devops_security)",
|
||||
"203": "👁️ UX & Persona Interface Review (08_visual_qa)",
|
||||
"204": "reflect-metadata",
|
||||
"205": "prisma/scientificTerms.ts",
|
||||
"206": "seed-blogs.ts",
|
||||
"207": "seed-custom.ts",
|
||||
@ -222,8 +217,6 @@
|
||||
"220": "Input.tsx",
|
||||
"221": "Textarea.tsx",
|
||||
"222": "admin-panel/tsconfig.json",
|
||||
"223": "swagger-ui-express",
|
||||
"224": "jest",
|
||||
"225": "next.config.ts",
|
||||
"226": "Shabnam Font README",
|
||||
"227": "AGENTS.md",
|
||||
@ -231,13 +224,9 @@
|
||||
"229": ".agents/workflows/graphify.md",
|
||||
"230": "instructions.md",
|
||||
"231": "WikiController",
|
||||
"232": "helmet",
|
||||
"233": "tailwindcss",
|
||||
"234": "@nestjs/schematics",
|
||||
"235": "@nestjs/testing",
|
||||
"236": "BlogsService",
|
||||
"237": "source-map-support",
|
||||
"238": "ts-jest",
|
||||
"239": "ts-loader",
|
||||
"240": "supertest",
|
||||
"241": "blog.entity.ts",
|
||||
@ -302,36 +291,25 @@
|
||||
"300": "typescript",
|
||||
"301": "@types/jest",
|
||||
"302": "typescript-eslint",
|
||||
"303": "@types/js-yaml",
|
||||
"304": "@types/multer",
|
||||
"305": "@types/react",
|
||||
"306": "globals",
|
||||
"307": "@nestjs/cli",
|
||||
"308": "vitest",
|
||||
"309": "axios",
|
||||
"310": "tailwindcss",
|
||||
"311": "@types/supertest",
|
||||
"312": "@types/passport-jwt",
|
||||
"313": "20260526160916_add_ui_texts_and_scientific_terms/migration.sql",
|
||||
"314": "typescript-eslint",
|
||||
"315": "typescript",
|
||||
"316": "prettier",
|
||||
"317": "revalidate/route.ts",
|
||||
"318": "MaskableField.tsx",
|
||||
"319": "@eslint/js",
|
||||
"320": "@testing-library/react",
|
||||
"321": "orders/page.tsx",
|
||||
"322": "pets/page.tsx",
|
||||
"323": "eslint-config-prettier",
|
||||
"324": "eslint",
|
||||
"325": "@types/react-dom",
|
||||
"326": "SmsLogQueryDto",
|
||||
"327": "eslint-plugin-react-refresh",
|
||||
"328": "WikiService",
|
||||
"329": "B2BService",
|
||||
"330": "track/page.tsx",
|
||||
"331": "PodcastPlayerModal.tsx",
|
||||
"332": "app.e2e-spec.js",
|
||||
"333": "app/page.tsx",
|
||||
"334": "bcrypt"
|
||||
"333": "app/page.tsx"
|
||||
}
|
||||
|
||||
File diff suppressed because one or more lines are too long
@ -1,15 +1,15 @@
|
||||
{
|
||||
"0": "Roles",
|
||||
"1": "app.module.ts",
|
||||
"2": "SmsService",
|
||||
"2": "SettingsController",
|
||||
"3": "ProductService",
|
||||
"4": "ProductPage.tsx",
|
||||
"5": "CmsController",
|
||||
"6": "tickets.controller.ts",
|
||||
"7": "Button.tsx",
|
||||
"8": "ProductsService",
|
||||
"8": "SettingsService",
|
||||
"9": "devDependencies",
|
||||
"10": "ReviewsService",
|
||||
"10": "CreateReviewDto",
|
||||
"11": "MediaSelector.tsx",
|
||||
"12": "index.ts",
|
||||
"13": "app-audit-verification.e2e-spec.js",
|
||||
@ -18,10 +18,10 @@
|
||||
"16": "DoctorQueryDto",
|
||||
"17": "schema.ts",
|
||||
"18": "JwtAuthGuard",
|
||||
"19": "ProductsController",
|
||||
"19": "ProductsService",
|
||||
"20": "CreateVideoDto",
|
||||
"21": "admin.module.ts",
|
||||
"22": "FeaturedProducts.tsx",
|
||||
"21": "ReportsController",
|
||||
"22": "components/Skeleton.tsx",
|
||||
"23": "MenuService",
|
||||
"24": "BE-001",
|
||||
"25": "FE-001",
|
||||
@ -33,41 +33,41 @@
|
||||
"31": "DOC-001",
|
||||
"32": "adminRoutes.tsx",
|
||||
"33": "WholesaleApplyDto",
|
||||
"34": "B2BService",
|
||||
"34": "B2BController",
|
||||
"35": "AuthController",
|
||||
"36": "FaqService",
|
||||
"37": "راهنمای تست سیستم (Software Testing)",
|
||||
"38": "Button",
|
||||
"38": "Transactions.tsx",
|
||||
"39": "CategoriesController",
|
||||
"40": "MediaController",
|
||||
"41": "What You Must Do When Invoked",
|
||||
"42": "SslController",
|
||||
"43": "BannersService",
|
||||
"44": "TestimonialsService",
|
||||
"43": "BannersController",
|
||||
"44": "TestimonialsController",
|
||||
"45": "What You Must Do When Invoked",
|
||||
"46": "20260526145407_init/migration.sql",
|
||||
"47": "IngredientsService",
|
||||
"48": "UsersService",
|
||||
"47": "IngredientsController",
|
||||
"48": "UsersController",
|
||||
"49": "devDependencies",
|
||||
"50": "devDependencies",
|
||||
"51": "BlogsController",
|
||||
"52": "PrescriptionsService",
|
||||
"53": "SmartAdvisorService",
|
||||
"54": "Reports.tsx",
|
||||
"54": "Modal.tsx",
|
||||
"55": "UITexts.tsx",
|
||||
"56": "Orders.tsx",
|
||||
"57": "Role & Core Objective",
|
||||
"58": "ContactService",
|
||||
"58": "ContactController",
|
||||
"59": "compilerOptions",
|
||||
"60": "PaymentService",
|
||||
"61": "AdminTransactionFilterDto",
|
||||
"62": "RouteErrorBoundary",
|
||||
"61": "usePetStore",
|
||||
"62": "SmsService",
|
||||
"63": "dependencies",
|
||||
"64": "compilerOptions",
|
||||
"65": "BlogsService",
|
||||
"66": "AdminQueryDto",
|
||||
"66": "ApiOperation",
|
||||
"67": "PetsController",
|
||||
"68": "UserDashboard.tsx",
|
||||
"68": "lib/services/api.ts",
|
||||
"69": "Required Review Group Closures",
|
||||
"70": "compilerOptions",
|
||||
"71": "getPageMetadata",
|
||||
@ -84,15 +84,15 @@
|
||||
"82": "scripts",
|
||||
"83": "dependencies",
|
||||
"84": "Role & Core Objective",
|
||||
"85": "useSettingsStore",
|
||||
"85": "trust-seals/page.tsx",
|
||||
"86": "zibal.service.ts",
|
||||
"87": "dependencies",
|
||||
"88": "CreateEBankCheckoutDto",
|
||||
"89": "seed-products.ts",
|
||||
"90": "CreateReviewDto",
|
||||
"90": "users.service.ts",
|
||||
"91": "Reconciled Audit Roles & Assignments",
|
||||
"92": "OrdersService",
|
||||
"93": "lib/services/api.ts",
|
||||
"93": "useSettingsStore",
|
||||
"94": "Phase 3.1 — Human Review Preparation and Master Backlog Critique",
|
||||
"95": "wiki/[slug]/page.tsx",
|
||||
"96": "compilerOptions",
|
||||
@ -105,7 +105,7 @@
|
||||
"103": "Comprehensive Change Log",
|
||||
"104": "Coupons.tsx",
|
||||
"105": "Operational Rules & Boundaries",
|
||||
"106": "MetricsController",
|
||||
"106": "auth.service.ts",
|
||||
"107": "PaginationDto",
|
||||
"108": "PrismaService",
|
||||
"109": "1. Summary of Integrity Repairs Performed",
|
||||
@ -114,20 +114,20 @@
|
||||
"112": "Operational Rules & Boundaries",
|
||||
"113": "RegisterDto",
|
||||
"114": "AppService",
|
||||
"115": "VerifyOtpDto",
|
||||
"115": "Blogs.tsx",
|
||||
"116": "Vazirmatn Changelog",
|
||||
"117": "Vazirmatn Font فونت وزیرمتن",
|
||||
"118": "Operational Rules & Boundaries",
|
||||
"119": "compilerOptions",
|
||||
"120": "compilerOptions",
|
||||
"121": "backend/README.md",
|
||||
"122": "ApiOperation",
|
||||
"123": "auth.service.ts",
|
||||
"122": "AdminController",
|
||||
"123": "AuthService",
|
||||
"124": "Repository Map",
|
||||
"125": "validate_integrity.js",
|
||||
"126": "admin-panel/package.json",
|
||||
"127": "Sahel-Font",
|
||||
"128": "AdminController",
|
||||
"128": "Body",
|
||||
"129": "auth.controller.ts",
|
||||
"130": "Sahel-Font",
|
||||
"131": "Role & Core Objective",
|
||||
@ -143,11 +143,11 @@
|
||||
"141": "application/package.json",
|
||||
"142": "start-dev.js",
|
||||
"143": "generate-openapi.js",
|
||||
"144": "reviews.controller.ts",
|
||||
"145": "admin.service.ts",
|
||||
"144": "VetGallery.tsx",
|
||||
"145": "ProductDto",
|
||||
"146": "System Discovery",
|
||||
"147": "ArchivePage.tsx",
|
||||
"148": "CreateUserDto",
|
||||
"147": "HomeController",
|
||||
"148": "admin.service.ts",
|
||||
"149": "SmsSettingsPage.tsx",
|
||||
"150": "Product Requirement Document (PRD)",
|
||||
"151": "class-transformer",
|
||||
@ -176,14 +176,14 @@
|
||||
"174": "rebuild_honest_ledger.js",
|
||||
"175": "validate_evidence_grade.js",
|
||||
"176": "@nestjs/core",
|
||||
"177": "SendOtpDto",
|
||||
"177": "auth.module.ts",
|
||||
"178": "نقشه جامع پوشش تستهای سرتاسری (E2E Test Coverage Map) — پروژه Canina",
|
||||
"179": "@nestjs/jwt",
|
||||
"180": "API Contract Specification",
|
||||
"181": "⚙️ Backend Technical Review (05_dev_backend)",
|
||||
"182": "🎨 Frontend & Admin Panel Technical Review (06_dev_frontend)",
|
||||
"183": "🚀 SEO & Content Strategy Review (12_seo_content)",
|
||||
"184": "UpdateReviewDto",
|
||||
"184": "CheckoutPage.tsx",
|
||||
"185": "@eslint/eslintrc",
|
||||
"186": "seed-ui-texts.ts",
|
||||
"187": "seed-wiki.ts",
|
||||
@ -196,7 +196,7 @@
|
||||
"194": "Raw Finding Verification & Disposition Report",
|
||||
"195": "React + TypeScript + Vite",
|
||||
"196": "Select.tsx",
|
||||
"197": "catalog/page.tsx",
|
||||
"197": "UsersService",
|
||||
"198": "@nestjs/throttler",
|
||||
"199": "passport",
|
||||
"200": "application/README.md",
|
||||
@ -230,12 +230,12 @@
|
||||
"228": "rules/graphify.md",
|
||||
"229": ".agents/workflows/graphify.md",
|
||||
"230": "instructions.md",
|
||||
"231": "RevalidationService",
|
||||
"231": "WikiController",
|
||||
"232": "helmet",
|
||||
"233": "tailwindcss",
|
||||
"234": "@nestjs/schematics",
|
||||
"235": "@nestjs/testing",
|
||||
"236": "@nestjs/swagger",
|
||||
"236": "BlogsService",
|
||||
"237": "source-map-support",
|
||||
"238": "ts-jest",
|
||||
"239": "ts-loader",
|
||||
@ -325,5 +325,13 @@
|
||||
"323": "eslint-config-prettier",
|
||||
"324": "eslint",
|
||||
"325": "@types/react-dom",
|
||||
"327": "eslint-plugin-react-refresh"
|
||||
"326": "SmsLogQueryDto",
|
||||
"327": "eslint-plugin-react-refresh",
|
||||
"328": "WikiService",
|
||||
"329": "B2BService",
|
||||
"330": "track/page.tsx",
|
||||
"331": "PodcastPlayerModal.tsx",
|
||||
"332": "app.e2e-spec.js",
|
||||
"333": "app/page.tsx",
|
||||
"334": "bcrypt"
|
||||
}
|
||||
|
||||
@ -1,31 +1,31 @@
|
||||
# Graph Report - canina (2026-08-29)
|
||||
|
||||
## Corpus Check
|
||||
- 590 files · ~1,335,143 words
|
||||
- 590 files · ~1,336,894 words
|
||||
- Verdict: corpus is large enough that graph structure adds value.
|
||||
|
||||
## Summary
|
||||
- 4136 nodes · 7451 edges · 327 communities (208 shown, 119 thin omitted)
|
||||
- 4138 nodes · 7454 edges · 335 communities (213 shown, 122 thin omitted)
|
||||
- Extraction: 96% EXTRACTED · 4% INFERRED · 0% AMBIGUOUS · INFERRED: 281 edges (avg confidence: 0.79)
|
||||
- Token cost: 0 input · 0 output
|
||||
|
||||
## Graph Freshness
|
||||
- Built from commit: `bfb7f420`
|
||||
- Built from commit: `32e40a82`
|
||||
- Run `git rev-parse HEAD` and compare to check if the graph is stale.
|
||||
- Run `graphify update .` after code changes (no API cost).
|
||||
|
||||
## Community Hubs (Navigation)
|
||||
- Roles
|
||||
- app.module.ts
|
||||
- SmsService
|
||||
- SettingsController
|
||||
- ProductService
|
||||
- ProductPage.tsx
|
||||
- CmsController
|
||||
- tickets.controller.ts
|
||||
- Button.tsx
|
||||
- ProductsService
|
||||
- SettingsService
|
||||
- devDependencies
|
||||
- ReviewsService
|
||||
- CreateReviewDto
|
||||
- MediaSelector.tsx
|
||||
- index.ts
|
||||
- app-audit-verification.e2e-spec.js
|
||||
@ -34,10 +34,10 @@
|
||||
- DoctorQueryDto
|
||||
- schema.ts
|
||||
- JwtAuthGuard
|
||||
- ProductsController
|
||||
- ProductsService
|
||||
- CreateVideoDto
|
||||
- admin.module.ts
|
||||
- FeaturedProducts.tsx
|
||||
- ReportsController
|
||||
- components/Skeleton.tsx
|
||||
- MenuService
|
||||
- BE-001
|
||||
- FE-001
|
||||
@ -49,41 +49,41 @@
|
||||
- DOC-001
|
||||
- adminRoutes.tsx
|
||||
- WholesaleApplyDto
|
||||
- B2BService
|
||||
- B2BController
|
||||
- AuthController
|
||||
- FaqService
|
||||
- راهنمای تست سیستم (Software Testing)
|
||||
- Button
|
||||
- Transactions.tsx
|
||||
- CategoriesController
|
||||
- MediaController
|
||||
- What You Must Do When Invoked
|
||||
- SslController
|
||||
- BannersService
|
||||
- TestimonialsService
|
||||
- BannersController
|
||||
- TestimonialsController
|
||||
- What You Must Do When Invoked
|
||||
- 20260526145407_init/migration.sql
|
||||
- IngredientsService
|
||||
- UsersService
|
||||
- IngredientsController
|
||||
- UsersController
|
||||
- devDependencies
|
||||
- devDependencies
|
||||
- BlogsController
|
||||
- PrescriptionsService
|
||||
- SmartAdvisorService
|
||||
- Reports.tsx
|
||||
- Modal.tsx
|
||||
- UITexts.tsx
|
||||
- Orders.tsx
|
||||
- Role & Core Objective
|
||||
- ContactService
|
||||
- ContactController
|
||||
- compilerOptions
|
||||
- PaymentService
|
||||
- AdminTransactionFilterDto
|
||||
- RouteErrorBoundary
|
||||
- usePetStore
|
||||
- SmsService
|
||||
- dependencies
|
||||
- compilerOptions
|
||||
- BlogsService
|
||||
- AdminQueryDto
|
||||
- ApiOperation
|
||||
- PetsController
|
||||
- UserDashboard.tsx
|
||||
- lib/services/api.ts
|
||||
- Required Review Group Closures
|
||||
- compilerOptions
|
||||
- getPageMetadata
|
||||
@ -100,15 +100,15 @@
|
||||
- scripts
|
||||
- dependencies
|
||||
- Role & Core Objective
|
||||
- useSettingsStore
|
||||
- trust-seals/page.tsx
|
||||
- zibal.service.ts
|
||||
- dependencies
|
||||
- CreateEBankCheckoutDto
|
||||
- seed-products.ts
|
||||
- CreateReviewDto
|
||||
- users.service.ts
|
||||
- Reconciled Audit Roles & Assignments
|
||||
- OrdersService
|
||||
- lib/services/api.ts
|
||||
- useSettingsStore
|
||||
- Phase 3.1 — Human Review Preparation and Master Backlog Critique
|
||||
- wiki/[slug]/page.tsx
|
||||
- compilerOptions
|
||||
@ -121,7 +121,7 @@
|
||||
- Comprehensive Change Log
|
||||
- Coupons.tsx
|
||||
- Operational Rules & Boundaries
|
||||
- MetricsController
|
||||
- auth.service.ts
|
||||
- PaginationDto
|
||||
- PrismaService
|
||||
- 1. Summary of Integrity Repairs Performed
|
||||
@ -130,20 +130,20 @@
|
||||
- Operational Rules & Boundaries
|
||||
- RegisterDto
|
||||
- AppService
|
||||
- VerifyOtpDto
|
||||
- Blogs.tsx
|
||||
- Vazirmatn Changelog
|
||||
- Vazirmatn Font فونت وزیرمتن
|
||||
- Operational Rules & Boundaries
|
||||
- compilerOptions
|
||||
- compilerOptions
|
||||
- backend/README.md
|
||||
- ApiOperation
|
||||
- auth.service.ts
|
||||
- AdminController
|
||||
- AuthService
|
||||
- Repository Map
|
||||
- validate_integrity.js
|
||||
- admin-panel/package.json
|
||||
- Sahel-Font
|
||||
- AdminController
|
||||
- Body
|
||||
- auth.controller.ts
|
||||
- Sahel-Font
|
||||
- Role & Core Objective
|
||||
@ -159,11 +159,11 @@
|
||||
- application/package.json
|
||||
- start-dev.js
|
||||
- generate-openapi.js
|
||||
- reviews.controller.ts
|
||||
- admin.service.ts
|
||||
- VetGallery.tsx
|
||||
- ProductDto
|
||||
- System Discovery
|
||||
- ArchivePage.tsx
|
||||
- CreateUserDto
|
||||
- HomeController
|
||||
- admin.service.ts
|
||||
- SmsSettingsPage.tsx
|
||||
- Product Requirement Document (PRD)
|
||||
- class-transformer
|
||||
@ -191,14 +191,14 @@
|
||||
- rebuild_honest_ledger.js
|
||||
- validate_evidence_grade.js
|
||||
- @nestjs/core
|
||||
- SendOtpDto
|
||||
- auth.module.ts
|
||||
- نقشه جامع پوشش تستهای سرتاسری (E2E Test Coverage Map) — پروژه Canina
|
||||
- @nestjs/jwt
|
||||
- API Contract Specification
|
||||
- ⚙️ Backend Technical Review (05_dev_backend)
|
||||
- 🎨 Frontend & Admin Panel Technical Review (06_dev_frontend)
|
||||
- 🚀 SEO & Content Strategy Review (12_seo_content)
|
||||
- UpdateReviewDto
|
||||
- CheckoutPage.tsx
|
||||
- @eslint/eslintrc
|
||||
- seed-ui-texts.ts
|
||||
- seed-wiki.ts
|
||||
@ -211,7 +211,7 @@
|
||||
- Raw Finding Verification & Disposition Report
|
||||
- React + TypeScript + Vite
|
||||
- Select.tsx
|
||||
- catalog/page.tsx
|
||||
- UsersService
|
||||
- @nestjs/throttler
|
||||
- passport
|
||||
- application/README.md
|
||||
@ -245,12 +245,12 @@
|
||||
- rules/graphify.md
|
||||
- .agents/workflows/graphify.md
|
||||
- instructions.md
|
||||
- RevalidationService
|
||||
- WikiController
|
||||
- helmet
|
||||
- tailwindcss
|
||||
- @nestjs/schematics
|
||||
- @nestjs/testing
|
||||
- @nestjs/swagger
|
||||
- BlogsService
|
||||
- source-map-support
|
||||
- ts-jest
|
||||
- ts-loader
|
||||
@ -321,7 +321,15 @@
|
||||
- eslint-config-prettier
|
||||
- eslint
|
||||
- @types/react-dom
|
||||
- SmsLogQueryDto
|
||||
- eslint-plugin-react-refresh
|
||||
- WikiService
|
||||
- B2BService
|
||||
- track/page.tsx
|
||||
- PodcastPlayerModal.tsx
|
||||
- app.e2e-spec.js
|
||||
- app/page.tsx
|
||||
- bcrypt
|
||||
|
||||
## God Nodes (most connected - your core abstractions)
|
||||
1. `Roles()` - 106 edges
|
||||
@ -340,39 +348,39 @@
|
||||
docs/02-user-guide.md → backend/uploads/1781288429353-508765350.jpg
|
||||
- `AuthController` --references--> `ApiResponse` [EXTRACTED]
|
||||
backend/src/auth/auth.controller.ts → frontend/admin-panel/src/types/admin.ts
|
||||
- `BlogsController` --references--> `ApiResponse` [EXTRACTED]
|
||||
backend/src/blogs/blogs.controller.ts → frontend/admin-panel/src/types/admin.ts
|
||||
- `HomeController` --references--> `ApiResponse` [EXTRACTED]
|
||||
backend/src/home/home.controller.ts → frontend/admin-panel/src/types/admin.ts
|
||||
- `OrdersController` --references--> `ApiResponse` [EXTRACTED]
|
||||
backend/src/orders/orders.controller.ts → frontend/admin-panel/src/types/admin.ts
|
||||
- `PetsController` --references--> `ApiResponse` [EXTRACTED]
|
||||
backend/src/pets/pets.controller.ts → frontend/admin-panel/src/types/admin.ts
|
||||
- `ProductsController` --references--> `ApiResponse` [EXTRACTED]
|
||||
backend/src/products/products.controller.ts → frontend/admin-panel/src/types/admin.ts
|
||||
|
||||
## Import Cycles
|
||||
- 3-file cycle: `frontend/application/lib/services/api.ts -> frontend/application/lib/store/userStore.ts -> frontend/application/lib/services/authService.ts -> frontend/application/lib/services/api.ts`
|
||||
- 3-file cycle: `frontend/application/lib/services/api.ts -> frontend/application/lib/store/userStore.ts -> frontend/application/lib/store/cartStore.ts -> frontend/application/lib/services/api.ts`
|
||||
- 3-file cycle: `frontend/application/lib/services/api.ts -> frontend/application/lib/store/userStore.ts -> frontend/application/lib/services/authService.ts -> frontend/application/lib/services/api.ts`
|
||||
- 4-file cycle: `frontend/application/lib/services/api.ts -> frontend/application/lib/store/userStore.ts -> frontend/application/lib/store/cartStore.ts -> frontend/application/lib/services/orderService.ts -> frontend/application/lib/services/api.ts`
|
||||
|
||||
## Communities (327 total, 119 thin omitted)
|
||||
## Communities (335 total, 122 thin omitted)
|
||||
|
||||
### Community 0 - "Roles"
|
||||
Cohesion: 0.24
|
||||
Nodes (13): Roles(), PaymentController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Get (+5 more)
|
||||
|
||||
### Community 1 - "app.module.ts"
|
||||
Cohesion: 0.05
|
||||
Nodes (42): B2BModule, Module, BannersModule, Module, CmsModule, Module, SmsModule, Global (+34 more)
|
||||
Cohesion: 0.06
|
||||
Nodes (40): B2BModule, Module, BannersModule, Module, CmsModule, Module, SmsModule, Global (+32 more)
|
||||
|
||||
### Community 2 - "SmsService"
|
||||
Cohesion: 0.05
|
||||
Nodes (26): SmsService, Injectable, SmsLogQueryDto, ApiPropertyOptional, IsIn, IsNumber, IsOptional, IsString (+18 more)
|
||||
### Community 2 - "SettingsController"
|
||||
Cohesion: 0.16
|
||||
Nodes (15): SettingsController, ApiBearerAuth, ApiOkResponse, ApiOperation, ApiTags, Body, Controller, Delete (+7 more)
|
||||
|
||||
### Community 3 - "ProductService"
|
||||
Cohesion: 0.06
|
||||
Nodes (34): dynamic, revalidate, DEFAULT_CATEGORIES, dynamic, revalidate, dynamic, revalidate, BlogCategory (+26 more)
|
||||
|
||||
### Community 4 - "ProductPage.tsx"
|
||||
Cohesion: 0.06
|
||||
Nodes (34): BlogPostClientProps, OrderDetailsModalProps, PLAYBACK_RATES, PodcastInlinePlayer(), PodcastInlinePlayerProps, PLAYBACK_RATES, PodcastPlayerModal(), PodcastPlayerModalProps (+26 more)
|
||||
Cohesion: 0.12
|
||||
Nodes (16): PLAYBACK_RATES, PodcastInlinePlayer(), PodcastInlinePlayerProps, ProductImageZoomModalProps, CalculatorState, GalleryMediaItem, ICON_MAP, isVideoUrl() (+8 more)
|
||||
|
||||
### Community 5 - "CmsController"
|
||||
Cohesion: 0.09
|
||||
@ -383,40 +391,36 @@ Cohesion: 0.09
|
||||
Nodes (29): AdminUpdateTicketDto, CreateTicketDto, ReplyTicketDto, ApiProperty, ApiPropertyOptional, IsNotEmpty, IsOptional, IsString (+21 more)
|
||||
|
||||
### Community 7 - "Button.tsx"
|
||||
Cohesion: 0.08
|
||||
Nodes (20): ButtonProps, ButtonSize, ButtonVariant, Spinner(), FAQ, MENU_TABS, MenuItem, MenuType (+12 more)
|
||||
|
||||
### Community 8 - "ProductsService"
|
||||
Cohesion: 0.19
|
||||
Nodes (10): GetProductsDto, ApiPropertyOptional, IsEnum, IsOptional, IsString, Query, ProductsModule, Module (+2 more)
|
||||
Cohesion: 0.12
|
||||
Nodes (14): Button(), ButtonProps, ButtonSize, ButtonVariant, Spinner(), FAQ, BlogCommentItem, ProductReview (+6 more)
|
||||
|
||||
### Community 9 - "devDependencies"
|
||||
Cohesion: 0.22
|
||||
Nodes (9): devDependencies, prisma, @types/bcryptjs, @types/node, typescript, @types/node, typescript, prisma (+1 more)
|
||||
|
||||
### Community 10 - "ReviewsService"
|
||||
Cohesion: 0.12
|
||||
Nodes (17): ReviewsController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+9 more)
|
||||
### Community 10 - "CreateReviewDto"
|
||||
Cohesion: 0.09
|
||||
Nodes (23): CreateReviewDto, ApiProperty, IsInt, IsNotEmpty, IsOptional, IsString, Min, ReviewsController (+15 more)
|
||||
|
||||
### Community 11 - "MediaSelector.tsx"
|
||||
Cohesion: 0.07
|
||||
Nodes (36): ConfirmModal(), ConfirmModalProps, getFileType(), Media, MediaSelector(), MediaSelectorProps, maxWidthClasses, Modal() (+28 more)
|
||||
Cohesion: 0.06
|
||||
Nodes (35): ConfirmModal(), ConfirmModalProps, ImagePreviewModal(), ImagePreviewModalProps, getFileType(), Media, MediaSelector(), MediaSelectorProps (+27 more)
|
||||
|
||||
### Community 12 - "index.ts"
|
||||
Cohesion: 0.06
|
||||
Nodes (24): backend, frontend, playwright.config.ts, @playwright/test, tests/**/*.ts, authFile, test, compilerOptions (+16 more)
|
||||
|
||||
### Community 13 - "app-audit-verification.e2e-spec.js"
|
||||
Cohesion: 0.06
|
||||
Nodes (28): AppModule, Module, EnvironmentVariables, IsNotEmpty, IsOptional, IsString, validateEnv(), CustomHttpExceptionFilter (+20 more)
|
||||
Cohesion: 0.07
|
||||
Nodes (26): EnvironmentVariables, IsNotEmpty, IsOptional, IsString, validateEnv(), CustomHttpExceptionFilter, Catch, PrismaExceptionFilter (+18 more)
|
||||
|
||||
### Community 14 - "userStore.ts"
|
||||
Cohesion: 0.07
|
||||
Nodes (33): AuthModal, LoginModal, metadata, AuthModal(), AuthModalProps, extractOtpFromText(), Header(), MENU_ICONS (+25 more)
|
||||
Nodes (30): AuthModal, B2BPortal, CartDrawer, ClientLayout(), LoginModal, metadata, AuthModal(), AuthModalProps (+22 more)
|
||||
|
||||
### Community 15 - "src/services/api.ts"
|
||||
Cohesion: 0.07
|
||||
Nodes (35): Layout(), ProtectedRoute(), MenuGroup, Sidebar(), SidebarProps, SubMenuItem, LiveMonitoringSummary, SEARCHABLE_PAGES (+27 more)
|
||||
Cohesion: 0.08
|
||||
Nodes (31): Layout(), ProtectedRoute(), MenuGroup, Sidebar(), SidebarProps, SubMenuItem, LiveMonitoringSummary, SEARCHABLE_PAGES (+23 more)
|
||||
|
||||
### Community 16 - "DoctorQueryDto"
|
||||
Cohesion: 0.09
|
||||
@ -428,23 +432,23 @@ Nodes (18): B2BPage(), generateMetadata(), ContactPage(), generateMetadata(), ge
|
||||
|
||||
### Community 18 - "JwtAuthGuard"
|
||||
Cohesion: 0.16
|
||||
Nodes (8): JwtAuthGuard, Injectable, B2BWholesaleOrderItem, ROLES_KEY, RequestWithUser, RolesGuard, Injectable, UserReqPayload
|
||||
Nodes (7): JwtAuthGuard, Injectable, ROLES_KEY, RequestWithUser, RolesGuard, Injectable, UserReqPayload
|
||||
|
||||
### Community 19 - "ProductsController"
|
||||
Cohesion: 0.16
|
||||
Nodes (9): ProductsController, ApiOperation, ApiTags, Body, Controller, Get, Param, Patch (+1 more)
|
||||
### Community 19 - "ProductsService"
|
||||
Cohesion: 0.10
|
||||
Nodes (19): GetProductsDto, ApiPropertyOptional, IsEnum, IsOptional, IsString, ProductsController, ApiOperation, ApiTags (+11 more)
|
||||
|
||||
### Community 20 - "CreateVideoDto"
|
||||
Cohesion: 0.09
|
||||
Nodes (24): CreateVideoDto, ApiProperty, ApiPropertyOptional, IsBoolean, IsNotEmpty, IsOptional, IsString, UpdateVideoDto (+16 more)
|
||||
|
||||
### Community 21 - "admin.module.ts"
|
||||
Cohesion: 0.07
|
||||
Nodes (19): AdminModule, Module, MediaService, Injectable, ReportsController, ApiBearerAuth, ApiOperation, ApiQuery (+11 more)
|
||||
|
||||
### Community 22 - "FeaturedProducts.tsx"
|
||||
### Community 21 - "ReportsController"
|
||||
Cohesion: 0.14
|
||||
Nodes (9): FeaturedProducts(), ProductCard(), OrderRowSkeleton(), PetProfileSkeleton(), ProductCardSkeleton(), Skeleton(), SkeletonProps, mockProducts (+1 more)
|
||||
Nodes (11): ReportsController, ApiBearerAuth, ApiOperation, ApiQuery, ApiTags, Controller, Get, Query (+3 more)
|
||||
|
||||
### Community 22 - "components/Skeleton.tsx"
|
||||
Cohesion: 0.21
|
||||
Nodes (5): OrderRowSkeleton(), PetProfileSkeleton(), ProductCardSkeleton(), Skeleton(), SkeletonProps
|
||||
|
||||
### Community 23 - "MenuService"
|
||||
Cohesion: 0.12
|
||||
@ -484,18 +488,18 @@ Nodes (31): Acceptance Criteria, Affected Application, Affected Files, Alternati
|
||||
|
||||
### Community 32 - "adminRoutes.tsx"
|
||||
Cohesion: 0.06
|
||||
Nodes (26): App(), ContactInfoItem, ContactSubmission, CategoryDist, DashboardData, Ticket, TicketMessage, WholesaleRequest (+18 more)
|
||||
Nodes (24): App(), Props, RouteErrorBoundary, State, HeroBanner, VetTestimonial, BestSellerItem, CategoryDistItem (+16 more)
|
||||
|
||||
### Community 33 - "WholesaleApplyDto"
|
||||
Cohesion: 0.10
|
||||
Nodes (20): ApiProperty, ApiPropertyOptional, IsNotEmpty, IsOptional, IsString, WholesaleApplyDto, ApiBearerAuth, ApiOperation (+12 more)
|
||||
|
||||
### Community 34 - "B2BService"
|
||||
Cohesion: 0.13
|
||||
Nodes (15): B2BController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Get, Param (+7 more)
|
||||
### Community 34 - "B2BController"
|
||||
Cohesion: 0.14
|
||||
Nodes (13): B2BController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Get, Param (+5 more)
|
||||
|
||||
### Community 35 - "AuthController"
|
||||
Cohesion: 0.23
|
||||
Cohesion: 0.25
|
||||
Nodes (13): AuthController, ApiBadRequestResponse, ApiBearerAuth, ApiOkResponse, ApiOperation, ApiTags, Body, Controller (+5 more)
|
||||
|
||||
### Community 36 - "FaqService"
|
||||
@ -506,13 +510,13 @@ Nodes (14): FaqController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controlle
|
||||
Cohesion: 0.07
|
||||
Nodes (25): اجرای بکاند, اجرای فرانتاند, اجرای پروژه در سرور با PM2, برای راهاندازی بکاند:, برای راهاندازی فرانتاند Next.js:, بیلد کردن پروژه (Building), ذخیره پروسهها تا پس از ریاستارت سرور قطع نشوند:, راهاندازی و انتشار سیستم (Setup & Deployment) (+17 more)
|
||||
|
||||
### Community 38 - "Button"
|
||||
Cohesion: 0.16
|
||||
Nodes (13): TransactionReceiptData, TransactionReceiptModal(), TransactionReceiptModalProps, Button(), ThSort(), ThSortProps, GatewayHealth, Stats (+5 more)
|
||||
### Community 38 - "Transactions.tsx"
|
||||
Cohesion: 0.10
|
||||
Nodes (19): TransactionReceiptData, TransactionReceiptModal(), TransactionReceiptModalProps, Badge(), BadgeProps, BadgeVariant, variantStyles, ThSort() (+11 more)
|
||||
|
||||
### Community 39 - "CategoriesController"
|
||||
Cohesion: 0.09
|
||||
Nodes (17): CategoriesController, ApiBearerAuth, ApiOperation, ApiQuery, ApiTags, Body, Controller, Delete (+9 more)
|
||||
Cohesion: 0.10
|
||||
Nodes (16): CategoriesController, ApiBearerAuth, ApiOperation, ApiQuery, ApiTags, Body, Controller, Delete (+8 more)
|
||||
|
||||
### Community 40 - "MediaController"
|
||||
Cohesion: 0.11
|
||||
@ -526,13 +530,13 @@ Nodes (26): For /graphify add and --watch, For /graphify query, For the commit h
|
||||
Cohesion: 0.13
|
||||
Nodes (14): SslController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Get, Post (+6 more)
|
||||
|
||||
### Community 43 - "BannersService"
|
||||
### Community 43 - "BannersController"
|
||||
Cohesion: 0.13
|
||||
Nodes (15): BannersController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+7 more)
|
||||
Nodes (13): BannersController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+5 more)
|
||||
|
||||
### Community 44 - "TestimonialsService"
|
||||
### Community 44 - "TestimonialsController"
|
||||
Cohesion: 0.13
|
||||
Nodes (14): TestimonialsController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+6 more)
|
||||
Nodes (12): TestimonialsController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+4 more)
|
||||
|
||||
### Community 45 - "What You Must Do When Invoked"
|
||||
Cohesion: 0.07
|
||||
@ -542,13 +546,13 @@ Nodes (26): For /graphify add and --watch, For /graphify query, For the commit h
|
||||
Cohesion: 0.27
|
||||
Nodes (14): "coupons", "health_logs", "order_items", "orders", "pet_medical_conditions", "pets", "product_ingredients", "product_symptoms" (+6 more)
|
||||
|
||||
### Community 47 - "IngredientsService"
|
||||
### Community 47 - "IngredientsController"
|
||||
Cohesion: 0.13
|
||||
Nodes (14): IngredientsController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+6 more)
|
||||
Nodes (12): IngredientsController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+4 more)
|
||||
|
||||
### Community 48 - "UsersService"
|
||||
Cohesion: 0.06
|
||||
Nodes (41): DEFAULT_JWT_REFRESH_SECRET, DEFAULT_JWT_SECRET, getJwtSecret(), AuthModule, Module, JwtPayload, JwtStrategy, Injectable (+33 more)
|
||||
### Community 48 - "UsersController"
|
||||
Cohesion: 0.21
|
||||
Nodes (16): ApiBadRequestResponse, ApiBearerAuth, ApiCreatedResponse, ApiOkResponse, ApiOperation, ApiTags, Body, Controller (+8 more)
|
||||
|
||||
### Community 49 - "devDependencies"
|
||||
Cohesion: 0.11
|
||||
@ -570,13 +574,13 @@ Nodes (14): PrescriptionsController, ApiBearerAuth, ApiOperation, ApiTags, Body,
|
||||
Cohesion: 0.13
|
||||
Nodes (14): SmartAdvisorController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+6 more)
|
||||
|
||||
### Community 54 - "Reports.tsx"
|
||||
Cohesion: 0.20
|
||||
Nodes (7): BestSellerItem, CategoryDistItem, COLORS, CustomTooltipProps, ReportData, TopCouponItem, Reports
|
||||
### Community 54 - "Modal.tsx"
|
||||
Cohesion: 0.10
|
||||
Nodes (14): maxWidthClasses, Modal(), ModalProps, ContactInfoItem, ContactSubmission, MENU_TABS, MenuItem, MenuType (+6 more)
|
||||
|
||||
### Community 55 - "UITexts.tsx"
|
||||
Cohesion: 0.07
|
||||
Nodes (24): Badge(), BadgeProps, BadgeVariant, variantStyles, ICON_REGISTRY, IconPickerModal(), IconPickerModalProps, ImagePreviewModal() (+16 more)
|
||||
Cohesion: 0.12
|
||||
Nodes (15): ICON_REGISTRY, IconPickerModal(), IconPickerModalProps, ToggleSwitch(), ToggleSwitchProps, AppSitePage, PageSection, SectionField (+7 more)
|
||||
|
||||
### Community 56 - "Orders.tsx"
|
||||
Cohesion: 0.11
|
||||
@ -586,41 +590,45 @@ Nodes (15): Skeleton(), MonitoringStats, getPaymentMethodLabel(), Order, ORDER_S
|
||||
Cohesion: 0.09
|
||||
Nodes (22): CREATE MODE — Normal Operation, Expected JSON Output Schema, File Scope Boundary, Forbidden Actions, MODE 1: REVIEW (called during Review Phase), MODE 2: CONTENT CREATION (standalone task from backlog), Operating Modes, Operational Rules & Boundaries (+14 more)
|
||||
|
||||
### Community 58 - "ContactService"
|
||||
### Community 58 - "ContactController"
|
||||
Cohesion: 0.13
|
||||
Nodes (12): ContactController, Body, Controller, Get, Param, Post, Put, Query (+4 more)
|
||||
Nodes (10): ContactController, Body, Controller, Get, Param, Post, Put, Query (+2 more)
|
||||
|
||||
### Community 59 - "compilerOptions"
|
||||
Cohesion: 0.06
|
||||
Nodes (30): compilerOptions, allowSyntheticDefaultImports, baseUrl, declaration, emitDecoratorMetadata, esModuleInterop, experimentalDecorators, forceConsistentCasingInFileNames (+22 more)
|
||||
|
||||
### Community 61 - "AdminTransactionFilterDto"
|
||||
Cohesion: 0.25
|
||||
Nodes (7): AdminTransactionFilterDto, ApiPropertyOptional, IsIn, IsNumber, IsOptional, IsString, Type
|
||||
### Community 60 - "PaymentService"
|
||||
Cohesion: 0.11
|
||||
Nodes (9): AdminTransactionFilterDto, ApiPropertyOptional, IsIn, IsNumber, IsOptional, IsString, Type, PaymentService (+1 more)
|
||||
|
||||
### Community 62 - "RouteErrorBoundary"
|
||||
Cohesion: 0.22
|
||||
Nodes (3): Props, RouteErrorBoundary, State
|
||||
### Community 61 - "usePetStore"
|
||||
Cohesion: 0.14
|
||||
Nodes (14): FeaturedProducts(), ProductCard(), OrderSuccess(), PrescriptionUploadModal(), PrescriptionUploadModalProps, SearchResultsPage(), mockProducts, mockPush (+6 more)
|
||||
|
||||
### Community 63 - "dependencies"
|
||||
Cohesion: 0.09
|
||||
Nodes (23): dependencies, bcrypt, bcryptjs, class-validator, compression, ioredis, @nestjs/common, @nestjs/passport (+15 more)
|
||||
Nodes (23): dependencies, bcryptjs, class-validator, compression, ioredis, @nestjs/common, @nestjs/passport, @nestjs/platform-express (+15 more)
|
||||
|
||||
### Community 64 - "compilerOptions"
|
||||
Cohesion: 0.10
|
||||
Nodes (20): compilerOptions, allowImportingTsExtensions, erasableSyntaxOnly, lib, module, moduleDetection, moduleResolution, noEmit (+12 more)
|
||||
|
||||
### Community 66 - "AdminQueryDto"
|
||||
Cohesion: 0.21
|
||||
Nodes (6): ApiQuery, Query, AdminQueryDto, ApiPropertyOptional, IsOptional, IsString
|
||||
### Community 65 - "BlogsService"
|
||||
Cohesion: 0.06
|
||||
Nodes (14): BlogsService, Injectable, RevalidationModule, Global, Module, RevalidationService, Injectable, ApiProperty (+6 more)
|
||||
|
||||
### Community 66 - "ApiOperation"
|
||||
Cohesion: 0.12
|
||||
Nodes (8): ApiOperation, ApiQuery, Get, Query, AdminQueryDto, ApiPropertyOptional, IsOptional, IsString
|
||||
|
||||
### Community 67 - "PetsController"
|
||||
Cohesion: 0.10
|
||||
Nodes (14): PetsController, ApiBearerAuth, ApiOperation, ApiQuery, ApiTags, Controller, Delete, Get (+6 more)
|
||||
|
||||
### Community 68 - "UserDashboard.tsx"
|
||||
Cohesion: 0.11
|
||||
Nodes (28): VerifyContent(), AddressFormData, AddressModal(), AddressModalProps, normalizeDigits(), validateAddressForm(), B2BPortal(), BackButton() (+20 more)
|
||||
Nodes (13): PetsController, ApiBearerAuth, ApiOperation, ApiQuery, ApiTags, Controller, Delete, Get (+5 more)
|
||||
|
||||
### Community 68 - "lib/services/api.ts"
|
||||
Cohesion: 0.09
|
||||
Nodes (31): VerifyContent(), B2BPortal(), BlogPostClientProps, BlogPost, BlogPreviewSection(), ContactInfoItem, HeaderButton(), HeaderButtonProps (+23 more)
|
||||
|
||||
### Community 69 - "Required Review Group Closures"
|
||||
Cohesion: 0.10
|
||||
@ -632,7 +640,7 @@ Nodes (23): compilerOptions, allowImportingTsExtensions, erasableSyntaxOnly, jsx
|
||||
|
||||
### Community 71 - "getPageMetadata"
|
||||
Cohesion: 0.09
|
||||
Nodes (15): generateMetadata(), generateMetadata(), generateMetadata(), generateMetadata(), generateMetadata(), generateMetadata(), generateMetadata(), generateMetadata() (+7 more)
|
||||
Nodes (14): generateMetadata(), CatalogClient(), generateMetadata(), generateMetadata(), generateMetadata(), generateMetadata(), generateMetadata(), generateMetadata() (+6 more)
|
||||
|
||||
### Community 72 - "Operational Rules & Boundaries"
|
||||
Cohesion: 0.11
|
||||
@ -651,8 +659,8 @@ Cohesion: 0.05
|
||||
Nodes (47): CreateHealthLogDto, ApiProperty, ApiPropertyOptional, IsNotEmpty, IsOptional, IsString, CreatePetDto, ApiProperty (+39 more)
|
||||
|
||||
### Community 76 - "AdminService"
|
||||
Cohesion: 0.13
|
||||
Nodes (5): Delete, Param, Put, AdminService, Injectable
|
||||
Cohesion: 0.20
|
||||
Nodes (4): Delete, Param, AdminService, Injectable
|
||||
|
||||
### Community 77 - "seo.module.ts"
|
||||
Cohesion: 0.16
|
||||
@ -686,10 +694,6 @@ Nodes (21): dependencies, axios, lucide-react, react, react-dom, react-hot-toast
|
||||
Cohesion: 0.12
|
||||
Nodes (16): 1. Active Secret Scanning (All Modified Files), 2. Docker Container Verification (if Dockerfile exists), 3. CI/CD Basic Check (if `.github/workflows/` exists), 4. Failure Routing Protocol, 5. Forbidden Actions, ENFORCE MODE — Normal Operation, Expected JSON Output Schema, Operational Rules & Boundaries (+8 more)
|
||||
|
||||
### Community 85 - "useSettingsStore"
|
||||
Cohesion: 0.14
|
||||
Nodes (16): B2BPortal, CartDrawer, ClientLayout(), B2BLandingClient(), BrandLogo(), BrandLogoProps, EnamadBadge(), Footer() (+8 more)
|
||||
|
||||
### Community 86 - "zibal.service.ts"
|
||||
Cohesion: 0.16
|
||||
Nodes (9): GatewayHealthResult, IPaymentGateway, PaymentInquiryResult, PaymentRequestOptions, PaymentRequestResult, PaymentVerifyResult, ZibalInquiryResponse, ZibalRequestResponse (+1 more)
|
||||
@ -706,21 +710,21 @@ Nodes (8): CreateEBankCheckoutDto, ApiProperty, ApiPropertyOptional, IsNotEmpty,
|
||||
Cohesion: 0.17
|
||||
Nodes (12): prisma, main(), prisma, determineSuitableFor(), findOrCreateCategory(), getProductImageUrl(), main(), parseSize() (+4 more)
|
||||
|
||||
### Community 90 - "CreateReviewDto"
|
||||
Cohesion: 0.25
|
||||
Nodes (8): CreateReviewDto, ApiProperty, IsInt, IsNotEmpty, IsOptional, IsString, Min, Max
|
||||
### Community 90 - "users.service.ts"
|
||||
Cohesion: 0.13
|
||||
Nodes (14): AddressDto, ApiProperty, ApiPropertyOptional, IsBoolean, IsNotEmpty, IsOptional, IsString, ApiPropertyOptional (+6 more)
|
||||
|
||||
### Community 91 - "Reconciled Audit Roles & Assignments"
|
||||
Cohesion: 0.12
|
||||
Nodes (15): 10. Documentation Engineer, 1. Lead Architect / Orchestrator, 2. React / Vite Storefront Auditor, 3. NestJS Backend Auditor, 4. Admin Features Auditor, 5. Database & Data Integrity Auditor, 6. Security Auditor, 7. TypeScript & Code Quality Auditor (+7 more)
|
||||
|
||||
### Community 92 - "OrdersService"
|
||||
Cohesion: 0.07
|
||||
Cohesion: 0.06
|
||||
Nodes (35): CreateOrderDto, OrderItemDto, ApiProperty, ApiPropertyOptional, IsArray, IsNotEmpty, IsNumber, IsOptional (+27 more)
|
||||
|
||||
### Community 93 - "lib/services/api.ts"
|
||||
Cohesion: 0.07
|
||||
Nodes (25): HomeClient(), HomeClientProps, getHomeData(), Home(), BlogPost, BlogPreviewSection(), ContactInfoItem, FAQItem (+17 more)
|
||||
### Community 93 - "useSettingsStore"
|
||||
Cohesion: 0.08
|
||||
Nodes (33): HomeClient(), HomeClientProps, ArchivePage(), ArchiveProductCard(), CATEGORY_MAP, ICON_MAP, B2BLandingClient(), BannerPlacement() (+25 more)
|
||||
|
||||
### Community 94 - "Phase 3.1 — Human Review Preparation and Master Backlog Critique"
|
||||
Cohesion: 0.13
|
||||
@ -743,8 +747,8 @@ Cohesion: 0.13
|
||||
Nodes (15): scripts, build, build:nest, docs:generate, lint, seo:backfill, start, start:debug (+7 more)
|
||||
|
||||
### Community 99 - "BlogsController"
|
||||
Cohesion: 0.06
|
||||
Nodes (32): BlogsController, ApiNotFoundResponse, ApiOkResponse, ApiOperation, ApiTags, Body, Controller, Get (+24 more)
|
||||
Cohesion: 0.18
|
||||
Nodes (12): BlogsController, ApiNotFoundResponse, ApiOkResponse, ApiOperation, ApiTags, Body, Controller, Get (+4 more)
|
||||
|
||||
### Community 100 - "Deep Audit Summary Report"
|
||||
Cohesion: 0.14
|
||||
@ -763,24 +767,24 @@ Cohesion: 0.15
|
||||
Nodes (12): 10. `TASK-VERIFY-001`, 1. `TASK-SEC-001`, 2. `TASK-SEC-002`, 3. `TASK-SEC-003`, 4. `TASK-FIN-001`, 5. `TASK-BUILD-001`, 6. `TASK-AUTH-001`, 7. `TASK-FE-001` (+4 more)
|
||||
|
||||
### Community 104 - "Coupons.tsx"
|
||||
Cohesion: 0.13
|
||||
Nodes (12): formatPriceWithCommas(), PriceInput(), PriceInputProps, toEnglishDigits(), Coupon, CouponFormData, CouponModalProps, CouponTarget (+4 more)
|
||||
Cohesion: 0.15
|
||||
Nodes (11): formatPriceWithCommas(), PriceInput(), PriceInputProps, toEnglishDigits(), Coupon, CouponFormData, CouponModalProps, CouponTarget (+3 more)
|
||||
|
||||
### Community 105 - "Operational Rules & Boundaries"
|
||||
Cohesion: 0.17
|
||||
Nodes (11): 1. Detect Test Runner from Tech Stack, 2. Execution Output Capture (Mandatory), 3. Acceptance Criteria Verification, 4. Failure Routing Protocol, 5. Success Routing Protocol, 6. Forbidden Actions, Expected JSON Output Schema, Operational Rules & Boundaries (+3 more)
|
||||
|
||||
### Community 106 - "MetricsController"
|
||||
Cohesion: 0.29
|
||||
Nodes (5): ApiExcludeController, MetricsController, Controller, Get, Res
|
||||
### Community 106 - "auth.service.ts"
|
||||
Cohesion: 0.07
|
||||
Nodes (15): ApiExcludeController, AppModule, Module, AdminLoginInput, LoginInput, RegisterInput, MetricsController, Controller (+7 more)
|
||||
|
||||
### Community 107 - "PaginationDto"
|
||||
Cohesion: 0.06
|
||||
Nodes (23): BlogsModule, Module, BlogFilterDto, BlogsService, Injectable, PaginationDto, SortOrder, ApiPropertyOptional (+15 more)
|
||||
Cohesion: 0.07
|
||||
Nodes (26): AdminModule, Module, MediaService, Injectable, SslCertInfo, BlogsModule, Module, BlogFilterDto (+18 more)
|
||||
|
||||
### Community 108 - "PrismaService"
|
||||
Cohesion: 0.07
|
||||
Nodes (21): MeliPayamakPattern, MeliPayamakResponse, SendPatternSmsOptions, SmsConfig, SmsLogQuery, CreateContactSubmissionDto, UpdateContactInfoItemDto, MenuType (+13 more)
|
||||
Cohesion: 0.05
|
||||
Nodes (29): CategoryQuery, PetQuery, WikiQuery, BannersService, Injectable, MeliPayamakPattern, MeliPayamakResponse, SendPatternSmsOptions (+21 more)
|
||||
|
||||
### Community 109 - "1. Summary of Integrity Repairs Performed"
|
||||
Cohesion: 0.17
|
||||
@ -806,9 +810,9 @@ Nodes (8): RegisterDto, ApiProperty, ApiPropertyOptional, IsEmail, IsNotEmpty, I
|
||||
Cohesion: 0.29
|
||||
Nodes (5): AppController, Controller, Get, AppService, Injectable
|
||||
|
||||
### Community 115 - "VerifyOtpDto"
|
||||
Cohesion: 0.29
|
||||
Nodes (6): ApiProperty, IsNotEmpty, IsString, Matches, VerifyOtpDto, Length
|
||||
### Community 115 - "Blogs.tsx"
|
||||
Cohesion: 0.12
|
||||
Nodes (14): ActiveStates, PRESET_BG_COLORS, PRESET_COLORS, RichTextEditor(), RichTextEditorProps, AuthorUser, BlogCategory, BlogPost (+6 more)
|
||||
|
||||
### Community 116 - "Vazirmatn Changelog"
|
||||
Cohesion: 0.18
|
||||
@ -834,9 +838,13 @@ Nodes (9): compilerOptions, esModuleInterop, module, moduleResolution, skipLibCh
|
||||
Cohesion: 0.20
|
||||
Nodes (9): Compile and run the project, Deployment, Description, License, Project setup, Resources, Run tests, Stay in touch (+1 more)
|
||||
|
||||
### Community 123 - "auth.service.ts"
|
||||
Cohesion: 0.11
|
||||
Nodes (8): AdminLoginInput, AuthService, LoginInput, RegisterInput, Injectable, normalizeMobile(), RedisService, Injectable
|
||||
### Community 122 - "AdminController"
|
||||
Cohesion: 0.14
|
||||
Nodes (6): AdminController, ApiBearerAuth, ApiTags, Controller, Put, UseGuards
|
||||
|
||||
### Community 123 - "AuthService"
|
||||
Cohesion: 0.19
|
||||
Nodes (3): AuthService, Injectable, normalizeMobile()
|
||||
|
||||
### Community 124 - "Repository Map"
|
||||
Cohesion: 0.20
|
||||
@ -854,13 +862,9 @@ Nodes (9): name, private, scripts, build, dev, lint, preview, type (+1 more)
|
||||
Cohesion: 0.20
|
||||
Nodes (9): Arch Linux, Contributors, Install, Known problems for variable version, License, Sahel-Font, To Do (variable), طریقه استفاده از نسخه متغیر variable (+1 more)
|
||||
|
||||
### Community 128 - "AdminController"
|
||||
Cohesion: 0.16
|
||||
Nodes (7): AdminController, ApiBearerAuth, ApiTags, Body, Controller, Post, UseGuards
|
||||
|
||||
### Community 129 - "auth.controller.ts"
|
||||
Cohesion: 0.16
|
||||
Nodes (11): AdminLoginDto, ApiProperty, IsEmail, IsNotEmpty, IsString, MinLength, LoginDto, ApiProperty (+3 more)
|
||||
Cohesion: 0.09
|
||||
Nodes (22): AdminLoginDto, ApiProperty, IsEmail, IsNotEmpty, IsString, MinLength, LoginDto, ApiProperty (+14 more)
|
||||
|
||||
### Community 130 - "Sahel-Font"
|
||||
Cohesion: 0.20
|
||||
@ -918,21 +922,25 @@ Nodes (7): backend, distMainPath, fs, http, path, { spawn, execSync }, waitForBa
|
||||
Cohesion: 0.25
|
||||
Nodes (6): app_module_1, core_1, fs, path, swagger_1, yaml
|
||||
|
||||
### Community 145 - "admin.service.ts"
|
||||
### Community 144 - "VetGallery.tsx"
|
||||
Cohesion: 0.16
|
||||
Nodes (11): CouponInput, CouponTargetInput, PaginationQuery, ProductDto, ApiPropertyOptional, IsArray, IsBoolean, IsNumber (+3 more)
|
||||
Nodes (12): BackButton(), BackButtonProps, VideoModalPlayer, DisplayVideoItem, FALLBACK_VIDEOS, TestimonialItem, VetGallery(), PLAYBACK_RATES (+4 more)
|
||||
|
||||
### Community 145 - "ProductDto"
|
||||
Cohesion: 0.22
|
||||
Nodes (7): ProductDto, ApiPropertyOptional, IsArray, IsBoolean, IsNumber, IsOptional, IsString
|
||||
|
||||
### Community 146 - "System Discovery"
|
||||
Cohesion: 0.25
|
||||
Nodes (7): Active Core Applications, Current Architecture, Evidence-Based Status Matrix, Excluded / Non-Auditable Artifacts, Major Business Domains Discovered, System Discovery, Technical Architecture Summary
|
||||
|
||||
### Community 147 - "ArchivePage.tsx"
|
||||
Cohesion: 0.14
|
||||
Nodes (14): ArchivePage(), ArchiveProductCard(), CATEGORY_MAP, ICON_MAP, BannerPlacement(), BannerPlacementProps, B2BInquiry, Banner (+6 more)
|
||||
### Community 147 - "HomeController"
|
||||
Cohesion: 0.16
|
||||
Nodes (10): HomeController, ApiOkResponse, ApiOperation, ApiTags, Controller, Get, HomeModule, Module (+2 more)
|
||||
|
||||
### Community 148 - "CreateUserDto"
|
||||
Cohesion: 0.24
|
||||
Nodes (10): CreateUserDto, ApiProperty, ApiPropertyOptional, IsEmail, IsNotEmpty, IsNumber, IsOptional, IsString (+2 more)
|
||||
### Community 148 - "admin.service.ts"
|
||||
Cohesion: 0.17
|
||||
Nodes (14): CouponInput, CouponTargetInput, PaginationQuery, CreateUserDto, ApiProperty, ApiPropertyOptional, IsEmail, IsNotEmpty (+6 more)
|
||||
|
||||
### Community 149 - "SmsSettingsPage.tsx"
|
||||
Cohesion: 0.29
|
||||
@ -943,8 +951,8 @@ Cohesion: 0.29
|
||||
Nodes (6): 1. Executive Vision, 2. Target Audience, 3. Functional Requirements, 4. Non-Functional Requirements (Performance, Security), 5. Epic / Feature Breakdown, Product Requirement Document (PRD)
|
||||
|
||||
### Community 152 - "useCartStore"
|
||||
Cohesion: 0.18
|
||||
Nodes (10): CartDrawer(), DeleteConfirmModal(), DeleteConfirmModalProps, OrderSuccess(), OrderTracking(), mockProduct, CartItem, CartStore (+2 more)
|
||||
Cohesion: 0.12
|
||||
Nodes (12): CartDrawer(), DeleteConfirmModal(), DeleteConfirmModalProps, Header(), mockProduct, ApiErr, Order, OrderItem (+4 more)
|
||||
|
||||
### Community 153 - "exclude"
|
||||
Cohesion: 0.22
|
||||
@ -1026,9 +1034,9 @@ Nodes (4): evidenceList, ledger, mandatoryMap, mandatoryScope
|
||||
Cohesion: 0.40
|
||||
Nodes (4): activeFiles, errors, validationOutput, warnings
|
||||
|
||||
### Community 177 - "SendOtpDto"
|
||||
Cohesion: 0.33
|
||||
Nodes (5): SendOtpDto, ApiProperty, IsNotEmpty, IsString, Matches
|
||||
### Community 177 - "auth.module.ts"
|
||||
Cohesion: 0.17
|
||||
Nodes (10): DEFAULT_JWT_REFRESH_SECRET, DEFAULT_JWT_SECRET, getJwtSecret(), AuthModule, Module, JwtPayload, JwtStrategy, Injectable (+2 more)
|
||||
|
||||
### Community 178 - "نقشه جامع پوشش تستهای سرتاسری (E2E Test Coverage Map) — پروژه Canina"
|
||||
Cohesion: 0.33
|
||||
@ -1050,9 +1058,9 @@ Nodes (3): Architectural Overview, Critical Review Findings & Required Enhanceme
|
||||
Cohesion: 0.50
|
||||
Nodes (3): Overview & Content Foundation, SEO & Content Requirements, 🚀 SEO & Content Strategy Review (12_seo_content)
|
||||
|
||||
### Community 184 - "UpdateReviewDto"
|
||||
Cohesion: 0.33
|
||||
Nodes (5): ApiProperty, IsIn, IsOptional, IsString, UpdateReviewDto
|
||||
### Community 184 - "CheckoutPage.tsx"
|
||||
Cohesion: 0.30
|
||||
Nodes (11): AddressFormData, AddressModal(), AddressModalProps, normalizeDigits(), validateAddressForm(), CheckoutPage(), SearchableSelect(), SearchableSelectProps (+3 more)
|
||||
|
||||
### Community 191 - "graphify reference: add a URL and watch a folder"
|
||||
Cohesion: 0.50
|
||||
@ -1094,9 +1102,9 @@ Nodes (3): ADR-AUTH-001: Admin Panel Authentication Architecture & Token Managem
|
||||
Cohesion: 0.67
|
||||
Nodes (3): Shabnam Font README, Shabnam Font Sample, Vazir Font
|
||||
|
||||
### Community 231 - "RevalidationService"
|
||||
Cohesion: 0.16
|
||||
Nodes (5): RevalidationModule, Global, Module, RevalidationService, Injectable
|
||||
### Community 231 - "WikiController"
|
||||
Cohesion: 0.21
|
||||
Nodes (9): ApiNotFoundResponse, ApiOkResponse, ApiOperation, ApiTags, Controller, Get, Param, Query (+1 more)
|
||||
|
||||
### Community 298 - ".initiateOrderPayment"
|
||||
Cohesion: 0.20
|
||||
@ -1106,25 +1114,45 @@ Nodes (10): ApiPropertyOptional, IsOptional, IsString, ZibalCallbackQueryDto, Ap
|
||||
Cohesion: 0.83
|
||||
Nodes (3): GET(), handleRevalidate(), POST()
|
||||
|
||||
### Community 326 - "SmsLogQueryDto"
|
||||
Cohesion: 0.25
|
||||
Nodes (7): SmsLogQueryDto, ApiPropertyOptional, IsIn, IsNumber, IsOptional, IsString, Type
|
||||
|
||||
### Community 329 - "B2BService"
|
||||
Cohesion: 0.48
|
||||
Nodes (3): B2BService, B2BWholesaleOrderItem, Injectable
|
||||
|
||||
### Community 331 - "PodcastPlayerModal.tsx"
|
||||
Cohesion: 0.40
|
||||
Nodes (3): PLAYBACK_RATES, PodcastPlayerModal(), PodcastPlayerModalProps
|
||||
|
||||
### Community 332 - "app.e2e-spec.js"
|
||||
Cohesion: 0.50
|
||||
Nodes (3): app_module_1, supertest_1, testing_1
|
||||
|
||||
### Community 333 - "app/page.tsx"
|
||||
Cohesion: 0.67
|
||||
Nodes (3): generateMetadata(), getHomeData(), Home()
|
||||
|
||||
## Knowledge Gaps
|
||||
- **1340 isolated node(s):** `$schema`, `collection`, `sourceRoot`, `deleteOutDir`, `name` (+1335 more)
|
||||
- **1341 isolated node(s):** `$schema`, `collection`, `sourceRoot`, `deleteOutDir`, `name` (+1336 more)
|
||||
These have ≤1 connection - possible missing edges or undocumented components.
|
||||
- **119 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
|
||||
- **122 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
|
||||
|
||||
## Suggested Questions
|
||||
_Questions this graph is uniquely positioned to answer:_
|
||||
|
||||
- **Why does `ApiResponse` connect `BlogsController` to `AuthController`, `PetsController`, `src/services/api.ts`, `UsersService`, `ProductsController`, `OrdersService`?**
|
||||
- **Why does `ApiResponse` connect `src/services/api.ts` to `BlogsController`, `AuthController`, `WikiController`, `PetsController`, `UsersController`, `HomeController`, `ProductsService`, `OrdersService`?**
|
||||
_High betweenness centrality (0.080) - this node is a cross-community bridge._
|
||||
- **Why does `Roles()` connect `Roles` to `SmsService`, `CmsController`, `tickets.controller.ts`, `ProductsService`, `ReviewsService`, `reviews.controller.ts`, `JwtAuthGuard`, `ProductsController`, `MenuService`, `WholesaleApplyDto`, `B2BService`, `FaqService`, `SslController`, `BannersService`, `TestimonialsService`, `IngredientsService`, `PrescriptionsService`, `SmartAdvisorService`, `ContactService`?**
|
||||
- **Why does `Roles()` connect `Roles` to `SettingsController`, `CmsController`, `tickets.controller.ts`, `CreateReviewDto`, `JwtAuthGuard`, `ProductsService`, `MenuService`, `WholesaleApplyDto`, `B2BController`, `FaqService`, `SslController`, `BannersController`, `TestimonialsController`, `IngredientsController`, `PrescriptionsService`, `SmartAdvisorService`, `ContactController`, `BlogsService`, `B2BService`?**
|
||||
_High betweenness centrality (0.063) - this node is a cross-community bridge._
|
||||
- **Why does `JwtAuthGuard` connect `JwtAuthGuard` to `auth.controller.ts`, `PetsController`, `CmsController`, `tickets.controller.ts`, `CategoriesController`, `ProductsService`, `PaginationDto`, `PetsController`, `PrismaService`, `DoctorQueryDto`, `admin.service.ts`, `reviews.controller.ts`, `admin.module.ts`, `OrdersService`?**
|
||||
- **Why does `JwtAuthGuard` connect `JwtAuthGuard` to `auth.controller.ts`, `BlogsService`, `CmsController`, `tickets.controller.ts`, `B2BService`, `PaginationDto`, `PetsController`, `ProductsService`, `admin.service.ts`, `ReportsController`, `users.service.ts`, `OrdersService`?**
|
||||
_High betweenness centrality (0.036) - this node is a cross-community bridge._
|
||||
- **What connects `$schema`, `collection`, `sourceRoot` to the rest of the system?**
|
||||
_1340 weakly-connected nodes found - possible documentation gaps or missing edges._
|
||||
_1341 weakly-connected nodes found - possible documentation gaps or missing edges._
|
||||
- **Should `app.module.ts` be split into smaller, more focused modules?**
|
||||
_Cohesion score 0.05288207297726071 - nodes in this community are weakly interconnected._
|
||||
- **Should `SmsService` be split into smaller, more focused modules?**
|
||||
_Cohesion score 0.052028732284993204 - nodes in this community are weakly interconnected._
|
||||
_Cohesion score 0.06078316773816481 - nodes in this community are weakly interconnected._
|
||||
- **Should `ProductService` be split into smaller, more focused modules?**
|
||||
_Cohesion score 0.06240084611316764 - nodes in this community are weakly interconnected._
|
||||
_Cohesion score 0.06229508196721312 - nodes in this community are weakly interconnected._
|
||||
- **Should `ProductPage.tsx` be split into smaller, more focused modules?**
|
||||
_Cohesion score 0.11594202898550725 - nodes in this community are weakly interconnected._
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,16 +1,16 @@
|
||||
# Graph Report - canina (2026-08-29)
|
||||
|
||||
## Corpus Check
|
||||
- 590 files · ~1,336,894 words
|
||||
- 593 files · ~1,337,817 words
|
||||
- Verdict: corpus is large enough that graph structure adds value.
|
||||
|
||||
## Summary
|
||||
- 4138 nodes · 7454 edges · 335 communities (213 shown, 122 thin omitted)
|
||||
- 4149 nodes · 7481 edges · 313 communities (211 shown, 102 thin omitted)
|
||||
- Extraction: 96% EXTRACTED · 4% INFERRED · 0% AMBIGUOUS · INFERRED: 281 edges (avg confidence: 0.79)
|
||||
- Token cost: 0 input · 0 output
|
||||
|
||||
## Graph Freshness
|
||||
- Built from commit: `32e40a82`
|
||||
- Built from commit: `d9c693c4`
|
||||
- Run `git rev-parse HEAD` and compare to check if the graph is stale.
|
||||
- Run `graphify update .` after code changes (no API cost).
|
||||
|
||||
@ -18,26 +18,26 @@
|
||||
- Roles
|
||||
- app.module.ts
|
||||
- SettingsController
|
||||
- ProductService
|
||||
- productService.ts
|
||||
- ProductPage.tsx
|
||||
- CmsController
|
||||
- tickets.controller.ts
|
||||
- Button.tsx
|
||||
- SettingsService
|
||||
- reviews.controller.ts
|
||||
- devDependencies
|
||||
- CreateReviewDto
|
||||
- ReviewsController
|
||||
- MediaSelector.tsx
|
||||
- index.ts
|
||||
- app-audit-verification.e2e-spec.js
|
||||
- userStore.ts
|
||||
- lib/services/api.ts
|
||||
- src/services/api.ts
|
||||
- DoctorQueryDto
|
||||
- schema.ts
|
||||
- JwtAuthGuard
|
||||
- ProductsService
|
||||
- ProductsController
|
||||
- CreateVideoDto
|
||||
- ReportsController
|
||||
- components/Skeleton.tsx
|
||||
- admin.module.ts
|
||||
- RevalidationService
|
||||
- MenuService
|
||||
- BE-001
|
||||
- FE-001
|
||||
@ -67,23 +67,23 @@
|
||||
- devDependencies
|
||||
- devDependencies
|
||||
- BlogsController
|
||||
- PrescriptionsService
|
||||
- PrescriptionsController
|
||||
- SmartAdvisorService
|
||||
- Modal.tsx
|
||||
- UITexts.tsx
|
||||
- Orders.tsx
|
||||
- Role & Core Objective
|
||||
- ContactController
|
||||
- ContactService
|
||||
- compilerOptions
|
||||
- PaymentService
|
||||
- usePetStore
|
||||
- PetProfile.tsx
|
||||
- SmsService
|
||||
- dependencies
|
||||
- compilerOptions
|
||||
- BlogsService
|
||||
- ApiOperation
|
||||
- PetsController
|
||||
- lib/services/api.ts
|
||||
- UserDashboard.tsx
|
||||
- Required Review Group Closures
|
||||
- compilerOptions
|
||||
- getPageMetadata
|
||||
@ -100,17 +100,17 @@
|
||||
- scripts
|
||||
- dependencies
|
||||
- Role & Core Objective
|
||||
- trust-seals/page.tsx
|
||||
- useSettingsStore
|
||||
- zibal.service.ts
|
||||
- dependencies
|
||||
- CreateEBankCheckoutDto
|
||||
- seed-products.ts
|
||||
- users.service.ts
|
||||
- ProductsService
|
||||
- Reconciled Audit Roles & Assignments
|
||||
- OrdersService
|
||||
- useSettingsStore
|
||||
- HomeClient.tsx
|
||||
- Phase 3.1 — Human Review Preparation and Master Backlog Critique
|
||||
- wiki/[slug]/page.tsx
|
||||
- blog/[slug]/page.tsx
|
||||
- compilerOptions
|
||||
- InitiatePaymentDto
|
||||
- scripts
|
||||
@ -128,7 +128,7 @@
|
||||
- Operational Rules & Boundaries
|
||||
- Operational Rules & Boundaries
|
||||
- Operational Rules & Boundaries
|
||||
- RegisterDto
|
||||
- AdminTransactionFilterDto
|
||||
- AppService
|
||||
- Blogs.tsx
|
||||
- Vazirmatn Changelog
|
||||
@ -138,13 +138,13 @@
|
||||
- compilerOptions
|
||||
- backend/README.md
|
||||
- AdminController
|
||||
- AuthService
|
||||
- MetricsController
|
||||
- Repository Map
|
||||
- validate_integrity.js
|
||||
- admin-panel/package.json
|
||||
- Sahel-Font
|
||||
- Body
|
||||
- auth.controller.ts
|
||||
- wiki/[slug]/page.tsx
|
||||
- Sahel-Font
|
||||
- Role & Core Objective
|
||||
- orchestrate.py
|
||||
@ -159,20 +159,20 @@
|
||||
- application/package.json
|
||||
- start-dev.js
|
||||
- generate-openapi.js
|
||||
- VetGallery.tsx
|
||||
- SafeImage.tsx
|
||||
- ProductDto
|
||||
- System Discovery
|
||||
- HomeController
|
||||
- admin.service.ts
|
||||
- SmsSettingsPage.tsx
|
||||
- Product Requirement Document (PRD)
|
||||
- class-transformer
|
||||
- zibal-ebank.service.ts
|
||||
- useCartStore
|
||||
- exclude
|
||||
- Baseline Command Plan & Reconciled Command History
|
||||
- seo-backfill.ts
|
||||
- ErrorPages.tsx
|
||||
- js-yaml
|
||||
- media/[...path]/route.ts
|
||||
- with-vpn.sh
|
||||
- Architecture Specification
|
||||
- Project Health Audit Report
|
||||
@ -190,16 +190,15 @@
|
||||
- Phase 3 Audit Traceability Matrix
|
||||
- rebuild_honest_ledger.js
|
||||
- validate_evidence_grade.js
|
||||
- @nestjs/core
|
||||
- auth.module.ts
|
||||
- uploads/[...path]/route.ts
|
||||
- UsersService
|
||||
- نقشه جامع پوشش تستهای سرتاسری (E2E Test Coverage Map) — پروژه Canina
|
||||
- @nestjs/jwt
|
||||
- prisma
|
||||
- API Contract Specification
|
||||
- ⚙️ Backend Technical Review (05_dev_backend)
|
||||
- 🎨 Frontend & Admin Panel Technical Review (06_dev_frontend)
|
||||
- 🚀 SEO & Content Strategy Review (12_seo_content)
|
||||
- CheckoutPage.tsx
|
||||
- @eslint/eslintrc
|
||||
- @types/node
|
||||
- seed-ui-texts.ts
|
||||
- seed-wiki.ts
|
||||
- update-blog.dto.ts
|
||||
@ -211,14 +210,10 @@
|
||||
- Raw Finding Verification & Disposition Report
|
||||
- React + TypeScript + Vite
|
||||
- Select.tsx
|
||||
- UsersService
|
||||
- @nestjs/throttler
|
||||
- passport
|
||||
- application/README.md
|
||||
- deploy.sh
|
||||
- 🔒 Security & Performance Review (09_devops_security)
|
||||
- 👁️ UX & Persona Interface Review (08_visual_qa)
|
||||
- reflect-metadata
|
||||
- prisma/scientificTerms.ts
|
||||
- seed-blogs.ts
|
||||
- seed-custom.ts
|
||||
@ -237,8 +232,6 @@
|
||||
- Input.tsx
|
||||
- Textarea.tsx
|
||||
- admin-panel/tsconfig.json
|
||||
- swagger-ui-express
|
||||
- jest
|
||||
- next.config.ts
|
||||
- Shabnam Font README
|
||||
- AGENTS.md
|
||||
@ -246,13 +239,9 @@
|
||||
- .agents/workflows/graphify.md
|
||||
- instructions.md
|
||||
- WikiController
|
||||
- helmet
|
||||
- tailwindcss
|
||||
- @nestjs/schematics
|
||||
- @nestjs/testing
|
||||
- BlogsService
|
||||
- source-map-support
|
||||
- ts-jest
|
||||
- ts-loader
|
||||
- supertest
|
||||
- blog.entity.ts
|
||||
@ -302,34 +291,23 @@
|
||||
- typescript
|
||||
- @types/jest
|
||||
- typescript-eslint
|
||||
- @types/js-yaml
|
||||
- @types/multer
|
||||
- @types/react
|
||||
- globals
|
||||
- @nestjs/cli
|
||||
- vitest
|
||||
- @types/supertest
|
||||
- @types/passport-jwt
|
||||
- 20260526160916_add_ui_texts_and_scientific_terms/migration.sql
|
||||
- typescript-eslint
|
||||
- typescript
|
||||
- prettier
|
||||
- revalidate/route.ts
|
||||
- MaskableField.tsx
|
||||
- @eslint/js
|
||||
- @testing-library/react
|
||||
- eslint-config-prettier
|
||||
- eslint
|
||||
- @types/react-dom
|
||||
- SmsLogQueryDto
|
||||
- eslint-plugin-react-refresh
|
||||
- WikiService
|
||||
- B2BService
|
||||
- track/page.tsx
|
||||
- PodcastPlayerModal.tsx
|
||||
- app.e2e-spec.js
|
||||
- app/page.tsx
|
||||
- bcrypt
|
||||
|
||||
## God Nodes (most connected - your core abstractions)
|
||||
1. `Roles()` - 106 edges
|
||||
@ -360,27 +338,27 @@
|
||||
- 3-file cycle: `frontend/application/lib/services/api.ts -> frontend/application/lib/store/userStore.ts -> frontend/application/lib/services/authService.ts -> frontend/application/lib/services/api.ts`
|
||||
- 4-file cycle: `frontend/application/lib/services/api.ts -> frontend/application/lib/store/userStore.ts -> frontend/application/lib/store/cartStore.ts -> frontend/application/lib/services/orderService.ts -> frontend/application/lib/services/api.ts`
|
||||
|
||||
## Communities (335 total, 122 thin omitted)
|
||||
## Communities (313 total, 102 thin omitted)
|
||||
|
||||
### Community 0 - "Roles"
|
||||
Cohesion: 0.24
|
||||
Nodes (13): Roles(), PaymentController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Get (+5 more)
|
||||
|
||||
### Community 1 - "app.module.ts"
|
||||
Cohesion: 0.06
|
||||
Nodes (40): B2BModule, Module, BannersModule, Module, CmsModule, Module, SmsModule, Global (+32 more)
|
||||
Cohesion: 0.07
|
||||
Nodes (34): B2BModule, Module, BannersModule, Module, CmsModule, Module, SmsModule, Global (+26 more)
|
||||
|
||||
### Community 2 - "SettingsController"
|
||||
Cohesion: 0.16
|
||||
Nodes (15): SettingsController, ApiBearerAuth, ApiOkResponse, ApiOperation, ApiTags, Body, Controller, Delete (+7 more)
|
||||
Cohesion: 0.07
|
||||
Nodes (24): SmsLogQueryDto, ApiPropertyOptional, IsIn, IsNumber, IsOptional, IsString, Type, SettingsController (+16 more)
|
||||
|
||||
### Community 3 - "ProductService"
|
||||
### Community 3 - "productService.ts"
|
||||
Cohesion: 0.06
|
||||
Nodes (34): dynamic, revalidate, DEFAULT_CATEGORIES, dynamic, revalidate, dynamic, revalidate, BlogCategory (+26 more)
|
||||
Nodes (32): dynamic, revalidate, DEFAULT_CATEGORIES, dynamic, revalidate, dynamic, revalidate, BlogCategory (+24 more)
|
||||
|
||||
### Community 4 - "ProductPage.tsx"
|
||||
Cohesion: 0.12
|
||||
Nodes (16): PLAYBACK_RATES, PodcastInlinePlayer(), PodcastInlinePlayerProps, ProductImageZoomModalProps, CalculatorState, GalleryMediaItem, ICON_MAP, isVideoUrl() (+8 more)
|
||||
Cohesion: 0.13
|
||||
Nodes (15): ProductImageZoomModalProps, CalculatorState, GalleryMediaItem, ICON_MAP, isVideoUrl(), ProductImageZoomModal, ProductPage(), ProductReviews (+7 more)
|
||||
|
||||
### Community 5 - "CmsController"
|
||||
Cohesion: 0.09
|
||||
@ -388,19 +366,23 @@ Nodes (24): CmsController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controlle
|
||||
|
||||
### Community 6 - "tickets.controller.ts"
|
||||
Cohesion: 0.09
|
||||
Nodes (29): AdminUpdateTicketDto, CreateTicketDto, ReplyTicketDto, ApiProperty, ApiPropertyOptional, IsNotEmpty, IsOptional, IsString (+21 more)
|
||||
Nodes (31): AdminUpdateTicketDto, CreateTicketDto, ReplyTicketDto, ApiProperty, ApiPropertyOptional, IsNotEmpty, IsOptional, IsString (+23 more)
|
||||
|
||||
### Community 7 - "Button.tsx"
|
||||
Cohesion: 0.12
|
||||
Nodes (14): Button(), ButtonProps, ButtonSize, ButtonVariant, Spinner(), FAQ, BlogCommentItem, ProductReview (+6 more)
|
||||
|
||||
### Community 9 - "devDependencies"
|
||||
Cohesion: 0.22
|
||||
Nodes (9): devDependencies, prisma, @types/bcryptjs, @types/node, typescript, @types/node, typescript, prisma (+1 more)
|
||||
### Community 8 - "reviews.controller.ts"
|
||||
Cohesion: 0.13
|
||||
Nodes (17): CreateReviewDto, ApiProperty, IsInt, IsNotEmpty, IsOptional, IsString, Min, ApiProperty (+9 more)
|
||||
|
||||
### Community 10 - "CreateReviewDto"
|
||||
Cohesion: 0.09
|
||||
Nodes (23): CreateReviewDto, ApiProperty, IsInt, IsNotEmpty, IsOptional, IsString, Min, ReviewsController (+15 more)
|
||||
### Community 9 - "devDependencies"
|
||||
Cohesion: 0.08
|
||||
Nodes (25): devDependencies, eslint, eslint-config-prettier, @eslint/eslintrc, jest, @nestjs/cli, @nestjs/testing, prettier (+17 more)
|
||||
|
||||
### Community 10 - "ReviewsController"
|
||||
Cohesion: 0.13
|
||||
Nodes (15): ReviewsController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+7 more)
|
||||
|
||||
### Community 11 - "MediaSelector.tsx"
|
||||
Cohesion: 0.06
|
||||
@ -414,9 +396,9 @@ Nodes (24): backend, frontend, playwright.config.ts, @playwright/test, tests/**/
|
||||
Cohesion: 0.07
|
||||
Nodes (26): EnvironmentVariables, IsNotEmpty, IsOptional, IsString, validateEnv(), CustomHttpExceptionFilter, Catch, PrismaExceptionFilter (+18 more)
|
||||
|
||||
### Community 14 - "userStore.ts"
|
||||
Cohesion: 0.07
|
||||
Nodes (30): AuthModal, B2BPortal, CartDrawer, ClientLayout(), LoginModal, metadata, AuthModal(), AuthModalProps (+22 more)
|
||||
### Community 14 - "lib/services/api.ts"
|
||||
Cohesion: 0.09
|
||||
Nodes (16): BlogPostClient(), BlogPostClientProps, ContactInfoItem, Testimonial, api, ApiErrorPayload, BASE_DOMAIN, baseURL (+8 more)
|
||||
|
||||
### Community 15 - "src/services/api.ts"
|
||||
Cohesion: 0.08
|
||||
@ -427,28 +409,28 @@ Cohesion: 0.09
|
||||
Nodes (24): DoctorsController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+16 more)
|
||||
|
||||
### Community 17 - "schema.ts"
|
||||
Cohesion: 0.14
|
||||
Nodes (18): B2BPage(), generateMetadata(), ContactPage(), generateMetadata(), generateMetadata(), getInitialVideos(), Videos(), ContactFormClient() (+10 more)
|
||||
Cohesion: 0.13
|
||||
Nodes (19): B2BPage(), generateMetadata(), ContactPage(), generateMetadata(), generateMetadata(), getInitialVideos(), Videos(), B2BLandingClient() (+11 more)
|
||||
|
||||
### Community 18 - "JwtAuthGuard"
|
||||
Cohesion: 0.16
|
||||
Nodes (7): JwtAuthGuard, Injectable, ROLES_KEY, RequestWithUser, RolesGuard, Injectable, UserReqPayload
|
||||
Cohesion: 0.12
|
||||
Nodes (11): JwtAuthGuard, Injectable, B2BService, B2BWholesaleOrderItem, Injectable, ROLES_KEY, RequestWithUser, RolesGuard (+3 more)
|
||||
|
||||
### Community 19 - "ProductsService"
|
||||
Cohesion: 0.10
|
||||
Nodes (19): GetProductsDto, ApiPropertyOptional, IsEnum, IsOptional, IsString, ProductsController, ApiOperation, ApiTags (+11 more)
|
||||
### Community 19 - "ProductsController"
|
||||
Cohesion: 0.14
|
||||
Nodes (10): ProductsController, ApiOperation, ApiTags, Body, Controller, Get, Param, Patch (+2 more)
|
||||
|
||||
### Community 20 - "CreateVideoDto"
|
||||
Cohesion: 0.09
|
||||
Nodes (24): CreateVideoDto, ApiProperty, ApiPropertyOptional, IsBoolean, IsNotEmpty, IsOptional, IsString, UpdateVideoDto (+16 more)
|
||||
Cohesion: 0.07
|
||||
Nodes (32): CreateVideoDto, ApiProperty, ApiPropertyOptional, IsBoolean, IsNotEmpty, IsOptional, IsString, UpdateVideoDto (+24 more)
|
||||
|
||||
### Community 21 - "ReportsController"
|
||||
Cohesion: 0.14
|
||||
Nodes (11): ReportsController, ApiBearerAuth, ApiOperation, ApiQuery, ApiTags, Controller, Get, Query (+3 more)
|
||||
### Community 21 - "admin.module.ts"
|
||||
Cohesion: 0.06
|
||||
Nodes (20): AdminModule, Module, MediaService, Injectable, PetsService, Injectable, ReportsController, ApiBearerAuth (+12 more)
|
||||
|
||||
### Community 22 - "components/Skeleton.tsx"
|
||||
Cohesion: 0.21
|
||||
Nodes (5): OrderRowSkeleton(), PetProfileSkeleton(), ProductCardSkeleton(), Skeleton(), SkeletonProps
|
||||
### Community 22 - "RevalidationService"
|
||||
Cohesion: 0.15
|
||||
Nodes (5): RevalidationModule, Global, Module, RevalidationService, Injectable
|
||||
|
||||
### Community 23 - "MenuService"
|
||||
Cohesion: 0.12
|
||||
@ -491,7 +473,7 @@ Cohesion: 0.06
|
||||
Nodes (24): App(), Props, RouteErrorBoundary, State, HeroBanner, VetTestimonial, BestSellerItem, CategoryDistItem (+16 more)
|
||||
|
||||
### Community 33 - "WholesaleApplyDto"
|
||||
Cohesion: 0.10
|
||||
Cohesion: 0.11
|
||||
Nodes (20): ApiProperty, ApiPropertyOptional, IsNotEmpty, IsOptional, IsString, WholesaleApplyDto, ApiBearerAuth, ApiOperation (+12 more)
|
||||
|
||||
### Community 34 - "B2BController"
|
||||
@ -499,8 +481,8 @@ Cohesion: 0.14
|
||||
Nodes (13): B2BController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Get, Param (+5 more)
|
||||
|
||||
### Community 35 - "AuthController"
|
||||
Cohesion: 0.25
|
||||
Nodes (13): AuthController, ApiBadRequestResponse, ApiBearerAuth, ApiOkResponse, ApiOperation, ApiTags, Body, Controller (+5 more)
|
||||
Cohesion: 0.08
|
||||
Nodes (32): AuthController, ApiBadRequestResponse, ApiBearerAuth, ApiOkResponse, ApiOperation, ApiTags, Body, Controller (+24 more)
|
||||
|
||||
### Community 36 - "FaqService"
|
||||
Cohesion: 0.14
|
||||
@ -551,8 +533,8 @@ Cohesion: 0.13
|
||||
Nodes (12): IngredientsController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+4 more)
|
||||
|
||||
### Community 48 - "UsersController"
|
||||
Cohesion: 0.21
|
||||
Nodes (16): ApiBadRequestResponse, ApiBearerAuth, ApiCreatedResponse, ApiOkResponse, ApiOperation, ApiTags, Body, Controller (+8 more)
|
||||
Cohesion: 0.08
|
||||
Nodes (29): AddressDto, ApiProperty, ApiPropertyOptional, IsBoolean, IsNotEmpty, IsOptional, IsString, ApiPropertyOptional (+21 more)
|
||||
|
||||
### Community 49 - "devDependencies"
|
||||
Cohesion: 0.11
|
||||
@ -566,9 +548,9 @@ Nodes (15): eslint-config-next, devDependencies, eslint, eslint-config-next, jsd
|
||||
Cohesion: 0.14
|
||||
Nodes (16): BlogsController, ApiBearerAuth, ApiOperation, ApiQuery, ApiTags, Body, Controller, Delete (+8 more)
|
||||
|
||||
### Community 52 - "PrescriptionsService"
|
||||
Cohesion: 0.14
|
||||
Nodes (14): PrescriptionsController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Get, Param (+6 more)
|
||||
### Community 52 - "PrescriptionsController"
|
||||
Cohesion: 0.16
|
||||
Nodes (12): PrescriptionsController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Get, Param (+4 more)
|
||||
|
||||
### Community 53 - "SmartAdvisorService"
|
||||
Cohesion: 0.13
|
||||
@ -590,45 +572,41 @@ Nodes (15): Skeleton(), MonitoringStats, getPaymentMethodLabel(), Order, ORDER_S
|
||||
Cohesion: 0.09
|
||||
Nodes (22): CREATE MODE — Normal Operation, Expected JSON Output Schema, File Scope Boundary, Forbidden Actions, MODE 1: REVIEW (called during Review Phase), MODE 2: CONTENT CREATION (standalone task from backlog), Operating Modes, Operational Rules & Boundaries (+14 more)
|
||||
|
||||
### Community 58 - "ContactController"
|
||||
### Community 58 - "ContactService"
|
||||
Cohesion: 0.13
|
||||
Nodes (10): ContactController, Body, Controller, Get, Param, Post, Put, Query (+2 more)
|
||||
Nodes (12): ContactController, Body, Controller, Get, Param, Post, Put, Query (+4 more)
|
||||
|
||||
### Community 59 - "compilerOptions"
|
||||
Cohesion: 0.06
|
||||
Nodes (30): compilerOptions, allowSyntheticDefaultImports, baseUrl, declaration, emitDecoratorMetadata, esModuleInterop, experimentalDecorators, forceConsistentCasingInFileNames (+22 more)
|
||||
|
||||
### Community 60 - "PaymentService"
|
||||
Cohesion: 0.11
|
||||
Nodes (9): AdminTransactionFilterDto, ApiPropertyOptional, IsIn, IsNumber, IsOptional, IsString, Type, PaymentService (+1 more)
|
||||
### Community 61 - "PetProfile.tsx"
|
||||
Cohesion: 0.07
|
||||
Nodes (24): metadata, FeaturedProducts(), ProductCard(), Header(), OrderSuccess(), PrescriptionUploadModal(), PrescriptionUploadModalProps, OrderRowSkeleton() (+16 more)
|
||||
|
||||
### Community 61 - "usePetStore"
|
||||
Cohesion: 0.14
|
||||
Nodes (14): FeaturedProducts(), ProductCard(), OrderSuccess(), PrescriptionUploadModal(), PrescriptionUploadModalProps, SearchResultsPage(), mockProducts, mockPush (+6 more)
|
||||
### Community 62 - "SmsService"
|
||||
Cohesion: 0.12
|
||||
Nodes (4): SmsService, Injectable, PrescriptionsService, Injectable
|
||||
|
||||
### Community 63 - "dependencies"
|
||||
Cohesion: 0.09
|
||||
Nodes (23): dependencies, bcryptjs, class-validator, compression, ioredis, @nestjs/common, @nestjs/passport, @nestjs/platform-express (+15 more)
|
||||
Cohesion: 0.05
|
||||
Nodes (43): dependencies, bcrypt, bcryptjs, class-transformer, class-validator, compression, helmet, ioredis (+35 more)
|
||||
|
||||
### Community 64 - "compilerOptions"
|
||||
Cohesion: 0.10
|
||||
Nodes (20): compilerOptions, allowImportingTsExtensions, erasableSyntaxOnly, lib, module, moduleDetection, moduleResolution, noEmit (+12 more)
|
||||
|
||||
### Community 65 - "BlogsService"
|
||||
Cohesion: 0.06
|
||||
Nodes (14): BlogsService, Injectable, RevalidationModule, Global, Module, RevalidationService, Injectable, ApiProperty (+6 more)
|
||||
|
||||
### Community 66 - "ApiOperation"
|
||||
Cohesion: 0.12
|
||||
Nodes (8): ApiOperation, ApiQuery, Get, Query, AdminQueryDto, ApiPropertyOptional, IsOptional, IsString
|
||||
|
||||
### Community 67 - "PetsController"
|
||||
Cohesion: 0.11
|
||||
Nodes (13): PetsController, ApiBearerAuth, ApiOperation, ApiQuery, ApiTags, Controller, Delete, Get (+5 more)
|
||||
Cohesion: 0.15
|
||||
Nodes (11): PetsController, ApiBearerAuth, ApiOperation, ApiQuery, ApiTags, Controller, Delete, Get (+3 more)
|
||||
|
||||
### Community 68 - "lib/services/api.ts"
|
||||
Cohesion: 0.09
|
||||
Nodes (31): VerifyContent(), B2BPortal(), BlogPostClientProps, BlogPost, BlogPreviewSection(), ContactInfoItem, HeaderButton(), HeaderButtonProps (+23 more)
|
||||
### Community 68 - "UserDashboard.tsx"
|
||||
Cohesion: 0.11
|
||||
Nodes (34): LoginModal, HomeClient(), VerifyContent(), AddressFormData, AddressModal(), AddressModalProps, normalizeDigits(), validateAddressForm() (+26 more)
|
||||
|
||||
### Community 69 - "Required Review Group Closures"
|
||||
Cohesion: 0.10
|
||||
@ -639,8 +617,8 @@ Cohesion: 0.08
|
||||
Nodes (23): compilerOptions, allowImportingTsExtensions, erasableSyntaxOnly, jsx, lib, module, moduleDetection, moduleResolution (+15 more)
|
||||
|
||||
### Community 71 - "getPageMetadata"
|
||||
Cohesion: 0.09
|
||||
Nodes (14): generateMetadata(), CatalogClient(), generateMetadata(), generateMetadata(), generateMetadata(), generateMetadata(), generateMetadata(), generateMetadata() (+6 more)
|
||||
Cohesion: 0.08
|
||||
Nodes (17): generateMetadata(), CatalogClient(), generateMetadata(), generateMetadata(), generateMetadata(), generateMetadata(), generateMetadata(), generateMetadata() (+9 more)
|
||||
|
||||
### Community 72 - "Operational Rules & Boundaries"
|
||||
Cohesion: 0.11
|
||||
@ -694,6 +672,10 @@ Nodes (21): dependencies, axios, lucide-react, react, react-dom, react-hot-toast
|
||||
Cohesion: 0.12
|
||||
Nodes (16): 1. Active Secret Scanning (All Modified Files), 2. Docker Container Verification (if Dockerfile exists), 3. CI/CD Basic Check (if `.github/workflows/` exists), 4. Failure Routing Protocol, 5. Forbidden Actions, ENFORCE MODE — Normal Operation, Expected JSON Output Schema, Operational Rules & Boundaries (+8 more)
|
||||
|
||||
### Community 85 - "useSettingsStore"
|
||||
Cohesion: 0.09
|
||||
Nodes (24): AuthModal, CartDrawer, ClientLayout(), BrandLogo(), BrandLogoProps, EnamadBadge(), FAQItem, FAQSection() (+16 more)
|
||||
|
||||
### Community 86 - "zibal.service.ts"
|
||||
Cohesion: 0.16
|
||||
Nodes (9): GatewayHealthResult, IPaymentGateway, PaymentInquiryResult, PaymentRequestOptions, PaymentRequestResult, PaymentVerifyResult, ZibalInquiryResponse, ZibalRequestResponse (+1 more)
|
||||
@ -710,29 +692,29 @@ Nodes (8): CreateEBankCheckoutDto, ApiProperty, ApiPropertyOptional, IsNotEmpty,
|
||||
Cohesion: 0.17
|
||||
Nodes (12): prisma, main(), prisma, determineSuitableFor(), findOrCreateCategory(), getProductImageUrl(), main(), parseSize() (+4 more)
|
||||
|
||||
### Community 90 - "users.service.ts"
|
||||
Cohesion: 0.13
|
||||
Nodes (14): AddressDto, ApiProperty, ApiPropertyOptional, IsBoolean, IsNotEmpty, IsOptional, IsString, ApiPropertyOptional (+6 more)
|
||||
### Community 90 - "ProductsService"
|
||||
Cohesion: 0.21
|
||||
Nodes (9): GetProductsDto, ApiPropertyOptional, IsEnum, IsOptional, IsString, ProductsModule, Module, ProductsService (+1 more)
|
||||
|
||||
### Community 91 - "Reconciled Audit Roles & Assignments"
|
||||
Cohesion: 0.12
|
||||
Nodes (15): 10. Documentation Engineer, 1. Lead Architect / Orchestrator, 2. React / Vite Storefront Auditor, 3. NestJS Backend Auditor, 4. Admin Features Auditor, 5. Database & Data Integrity Auditor, 6. Security Auditor, 7. TypeScript & Code Quality Auditor (+7 more)
|
||||
|
||||
### Community 92 - "OrdersService"
|
||||
Cohesion: 0.06
|
||||
Cohesion: 0.07
|
||||
Nodes (35): CreateOrderDto, OrderItemDto, ApiProperty, ApiPropertyOptional, IsArray, IsNotEmpty, IsNumber, IsOptional (+27 more)
|
||||
|
||||
### Community 93 - "useSettingsStore"
|
||||
Cohesion: 0.08
|
||||
Nodes (33): HomeClient(), HomeClientProps, ArchivePage(), ArchiveProductCard(), CATEGORY_MAP, ICON_MAP, B2BLandingClient(), BannerPlacement() (+25 more)
|
||||
### Community 93 - "HomeClient.tsx"
|
||||
Cohesion: 0.11
|
||||
Nodes (19): HomeClientProps, ArchiveProductCard(), CATEGORY_MAP, ICON_MAP, BannerPlacement(), BannerPlacementProps, BlogPreviewSection(), Hero() (+11 more)
|
||||
|
||||
### Community 94 - "Phase 3.1 — Human Review Preparation and Master Backlog Critique"
|
||||
Cohesion: 0.13
|
||||
Nodes (14): 10. Dependency & Wave Adjustments, 11. Acceptance Criteria Refinements, 12. Business and Product Decision Classification, 13. Final Recommended Backlog Summary, 1. Executive Assessment, 2. Findings That Require No Change, 3. Findings Requiring Task Refinements, 4. Tasks Requiring Splitting (+6 more)
|
||||
|
||||
### Community 95 - "wiki/[slug]/page.tsx"
|
||||
Cohesion: 0.19
|
||||
Nodes (16): BlogPostPage(), generateMetadata(), getBlog(), revalidate, safeIso(), safeLocalDate(), generateMetadata(), revalidate (+8 more)
|
||||
### Community 95 - "blog/[slug]/page.tsx"
|
||||
Cohesion: 0.29
|
||||
Nodes (10): BlogPostPage(), generateMetadata(), getBlog(), revalidate, safeIso(), safeLocalDate(), generateMetadata(), revalidate (+2 more)
|
||||
|
||||
### Community 96 - "compilerOptions"
|
||||
Cohesion: 0.06
|
||||
@ -747,8 +729,8 @@ Cohesion: 0.13
|
||||
Nodes (15): scripts, build, build:nest, docs:generate, lint, seo:backfill, start, start:debug (+7 more)
|
||||
|
||||
### Community 99 - "BlogsController"
|
||||
Cohesion: 0.18
|
||||
Nodes (12): BlogsController, ApiNotFoundResponse, ApiOkResponse, ApiOperation, ApiTags, Body, Controller, Get (+4 more)
|
||||
Cohesion: 0.10
|
||||
Nodes (14): BlogsController, ApiNotFoundResponse, ApiOkResponse, ApiOperation, ApiTags, Body, Controller, Get (+6 more)
|
||||
|
||||
### Community 100 - "Deep Audit Summary Report"
|
||||
Cohesion: 0.14
|
||||
@ -775,16 +757,16 @@ Cohesion: 0.17
|
||||
Nodes (11): 1. Detect Test Runner from Tech Stack, 2. Execution Output Capture (Mandatory), 3. Acceptance Criteria Verification, 4. Failure Routing Protocol, 5. Success Routing Protocol, 6. Forbidden Actions, Expected JSON Output Schema, Operational Rules & Boundaries (+3 more)
|
||||
|
||||
### Community 106 - "auth.service.ts"
|
||||
Cohesion: 0.07
|
||||
Nodes (15): ApiExcludeController, AppModule, Module, AdminLoginInput, LoginInput, RegisterInput, MetricsController, Controller (+7 more)
|
||||
Cohesion: 0.06
|
||||
Nodes (24): AppModule, Module, AdminLoginInput, AuthService, LoginInput, RegisterInput, Injectable, SendOtpDto (+16 more)
|
||||
|
||||
### Community 107 - "PaginationDto"
|
||||
Cohesion: 0.07
|
||||
Nodes (26): AdminModule, Module, MediaService, Injectable, SslCertInfo, BlogsModule, Module, BlogFilterDto (+18 more)
|
||||
Cohesion: 0.11
|
||||
Nodes (16): BlogsModule, Module, BlogFilterDto, PaginationDto, SortOrder, ApiPropertyOptional, IsEnum, IsInt (+8 more)
|
||||
|
||||
### Community 108 - "PrismaService"
|
||||
Cohesion: 0.05
|
||||
Nodes (29): CategoryQuery, PetQuery, WikiQuery, BannersService, Injectable, MeliPayamakPattern, MeliPayamakResponse, SendPatternSmsOptions (+21 more)
|
||||
Cohesion: 0.07
|
||||
Nodes (21): CategoryQuery, PetQuery, WikiQuery, BannersService, Injectable, MeliPayamakPattern, MeliPayamakResponse, SendPatternSmsOptions (+13 more)
|
||||
|
||||
### Community 109 - "1. Summary of Integrity Repairs Performed"
|
||||
Cohesion: 0.17
|
||||
@ -802,9 +784,9 @@ Nodes (10): 1. Mark Active Task as Complete, 2. Documentation Updates, 3. Dynami
|
||||
Cohesion: 0.18
|
||||
Nodes (10): 1. Pre-Deployment Checklist, 2. Build Verification, 3. Deployment Strategy (Based on Target), 4. Post-Deployment Health Check, 5. Forbidden Actions, Expected JSON Output Schema, Operational Rules & Boundaries, Required Output Artifacts (What files to write/update) (+2 more)
|
||||
|
||||
### Community 113 - "RegisterDto"
|
||||
Cohesion: 0.22
|
||||
Nodes (8): RegisterDto, ApiProperty, ApiPropertyOptional, IsEmail, IsNotEmpty, IsOptional, IsString, MinLength
|
||||
### Community 113 - "AdminTransactionFilterDto"
|
||||
Cohesion: 0.25
|
||||
Nodes (7): AdminTransactionFilterDto, ApiPropertyOptional, IsIn, IsNumber, IsOptional, IsString, Type
|
||||
|
||||
### Community 114 - "AppService"
|
||||
Cohesion: 0.29
|
||||
@ -842,9 +824,9 @@ Nodes (9): Compile and run the project, Deployment, Description, License, Projec
|
||||
Cohesion: 0.14
|
||||
Nodes (6): AdminController, ApiBearerAuth, ApiTags, Controller, Put, UseGuards
|
||||
|
||||
### Community 123 - "AuthService"
|
||||
Cohesion: 0.19
|
||||
Nodes (3): AuthService, Injectable, normalizeMobile()
|
||||
### Community 123 - "MetricsController"
|
||||
Cohesion: 0.29
|
||||
Nodes (5): ApiExcludeController, MetricsController, Controller, Get, Res
|
||||
|
||||
### Community 124 - "Repository Map"
|
||||
Cohesion: 0.20
|
||||
@ -862,9 +844,9 @@ Nodes (9): name, private, scripts, build, dev, lint, preview, type (+1 more)
|
||||
Cohesion: 0.20
|
||||
Nodes (9): Arch Linux, Contributors, Install, Known problems for variable version, License, Sahel-Font, To Do (variable), طریقه استفاده از نسخه متغیر variable (+1 more)
|
||||
|
||||
### Community 129 - "auth.controller.ts"
|
||||
Cohesion: 0.09
|
||||
Nodes (22): AdminLoginDto, ApiProperty, IsEmail, IsNotEmpty, IsString, MinLength, LoginDto, ApiProperty (+14 more)
|
||||
### Community 129 - "wiki/[slug]/page.tsx"
|
||||
Cohesion: 0.60
|
||||
Nodes (5): generateMetadata(), getRelatedProducts(), getWikiTerm(), WikiTermPage(), generateMedicalWebPageSchema()
|
||||
|
||||
### Community 130 - "Sahel-Font"
|
||||
Cohesion: 0.20
|
||||
@ -922,9 +904,9 @@ Nodes (7): backend, distMainPath, fs, http, path, { spawn, execSync }, waitForBa
|
||||
Cohesion: 0.25
|
||||
Nodes (6): app_module_1, core_1, fs, path, swagger_1, yaml
|
||||
|
||||
### Community 144 - "VetGallery.tsx"
|
||||
Cohesion: 0.16
|
||||
Nodes (12): BackButton(), BackButtonProps, VideoModalPlayer, DisplayVideoItem, FALLBACK_VIDEOS, TestimonialItem, VetGallery(), PLAYBACK_RATES (+4 more)
|
||||
### Community 144 - "SafeImage.tsx"
|
||||
Cohesion: 0.10
|
||||
Nodes (23): BackButton(), BackButtonProps, BlogPost, PLAYBACK_RATES, PodcastInlinePlayer(), PodcastInlinePlayerProps, PLAYBACK_RATES, PodcastPlayerModal() (+15 more)
|
||||
|
||||
### Community 145 - "ProductDto"
|
||||
Cohesion: 0.22
|
||||
@ -950,9 +932,13 @@ Nodes (7): PatternItem, SmsConfigState, SmsLogItem, SmsLogStats, SmsSettingsPage
|
||||
Cohesion: 0.29
|
||||
Nodes (6): 1. Executive Vision, 2. Target Audience, 3. Functional Requirements, 4. Non-Functional Requirements (Performance, Security), 5. Epic / Feature Breakdown, Product Requirement Document (PRD)
|
||||
|
||||
### Community 151 - "zibal-ebank.service.ts"
|
||||
Cohesion: 0.40
|
||||
Nodes (4): EBankCheckoutListFilter, EBankCheckoutOptions, EBankIdentifiedPaymentFilter, EBankStatementFilter
|
||||
|
||||
### Community 152 - "useCartStore"
|
||||
Cohesion: 0.12
|
||||
Nodes (12): CartDrawer(), DeleteConfirmModal(), DeleteConfirmModalProps, Header(), mockProduct, ApiErr, Order, OrderItem (+4 more)
|
||||
Cohesion: 0.11
|
||||
Nodes (15): B2BPortal, B2BPortal(), CartDrawer(), DeleteConfirmModal(), DeleteConfirmModalProps, mockProduct, ApiErr, Order (+7 more)
|
||||
|
||||
### Community 153 - "exclude"
|
||||
Cohesion: 0.22
|
||||
@ -1034,9 +1020,9 @@ Nodes (4): evidenceList, ledger, mandatoryMap, mandatoryScope
|
||||
Cohesion: 0.40
|
||||
Nodes (4): activeFiles, errors, validationOutput, warnings
|
||||
|
||||
### Community 177 - "auth.module.ts"
|
||||
Cohesion: 0.17
|
||||
Nodes (10): DEFAULT_JWT_REFRESH_SECRET, DEFAULT_JWT_SECRET, getJwtSecret(), AuthModule, Module, JwtPayload, JwtStrategy, Injectable (+2 more)
|
||||
### Community 177 - "UsersService"
|
||||
Cohesion: 0.12
|
||||
Nodes (13): DEFAULT_JWT_REFRESH_SECRET, DEFAULT_JWT_SECRET, getJwtSecret(), AuthModule, Module, JwtPayload, JwtStrategy, Injectable (+5 more)
|
||||
|
||||
### Community 178 - "نقشه جامع پوشش تستهای سرتاسری (E2E Test Coverage Map) — پروژه Canina"
|
||||
Cohesion: 0.33
|
||||
@ -1058,10 +1044,6 @@ Nodes (3): Architectural Overview, Critical Review Findings & Required Enhanceme
|
||||
Cohesion: 0.50
|
||||
Nodes (3): Overview & Content Foundation, SEO & Content Requirements, 🚀 SEO & Content Strategy Review (12_seo_content)
|
||||
|
||||
### Community 184 - "CheckoutPage.tsx"
|
||||
Cohesion: 0.30
|
||||
Nodes (11): AddressFormData, AddressModal(), AddressModalProps, normalizeDigits(), validateAddressForm(), CheckoutPage(), SearchableSelect(), SearchableSelectProps (+3 more)
|
||||
|
||||
### Community 191 - "graphify reference: add a URL and watch a folder"
|
||||
Cohesion: 0.50
|
||||
Nodes (3): For /graphify add, For --watch, graphify reference: add a URL and watch a folder
|
||||
@ -1114,18 +1096,6 @@ Nodes (10): ApiPropertyOptional, IsOptional, IsString, ZibalCallbackQueryDto, Ap
|
||||
Cohesion: 0.83
|
||||
Nodes (3): GET(), handleRevalidate(), POST()
|
||||
|
||||
### Community 326 - "SmsLogQueryDto"
|
||||
Cohesion: 0.25
|
||||
Nodes (7): SmsLogQueryDto, ApiPropertyOptional, IsIn, IsNumber, IsOptional, IsString, Type
|
||||
|
||||
### Community 329 - "B2BService"
|
||||
Cohesion: 0.48
|
||||
Nodes (3): B2BService, B2BWholesaleOrderItem, Injectable
|
||||
|
||||
### Community 331 - "PodcastPlayerModal.tsx"
|
||||
Cohesion: 0.40
|
||||
Nodes (3): PLAYBACK_RATES, PodcastPlayerModal(), PodcastPlayerModalProps
|
||||
|
||||
### Community 332 - "app.e2e-spec.js"
|
||||
Cohesion: 0.50
|
||||
Nodes (3): app_module_1, supertest_1, testing_1
|
||||
@ -1135,24 +1105,24 @@ Cohesion: 0.67
|
||||
Nodes (3): generateMetadata(), getHomeData(), Home()
|
||||
|
||||
## Knowledge Gaps
|
||||
- **1341 isolated node(s):** `$schema`, `collection`, `sourceRoot`, `deleteOutDir`, `name` (+1336 more)
|
||||
- **1343 isolated node(s):** `$schema`, `collection`, `sourceRoot`, `deleteOutDir`, `name` (+1338 more)
|
||||
These have ≤1 connection - possible missing edges or undocumented components.
|
||||
- **122 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
|
||||
- **102 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
|
||||
|
||||
## Suggested Questions
|
||||
_Questions this graph is uniquely positioned to answer:_
|
||||
|
||||
- **Why does `ApiResponse` connect `src/services/api.ts` to `BlogsController`, `AuthController`, `WikiController`, `PetsController`, `UsersController`, `HomeController`, `ProductsService`, `OrdersService`?**
|
||||
- **Why does `ApiResponse` connect `src/services/api.ts` to `BlogsController`, `AuthController`, `WikiController`, `PetsController`, `UsersController`, `HomeController`, `ProductsController`, `OrdersService`?**
|
||||
_High betweenness centrality (0.080) - this node is a cross-community bridge._
|
||||
- **Why does `Roles()` connect `Roles` to `SettingsController`, `CmsController`, `tickets.controller.ts`, `CreateReviewDto`, `JwtAuthGuard`, `ProductsService`, `MenuService`, `WholesaleApplyDto`, `B2BController`, `FaqService`, `SslController`, `BannersController`, `TestimonialsController`, `IngredientsController`, `PrescriptionsService`, `SmartAdvisorService`, `ContactController`, `BlogsService`, `B2BService`?**
|
||||
- **Why does `Roles()` connect `Roles` to `SettingsController`, `CmsController`, `tickets.controller.ts`, `reviews.controller.ts`, `ReviewsController`, `JwtAuthGuard`, `ProductsController`, `MenuService`, `WholesaleApplyDto`, `B2BController`, `FaqService`, `SslController`, `BannersController`, `TestimonialsController`, `IngredientsController`, `PrescriptionsController`, `SmartAdvisorService`, `ContactService`, `ProductsService`?**
|
||||
_High betweenness centrality (0.063) - this node is a cross-community bridge._
|
||||
- **Why does `JwtAuthGuard` connect `JwtAuthGuard` to `auth.controller.ts`, `BlogsService`, `CmsController`, `tickets.controller.ts`, `B2BService`, `PaginationDto`, `PetsController`, `ProductsService`, `admin.service.ts`, `ReportsController`, `users.service.ts`, `OrdersService`?**
|
||||
_High betweenness centrality (0.036) - this node is a cross-community bridge._
|
||||
- **Why does `JwtAuthGuard` connect `JwtAuthGuard` to `app.module.ts`, `CmsController`, `tickets.controller.ts`, `reviews.controller.ts`, `auth.service.ts`, `PaginationDto`, `PetsController`, `UsersService`, `admin.service.ts`, `admin.module.ts`, `CreateVideoDto`, `ProductsService`, `OrdersService`?**
|
||||
_High betweenness centrality (0.035) - this node is a cross-community bridge._
|
||||
- **What connects `$schema`, `collection`, `sourceRoot` to the rest of the system?**
|
||||
_1341 weakly-connected nodes found - possible documentation gaps or missing edges._
|
||||
_1343 weakly-connected nodes found - possible documentation gaps or missing edges._
|
||||
- **Should `app.module.ts` be split into smaller, more focused modules?**
|
||||
_Cohesion score 0.06078316773816481 - nodes in this community are weakly interconnected._
|
||||
- **Should `ProductService` be split into smaller, more focused modules?**
|
||||
_Cohesion score 0.06229508196721312 - nodes in this community are weakly interconnected._
|
||||
- **Should `ProductPage.tsx` be split into smaller, more focused modules?**
|
||||
_Cohesion score 0.11594202898550725 - nodes in this community are weakly interconnected._
|
||||
_Cohesion score 0.06748911465892599 - nodes in this community are weakly interconnected._
|
||||
- **Should `SettingsController` be split into smaller, more focused modules?**
|
||||
_Cohesion score 0.07333333333333333 - nodes in this community are weakly interconnected._
|
||||
- **Should `productService.ts` be split into smaller, more focused modules?**
|
||||
_Cohesion score 0.06440677966101695 - nodes in this community are weakly interconnected._
|
||||
2
graphify-out/cache/stat-index.json
vendored
2
graphify-out/cache/stat-index.json
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
10695
graphify-out/graph.json
10695
graphify-out/graph.json
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user