feat: complete Google Search Console and Analytics integration across admin panel and storefront
Some checks failed
Deploy Canina / deploy (push) Successful in 2m14s
E2E Playwright Tests / Run Full E2E & Security Suites (push) Failing after 7s

This commit is contained in:
parsa aghaei 2026-09-02 11:34:10 +03:30
parent 1fb5de764c
commit f0457b5748
16 changed files with 7698 additions and 7210 deletions

View File

@ -571,6 +571,28 @@ export class SettingsService implements OnModuleInit {
if (obj.ogImageUrl) {
updates['ogImageUrl'] = String(obj.ogImageUrl);
}
if ('googleSiteVerification' in obj) {
updates['googleSiteVerification'] = String(obj.googleSiteVerification ?? '');
updates['google_site_verification'] = String(obj.googleSiteVerification ?? '');
}
if ('googleAnalyticsId' in obj) {
updates['googleAnalyticsId'] = String(obj.googleAnalyticsId ?? '');
updates['ga_measurement_id'] = String(obj.googleAnalyticsId ?? '');
}
if ('googleTagManagerId' in obj) {
updates['googleTagManagerId'] = String(obj.googleTagManagerId ?? '');
updates['gtm_id'] = String(obj.googleTagManagerId ?? '');
}
if ('enableGoogleAnalytics' in obj) {
updates['enableGoogleAnalytics'] = String(Boolean(obj.enableGoogleAnalytics));
}
if ('enableGoogleTagManager' in obj) {
updates['enableGoogleTagManager'] = String(Boolean(obj.enableGoogleTagManager));
}
if ('clarityProjectId' in obj) {
updates['clarityProjectId'] = String(obj.clarityProjectId ?? '');
updates['clarity_project_id'] = String(obj.clarityProjectId ?? '');
}
if (Object.keys(updates).length > 0) {
await this.updateBulkUiTexts(updates);

View File

@ -1,5 +1,5 @@
import { useState, useEffect } from 'react';
import { Globe, Save, Sliders, Monitor, Sparkles } from 'lucide-react';
import { Globe, Save, Sliders, Monitor, Sparkles, Search, BarChart3, Code2, CheckCircle2, HelpCircle, Activity, ExternalLink, ShieldCheck } from 'lucide-react';
import { toast } from 'react-hot-toast';
import api from '../services/api';
import Spinner from '../components/ui/Spinner';
@ -19,6 +19,12 @@ export default function SeoSettingsPage() {
keywords: 'مکمل سگ, مکمل گربه, داروی حیوانات, Canina Germany',
canonicalBaseUrl: 'https://canina.ir',
ogImageUrl: '/assets/images/regenerated_image_1779109861747.png',
googleSiteVerification: '',
googleAnalyticsId: '',
googleTagManagerId: '',
enableGoogleAnalytics: true,
enableGoogleTagManager: true,
clarityProjectId: '',
});
const [isLoading, setIsLoading] = useState(true);
const [isSaving, setIsSaving] = useState(false);
@ -41,6 +47,12 @@ export default function SeoSettingsPage() {
keywords: data.keywords || prev.keywords,
canonicalBaseUrl: data.canonicalBaseUrl || prev.canonicalBaseUrl,
ogImageUrl: data.ogImageUrl || prev.ogImageUrl,
googleSiteVerification: data.googleSiteVerification || data.google_site_verification || '',
googleAnalyticsId: data.googleAnalyticsId || data.ga_measurement_id || '',
googleTagManagerId: data.googleTagManagerId || data.gtm_id || '',
enableGoogleAnalytics: data.enableGoogleAnalytics !== undefined ? Boolean(data.enableGoogleAnalytics) : true,
enableGoogleTagManager: data.enableGoogleTagManager !== undefined ? Boolean(data.enableGoogleTagManager) : true,
clarityProjectId: data.clarityProjectId || data.clarity_project_id || '',
}));
}
})
@ -286,6 +298,279 @@ export default function SeoSettingsPage() {
</div>
</div>
{/* Section 3: Google Services & Webmaster Analytics */}
<div className="space-y-6 pt-6 border-t border-gray-100">
<div className="flex flex-col sm:flex-row sm:items-center justify-between gap-2 pb-2">
<div className="flex items-center gap-2">
<BarChart3 className="w-5 h-5 text-purple-600" />
<h3 className="text-base font-black text-gray-900">
سرویسهای تحلیل و وبمستر گوگل (Google Services & Analytics)
</h3>
</div>
<span className="text-xs text-purple-700 bg-purple-50 px-3 py-1 rounded-full font-bold self-start sm:self-auto">
اتصال آنی به فرانتاستور (Zero Build Delay)
</span>
</div>
{/* Grid of Webmaster Cards */}
<div className="grid grid-cols-1 lg:grid-cols-2 gap-6">
{/* Google Search Console Card */}
<div className="bg-white p-5 rounded-2xl border border-gray-200 shadow-xs space-y-4 relative overflow-hidden">
<div className="flex items-center justify-between border-b pb-3 border-gray-100">
<div className="flex items-center gap-2.5">
<div className="w-9 h-9 rounded-xl bg-blue-50 text-blue-600 flex items-center justify-center font-black text-xs">
GSC
</div>
<div>
<h4 className="text-sm font-bold text-gray-900 flex items-center gap-1.5">
<span>گوگل سرچ کنسول (Google Search Console)</span>
</h4>
<p className="text-[11px] text-gray-500">تأیید مالکیت دامنه در نتایج جستجوی گوگل</p>
</div>
</div>
{seo.googleSiteVerification ? (
<span className="inline-flex items-center gap-1 px-2.5 py-0.5 rounded-full text-[11px] font-bold bg-emerald-50 text-emerald-700 border border-emerald-200">
<CheckCircle2 className="w-3.5 h-3.5" />
متصل
</span>
) : (
<span className="inline-flex items-center gap-1 px-2.5 py-0.5 rounded-full text-[11px] font-bold bg-gray-100 text-gray-600">
تنظیم نشده
</span>
)}
</div>
<div className="space-y-2">
<label className="text-xs font-bold text-gray-700 flex items-center justify-between">
<span>کد متاتگ تأیید مالکیت (HTML Verification Tag)</span>
<a
href="https://search.google.com/search-console"
target="_blank"
rel="noreferrer"
className="text-[11px] text-blue-600 hover:underline flex items-center gap-1 font-bold"
>
ورود به سرچ کنسول
<ExternalLink className="w-3 h-3" />
</a>
</label>
<input
type="text"
value={seo.googleSiteVerification || ''}
onChange={(e) => {
let val = e.target.value.trim();
// Auto-extract content if user pasted full <meta name="google-site-verification" content="..." />
const match = val.match(/content=["']([^"']+)["']/);
if (match && match[1]) {
val = match[1];
}
setSeo({ ...seo, googleSiteVerification: val });
}}
placeholder="مثال: abcdef1234567890 یا کل تگ <meta...>"
className="w-full px-4 py-2.5 rounded-xl border border-gray-200 focus:border-blue-500 outline-none text-xs font-mono"
dir="ltr"
/>
<p className="text-[11px] text-gray-400 leading-relaxed">
میتوانید کل تگ <code className="bg-gray-100 px-1 rounded text-purple-700">&lt;meta name="google-site-verification"...&gt;</code> یا فقط مقدار داخل <code className="bg-gray-100 px-1 rounded text-purple-700">content</code> را پیست کنید.
</p>
</div>
{seo.googleSiteVerification && (
<div className="p-3 bg-gray-50 rounded-xl border border-gray-200 text-[11px] font-mono text-gray-600 space-y-1" dir="ltr">
<span className="text-[10px] text-gray-400 font-sans block text-right font-bold">متاتگ تزریق شده در سایت:</span>
<code className="text-blue-700 select-all block break-all">
&lt;meta name="google-site-verification" content="{seo.googleSiteVerification}" /&gt;
</code>
</div>
)}
</div>
{/* Google Analytics 4 (GA4) Card */}
<div className="bg-white p-5 rounded-2xl border border-gray-200 shadow-xs space-y-4 relative overflow-hidden">
<div className="flex items-center justify-between border-b pb-3 border-gray-100">
<div className="flex items-center gap-2.5">
<div className="w-9 h-9 rounded-xl bg-amber-50 text-amber-600 flex items-center justify-center font-black text-xs">
GA4
</div>
<div>
<h4 className="text-sm font-bold text-gray-900 flex items-center gap-1.5">
<span>گوگل آنالیتیکس ۴ (Google Analytics 4)</span>
</h4>
<p className="text-[11px] text-gray-500">رهگیری بازدیدها، نرخ تبدیل و رفتار مشتریان</p>
</div>
</div>
<label className="relative inline-flex items-center cursor-pointer">
<input
type="checkbox"
className="sr-only peer"
checked={seo.enableGoogleAnalytics !== false}
onChange={(e) => setSeo({ ...seo, enableGoogleAnalytics: e.target.checked })}
/>
<div className="w-10 h-5 bg-gray-200 peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all peer-checked:bg-amber-500"></div>
</label>
</div>
<div className="space-y-2">
<label className="text-xs font-bold text-gray-700 flex items-center justify-between">
<span>شناسه اندازهگیری گوگل آنالیتیکس (Measurement ID)</span>
<a
href="https://analytics.google.com"
target="_blank"
rel="noreferrer"
className="text-[11px] text-amber-600 hover:underline flex items-center gap-1 font-bold"
>
ورود به Google Analytics
<ExternalLink className="w-3 h-3" />
</a>
</label>
<input
type="text"
value={seo.googleAnalyticsId || ''}
onChange={(e) => setSeo({ ...seo, googleAnalyticsId: e.target.value.trim() })}
placeholder="G-XXXXXXXXXX"
className="w-full px-4 py-2.5 rounded-xl border border-gray-200 focus:border-amber-500 outline-none text-xs font-mono font-bold"
dir="ltr"
/>
<p className="text-[11px] text-gray-400 leading-relaxed">
این شناسه با پیشوند <strong className="text-gray-700">G-</strong> از مسیر Admin &gt; Data Streams در گوگل آنالیتیکس قابل دریافت است.
</p>
</div>
<div className="flex items-center gap-2 pt-1">
{seo.googleAnalyticsId && seo.enableGoogleAnalytics !== false ? (
<span className="inline-flex items-center gap-1.5 px-3 py-1 rounded-lg text-xs font-bold bg-amber-50 text-amber-800 border border-amber-200">
<Activity className="w-3.5 h-3.5 text-amber-600 animate-pulse" />
اسکریپت gtag.js فعال و در حال رهگیری است
</span>
) : (
<span className="text-[11px] text-gray-400 font-medium">
{!seo.googleAnalyticsId ? 'شناسه GA4 هنوز ثبت نشده است.' : 'آمارگیر غیرفعال شده است.'}
</span>
)}
</div>
</div>
{/* Google Tag Manager (GTM) Card */}
<div className="bg-white p-5 rounded-2xl border border-gray-200 shadow-xs space-y-4 relative overflow-hidden">
<div className="flex items-center justify-between border-b pb-3 border-gray-100">
<div className="flex items-center gap-2.5">
<div className="w-9 h-9 rounded-xl bg-blue-50 text-blue-700 flex items-center justify-center font-black text-xs">
GTM
</div>
<div>
<h4 className="text-sm font-bold text-gray-900 flex items-center gap-1.5">
<span>گوگل تگ منیجر (Google Tag Manager)</span>
</h4>
<p className="text-[11px] text-gray-500">مدیریت متمرکز تگها، ایونتها و تبلیغات گوگل ادز</p>
</div>
</div>
<label className="relative inline-flex items-center cursor-pointer">
<input
type="checkbox"
className="sr-only peer"
checked={seo.enableGoogleTagManager !== false}
onChange={(e) => setSeo({ ...seo, enableGoogleTagManager: e.target.checked })}
/>
<div className="w-10 h-5 bg-gray-200 peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all peer-checked:bg-blue-600"></div>
</label>
</div>
<div className="space-y-2">
<label className="text-xs font-bold text-gray-700 flex items-center justify-between">
<span>شناسه کانتینر تگ منیجر (Container ID)</span>
<a
href="https://tagmanager.google.com"
target="_blank"
rel="noreferrer"
className="text-[11px] text-blue-600 hover:underline flex items-center gap-1 font-bold"
>
ورود به Tag Manager
<ExternalLink className="w-3 h-3" />
</a>
</label>
<input
type="text"
value={seo.googleTagManagerId || ''}
onChange={(e) => setSeo({ ...seo, googleTagManagerId: e.target.value.trim() })}
placeholder="GTM-XXXXXXX"
className="w-full px-4 py-2.5 rounded-xl border border-gray-200 focus:border-blue-500 outline-none text-xs font-mono font-bold"
dir="ltr"
/>
<p className="text-[11px] text-gray-400 leading-relaxed">
شناسه با پیشوند <strong className="text-gray-700">GTM-</strong> در بالای داشبورد کانتینر تگ منیجر درج شده است.
</p>
</div>
<div className="flex items-center gap-2 pt-1">
{seo.googleTagManagerId && seo.enableGoogleTagManager !== false ? (
<span className="inline-flex items-center gap-1.5 px-3 py-1 rounded-lg text-xs font-bold bg-blue-50 text-blue-800 border border-blue-200">
<Code2 className="w-3.5 h-3.5 text-blue-600" />
کانتینر GTM در Head و Noscript لود میشود
</span>
) : (
<span className="text-[11px] text-gray-400 font-medium">
{!seo.googleTagManagerId ? 'شناسه GTM ثبت نشده است.' : 'تگ منیجر غیرفعال شده است.'}
</span>
)}
</div>
</div>
{/* Microsoft Clarity Card */}
<div className="bg-white p-5 rounded-2xl border border-gray-200 shadow-xs space-y-4 relative overflow-hidden">
<div className="flex items-center justify-between border-b pb-3 border-gray-100">
<div className="flex items-center gap-2.5">
<div className="w-9 h-9 rounded-xl bg-orange-50 text-orange-600 flex items-center justify-center font-black text-xs">
MS
</div>
<div>
<h4 className="text-sm font-bold text-gray-900 flex items-center gap-1.5">
<span>مایکروسافت کلاریتی (Microsoft Clarity)</span>
</h4>
<p className="text-[11px] text-gray-500">ضبط جلسات، نقشه حرارتی (Heatmap) و تحلیل کلیکها</p>
</div>
</div>
{seo.clarityProjectId ? (
<span className="inline-flex items-center gap-1 px-2.5 py-0.5 rounded-full text-[11px] font-bold bg-emerald-50 text-emerald-700 border border-emerald-200">
<CheckCircle2 className="w-3.5 h-3.5" />
فعال
</span>
) : (
<span className="inline-flex items-center gap-1 px-2.5 py-0.5 rounded-full text-[11px] font-bold bg-gray-100 text-gray-600">
اختیاری
</span>
)}
</div>
<div className="space-y-2">
<label className="text-xs font-bold text-gray-700 flex items-center justify-between">
<span>شناسه پروژه کلاریتی (Project ID)</span>
<a
href="https://clarity.microsoft.com"
target="_blank"
rel="noreferrer"
className="text-[11px] text-orange-600 hover:underline flex items-center gap-1 font-bold"
>
ورود به Microsoft Clarity
<ExternalLink className="w-3 h-3" />
</a>
</label>
<input
type="text"
value={seo.clarityProjectId || ''}
onChange={(e) => setSeo({ ...seo, clarityProjectId: e.target.value.trim() })}
placeholder="مثال: abcde12345"
className="w-full px-4 py-2.5 rounded-xl border border-gray-200 focus:border-orange-500 outline-none text-xs font-mono"
dir="ltr"
/>
<p className="text-[11px] text-gray-400 leading-relaxed">
ابزار کاملاً رایگان مایکروسافت برای مشاهده رفتار خرید کاربران در صفحه محصول و چکاوت.
</p>
</div>
</div>
</div>
</div>
<div className="flex justify-end pt-4 border-t border-gray-100">
<Button
type="submit"
@ -294,7 +579,7 @@ export default function SeoSettingsPage() {
startIcon={Save}
isLoading={isSaving}
>
ذخیره تنظیمات سئو و ساختار عناوین
ذخیره جامع تنظیمات سئو و سرویسهای گوگل
</Button>
</div>
</form>

View File

@ -185,6 +185,12 @@ export interface SeoSettings {
keywords: string;
canonicalBaseUrl: string;
ogImageUrl: string;
googleSiteVerification?: string;
googleAnalyticsId?: string;
googleTagManagerId?: string;
enableGoogleAnalytics?: boolean;
enableGoogleTagManager?: boolean;
clarityProjectId?: string;
}
export interface FinancialSettings {

View File

@ -1,9 +1,11 @@
import type { Metadata } from 'next';
import Script from 'next/script';
import './globals.css';
import NextTopLoader from 'nextjs-toploader';
import ClientLayout from './ClientLayout';
import { getSeoConfig } from '../lib/seo';
import { vazirmatn, lalezar } from '../lib/fonts';
import { generateOrganizationSchema } from '../lib/schema';
export async function generateMetadata(): Promise<Metadata> {
const config = await getSeoConfig();
@ -43,6 +45,9 @@ export async function generateMetadata(): Promise<Metadata> {
authors: [{ name: brandName }],
creator: brandName,
publisher: brandName,
verification: config.googleSiteVerification ? {
google: config.googleSiteVerification,
} : undefined,
robots: isStaging ? {
index: false,
follow: false,
@ -96,13 +101,13 @@ export async function generateMetadata(): Promise<Metadata> {
};
}
import { generateOrganizationSchema } from '../lib/schema';
export default function RootLayout({
export default async function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
const config = await getSeoConfig();
const orgSchema = generateOrganizationSchema({
name: 'کنینا ایران',
alternateName: 'Canina Iran (Canina pharma GmbH)',
@ -144,9 +149,29 @@ export default function RootLayout({
const safeJsonLd = JSON.stringify([orgSchema, webSiteSchema]).replace(/</g, '\\u003c');
const gaId = config.googleAnalyticsId?.trim();
const isGaEnabled = Boolean(gaId && config.enableGoogleAnalytics !== false);
const gtmId = config.googleTagManagerId?.trim();
const isGtmEnabled = Boolean(gtmId && config.enableGoogleTagManager !== false);
const clarityId = config.clarityProjectId?.trim();
return (
<html lang="fa" dir="rtl" className={`${vazirmatn.variable} ${lalezar.variable}`} suppressHydrationWarning>
<body className="min-h-screen bg-medical-gray-50 font-sans" suppressHydrationWarning>
{/* Google Tag Manager (noscript fallback) */}
{isGtmEnabled && (
<noscript>
<iframe
src={`https://www.googletagmanager.com/ns.html?id=${gtmId}`}
height="0"
width="0"
style={{ display: 'none', visibility: 'hidden' }}
/>
</noscript>
)}
<NextTopLoader
color="#0284c7"
initialPosition={0.08}
@ -166,6 +191,64 @@ export default function RootLayout({
<ClientLayout>
{children}
</ClientLayout>
{/* Google Tag Manager Script */}
{isGtmEnabled && (
<Script
id="google-tag-manager"
strategy="afterInteractive"
dangerouslySetInnerHTML={{
__html: `
(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','${gtmId}');
`,
}}
/>
)}
{/* Google Analytics 4 (GA4) Scripts */}
{isGaEnabled && (
<>
<Script
strategy="afterInteractive"
src={`https://www.googletagmanager.com/gtag/js?id=${gaId}`}
/>
<Script
id="google-analytics"
strategy="afterInteractive"
dangerouslySetInnerHTML={{
__html: `
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', '${gaId}', {
page_path: window.location.pathname,
});
`,
}}
/>
</>
)}
{/* Microsoft Clarity Script */}
{clarityId && (
<Script
id="microsoft-clarity"
strategy="afterInteractive"
dangerouslySetInnerHTML={{
__html: `
(function(c,l,a,r,i,t,y){
c[a]=c[a]||function(){(c[a].q=c[a].q||[]).push(arguments)};
t=l.createElement(r);t.async=1;t.src="https://www.clarity.ms/tag/"+i;
y=l.getElementsByTagName(r)[0];y.parentNode.insertBefore(t,y);
})(window, document, "clarity", "script", "${clarityId}");
`,
}}
/>
)}
</body>
</html>
);

View File

@ -10,6 +10,12 @@ export interface SeoConfig {
keywords: string[];
canonicalBaseUrl: string;
ogImageUrl: string;
googleSiteVerification?: string;
googleAnalyticsId?: string;
googleTagManagerId?: string;
enableGoogleAnalytics?: boolean;
enableGoogleTagManager?: boolean;
clarityProjectId?: string;
texts: Record<string, string>;
}
@ -23,6 +29,12 @@ const DEFAULT_SEO_CONFIG: SeoConfig = {
keywords: ['کنینا', 'مکمل حیوانات خانگی', 'مکمل سگ', 'مکمل گربه', 'داروی حیوانات', 'Canina Iran'],
canonicalBaseUrl: 'https://canina.ir',
ogImageUrl: '/assets/images/regenerated_image_1779109861747.png',
googleSiteVerification: '',
googleAnalyticsId: '',
googleTagManagerId: '',
enableGoogleAnalytics: true,
enableGoogleTagManager: true,
clarityProjectId: '',
texts: {},
};
@ -97,6 +109,40 @@ export async function getSeoConfig(): Promise<SeoConfig> {
const ogImageUrl =
texts['ogImageUrl'] || DEFAULT_SEO_CONFIG.ogImageUrl;
const googleSiteVerification =
texts['googleSiteVerification'] ||
texts['google_site_verification'] ||
process.env.NEXT_PUBLIC_GOOGLE_SITE_VERIFICATION ||
'';
const googleAnalyticsId =
texts['googleAnalyticsId'] ||
texts['ga_measurement_id'] ||
process.env.NEXT_PUBLIC_GA_MEASUREMENT_ID ||
'';
const googleTagManagerId =
texts['googleTagManagerId'] ||
texts['gtm_id'] ||
process.env.NEXT_PUBLIC_GTM_ID ||
'';
const enableGoogleAnalytics =
texts['enableGoogleAnalytics'] !== undefined
? texts['enableGoogleAnalytics'] === 'true'
: true;
const enableGoogleTagManager =
texts['enableGoogleTagManager'] !== undefined
? texts['enableGoogleTagManager'] === 'true'
: true;
const clarityProjectId =
texts['clarityProjectId'] ||
texts['clarity_project_id'] ||
process.env.NEXT_PUBLIC_CLARITY_PROJECT_ID ||
'';
return {
brandNameFa,
brandNameEn,
@ -107,6 +153,12 @@ export async function getSeoConfig(): Promise<SeoConfig> {
keywords,
canonicalBaseUrl,
ogImageUrl,
googleSiteVerification,
googleAnalyticsId,
googleTagManagerId,
enableGoogleAnalytics,
enableGoogleTagManager,
clarityProjectId,
texts,
};
}

View File

@ -3,7 +3,7 @@
"1": "app.module.ts",
"2": "AdminTransactionFilterDto",
"3": "productService.ts",
"4": "PetProfile.tsx",
"4": "api",
"5": "CmsController",
"6": "TicketsService",
"7": "SmsSettingsPage.tsx",
@ -13,7 +13,7 @@
"11": "WikiController",
"12": "index.ts",
"13": "app-audit-verification.e2e-spec.js",
"14": "toPersian",
"14": "UserDashboard.tsx",
"15": "src/services/api.ts",
"16": "DoctorQueryDto",
"17": "schema.ts",
@ -57,16 +57,16 @@
"55": "UITexts.tsx",
"56": "Orders.tsx",
"57": "Role & Core Objective",
"58": "UserDashboard.tsx",
"58": "components/Skeleton.tsx",
"59": "compilerOptions",
"60": "CreateUserDto",
"61": "ProductPage.tsx",
"62": "RevalidationService",
"62": "WikiService",
"63": "dependencies",
"64": "compilerOptions",
"65": "admin.service.ts",
"66": "AdminQueryDto",
"67": "admin.module.ts",
"67": "ReportsController",
"68": "useSettingsStore",
"69": "Required Review Group Closures",
"70": "compilerOptions",
@ -84,15 +84,15 @@
"82": "scripts",
"83": "dependencies",
"84": "Role & Core Objective",
"85": "jwt.strategy.ts",
"85": "auth.module.ts",
"86": "zibal.service.ts",
"87": "dependencies",
"88": "payment.controller.ts",
"89": "seed-products.ts",
"90": "OrderService",
"90": "useCartStore",
"91": "Reconciled Audit Roles & Assignments",
"92": "OrdersService",
"93": "ArchivePage.tsx",
"93": "HomeClient.tsx",
"94": "Phase 3.1 — Human Review Preparation and Master Backlog Critique",
"95": "wiki/[slug]/page.tsx",
"96": "compilerOptions",
@ -150,7 +150,7 @@
"148": "track/page.tsx",
"149": "trust-seals/page.tsx",
"150": "Product Requirement Document (PRD)",
"151": "AuthService",
"151": "menu.module.ts",
"152": "auth.service.ts",
"153": "exclude",
"154": "Baseline Command Plan & Reconciled Command History",
@ -178,13 +178,13 @@
"176": "uploads/[...path]/route.ts",
"177": "app/page.tsx",
"178": "نقشه جامع پوشش تست‌های سرتاسری (E2E Test Coverage Map) — پروژه Canina",
"179": "@types/node",
"179": "app.e2e-spec.js",
"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": "MetricsController",
"185": "eslint",
"185": "bcrypt",
"186": "seed-ui-texts.ts",
"187": "seed-wiki.ts",
"188": "update-blog.dto.ts",
@ -196,7 +196,7 @@
"194": "Raw Finding Verification & Disposition Report",
"195": "React + TypeScript + Vite",
"196": "Select.tsx",
"197": "userStore.ts",
"197": "lib/services/api.ts",
"198": "@tailwindcss/postcss",
"199": "SmsLogQueryDto",
"200": "application/README.md",
@ -223,7 +223,7 @@
"221": "Textarea.tsx",
"222": "admin-panel/tsconfig.json",
"223": "tailwindcss",
"224": "typescript",
"224": "class-transformer",
"225": "next.config.ts",
"226": "Shabnam Font README",
"227": "AGENTS.md",
@ -264,6 +264,7 @@
"262": "User Logout API",
"263": "generate-openapi.d.ts",
"264": "@types/compression",
"265": "helmet",
"266": "@types/express",
"267": "@types/jest",
"268": "@types/multer",
@ -293,21 +294,39 @@
"292": "Production Docker Compose",
"293": "Staging Docker Compose",
"294": "ZibalService",
"295": "js-yaml",
"296": "@nestjs/core",
"297": "ZibalEBankService",
"298": ".initiateOrderPayment",
"299": "@tailwindcss/postcss",
"300": "typescript",
"301": "@nestjs/jwt",
"302": "typescript-eslint",
"303": "@nestjs/throttler",
"304": "passport",
"305": "reflect-metadata",
"306": "@eslint/js",
"307": "swagger-ui-express",
"308": "eslint-config-prettier",
"309": "axios",
"310": "tailwindcss",
"311": "@eslint/eslintrc",
"312": "@types/passport-jwt",
"313": "20260526160916_add_ui_texts_and_scientific_terms/migration.sql",
"314": "eslint-plugin-prettier",
"315": "typescript",
"316": "globals",
"317": "revalidate/route.ts",
"318": "MaskableField.tsx",
"319": "@nestjs/cli",
"320": "@nestjs/testing",
"321": "orders/page.tsx",
"322": "pets/page.tsx",
"323": "prettier",
"324": "ts-jest",
"325": "@types/react-dom",
"327": "eslint-plugin-react-refresh"
"326": "@types/js-yaml",
"327": "eslint-plugin-react-refresh",
"328": "@types/supertest",
"329": "typescript-eslint"
}

File diff suppressed because one or more lines are too long

View File

@ -3,7 +3,7 @@
"1": "app.module.ts",
"2": "AdminTransactionFilterDto",
"3": "productService.ts",
"4": "api",
"4": "PetProfile.tsx",
"5": "CmsController",
"6": "TicketsService",
"7": "SmsSettingsPage.tsx",
@ -13,7 +13,7 @@
"11": "WikiController",
"12": "index.ts",
"13": "app-audit-verification.e2e-spec.js",
"14": "UserDashboard.tsx",
"14": "toPersian",
"15": "src/services/api.ts",
"16": "DoctorQueryDto",
"17": "schema.ts",
@ -57,7 +57,7 @@
"55": "UITexts.tsx",
"56": "Orders.tsx",
"57": "Role & Core Objective",
"58": "components/Skeleton.tsx",
"58": "UserDashboard.tsx",
"59": "compilerOptions",
"60": "CreateUserDto",
"61": "ProductPage.tsx",
@ -89,10 +89,10 @@
"87": "dependencies",
"88": "payment.controller.ts",
"89": "seed-products.ts",
"90": "useCartStore",
"90": "OrderService",
"91": "Reconciled Audit Roles & Assignments",
"92": "OrdersService",
"93": "HomeClient.tsx",
"93": "ArchivePage.tsx",
"94": "Phase 3.1 — Human Review Preparation and Master Backlog Critique",
"95": "wiki/[slug]/page.tsx",
"96": "compilerOptions",
@ -121,13 +121,13 @@
"119": "compilerOptions",
"120": "compilerOptions",
"121": "backend/README.md",
"122": "AdminService",
"122": "AdminController",
"123": "UsersService",
"124": "Repository Map",
"125": "validate_integrity.js",
"126": "admin-panel/package.json",
"127": "Sahel-Font",
"128": "ProductDto",
"128": "AdminService",
"129": "Reports.tsx",
"130": "Sahel-Font",
"131": "Role & Core Objective",
@ -144,13 +144,13 @@
"142": "start-dev.js",
"143": "generate-openapi.js",
"144": "SafeImage.tsx",
"145": "RouteErrorBoundary",
"145": "ConfirmModal.tsx",
"146": "System Discovery",
"147": "HomeController",
"148": "track/page.tsx",
"149": "trust-seals/page.tsx",
"150": "Product Requirement Document (PRD)",
"151": "Body",
"151": "AuthService",
"152": "auth.service.ts",
"153": "exclude",
"154": "Baseline Command Plan & Reconciled Command History",
@ -184,7 +184,7 @@
"182": "🎨 Frontend & Admin Panel Technical Review (06_dev_frontend)",
"183": "🚀 SEO & Content Strategy Review (12_seo_content)",
"184": "MetricsController",
"185": "eslint-config-prettier",
"185": "eslint",
"186": "seed-ui-texts.ts",
"187": "seed-wiki.ts",
"188": "update-blog.dto.ts",
@ -196,8 +196,8 @@
"194": "Raw Finding Verification & Disposition Report",
"195": "React + TypeScript + Vite",
"196": "Select.tsx",
"197": "lib/services/api.ts",
"198": "Reviews.tsx",
"197": "userStore.ts",
"198": "@tailwindcss/postcss",
"199": "SmsLogQueryDto",
"200": "application/README.md",
"201": "deploy.sh",
@ -293,7 +293,6 @@
"292": "Production Docker Compose",
"293": "Staging Docker Compose",
"294": "ZibalService",
"295": "eslint-config-next",
"297": "ZibalEBankService",
"298": ".initiateOrderPayment",
"299": "@tailwindcss/postcss",

View File

@ -1,16 +1,16 @@
# Graph Report - canina (2026-09-02)
## Corpus Check
- 599 files · ~1,079,434 words
- 599 files · ~1,081,381 words
- Verdict: corpus is large enough that graph structure adds value.
## Summary
- 4208 nodes · 7642 edges · 312 communities (214 shown, 98 thin omitted)
- 4208 nodes · 7642 edges · 311 communities (210 shown, 101 thin omitted)
- Extraction: 96% EXTRACTED · 4% INFERRED · 0% AMBIGUOUS · INFERRED: 288 edges (avg confidence: 0.79)
- Token cost: 0 input · 0 output
## Graph Freshness
- Built from commit: `6fa1f2c9`
- Built from commit: `ddd0dcba`
- Run `git rev-parse HEAD` and compare to check if the graph is stale.
- Run `graphify update .` after code changes (no API cost).
@ -19,7 +19,7 @@
- app.module.ts
- AdminTransactionFilterDto
- productService.ts
- api
- PetProfile.tsx
- CmsController
- TicketsService
- SmsSettingsPage.tsx
@ -29,7 +29,7 @@
- WikiController
- index.ts
- app-audit-verification.e2e-spec.js
- UserDashboard.tsx
- toPersian
- src/services/api.ts
- DoctorQueryDto
- schema.ts
@ -72,7 +72,7 @@
- UITexts.tsx
- Orders.tsx
- Role & Core Objective
- components/Skeleton.tsx
- UserDashboard.tsx
- compilerOptions
- CreateUserDto
- ProductPage.tsx
@ -104,10 +104,10 @@
- dependencies
- payment.controller.ts
- seed-products.ts
- useCartStore
- OrderService
- Reconciled Audit Roles & Assignments
- OrdersService
- HomeClient.tsx
- ArchivePage.tsx
- Phase 3.1 — Human Review Preparation and Master Backlog Critique
- wiki/[slug]/page.tsx
- compilerOptions
@ -136,13 +136,13 @@
- compilerOptions
- compilerOptions
- backend/README.md
- AdminService
- AdminController
- UsersService
- Repository Map
- validate_integrity.js
- admin-panel/package.json
- Sahel-Font
- ProductDto
- AdminService
- Reports.tsx
- Sahel-Font
- Role & Core Objective
@ -159,13 +159,13 @@
- start-dev.js
- generate-openapi.js
- SafeImage.tsx
- RouteErrorBoundary
- ConfirmModal.tsx
- System Discovery
- HomeController
- track/page.tsx
- trust-seals/page.tsx
- Product Requirement Document (PRD)
- Body
- AuthService
- auth.service.ts
- exclude
- Baseline Command Plan & Reconciled Command History
@ -198,7 +198,7 @@
- 🎨 Frontend & Admin Panel Technical Review (06_dev_frontend)
- 🚀 SEO & Content Strategy Review (12_seo_content)
- MetricsController
- eslint-config-prettier
- eslint
- seed-ui-texts.ts
- seed-wiki.ts
- update-blog.dto.ts
@ -210,8 +210,8 @@
- Raw Finding Verification & Disposition Report
- React + TypeScript + Vite
- Select.tsx
- lib/services/api.ts
- Reviews.tsx
- userStore.ts
- @tailwindcss/postcss
- SmsLogQueryDto
- application/README.md
- deploy.sh
@ -292,7 +292,6 @@
- Production Docker Compose
- Staging Docker Compose
- ZibalService
- eslint-config-next
- ZibalEBankService
- .initiateOrderPayment
- @tailwindcss/postcss
@ -336,7 +335,7 @@
- 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`
- 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 (312 total, 98 thin omitted)
## Communities (311 total, 101 thin omitted)
### Community 0 - "Roles"
Cohesion: 0.24
@ -352,11 +351,11 @@ Nodes (7): AdminTransactionFilterDto, ApiPropertyOptional, IsIn, IsNumber, IsOpt
### Community 3 - "productService.ts"
Cohesion: 0.06
Nodes (38): buildTorobProductSpec(), buildTorobProductTitle(), dynamic, GET(), revalidate, dynamic, GET(), revalidate (+30 more)
Nodes (39): buildTorobProductSpec(), buildTorobProductTitle(), dynamic, GET(), revalidate, dynamic, GET(), revalidate (+31 more)
### Community 4 - "api"
Cohesion: 0.13
Nodes (14): metadata, ContactInfoItem, OrderDetailsModal(), OrderDetailsModalProps, CURRENT_SYMPTOMS, MEDICAL_HISTORIES, SmartAdvisor(), SmartAdvisorProps (+6 more)
### Community 4 - "PetProfile.tsx"
Cohesion: 0.12
Nodes (18): metadata, FeaturedProducts(), ProductCard(), OrderSuccess(), PetProfile(), SearchResultsPage(), CURRENT_SYMPTOMS, MEDICAL_HISTORIES (+10 more)
### Community 5 - "CmsController"
Cohesion: 0.10
@ -376,7 +375,7 @@ Nodes (17): SettingsController, ApiBearerAuth, ApiOkResponse, ApiOperation, ApiT
### Community 9 - "devDependencies"
Cohesion: 0.08
Nodes (25): devDependencies, eslint, @eslint/eslintrc, eslint-plugin-prettier, globals, @nestjs/cli, @nestjs/testing, prettier (+17 more)
Nodes (25): devDependencies, eslint-config-prettier, @eslint/eslintrc, eslint-plugin-prettier, globals, @nestjs/cli, @nestjs/testing, prettier (+17 more)
### Community 10 - "CreateReviewDto"
Cohesion: 0.07
@ -394,13 +393,13 @@ 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 - "UserDashboard.tsx"
Cohesion: 0.13
Nodes (28): VerifyContent(), AddressFormData, AddressModal(), AddressModalProps, normalizeDigits(), validateAddressForm(), AuthModal(), AuthModalProps (+20 more)
### Community 14 - "toPersian"
Cohesion: 0.17
Nodes (20): HomeClient(), VerifyContent(), AddressFormData, AddressModal(), AddressModalProps, normalizeDigits(), validateAddressForm(), CheckoutPage() (+12 more)
### Community 15 - "src/services/api.ts"
Cohesion: 0.06
Nodes (36): Layout(), ProtectedRoute(), MenuGroup, Sidebar(), SidebarProps, SubMenuItem, LiveMonitoringSummary, SEARCHABLE_PAGES (+28 more)
Nodes (38): Layout(), ProtectedRoute(), MenuGroup, Sidebar(), SidebarProps, SubMenuItem, LiveMonitoringSummary, SEARCHABLE_PAGES (+30 more)
### Community 16 - "DoctorQueryDto"
Cohesion: 0.09
@ -415,7 +414,7 @@ Cohesion: 0.19
Nodes (8): JwtAuthGuard, Injectable, ROLES_KEY, RequestWithUser, RolesGuard, Injectable, UserReqPayload, ScientificTermData
### Community 19 - "admin.controller.ts"
Cohesion: 0.29
Cohesion: 0.35
Nodes (12): ApplyGlobalMarginsDto, BulkPriceAdjustmentDto, ApiProperty, ApiPropertyOptional, IsArray, IsBoolean, IsIn, IsNumber (+4 more)
### Community 20 - "CreateVideoDto"
@ -460,7 +459,7 @@ Nodes (31): Acceptance Criteria, Affected Application, Affected Files, Alternati
### Community 32 - "adminRoutes.tsx"
Cohesion: 0.07
Nodes (21): App(), ContactInfoItem, ContactSubmission, CategoryDist, DashboardData, SslStatus, Ticket, TicketMessage (+13 more)
Nodes (16): App(), Props, RouteErrorBoundary, State, HeroBanner, VetTestimonial, SslStatus, AdminRouteConfig (+8 more)
### Community 33 - "WholesaleApplyDto"
Cohesion: 0.10
@ -532,7 +531,7 @@ Nodes (19): autoprefixer, devDependencies, autoprefixer, eslint, @eslint/js, glo
### Community 50 - "devDependencies"
Cohesion: 0.12
Nodes (17): devDependencies, eslint, jsdom, @tailwindcss/postcss, @testing-library/jest-dom, @testing-library/react, @types/node, @types/react (+9 more)
Nodes (17): eslint-config-next, devDependencies, eslint, eslint-config-next, jsdom, @testing-library/jest-dom, @testing-library/react, @types/node (+9 more)
### Community 51 - "BlogsController"
Cohesion: 0.14
@ -547,8 +546,8 @@ Cohesion: 0.13
Nodes (14): SmartAdvisorController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+6 more)
### Community 54 - "Button.tsx"
Cohesion: 0.10
Nodes (16): ButtonProps, ButtonSize, ButtonVariant, ConfirmModal(), ConfirmModalProps, HeroBanner, VetTestimonial, FAQ (+8 more)
Cohesion: 0.07
Nodes (24): ButtonProps, ButtonSize, ButtonVariant, maxWidthClasses, Modal(), ModalProps, ContactInfoItem, ContactSubmission (+16 more)
### Community 55 - "UITexts.tsx"
Cohesion: 0.07
@ -562,21 +561,21 @@ Nodes (15): Badge(), BadgeProps, BadgeVariant, variantStyles, Skeleton(), Monito
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 - "components/Skeleton.tsx"
Cohesion: 0.24
Nodes (4): OrderRowSkeleton(), PetProfileSkeleton(), Skeleton(), SkeletonProps
### Community 58 - "UserDashboard.tsx"
Cohesion: 0.12
Nodes (11): DeleteConfirmModal(), DeleteConfirmModalProps, OrderDetailsModal(), OrderRowSkeleton(), PetProfileSkeleton(), Skeleton(), SkeletonProps, CreateTicketPayload (+3 more)
### Community 59 - "compilerOptions"
Cohesion: 0.06
Nodes (30): compilerOptions, allowSyntheticDefaultImports, baseUrl, declaration, emitDecoratorMetadata, esModuleInterop, experimentalDecorators, forceConsistentCasingInFileNames (+22 more)
### Community 60 - "CreateUserDto"
Cohesion: 0.24
Cohesion: 0.23
Nodes (10): CreateUserDto, ApiProperty, ApiPropertyOptional, IsEmail, IsNotEmpty, IsNumber, IsOptional, IsString (+2 more)
### Community 61 - "ProductPage.tsx"
Cohesion: 0.09
Nodes (20): PodcastInlinePlayer(), ProductImageZoomModalProps, CalculatorState, GalleryMediaItem, ICON_MAP, isVideoUrl(), ProductImageZoomModal, ProductPage() (+12 more)
Cohesion: 0.10
Nodes (19): ProductImageZoomModalProps, CalculatorState, GalleryMediaItem, ICON_MAP, isVideoUrl(), ProductImageZoomModal, ProductPage(), ProductReviews (+11 more)
### Community 62 - "RevalidationService"
Cohesion: 0.14
@ -591,20 +590,20 @@ Cohesion: 0.10
Nodes (20): compilerOptions, allowImportingTsExtensions, erasableSyntaxOnly, lib, module, moduleDetection, moduleResolution, noEmit (+12 more)
### Community 65 - "admin.service.ts"
Cohesion: 0.22
Nodes (8): CouponTargetInput, PaginationQuery, applyRounding(), calculateSellingPrice(), DEFAULT_PRICING_SETTINGS, PricingSettings, RoundingMode, CANONICAL_ALIASES
Cohesion: 0.14
Nodes (15): CouponTargetInput, PaginationQuery, ProductDto, ApiPropertyOptional, IsArray, IsBoolean, IsNumber, IsOptional (+7 more)
### Community 66 - "AdminQueryDto"
Cohesion: 0.18
Nodes (7): ApiQuery, Query, AdminProductQueryDto, AdminQueryDto, ApiPropertyOptional, IsOptional, IsString
Cohesion: 0.13
Nodes (8): ApiQuery, Get, Query, AdminProductQueryDto, AdminQueryDto, ApiPropertyOptional, IsOptional, IsString
### Community 67 - "admin.module.ts"
Cohesion: 0.13
Nodes (13): AdminModule, Module, ReportsController, ApiBearerAuth, ApiOperation, ApiQuery, ApiTags, Controller (+5 more)
### Community 68 - "useSettingsStore"
Cohesion: 0.10
Nodes (22): AuthModal, B2BPortal, CartDrawer, ClientLayout(), B2BLandingClient(), BrandLogo(), BrandLogoProps, FAQItem (+14 more)
Cohesion: 0.08
Nodes (29): HomeClientProps, B2BLandingClient(), BlogPost, BlogPreviewSection(), BrandLogo(), BrandLogoProps, ContactInfoItem, FAQItem (+21 more)
### Community 69 - "Required Review Group Closures"
Cohesion: 0.10
@ -690,10 +689,6 @@ Nodes (19): CreateEBankCheckoutDto, ApiProperty, ApiPropertyOptional, IsNotEmpty
Cohesion: 0.17
Nodes (12): prisma, main(), prisma, determineSuitableFor(), findOrCreateCategory(), getProductImageUrl(), main(), parseSize() (+4 more)
### Community 90 - "useCartStore"
Cohesion: 0.07
Nodes (27): ArchivePage(), ArchiveProductCard(), CATEGORY_MAP, ICON_MAP, CartDrawer(), DeleteConfirmModal(), DeleteConfirmModalProps, FeaturedProducts() (+19 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)
@ -702,9 +697,9 @@ Nodes (15): 10. Documentation Engineer, 1. Lead Architect / Orchestrator, 2. Rea
Cohesion: 0.07
Nodes (35): CreateOrderDto, OrderItemDto, ApiProperty, ApiPropertyOptional, IsArray, IsNotEmpty, IsNumber, IsOptional (+27 more)
### Community 93 - "HomeClient.tsx"
Cohesion: 0.12
Nodes (17): HomeClient(), HomeClientProps, BannerPlacement(), BannerPlacementProps, BlogPreviewSection(), Hero(), StatCounter(), TestimonialsSection() (+9 more)
### Community 93 - "ArchivePage.tsx"
Cohesion: 0.13
Nodes (15): ArchivePage(), ArchiveProductCard(), CATEGORY_MAP, ICON_MAP, BannerPlacement(), BannerPlacementProps, ProductCardSkeleton(), B2BInquiry (+7 more)
### Community 94 - "Phase 3.1 — Human Review Preparation and Master Backlog Critique"
Cohesion: 0.13
@ -743,8 +738,8 @@ 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 - "Products.tsx"
Cohesion: 0.10
Nodes (24): Input, InputProps, formatPriceWithCommas(), PriceInput(), PriceInputProps, toEnglishDigits(), Coupon, CouponFormData (+16 more)
Cohesion: 0.09
Nodes (25): Input, InputProps, formatPriceWithCommas(), PriceInput(), PriceInputProps, toEnglishDigits(), Coupon, CouponFormData (+17 more)
### Community 105 - "Operational Rules & Boundaries"
Cohesion: 0.17
@ -787,8 +782,8 @@ Cohesion: 0.29
Nodes (5): AppController, Controller, Get, AppService, Injectable
### Community 115 - "Spinner.tsx"
Cohesion: 0.07
Nodes (36): ImagePreviewModal(), ImagePreviewModalProps, getFileType(), Media, MediaSelector(), MediaSelectorProps, maxWidthClasses, Modal() (+28 more)
Cohesion: 0.10
Nodes (22): ImagePreviewModal(), ImagePreviewModalProps, getFileType(), Media, MediaSelector(), MediaSelectorProps, Spinner(), Doctor (+14 more)
### Community 116 - "Vazirmatn Changelog"
Cohesion: 0.18
@ -814,9 +809,9 @@ 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 122 - "AdminService"
Cohesion: 0.10
Nodes (12): AdminController, ApiBearerAuth, ApiOperation, ApiTags, Controller, Delete, Get, Param (+4 more)
### Community 122 - "AdminController"
Cohesion: 0.17
Nodes (12): AdminController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Param (+4 more)
### Community 123 - "UsersService"
Cohesion: 0.07
@ -838,10 +833,6 @@ 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 - "ProductDto"
Cohesion: 0.16
Nodes (7): ProductDto, ApiPropertyOptional, IsArray, IsBoolean, IsNumber, IsOptional, IsString
### Community 129 - "Reports.tsx"
Cohesion: 0.20
Nodes (7): BestSellerItem, CategoryDistItem, COLORS, CustomTooltipProps, ReportData, TopCouponItem, Reports
@ -903,12 +894,12 @@ Cohesion: 0.25
Nodes (6): app_module_1, core_1, fs, path, swagger_1, yaml
### Community 144 - "SafeImage.tsx"
Cohesion: 0.08
Nodes (23): BackButton(), BackButtonProps, BlogCategory, BlogPostItem, BlogPostClientProps, BlogPost, ProductDetailModalProps, PLAYBACK_RATES (+15 more)
Cohesion: 0.10
Nodes (20): BackButton(), BackButtonProps, BlogPostClientProps, PLAYBACK_RATES, PodcastInlinePlayer(), PodcastInlinePlayerProps, PLAYBACK_RATES, PodcastPlayerModal() (+12 more)
### Community 145 - "RouteErrorBoundary"
Cohesion: 0.22
Nodes (3): Props, RouteErrorBoundary, State
### Community 145 - "ConfirmModal.tsx"
Cohesion: 0.10
Nodes (16): ConfirmModal(), ConfirmModalProps, Pagination(), PaginationProps, Category, Pet, DoctorOption, Video (+8 more)
### Community 146 - "System Discovery"
Cohesion: 0.25
@ -922,10 +913,6 @@ Nodes (10): HomeController, ApiOkResponse, ApiOperation, ApiTags, Controller, Ge
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 - "Body"
Cohesion: 0.21
Nodes (3): Body, Post, CouponInput
### Community 152 - "auth.service.ts"
Cohesion: 0.08
Nodes (13): AppModule, Module, AdminLoginInput, AuthService, LoginInput, RegisterInput, Injectable, normalizeMobile() (+5 more)
@ -1070,13 +1057,9 @@ Nodes (3): Expanding the ESLint configuration, React Compiler, React + TypeScrip
Cohesion: 0.50
Nodes (3): Select, SelectOption, SelectProps
### Community 197 - "lib/services/api.ts"
Cohesion: 0.09
Nodes (17): LoginModal, B2BPortal(), LoginModal(), LoginModalProps, PrescriptionUploadModal(), PrescriptionUploadModalProps, ApiErrorPayload, baseURL (+9 more)
### Community 198 - "Reviews.tsx"
Cohesion: 0.40
Nodes (5): BlogCommentItem, ProductReview, Reviews(), toPersianDigits(), Reviews
### Community 197 - "userStore.ts"
Cohesion: 0.08
Nodes (37): AuthModal, B2BPortal, CartDrawer, ClientLayout(), LoginModal, AuthModal(), AuthModalProps, extractOtpFromText() (+29 more)
### Community 199 - "SmsLogQueryDto"
Cohesion: 0.25
@ -1113,7 +1096,7 @@ Nodes (3): GET(), handleRevalidate(), POST()
## Knowledge Gaps
- **1347 isolated node(s):** `$schema`, `collection`, `sourceRoot`, `deleteOutDir`, `name` (+1342 more)
These have ≤1 connection - possible missing edges or undocumented components.
- **98 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
- **101 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
## Suggested Questions
_Questions this graph is uniquely positioned to answer:_
@ -1129,6 +1112,6 @@ _Questions this graph is uniquely positioned to answer:_
- **Should `app.module.ts` be split into smaller, more focused modules?**
_Cohesion score 0.055299539170506916 - nodes in this community are weakly interconnected._
- **Should `productService.ts` be split into smaller, more focused modules?**
_Cohesion score 0.06299603174603174 - nodes in this community are weakly interconnected._
- **Should `api` be split into smaller, more focused modules?**
_Cohesion score 0.12648221343873517 - nodes in this community are weakly interconnected._
_Cohesion score 0.05780885780885781 - nodes in this community are weakly interconnected._
- **Should `PetProfile.tsx` be split into smaller, more focused modules?**
_Cohesion score 0.11822660098522167 - nodes in this community are weakly interconnected._

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,16 +1,16 @@
# Graph Report - canina (2026-09-02)
## Corpus Check
- 599 files · ~1,081,381 words
- 599 files · ~1,082,850 words
- Verdict: corpus is large enough that graph structure adds value.
## Summary
- 4208 nodes · 7642 edges · 311 communities (210 shown, 101 thin omitted)
- 4208 nodes · 7643 edges · 330 communities (212 shown, 118 thin omitted)
- Extraction: 96% EXTRACTED · 4% INFERRED · 0% AMBIGUOUS · INFERRED: 288 edges (avg confidence: 0.79)
- Token cost: 0 input · 0 output
## Graph Freshness
- Built from commit: `ddd0dcba`
- Built from commit: `1fb5de76`
- Run `git rev-parse HEAD` and compare to check if the graph is stale.
- Run `graphify update .` after code changes (no API cost).
@ -19,7 +19,7 @@
- app.module.ts
- AdminTransactionFilterDto
- productService.ts
- PetProfile.tsx
- api
- CmsController
- TicketsService
- SmsSettingsPage.tsx
@ -29,7 +29,7 @@
- WikiController
- index.ts
- app-audit-verification.e2e-spec.js
- toPersian
- UserDashboard.tsx
- src/services/api.ts
- DoctorQueryDto
- schema.ts
@ -72,16 +72,16 @@
- UITexts.tsx
- Orders.tsx
- Role & Core Objective
- UserDashboard.tsx
- components/Skeleton.tsx
- compilerOptions
- CreateUserDto
- ProductPage.tsx
- RevalidationService
- WikiService
- dependencies
- compilerOptions
- admin.service.ts
- AdminQueryDto
- admin.module.ts
- ReportsController
- useSettingsStore
- Required Review Group Closures
- compilerOptions
@ -99,15 +99,15 @@
- scripts
- dependencies
- Role & Core Objective
- jwt.strategy.ts
- auth.module.ts
- zibal.service.ts
- dependencies
- payment.controller.ts
- seed-products.ts
- OrderService
- useCartStore
- Reconciled Audit Roles & Assignments
- OrdersService
- ArchivePage.tsx
- HomeClient.tsx
- Phase 3.1 — Human Review Preparation and Master Backlog Critique
- wiki/[slug]/page.tsx
- compilerOptions
@ -165,7 +165,7 @@
- track/page.tsx
- trust-seals/page.tsx
- Product Requirement Document (PRD)
- AuthService
- menu.module.ts
- auth.service.ts
- exclude
- Baseline Command Plan & Reconciled Command History
@ -192,13 +192,13 @@
- uploads/[...path]/route.ts
- app/page.tsx
- نقشه جامع پوشش تست‌های سرتاسری (E2E Test Coverage Map) — پروژه Canina
- @types/node
- app.e2e-spec.js
- API Contract Specification
- ⚙️ Backend Technical Review (05_dev_backend)
- 🎨 Frontend & Admin Panel Technical Review (06_dev_frontend)
- 🚀 SEO & Content Strategy Review (12_seo_content)
- MetricsController
- eslint
- bcrypt
- seed-ui-texts.ts
- seed-wiki.ts
- update-blog.dto.ts
@ -210,7 +210,7 @@
- Raw Finding Verification & Disposition Report
- React + TypeScript + Vite
- Select.tsx
- userStore.ts
- lib/services/api.ts
- @tailwindcss/postcss
- SmsLogQueryDto
- application/README.md
@ -237,7 +237,7 @@
- Textarea.tsx
- admin-panel/tsconfig.json
- tailwindcss
- typescript
- class-transformer
- next.config.ts
- Shabnam Font README
- AGENTS.md
@ -274,6 +274,7 @@
- User Login API
- User Logout API
- @types/compression
- helmet
- @types/express
- @types/jest
- @types/multer
@ -292,19 +293,37 @@
- Production Docker Compose
- Staging Docker Compose
- ZibalService
- js-yaml
- @nestjs/core
- ZibalEBankService
- .initiateOrderPayment
- @tailwindcss/postcss
- typescript
- @nestjs/jwt
- typescript-eslint
- @nestjs/throttler
- passport
- reflect-metadata
- @eslint/js
- swagger-ui-express
- eslint-config-prettier
- @eslint/eslintrc
- @types/passport-jwt
- 20260526160916_add_ui_texts_and_scientific_terms/migration.sql
- eslint-plugin-prettier
- typescript
- globals
- revalidate/route.ts
- MaskableField.tsx
- @nestjs/cli
- @nestjs/testing
- prettier
- ts-jest
- @types/react-dom
- @types/js-yaml
- eslint-plugin-react-refresh
- @types/supertest
- typescript-eslint
## God Nodes (most connected - your core abstractions)
1. `Roles()` - 106 edges
@ -335,7 +354,7 @@
- 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`
- 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 (311 total, 101 thin omitted)
## Communities (330 total, 118 thin omitted)
### Community 0 - "Roles"
Cohesion: 0.24
@ -343,7 +362,7 @@ Nodes (13): Roles(), PaymentController, ApiBearerAuth, ApiOperation, ApiTags, Bo
### Community 1 - "app.module.ts"
Cohesion: 0.06
Nodes (43): AuthModule, Module, B2BModule, Module, BannersModule, Module, CmsModule, Module (+35 more)
Nodes (39): B2BModule, Module, BannersModule, Module, CmsModule, Module, RevalidationModule, Global (+31 more)
### Community 2 - "AdminTransactionFilterDto"
Cohesion: 0.22
@ -351,11 +370,11 @@ Nodes (7): AdminTransactionFilterDto, ApiPropertyOptional, IsIn, IsNumber, IsOpt
### Community 3 - "productService.ts"
Cohesion: 0.06
Nodes (39): buildTorobProductSpec(), buildTorobProductTitle(), dynamic, GET(), revalidate, dynamic, GET(), revalidate (+31 more)
Nodes (38): buildTorobProductSpec(), buildTorobProductTitle(), dynamic, GET(), revalidate, dynamic, GET(), revalidate (+30 more)
### Community 4 - "PetProfile.tsx"
Cohesion: 0.12
Nodes (18): metadata, FeaturedProducts(), ProductCard(), OrderSuccess(), PetProfile(), SearchResultsPage(), CURRENT_SYMPTOMS, MEDICAL_HISTORIES (+10 more)
### Community 4 - "api"
Cohesion: 0.13
Nodes (14): metadata, ContactInfoItem, OrderDetailsModal(), OrderDetailsModalProps, CURRENT_SYMPTOMS, MEDICAL_HISTORIES, SmartAdvisor(), SmartAdvisorProps (+6 more)
### Community 5 - "CmsController"
Cohesion: 0.10
@ -374,8 +393,8 @@ Cohesion: 0.10
Nodes (17): SettingsController, ApiBearerAuth, ApiOkResponse, ApiOperation, ApiTags, Body, Controller, Delete (+9 more)
### Community 9 - "devDependencies"
Cohesion: 0.08
Nodes (25): devDependencies, eslint-config-prettier, @eslint/eslintrc, eslint-plugin-prettier, globals, @nestjs/cli, @nestjs/testing, prettier (+17 more)
Cohesion: 0.22
Nodes (9): devDependencies, eslint, @types/bcryptjs, @types/node, typescript, eslint, @types/node, typescript (+1 more)
### Community 10 - "CreateReviewDto"
Cohesion: 0.07
@ -390,12 +409,12 @@ 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.07
Nodes (26): EnvironmentVariables, IsNotEmpty, IsOptional, IsString, validateEnv(), CustomHttpExceptionFilter, Catch, PrismaExceptionFilter (+18 more)
Cohesion: 0.06
Nodes (28): AppModule, Module, EnvironmentVariables, IsNotEmpty, IsOptional, IsString, validateEnv(), CustomHttpExceptionFilter (+20 more)
### Community 14 - "toPersian"
Cohesion: 0.17
Nodes (20): HomeClient(), VerifyContent(), AddressFormData, AddressModal(), AddressModalProps, normalizeDigits(), validateAddressForm(), CheckoutPage() (+12 more)
### Community 14 - "UserDashboard.tsx"
Cohesion: 0.13
Nodes (28): VerifyContent(), AddressFormData, AddressModal(), AddressModalProps, normalizeDigits(), validateAddressForm(), AuthModal(), AuthModalProps (+20 more)
### Community 15 - "src/services/api.ts"
Cohesion: 0.06
@ -534,8 +553,8 @@ Cohesion: 0.12
Nodes (17): eslint-config-next, devDependencies, eslint, eslint-config-next, jsdom, @testing-library/jest-dom, @testing-library/react, @types/node (+9 more)
### Community 51 - "BlogsController"
Cohesion: 0.14
Nodes (16): BlogsController, ApiBearerAuth, ApiOperation, ApiQuery, ApiTags, Body, Controller, Delete (+8 more)
Cohesion: 0.07
Nodes (18): BlogsController, ApiBearerAuth, ApiOperation, ApiQuery, ApiTags, Body, Controller, Delete (+10 more)
### Community 52 - "PrescriptionsController"
Cohesion: 0.16
@ -561,9 +580,9 @@ Nodes (15): Badge(), BadgeProps, BadgeVariant, variantStyles, Skeleton(), Monito
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 - "UserDashboard.tsx"
Cohesion: 0.12
Nodes (11): DeleteConfirmModal(), DeleteConfirmModalProps, OrderDetailsModal(), OrderRowSkeleton(), PetProfileSkeleton(), Skeleton(), SkeletonProps, CreateTicketPayload (+3 more)
### Community 58 - "components/Skeleton.tsx"
Cohesion: 0.24
Nodes (4): OrderRowSkeleton(), PetProfileSkeleton(), Skeleton(), SkeletonProps
### Community 59 - "compilerOptions"
Cohesion: 0.06
@ -574,16 +593,12 @@ Cohesion: 0.23
Nodes (10): CreateUserDto, ApiProperty, ApiPropertyOptional, IsEmail, IsNotEmpty, IsNumber, IsOptional, IsString (+2 more)
### Community 61 - "ProductPage.tsx"
Cohesion: 0.10
Nodes (19): ProductImageZoomModalProps, CalculatorState, GalleryMediaItem, ICON_MAP, isVideoUrl(), ProductImageZoomModal, ProductPage(), ProductReviews (+11 more)
### Community 62 - "RevalidationService"
Cohesion: 0.14
Nodes (7): RevalidationModule, Global, Module, RevalidationService, Injectable, ReviewsModule, Module
Cohesion: 0.09
Nodes (20): PodcastInlinePlayer(), ProductImageZoomModalProps, CalculatorState, GalleryMediaItem, ICON_MAP, isVideoUrl(), ProductImageZoomModal, ProductPage() (+12 more)
### Community 63 - "dependencies"
Cohesion: 0.05
Nodes (43): dependencies, bcrypt, bcryptjs, class-transformer, class-validator, compression, helmet, ioredis (+35 more)
Cohesion: 0.09
Nodes (23): dependencies, bcryptjs, class-validator, compression, ioredis, @nestjs/common, @nestjs/passport, @nestjs/platform-express (+15 more)
### Community 64 - "compilerOptions"
Cohesion: 0.10
@ -597,13 +612,13 @@ Nodes (15): CouponTargetInput, PaginationQuery, ProductDto, ApiPropertyOptional,
Cohesion: 0.13
Nodes (8): ApiQuery, Get, Query, AdminProductQueryDto, AdminQueryDto, ApiPropertyOptional, IsOptional, IsString
### Community 67 - "admin.module.ts"
Cohesion: 0.13
Nodes (13): AdminModule, Module, ReportsController, ApiBearerAuth, ApiOperation, ApiQuery, ApiTags, Controller (+5 more)
### Community 67 - "ReportsController"
Cohesion: 0.14
Nodes (11): ReportsController, ApiBearerAuth, ApiOperation, ApiQuery, ApiTags, Controller, Get, Query (+3 more)
### Community 68 - "useSettingsStore"
Cohesion: 0.08
Nodes (29): HomeClientProps, B2BLandingClient(), BlogPost, BlogPreviewSection(), BrandLogo(), BrandLogoProps, ContactInfoItem, FAQItem (+21 more)
Cohesion: 0.10
Nodes (22): AuthModal, B2BPortal, CartDrawer, ClientLayout(), B2BLandingClient(), BrandLogo(), BrandLogoProps, FAQItem (+14 more)
### Community 69 - "Required Review Group Closures"
Cohesion: 0.10
@ -626,8 +641,8 @@ Cohesion: 0.11
Nodes (18): 1. Framework-Aware Analysis, 2. DOM & Semantic Structure Analysis, 3. Accessibility Compliance, 4. Responsive Layout Verification, 5. Fallback Inspection Mode, 6. Defect Routing Protocol, 7. Forbidden Actions, Expected JSON Output Schema (+10 more)
### Community 74 - "WikiController"
Cohesion: 0.09
Nodes (16): ApiBearerAuth, ApiOperation, ApiQuery, ApiTags, Body, Controller, Delete, Get (+8 more)
Cohesion: 0.14
Nodes (14): ApiBearerAuth, ApiOperation, ApiQuery, ApiTags, Body, Controller, Delete, Get (+6 more)
### Community 75 - "PetsController"
Cohesion: 0.05
@ -669,9 +684,9 @@ 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 - "jwt.strategy.ts"
Cohesion: 0.24
Nodes (6): DEFAULT_JWT_REFRESH_SECRET, DEFAULT_JWT_SECRET, getJwtSecret(), JwtPayload, JwtStrategy, Injectable
### Community 85 - "auth.module.ts"
Cohesion: 0.17
Nodes (10): DEFAULT_JWT_REFRESH_SECRET, DEFAULT_JWT_SECRET, getJwtSecret(), AuthModule, Module, JwtPayload, JwtStrategy, Injectable (+2 more)
### Community 86 - "zibal.service.ts"
Cohesion: 0.16
@ -689,6 +704,10 @@ Nodes (19): CreateEBankCheckoutDto, ApiProperty, ApiPropertyOptional, IsNotEmpty
Cohesion: 0.17
Nodes (12): prisma, main(), prisma, determineSuitableFor(), findOrCreateCategory(), getProductImageUrl(), main(), parseSize() (+4 more)
### Community 90 - "useCartStore"
Cohesion: 0.07
Nodes (27): ArchivePage(), ArchiveProductCard(), CATEGORY_MAP, ICON_MAP, CartDrawer(), DeleteConfirmModal(), DeleteConfirmModalProps, FeaturedProducts() (+19 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)
@ -697,9 +716,9 @@ Nodes (15): 10. Documentation Engineer, 1. Lead Architect / Orchestrator, 2. Rea
Cohesion: 0.07
Nodes (35): CreateOrderDto, OrderItemDto, ApiProperty, ApiPropertyOptional, IsArray, IsNotEmpty, IsNumber, IsOptional (+27 more)
### Community 93 - "ArchivePage.tsx"
Cohesion: 0.13
Nodes (15): ArchivePage(), ArchiveProductCard(), CATEGORY_MAP, ICON_MAP, BannerPlacement(), BannerPlacementProps, ProductCardSkeleton(), B2BInquiry (+7 more)
### Community 93 - "HomeClient.tsx"
Cohesion: 0.12
Nodes (17): HomeClient(), HomeClientProps, BannerPlacement(), BannerPlacementProps, BlogPreviewSection(), Hero(), StatCounter(), TestimonialsSection() (+9 more)
### Community 94 - "Phase 3.1 — Human Review Preparation and Master Backlog Critique"
Cohesion: 0.13
@ -718,8 +737,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.14
Nodes (15): BlogsController, ApiNotFoundResponse, ApiOkResponse, ApiOperation, ApiTags, Body, Controller, Get (+7 more)
### Community 100 - "Deep Audit Summary Report"
Cohesion: 0.14
@ -750,12 +769,12 @@ Cohesion: 0.37
Nodes (10): CreateHeroBannerDto, CreateSmartAdvisorRuleDto, CreateVetTestimonialDto, ApiProperty, ApiPropertyOptional, IsBoolean, IsNumber, IsOptional (+2 more)
### Community 107 - "PaginationDto"
Cohesion: 0.09
Nodes (14): BlogsModule, Module, BlogFilterDto, BlogsService, Injectable, PaginationDto, SortOrder, ApiPropertyOptional (+6 more)
Cohesion: 0.18
Nodes (11): AdminModule, Module, PaginationDto, SortOrder, ApiPropertyOptional, IsEnum, IsInt, IsOptional (+3 more)
### Community 108 - "PrismaService"
Cohesion: 0.07
Nodes (20): CategoryQuery, PetQuery, WikiQuery, MeliPayamakPattern, MeliPayamakResponse, SendPatternSmsOptions, SmsConfig, SmsLogQuery (+12 more)
Cohesion: 0.06
Nodes (21): CategoryQuery, PetQuery, WikiQuery, RevalidationService, Injectable, MeliPayamakPattern, MeliPayamakResponse, SendPatternSmsOptions (+13 more)
### Community 109 - "1. Summary of Integrity Repairs Performed"
Cohesion: 0.17
@ -894,8 +913,8 @@ Cohesion: 0.25
Nodes (6): app_module_1, core_1, fs, path, swagger_1, yaml
### Community 144 - "SafeImage.tsx"
Cohesion: 0.10
Nodes (20): BackButton(), BackButtonProps, BlogPostClientProps, PLAYBACK_RATES, PodcastInlinePlayer(), PodcastInlinePlayerProps, PLAYBACK_RATES, PodcastPlayerModal() (+12 more)
Cohesion: 0.08
Nodes (23): BackButton(), BackButtonProps, BlogCategory, BlogPostItem, BlogPostClientProps, BlogPost, ProductDetailModalProps, PLAYBACK_RATES (+15 more)
### Community 145 - "ConfirmModal.tsx"
Cohesion: 0.10
@ -913,9 +932,13 @@ Nodes (10): HomeController, ApiOkResponse, ApiOperation, ApiTags, Controller, Ge
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 - "menu.module.ts"
Cohesion: 0.40
Nodes (3): MenuModule, Module, MenuType
### Community 152 - "auth.service.ts"
Cohesion: 0.08
Nodes (13): AppModule, Module, AdminLoginInput, AuthService, LoginInput, RegisterInput, Injectable, normalizeMobile() (+5 more)
Cohesion: 0.09
Nodes (11): AdminLoginInput, AuthService, LoginInput, RegisterInput, Injectable, normalizeMobile(), RedisModule, Global (+3 more)
### Community 153 - "exclude"
Cohesion: 0.22
@ -1013,6 +1036,10 @@ Nodes (3): generateMetadata(), getHomeData(), Home()
Cohesion: 0.33
Nodes (5): نقشه جامع پوشش تست‌های سرتاسری (E2E Test Coverage Map) — پروژه Canina, ۱. معماری و نقش‌های کاربری (User Roles), ۲. ماتریس جریان‌ها و قابلیت‌های کاربرمحور (Feature & Flow Matrix), ۳. وضعیت پوشش نهایی سوئیت ۱۱گانه (Final 11 Test Suites Status), ۴. راهنمای نگهداری و افزودن فیچرهای جدید بدون شکستن تست‌ها (Developer Maintenance Guide)
### Community 179 - "app.e2e-spec.js"
Cohesion: 0.50
Nodes (3): app_module_1, supertest_1, testing_1
### Community 180 - "API Contract Specification"
Cohesion: 0.50
Nodes (3): 1. OpenAPI 3.0 (Swagger) Specification, 2. Endpoint Definitions & Data Types, API Contract Specification
@ -1030,7 +1057,7 @@ Cohesion: 0.50
Nodes (3): Overview & Content Foundation, SEO & Content Requirements, 🚀 SEO & Content Strategy Review (12_seo_content)
### Community 184 - "MetricsController"
Cohesion: 0.29
Cohesion: 0.25
Nodes (5): ApiExcludeController, MetricsController, Controller, Get, Res
### Community 191 - "graphify reference: add a URL and watch a folder"
@ -1057,9 +1084,9 @@ Nodes (3): Expanding the ESLint configuration, React Compiler, React + TypeScrip
Cohesion: 0.50
Nodes (3): Select, SelectOption, SelectProps
### Community 197 - "userStore.ts"
Cohesion: 0.08
Nodes (37): AuthModal, B2BPortal, CartDrawer, ClientLayout(), LoginModal, AuthModal(), AuthModalProps, extractOtpFromText() (+29 more)
### Community 197 - "lib/services/api.ts"
Cohesion: 0.09
Nodes (17): LoginModal, B2BPortal(), LoginModal(), LoginModalProps, PrescriptionUploadModal(), PrescriptionUploadModalProps, ApiErrorPayload, baseURL (+9 more)
### Community 199 - "SmsLogQueryDto"
Cohesion: 0.25
@ -1096,7 +1123,7 @@ Nodes (3): GET(), handleRevalidate(), POST()
## Knowledge Gaps
- **1347 isolated node(s):** `$schema`, `collection`, `sourceRoot`, `deleteOutDir`, `name` (+1342 more)
These have ≤1 connection - possible missing edges or undocumented components.
- **101 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
- **118 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
## Suggested Questions
_Questions this graph is uniquely positioned to answer:_
@ -1105,13 +1132,13 @@ _Questions this graph is uniquely positioned to answer:_
_High betweenness centrality (0.065) - this node is a cross-community bridge._
- **Why does `ApiResponse` connect `src/services/api.ts` to `BlogsController`, `PetsController`, `ProductsService`, `WikiController`, `auth.controller.ts`, `HomeController`, `UsersService`, `OrdersService`?**
_High betweenness centrality (0.057) - this node is a cross-community bridge._
- **Why does `PrismaService` connect `PrismaService` to `app.module.ts`, `CmsController`, `TicketsService`, `CreateReviewDto`, `WikiController`, `DoctorQueryDto`, `HomeController`, `CreateVideoDto`, `MenuService`, `auth.service.ts`, `B2BService`, `FaqService`, `ZibalService`, `CategoriesController`, `MediaController`, `ZibalEBankService`, `BannersService`, `TestimonialsService`, `IngredientsService`, `SmartAdvisorService`, `MetricsController`, `RevalidationService`, `admin.service.ts`, `admin.module.ts`, `WikiController`, `PetsController`, `zibal-ebank.service.ts`, `ProductsService`, `seo.module.ts`, `zibal.service.ts`, `OrdersService`, `cms.controller.ts`, `PaginationDto`, `PetsController`, `UsersService`?**
- **Why does `PrismaService` connect `PrismaService` to `app.module.ts`, `CmsController`, `TicketsService`, `CreateReviewDto`, `WikiController`, `DoctorQueryDto`, `HomeController`, `CreateVideoDto`, `BlogsService`, `menu.module.ts`, `auth.service.ts`, `MenuService`, `B2BService`, `FaqService`, `ZibalService`, `CategoriesController`, `MediaController`, `ZibalEBankService`, `BannersService`, `TestimonialsService`, `IngredientsService`, `SmartAdvisorService`, `MetricsController`, `WikiService`, `admin.service.ts`, `ReportsController`, `PetsController`, `zibal-ebank.service.ts`, `ProductsService`, `seo.module.ts`, `zibal.service.ts`, `OrdersService`, `BlogsController`, `cms.controller.ts`, `PaginationDto`, `PetsController`, `UsersService`?**
_High betweenness centrality (0.029) - this node is a cross-community bridge._
- **What connects `$schema`, `collection`, `sourceRoot` to the rest of the system?**
_1347 weakly-connected nodes found - possible documentation gaps or missing edges._
- **Should `app.module.ts` be split into smaller, more focused modules?**
_Cohesion score 0.055299539170506916 - nodes in this community are weakly interconnected._
_Cohesion score 0.06170598911070781 - nodes in this community are weakly interconnected._
- **Should `productService.ts` be split into smaller, more focused modules?**
_Cohesion score 0.05780885780885781 - nodes in this community are weakly interconnected._
- **Should `PetProfile.tsx` be split into smaller, more focused modules?**
_Cohesion score 0.11822660098522167 - nodes in this community are weakly interconnected._
_Cohesion score 0.06299603174603174 - nodes in this community are weakly interconnected._
- **Should `api` be split into smaller, more focused modules?**
_Cohesion score 0.12648221343873517 - nodes in this community are weakly interconnected._

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff