feat(seo): enrich Torob product title, subtitle and technical specs for optimal search indexation
Some checks failed
Deploy Canina / deploy (push) Successful in 2m22s
E2E Playwright Tests / Run Full E2E & Security Suites (push) Failing after 7s

This commit is contained in:
parsa aghaei 2026-09-02 09:30:33 +03:30
parent 88060431bb
commit 382ebc0ce6
16 changed files with 151527 additions and 5915 deletions

View File

@ -2,6 +2,99 @@ import { Controller, Get, Query } from '@nestjs/common';
import { ApiTags, ApiOperation } from '@nestjs/swagger';
import { PrismaService } from '../prisma/prisma.service';
function buildTorobProductTitle(product: {
nameFa?: string | null;
nameEn?: string | null;
packageSize?: unknown;
unit?: string | null;
suitableFor?: string | null;
}): string {
const nameFa = (product.nameFa || '').trim();
let nameEn = (product.nameEn || '').trim();
// Clean brand duplicate if nameEn already starts with Canina
if (/^Canina\b/i.test(nameEn)) {
nameEn = nameEn.replace(/^Canina\s*[-:]*\s*/i, '').trim();
}
// Package size & unit
let sizePart = '';
const numSize = Number(product.packageSize);
const unit = (product.unit || '').trim();
if (numSize && numSize > 0) {
sizePart = unit ? `${numSize} ${unit}` : `${numSize}`;
}
// Suitable for pet
let petPart = '';
if (product.suitableFor) {
const pet = product.suitableFor.trim();
if (pet === 'هر دو' || pet === 'سگ و گربه' || pet === 'سگ، گربه') {
petPart = 'مناسب سگ و گربه';
} else if (pet) {
petPart = `مناسب ${pet}`;
}
}
const parts: string[] = [];
if (nameFa) parts.push(nameFa);
// Brand part
if (!nameFa.includes('کنینا') && !nameFa.includes('Canina')) {
parts.push('برند کنینا Canina');
} else if (!nameFa.includes('Canina')) {
parts.push('Canina');
}
if (nameEn && nameEn.toLowerCase() !== nameFa.toLowerCase()) {
parts.push(nameEn);
}
if (sizePart && !nameFa.includes(sizePart) && !nameEn.includes(sizePart)) {
parts.push(sizePart);
}
if (petPart && !nameFa.includes(petPart)) {
parts.push(petPart);
}
return parts.join(' ').replace(/\s+/g, ' ').trim();
}
function buildTorobProductSpec(product: {
packageSize?: unknown;
unit?: string | null;
suitableFor?: string | null;
artNo?: string | null;
category?: { name?: string } | null;
}): Record<string, string> {
const spec: Record<string, string> = {
'برند': 'کنینا (Canina Pharma Germany)',
'کشور سازنده': 'آلمان',
'ضمانت': 'اصالت ۱۰۰٪ کالای آلمانی و سلامت فیزیکی',
};
if (product.suitableFor) {
spec['گونه هدف'] = product.suitableFor === 'هر دو' ? 'سگ و گربه' : product.suitableFor;
}
const numSize = Number(product.packageSize);
const unit = (product.unit || '').trim();
if (numSize && numSize > 0) {
spec['حجم / وزن / تعداد'] = unit ? `${numSize} ${unit}` : `${numSize}`;
}
if (product.artNo) {
spec['کد محصول (Art.No)'] = product.artNo;
}
if (product.category?.name) {
spec['دسته دارویی و درمانی'] = product.category.name;
}
return spec;
}
@ApiTags('Torob Integration - وب‌سرویس اتصال به ترب')
@Controller('torob')
export class TorobController {
@ -28,6 +121,9 @@ export class TorobController {
where: whereCondition,
skip: (page - 1) * pageSize,
take: pageSize,
include: {
category: { select: { name: true } },
},
orderBy: { createdAt: 'desc' },
}),
]);
@ -38,10 +134,20 @@ export class TorobController {
const slug = product.slug || product.artNo || product.id;
const pageUrl = `${baseUrl}/shop/${slug}`;
const productId = String(product.artNo || product.id || slug);
const nameFa = product.nameFa || '';
const nameEn = product.nameEn || '';
const title = nameEn ? `${nameFa} (${nameEn})` : nameFa;
const title = buildTorobProductTitle(product);
const spec = buildTorobProductSpec(product);
// Construct pure English subtitle
const rawEn = (product.nameEn || '').trim();
const numSize = Number(product.packageSize);
const unit = (product.unit || '').trim();
const sizeStr = numSize && numSize > 0 ? (unit ? `${numSize} ${unit}` : `${numSize}`) : '';
let subtitle = rawEn.startsWith('Canina') ? rawEn : `Canina ${rawEn}`.trim();
if (sizeStr && !subtitle.includes(sizeStr)) {
subtitle = `${subtitle} - ${sizeStr}`;
}
const rawImage = product.ogImage || product.imageUrl || '';
let imageLink = '';
if (rawImage) {
@ -66,14 +172,15 @@ export class TorobController {
product_id: productId,
page_unique_code: productId,
title,
subtitle: nameEn || product.scientificTagline || '',
subtitle,
page_url: pageUrl,
price,
old_price: oldPrice,
availability: isInStock ? 'instock' : 'outofstock',
image_link: imageLink,
guarantee: 'ضمانت اصالت ۱۰۰٪ کمپانی Canina آلمان و اصالت کالا',
category_name: product.categorySlug || 'مکمل حیوانات خانگی',
category_name: product.category?.name || product.categorySlug || 'مکمل حیوانات خانگی',
spec,
};
});

View File

@ -6,6 +6,101 @@ import { getMediaUrl } from '../../../../lib/media';
export const dynamic = 'force-dynamic';
export const revalidate = 3600;
function buildTorobProductTitle(product: {
nameFa?: string | null;
name?: string | null;
nameEn?: string | null;
packageSize?: unknown;
unit?: string | null;
suitableFor?: string | null;
}): string {
const nameFa = (product.nameFa || product.name || '').trim();
let nameEn = (product.nameEn || '').trim();
// Clean brand duplicate if nameEn already starts with Canina
if (/^Canina\b/i.test(nameEn)) {
nameEn = nameEn.replace(/^Canina\s*[-:]*\s*/i, '').trim();
}
// Package size & unit
let sizePart = '';
const numSize = Number(product.packageSize);
const unit = (product.unit || '').trim();
if (numSize && numSize > 0) {
sizePart = unit ? `${numSize} ${unit}` : `${numSize}`;
}
// Suitable for pet
let petPart = '';
if (product.suitableFor) {
const pet = product.suitableFor.trim();
if (pet === 'هر دو' || pet === 'سگ و گربه' || pet === 'سگ، گربه') {
petPart = 'مناسب سگ و گربه';
} else if (pet) {
petPart = `مناسب ${pet}`;
}
}
const parts: string[] = [];
if (nameFa) parts.push(nameFa);
// Brand part
if (!nameFa.includes('کنینا') && !nameFa.includes('Canina')) {
parts.push('برند کنینا Canina');
} else if (!nameFa.includes('Canina')) {
parts.push('Canina');
}
if (nameEn && nameEn.toLowerCase() !== nameFa.toLowerCase()) {
parts.push(nameEn);
}
if (sizePart && !nameFa.includes(sizePart) && !nameEn.includes(sizePart)) {
parts.push(sizePart);
}
if (petPart && !nameFa.includes(petPart)) {
parts.push(petPart);
}
return parts.join(' ').replace(/\s+/g, ' ').trim();
}
function buildTorobProductSpec(product: {
packageSize?: unknown;
unit?: string | null;
suitableFor?: string | null;
artNo?: string | null;
category?: string | { name?: string } | null;
}): Record<string, string> {
const spec: Record<string, string> = {
'برند': 'کنینا (Canina Pharma Germany)',
'کشور سازنده': 'آلمان',
'ضمانت': 'اصالت ۱۰۰٪ کالای آلمانی و سلامت فیزیکی',
};
if (product.suitableFor) {
spec['گونه هدف'] = product.suitableFor === 'هر دو' ? 'سگ و گربه' : product.suitableFor;
}
const numSize = Number(product.packageSize);
const unit = (product.unit || '').trim();
if (numSize && numSize > 0) {
spec['حجم / وزن / تعداد'] = unit ? `${numSize} ${unit}` : `${numSize}`;
}
if (product.artNo) {
spec['کد محصول (Art.No)'] = product.artNo;
}
const catName = typeof product.category === 'object' ? product.category?.name : product.category;
if (catName) {
spec['دسته دارویی و درمانی'] = catName;
}
return spec;
}
export async function GET(request: NextRequest) {
try {
const { searchParams } = new URL(request.url);
@ -36,9 +131,19 @@ export async function GET(request: NextRequest) {
const slug = product.slug || product.artNo || product.id;
const pageUrl = `${baseUrl}/shop/${slug}`;
const productId = String(product.artNo || product.id || slug);
const nameFa = product.nameFa || product.name || '';
const nameEn = product.nameEn || '';
const title = nameEn ? `${nameFa} (${nameEn})` : nameFa;
const title = buildTorobProductTitle(product);
const spec = buildTorobProductSpec(product);
const rawEn = (product.nameEn || '').trim();
const numSize = Number(product.packageSize);
const unit = (product.unit || '').trim();
const sizeStr = numSize && numSize > 0 ? (unit ? `${numSize} ${unit}` : `${numSize}`) : '';
let subtitle = rawEn.startsWith('Canina') ? rawEn : `Canina ${rawEn}`.trim();
if (sizeStr && !subtitle.includes(sizeStr)) {
subtitle = `${subtitle} - ${sizeStr}`;
}
const primaryImg = product.ogImage || product.image || product.imageUrl || '';
let imageLink = '';
if (primaryImg) {
@ -51,23 +156,27 @@ export async function GET(request: NextRequest) {
const isInStock =
product.stockStatus !== 'OUT_OF_STOCK' &&
product.stockStatus !== 'out_of_stock' &&
product.stockStatus !== 'DISCONTINUED' &&
product.inStock !== false;
const price = Number(product.priceValue || product.price || 0);
const oldPrice = Number(product.oldPrice || product.priceValue || product.price || 0);
const catName = typeof product.category === 'object' ? product.category?.name : product.category;
return {
product_id: productId,
page_unique_code: productId,
title,
subtitle: nameEn || product.scientificTagline || '',
subtitle,
page_url: pageUrl,
price,
old_price: oldPrice,
availability: isInStock ? 'instock' : 'outofstock',
image_link: imageLink,
guarantee: 'ضمانت اصالت ۱۰۰٪ کمپانی Canina آلمان',
category_name: product.category || 'مکمل حیوانات خانگی',
guarantee: 'ضمانت اصالت ۱۰۰٪ کمپانی Canina آلمان و اصالت کالا',
category_name: catName || 'مکمل حیوانات خانگی',
spec,
};
});

View File

@ -89,7 +89,7 @@ export async function generateMetadata(
},
other: {
product_id: String(product.artNo || product.id || resolvedParams.slug),
product_name: nameFa,
product_name: title,
product_price: String(product.priceValue || 0),
product_old_price: String(product.priceValue || 0),
availability: (product.stockStatus === 'DISCONTINUED' || String(product.stockStatus || '').toLowerCase().includes('out')) ? 'outofstock' : 'instock',

View File

@ -3,13 +3,13 @@
"1": "app.module.ts",
"2": "PaymentService",
"3": "productService.ts",
"4": "PetProfile.tsx",
"4": "UserDashboard.tsx",
"5": "CmsController",
"6": "tickets.controller.ts",
"7": "Button.tsx",
"8": "WikiController",
"9": "devDependencies",
"10": "ReviewsService",
"10": "CreateReviewDto",
"11": "MediaSelector.tsx",
"12": "index.ts",
"13": "app-audit-verification.e2e-spec.js",
@ -18,9 +18,9 @@
"16": "DoctorQueryDto",
"17": "schema.ts",
"18": "JwtAuthGuard",
"19": "ProductsService",
"19": "users.controller.ts",
"20": "CreateVideoDto",
"21": "admin.module.ts",
"21": "ReportsController",
"22": "SmsService",
"23": "MenuService",
"24": "BE-001",
@ -32,14 +32,14 @@
"30": "DEVOPS-001",
"31": "DOC-001",
"32": "adminRoutes.tsx",
"33": "WholesaleApplyDto",
"33": "ContactService",
"34": "B2BService",
"35": "AuthController",
"36": "FaqService",
"36": "FaqController",
"37": "راهنمای تست سیستم (Software Testing)",
"38": "Transactions.tsx",
"39": "CategoriesController",
"40": "MediaController",
"40": "admin.module.ts",
"41": "What You Must Do When Invoked",
"42": "SslController",
"43": "BannersService",
@ -57,17 +57,17 @@
"55": "UITexts.tsx",
"56": "Orders.tsx",
"57": "Role & Core Objective",
"58": "ContactService",
"58": "auth.module.ts",
"59": "compilerOptions",
"60": "admin.service.ts",
"61": "ProductPage.tsx",
"62": "RevalidationService",
"62": "UsersService",
"63": "dependencies",
"64": "compilerOptions",
"65": "BlogsService",
"66": "AdminQueryDto",
"66": "ApiOperation",
"67": "PetsController",
"68": "lib/services/api.ts",
"68": "useSettingsStore",
"69": "Required Review Group Closures",
"70": "compilerOptions",
"71": "getPageMetadata",
@ -75,7 +75,7 @@
"73": "Operational Rules & Boundaries",
"74": "WikiController",
"75": "PetsController",
"76": "ProductsController",
"76": "ProductsService",
"77": "seo.module.ts",
"78": "rss.xml/route.ts",
"79": "🏢 AI Software Agency — Master Orchestration Protocol v3",
@ -84,15 +84,15 @@
"82": "scripts",
"83": "dependencies",
"84": "Role & Core Objective",
"85": "pets/pets.controller.ts",
"85": "Reports.tsx",
"86": "zibal.service.ts",
"87": "dependencies",
"88": "CreateEBankCheckoutDto",
"89": "seed-products.ts",
"90": "UserDashboard.tsx",
"90": "useCartStore",
"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": "blog/[slug]/page.tsx",
"96": "compilerOptions",
@ -122,13 +122,13 @@
"120": "compilerOptions",
"121": "backend/README.md",
"122": "AdminService",
"123": "UsersService",
"123": "UsersController",
"124": "Repository Map",
"125": "validate_integrity.js",
"126": "admin-panel/package.json",
"127": "Sahel-Font",
"128": "AdminController",
"129": "AuthService",
"129": "WikiService",
"130": "Sahel-Font",
"131": "Role & Core Objective",
"132": "orchestrate.py",
@ -143,15 +143,15 @@
"141": "application/package.json",
"142": "start-dev.js",
"143": "generate-openapi.js",
"144": "SafeImage.tsx",
"145": "TorobController",
"144": "PodcastPlayerModal.tsx",
"145": "FaqService",
"146": "System Discovery",
"147": "HomeController",
"148": "CreateUserDto",
"148": "class-transformer",
"149": "SmsSettingsPage.tsx",
"150": "Product Requirement Document (PRD)",
"151": "CreateReviewDto",
"152": "MetricsController",
"151": "helmet",
"152": "RedisService",
"153": "exclude",
"154": "Baseline Command Plan & Reconciled Command History",
"155": "seo-backfill.ts",
@ -183,8 +183,8 @@
"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",
"185": "app/page.tsx",
"184": "js-yaml",
"185": "@nestjs/core",
"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": "useSettingsStore",
"198": "@types/node",
"197": "userStore.ts",
"198": "@nestjs/jwt",
"199": "tailwindcss",
"200": "application/README.md",
"201": "deploy.sh",
@ -230,11 +230,15 @@
"228": "rules/graphify.md",
"229": ".agents/workflows/graphify.md",
"230": "instructions.md",
"231": "track/page.tsx",
"232": "typescript",
"231": "@nestjs/swagger",
"232": "@nestjs/throttler",
"233": "tailwindcss",
"234": "eslint-config-next",
"234": "passport",
"235": "reflect-metadata",
"236": "swagger-ui-express",
"237": "@eslint/eslintrc",
"238": "@vitejs/plugin-react",
"239": "eslint-plugin-prettier",
"240": "supertest",
"241": "blog.entity.ts",
"242": "home.entity.ts",
@ -259,6 +263,11 @@
"261": "User Login API",
"262": "User Logout API",
"263": "generate-openapi.d.ts",
"264": "globals",
"265": "jest",
"266": "@nestjs/cli",
"267": "@nestjs/testing",
"268": "prettier",
"269": "eslint-plugin-react-hooks",
"270": "app-audit-verification.e2e-spec.d.ts",
"271": "app.e2e-spec.d.ts",
@ -286,16 +295,19 @@
"293": "Staging Docker Compose",
"294": "ZibalService",
"295": "@nestjs/schematics",
"296": "ts-jest",
"297": "ZibalEBankService",
"298": ".initiateOrderPayment",
"299": "@tailwindcss/postcss",
"300": "typescript",
"301": "@types/js-yaml",
"302": "typescript-eslint",
"303": "prisma",
"304": "source-map-support",
"305": "@types/supertest",
"306": "@eslint/js",
"307": "ts-loader",
"308": "ts-node",
"308": "typescript-eslint",
"309": "axios",
"310": "tailwindcss",
"311": "tsconfig-paths",
@ -306,6 +318,7 @@
"316": "@types/compression",
"317": "revalidate/route.ts",
"318": "MaskableField.tsx",
"319": "@tailwindcss/postcss",
"320": "@types/express",
"321": "orders/page.tsx",
"322": "pets/page.tsx",

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,316 @@
{
"0": "Roles",
"1": "app.module.ts",
"2": "PaymentService",
"3": "productService.ts",
"4": "PetProfile.tsx",
"5": "CmsController",
"6": "tickets.controller.ts",
"7": "Button.tsx",
"8": "WikiController",
"9": "devDependencies",
"10": "ReviewsService",
"11": "MediaSelector.tsx",
"12": "index.ts",
"13": "app-audit-verification.e2e-spec.js",
"14": "toPersian",
"15": "src/services/api.ts",
"16": "DoctorQueryDto",
"17": "schema.ts",
"18": "JwtAuthGuard",
"19": "ProductsService",
"20": "CreateVideoDto",
"21": "admin.module.ts",
"22": "SmsService",
"23": "MenuService",
"24": "BE-001",
"25": "FE-001",
"26": "ADM-001",
"27": "DB-001",
"28": "TS-001",
"29": "TEST-001",
"30": "DEVOPS-001",
"31": "DOC-001",
"32": "adminRoutes.tsx",
"33": "WholesaleApplyDto",
"34": "B2BService",
"35": "AuthController",
"36": "FaqService",
"37": "راهنمای تست سیستم (Software Testing)",
"38": "Transactions.tsx",
"39": "CategoriesController",
"40": "MediaController",
"41": "What You Must Do When Invoked",
"42": "SslController",
"43": "BannersService",
"44": "TestimonialsService",
"45": "What You Must Do When Invoked",
"46": "20260526145407_init/migration.sql",
"47": "IngredientsService",
"48": "auth.service.ts",
"49": "devDependencies",
"50": "devDependencies",
"51": "BlogsController",
"52": "PrescriptionsService",
"53": "SmartAdvisorService",
"54": "Modal.tsx",
"55": "UITexts.tsx",
"56": "Orders.tsx",
"57": "Role & Core Objective",
"58": "ContactService",
"59": "compilerOptions",
"60": "admin.service.ts",
"61": "ProductPage.tsx",
"62": "RevalidationService",
"63": "dependencies",
"64": "compilerOptions",
"65": "BlogsService",
"66": "AdminQueryDto",
"67": "PetsController",
"68": "lib/services/api.ts",
"69": "Required Review Group Closures",
"70": "compilerOptions",
"71": "getPageMetadata",
"72": "Operational Rules & Boundaries",
"73": "Operational Rules & Boundaries",
"74": "WikiController",
"75": "PetsController",
"76": "ProductsController",
"77": "seo.module.ts",
"78": "rss.xml/route.ts",
"79": "🏢 AI Software Agency — Master Orchestration Protocol v3",
"80": "Operational Rules & Boundaries",
"81": "Operational Rules & Boundaries",
"82": "scripts",
"83": "dependencies",
"84": "Role & Core Objective",
"85": "pets/pets.controller.ts",
"86": "zibal.service.ts",
"87": "dependencies",
"88": "CreateEBankCheckoutDto",
"89": "seed-products.ts",
"90": "UserDashboard.tsx",
"91": "Reconciled Audit Roles & Assignments",
"92": "OrdersService",
"93": "HomeClient.tsx",
"94": "Phase 3.1 — Human Review Preparation and Master Backlog Critique",
"95": "blog/[slug]/page.tsx",
"96": "compilerOptions",
"97": "InitiatePaymentDto",
"98": "scripts",
"99": "BlogsController",
"100": "Deep Audit Summary Report",
"101": "Operational Rules & Boundaries",
"102": "jest",
"103": "Comprehensive Change Log",
"104": "Coupons.tsx",
"105": "Operational Rules & Boundaries",
"106": "AuthService",
"107": "PaginationDto",
"108": "PrismaService",
"109": "1. Summary of Integrity Repairs Performed",
"110": "Operational Rules & Boundaries",
"111": "Operational Rules & Boundaries",
"112": "Operational Rules & Boundaries",
"113": "RegisterDto",
"114": "AppService",
"115": "Blogs.tsx",
"116": "Vazirmatn Changelog",
"117": "Vazirmatn Font فونت وزیرمتن",
"118": "Operational Rules & Boundaries",
"119": "compilerOptions",
"120": "compilerOptions",
"121": "backend/README.md",
"122": "AdminService",
"123": "UsersService",
"124": "Repository Map",
"125": "validate_integrity.js",
"126": "admin-panel/package.json",
"127": "Sahel-Font",
"128": "AdminController",
"129": "AuthService",
"130": "Sahel-Font",
"131": "Role & Core Objective",
"132": "orchestrate.py",
"133": "backend/package.json",
"134": "blog/page.tsx",
"135": "graphify reference: extra exports and benchmark",
"136": "Phase 2 Final Quality Gate Summary Report",
"137": "Task Modifications Log",
"138": "Install",
"139": "layout.tsx",
"140": "ErrorBoundary",
"141": "application/package.json",
"142": "start-dev.js",
"143": "generate-openapi.js",
"144": "SafeImage.tsx",
"145": "TorobController",
"146": "System Discovery",
"147": "HomeController",
"148": "CreateUserDto",
"149": "SmsSettingsPage.tsx",
"150": "Product Requirement Document (PRD)",
"151": "CreateReviewDto",
"152": "MetricsController",
"153": "exclude",
"154": "Baseline Command Plan & Reconciled Command History",
"155": "seo-backfill.ts",
"156": "manual-test-scenarios.md",
"157": "ErrorPages.tsx",
"158": "media/[...path]/route.ts",
"159": "with-vpn.sh",
"160": "Architecture Specification",
"161": "Project Health Audit Report",
"162": "nest-cli.json",
"163": "graphify reference: query, path, explain",
"164": "Open Questions",
"165": "Final Phase 2 Audit Closure Report",
"166": "open-browsers.js",
"167": "📝 Active Agent Working Scratchpad",
"168": "🔍 Code Health Audit Review (01_auditor)",
"169": "paginated-response.schema.ts",
"170": "Vazirmatn Font README",
"171": "Omitted File Inspection Report",
"172": "Phase 3.2 / 3.3 — Implementation Readiness & Architectural Finalization Report",
"173": "Phase 3 Audit Traceability Matrix",
"174": "rebuild_honest_ledger.js",
"175": "validate_evidence_grade.js",
"176": "uploads/[...path]/route.ts",
"177": "videos/page.tsx",
"178": "نقشه جامع پوشش تست‌های سرتاسری (E2E Test Coverage Map) — پروژه Canina",
"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": "UpdateReviewDto",
"185": "app/page.tsx",
"186": "seed-ui-texts.ts",
"187": "seed-wiki.ts",
"188": "update-blog.dto.ts",
"189": "update-home.dto.ts",
"190": "update-wiki.dto.ts",
"191": "graphify reference: add a URL and watch a folder",
"192": "graphify reference: commit hook and native CLAUDE.md integration",
"193": "graphify reference: incremental update and cluster-only",
"194": "Raw Finding Verification & Disposition Report",
"195": "React + TypeScript + Vite",
"196": "Select.tsx",
"197": "useSettingsStore",
"198": "@types/node",
"199": "tailwindcss",
"200": "application/README.md",
"201": "deploy.sh",
"202": "🔒 Security & Performance Review (09_devops_security)",
"203": "👁️ UX & Persona Interface Review (08_visual_qa)",
"204": "eslint",
"205": "prisma/scientificTerms.ts",
"206": "seed-blogs.ts",
"207": "seed-custom.ts",
"208": "graphify reference: GitHub clone and cross-repo merge",
"209": "graphify reference: transcribe video and audio",
"210": "Compiler Diagnostic Dispositions",
"211": "Master Task Backlog (Phase 3.3)",
"212": "build_manifest.js",
"213": "generate_classification.js",
"214": "generate_evidence.js",
"215": "generate_ledger.js",
"216": "generate_manifest.js",
"217": "sync_honest_manifest.js",
"218": "sync_manifest.js",
"219": "FormField.tsx",
"220": "Input.tsx",
"221": "Textarea.tsx",
"222": "admin-panel/tsconfig.json",
"223": "catalog/page.tsx",
"224": "eslint-config-prettier",
"225": "next.config.ts",
"226": "Shabnam Font README",
"227": "AGENTS.md",
"228": "rules/graphify.md",
"229": ".agents/workflows/graphify.md",
"230": "instructions.md",
"231": "track/page.tsx",
"232": "typescript",
"233": "tailwindcss",
"234": "eslint-config-next",
"238": "@vitejs/plugin-react",
"240": "supertest",
"241": "blog.entity.ts",
"242": "home.entity.ts",
"243": "wiki.entity.ts",
"244": "User Profile Photo",
"245": "CLAUDE.md",
"246": ".claude/CLAUDE.md",
"247": "extraction-spec.md",
"248": "Products Table",
"249": "Users Table",
"250": "Architectural Audit Findings",
"251": "Cross Boundary Dependencies & Backend Architecture Specification",
"252": "Next.js Agent Rules & Brand Guidelines",
"253": "robots.ts",
"254": "application/eslint.config.mjs",
"255": "postcss.config.mjs",
"256": "vitest.setup.ts",
"257": "backup_db.sh",
"258": "start.sh",
"259": "reviews/README.md",
"260": "backend/eslint.config.mjs",
"261": "User Login API",
"262": "User Logout API",
"263": "generate-openapi.d.ts",
"269": "eslint-plugin-react-hooks",
"270": "app-audit-verification.e2e-spec.d.ts",
"271": "app.e2e-spec.d.ts",
"272": "Canina Pharma GmbH",
"273": "Pets Table",
"274": "Canina Iran Project Introduction",
"275": "Developer Standards and Architecture",
"276": "Frontend & Admin Architecture Route Map Specification",
"277": "Project Backlog and Tasks",
"278": "eslint.config.js",
"279": "postcss.config.js",
"280": "admin-panel/public/fonts/sahel-font-v3.4.0/CHANGELOG.md",
"281": "shabnam-font-v5.0.1/CHANGELOG.md",
"282": "tailwind.config.js",
"283": "vite.config.ts",
"284": "application/CLAUDE.md",
"285": "application/public/fonts/sahel-font-v3.4.0/CHANGELOG.md",
"286": "Sahel Font Sample",
"287": "Shabnam Font Changelog",
"288": "Vazirmatn Changelog",
"289": "vitest.config.ts",
"290": "Sahel Font Variable Sample",
"291": "Shabnam Font Sample",
"292": "Production Docker Compose",
"293": "Staging Docker Compose",
"294": "ZibalService",
"295": "@nestjs/schematics",
"297": "ZibalEBankService",
"298": ".initiateOrderPayment",
"299": "@tailwindcss/postcss",
"300": "typescript",
"302": "typescript-eslint",
"303": "prisma",
"304": "source-map-support",
"306": "@eslint/js",
"307": "ts-loader",
"308": "ts-node",
"309": "axios",
"310": "tailwindcss",
"311": "tsconfig-paths",
"312": "@types/passport-jwt",
"313": "20260526160916_add_ui_texts_and_scientific_terms/migration.sql",
"314": "@types/bcrypt",
"315": "typescript",
"316": "@types/compression",
"317": "revalidate/route.ts",
"318": "MaskableField.tsx",
"320": "@types/express",
"321": "orders/page.tsx",
"322": "pets/page.tsx",
"323": "@types/jest",
"325": "@types/react-dom",
"327": "eslint-plugin-react-refresh",
"329": "@types/multer"
}

View File

@ -0,0 +1 @@
{"output_tokens": 7105}

File diff suppressed because it is too large Load Diff

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-08-29)
# Graph Report - canina (2026-09-02)
## Corpus Check
- 596 files · ~1,071,427 words
- 596 files · ~1,072,182 words
- Verdict: corpus is large enough that graph structure adds value.
## Summary
- 4169 nodes · 7522 edges · 314 communities (214 shown, 100 thin omitted)
- 4173 nodes · 7530 edges · 327 communities (211 shown, 116 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: `376fea35`
- Built from commit: `88060431`
- Run `git rev-parse HEAD` and compare to check if the graph is stale.
- Run `graphify update .` after code changes (no API cost).
@ -19,13 +19,13 @@
- app.module.ts
- PaymentService
- productService.ts
- PetProfile.tsx
- UserDashboard.tsx
- CmsController
- tickets.controller.ts
- Button.tsx
- WikiController
- devDependencies
- ReviewsService
- CreateReviewDto
- MediaSelector.tsx
- index.ts
- app-audit-verification.e2e-spec.js
@ -34,9 +34,9 @@
- DoctorQueryDto
- schema.ts
- JwtAuthGuard
- ProductsService
- users.controller.ts
- CreateVideoDto
- admin.module.ts
- ReportsController
- SmsService
- MenuService
- BE-001
@ -48,14 +48,14 @@
- DEVOPS-001
- DOC-001
- adminRoutes.tsx
- WholesaleApplyDto
- ContactService
- B2BService
- AuthController
- FaqService
- FaqController
- راهنمای تست سیستم (Software Testing)
- Transactions.tsx
- CategoriesController
- MediaController
- admin.module.ts
- What You Must Do When Invoked
- SslController
- BannersService
@ -73,17 +73,17 @@
- UITexts.tsx
- Orders.tsx
- Role & Core Objective
- ContactService
- auth.module.ts
- compilerOptions
- admin.service.ts
- ProductPage.tsx
- RevalidationService
- UsersService
- dependencies
- compilerOptions
- BlogsService
- AdminQueryDto
- ApiOperation
- PetsController
- lib/services/api.ts
- useSettingsStore
- Required Review Group Closures
- compilerOptions
- getPageMetadata
@ -91,7 +91,7 @@
- Operational Rules & Boundaries
- WikiController
- PetsController
- ProductsController
- ProductsService
- seo.module.ts
- rss.xml/route.ts
- 🏢 AI Software Agency — Master Orchestration Protocol v3
@ -100,15 +100,15 @@
- scripts
- dependencies
- Role & Core Objective
- pets/pets.controller.ts
- Reports.tsx
- zibal.service.ts
- dependencies
- CreateEBankCheckoutDto
- seed-products.ts
- UserDashboard.tsx
- useCartStore
- Reconciled Audit Roles & Assignments
- OrdersService
- HomeClient.tsx
- ArchivePage.tsx
- Phase 3.1 — Human Review Preparation and Master Backlog Critique
- blog/[slug]/page.tsx
- compilerOptions
@ -138,13 +138,13 @@
- compilerOptions
- backend/README.md
- AdminService
- UsersService
- UsersController
- Repository Map
- validate_integrity.js
- admin-panel/package.json
- Sahel-Font
- AdminController
- AuthService
- WikiService
- Sahel-Font
- Role & Core Objective
- orchestrate.py
@ -159,15 +159,15 @@
- application/package.json
- start-dev.js
- generate-openapi.js
- SafeImage.tsx
- TorobController
- PodcastPlayerModal.tsx
- FaqService
- System Discovery
- HomeController
- CreateUserDto
- class-transformer
- SmsSettingsPage.tsx
- Product Requirement Document (PRD)
- CreateReviewDto
- MetricsController
- helmet
- RedisService
- exclude
- Baseline Command Plan & Reconciled Command History
- seo-backfill.ts
@ -198,8 +198,8 @@
- ⚙️ Backend Technical Review (05_dev_backend)
- 🎨 Frontend & Admin Panel Technical Review (06_dev_frontend)
- 🚀 SEO & Content Strategy Review (12_seo_content)
- UpdateReviewDto
- app/page.tsx
- js-yaml
- @nestjs/core
- seed-ui-texts.ts
- seed-wiki.ts
- update-blog.dto.ts
@ -211,8 +211,8 @@
- Raw Finding Verification & Disposition Report
- React + TypeScript + Vite
- Select.tsx
- useSettingsStore
- @types/node
- userStore.ts
- @nestjs/jwt
- tailwindcss
- application/README.md
- deploy.sh
@ -245,11 +245,15 @@
- rules/graphify.md
- .agents/workflows/graphify.md
- instructions.md
- track/page.tsx
- typescript
- @nestjs/swagger
- @nestjs/throttler
- tailwindcss
- eslint-config-next
- passport
- reflect-metadata
- swagger-ui-express
- @eslint/eslintrc
- @vitejs/plugin-react
- eslint-plugin-prettier
- supertest
- blog.entity.ts
- home.entity.ts
@ -270,6 +274,11 @@
- start.sh
- User Login API
- User Logout API
- globals
- jest
- @nestjs/cli
- @nestjs/testing
- prettier
- eslint-plugin-react-hooks
- Canina Pharma GmbH
- Pets Table
@ -286,16 +295,19 @@
- Staging Docker Compose
- ZibalService
- @nestjs/schematics
- ts-jest
- ZibalEBankService
- .initiateOrderPayment
- @tailwindcss/postcss
- typescript
- @types/js-yaml
- typescript-eslint
- prisma
- source-map-support
- @types/supertest
- @eslint/js
- ts-loader
- ts-node
- typescript-eslint
- tsconfig-paths
- @types/passport-jwt
- 20260526160916_add_ui_texts_and_scientific_terms/migration.sql
@ -304,6 +316,7 @@
- @types/compression
- revalidate/route.ts
- MaskableField.tsx
- @tailwindcss/postcss
- @types/express
- @types/jest
- @types/react-dom
@ -335,11 +348,11 @@
backend/src/orders/orders.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/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`
- 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 (314 total, 100 thin omitted)
## Communities (327 total, 116 thin omitted)
### Community 0 - "Roles"
Cohesion: 0.24
@ -347,7 +360,7 @@ Nodes (13): Roles(), PaymentController, ApiBearerAuth, ApiOperation, ApiTags, Bo
### Community 1 - "app.module.ts"
Cohesion: 0.06
Nodes (40): B2BModule, Module, BannersModule, Module, CmsModule, Module, SmsModule, Global (+32 more)
Nodes (39): B2BModule, Module, BannersModule, Module, CmsModule, Module, RevalidationModule, Global (+31 more)
### Community 2 - "PaymentService"
Cohesion: 0.11
@ -355,11 +368,11 @@ Nodes (9): AdminTransactionFilterDto, ApiPropertyOptional, IsIn, IsNumber, IsOpt
### Community 3 - "productService.ts"
Cohesion: 0.06
Nodes (36): dynamic, GET(), revalidate, dynamic, GET(), revalidate, DEFAULT_CATEGORIES, dynamic (+28 more)
Nodes (41): buildTorobProductSpec(), buildTorobProductTitle(), dynamic, GET(), revalidate, dynamic, GET(), revalidate (+33 more)
### Community 4 - "PetProfile.tsx"
### Community 4 - "UserDashboard.tsx"
Cohesion: 0.11
Nodes (19): metadata, FeaturedProducts(), ProductCard(), OrderSuccess(), PrescriptionUploadModal(), PrescriptionUploadModalProps, SearchResultsPage(), CURRENT_SYMPTOMS (+11 more)
Nodes (20): metadata, OrderDetailsModal(), PetProfile(), SearchResultsPage(), CURRENT_SYMPTOMS, MEDICAL_HISTORIES, SmartAdvisor(), SmartAdvisorProps (+12 more)
### Community 5 - "CmsController"
Cohesion: 0.09
@ -367,7 +380,7 @@ 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
@ -378,12 +391,12 @@ Cohesion: 0.13
Nodes (13): ApiNotFoundResponse, ApiOkResponse, ApiOperation, ApiTags, Controller, Get, Param, Query (+5 more)
### Community 9 - "devDependencies"
Cohesion: 0.08
Nodes (25): devDependencies, @eslint/eslintrc, eslint-plugin-prettier, globals, jest, @nestjs/cli, @nestjs/testing, prettier (+17 more)
Cohesion: 0.22
Nodes (9): devDependencies, ts-node, @types/bcryptjs, @types/node, typescript, @types/node, typescript, ts-node (+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.07
Nodes (30): CreateReviewDto, ApiProperty, IsInt, IsNotEmpty, IsOptional, IsString, Min, ApiProperty (+22 more)
### Community 11 - "MediaSelector.tsx"
Cohesion: 0.06
@ -398,8 +411,8 @@ Cohesion: 0.06
Nodes (28): AppModule, Module, EnvironmentVariables, IsNotEmpty, IsOptional, IsString, validateEnv(), CustomHttpExceptionFilter (+20 more)
### Community 14 - "toPersian"
Cohesion: 0.09
Nodes (41): VerifyContent(), AddressFormData, AddressModal(), AddressModalProps, normalizeDigits(), validateAddressForm(), ArchiveProductCard(), AuthModal() (+33 more)
Cohesion: 0.17
Nodes (19): VerifyContent(), AddressFormData, AddressModal(), AddressModalProps, normalizeDigits(), validateAddressForm(), BackButton(), BackButtonProps (+11 more)
### Community 15 - "src/services/api.ts"
Cohesion: 0.08
@ -414,20 +427,20 @@ Cohesion: 0.15
Nodes (18): B2BPage(), generateMetadata(), ContactPage(), generateMetadata(), generateMetadata(), getRelatedProducts(), getWikiTerm(), WikiTermPage() (+10 more)
### Community 18 - "JwtAuthGuard"
Cohesion: 0.17
Cohesion: 0.18
Nodes (7): JwtAuthGuard, Injectable, ROLES_KEY, RequestWithUser, RolesGuard, Injectable, UserReqPayload
### Community 19 - "ProductsService"
Cohesion: 0.18
Nodes (10): GetProductsDto, ApiPropertyOptional, IsEnum, IsOptional, IsString, Query, ProductsModule, Module (+2 more)
### Community 19 - "users.controller.ts"
Cohesion: 0.13
Nodes (13): AddressDto, ApiProperty, ApiPropertyOptional, IsBoolean, IsNotEmpty, IsOptional, IsString, ApiPropertyOptional (+5 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 (22): AdminModule, Module, MediaService, Injectable, ReportsController, ApiBearerAuth, ApiOperation, ApiQuery (+14 more)
### Community 21 - "ReportsController"
Cohesion: 0.14
Nodes (11): ReportsController, ApiBearerAuth, ApiOperation, ApiQuery, ApiTags, Controller, Get, Query (+3 more)
### Community 22 - "SmsService"
Cohesion: 0.06
@ -470,24 +483,24 @@ Cohesion: 0.06
Nodes (31): Acceptance Criteria, Affected Application, Affected Files, Alternative Direction, Category, Completion Statement, Confidence, Dependencies (+23 more)
### Community 32 - "adminRoutes.tsx"
Cohesion: 0.06
Nodes (24): App(), Props, RouteErrorBoundary, State, HeroBanner, VetTestimonial, BestSellerItem, CategoryDistItem (+16 more)
Cohesion: 0.08
Nodes (17): App(), Props, RouteErrorBoundary, State, HeroBanner, VetTestimonial, AdminRouteConfig, CMS (+9 more)
### Community 33 - "WholesaleApplyDto"
Cohesion: 0.10
Nodes (20): ApiProperty, ApiPropertyOptional, IsNotEmpty, IsOptional, IsString, WholesaleApplyDto, ApiBearerAuth, ApiOperation (+12 more)
### Community 33 - "ContactService"
Cohesion: 0.06
Nodes (32): ContactController, Body, Controller, Get, Param, Post, Put, Query (+24 more)
### Community 34 - "B2BService"
Cohesion: 0.13
Nodes (15): B2BController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Get, Param (+7 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"
### Community 36 - "FaqController"
Cohesion: 0.14
Nodes (14): FaqController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+6 more)
Nodes (12): FaqController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+4 more)
### Community 37 - "راهنمای تست سیستم (Software Testing)"
Cohesion: 0.07
@ -501,9 +514,9 @@ Nodes (19): TransactionReceiptData, TransactionReceiptModal(), TransactionReceip
Cohesion: 0.10
Nodes (16): CategoriesController, ApiBearerAuth, ApiOperation, ApiQuery, ApiTags, Body, Controller, Delete (+8 more)
### Community 40 - "MediaController"
Cohesion: 0.11
Nodes (14): MediaController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+6 more)
### Community 40 - "admin.module.ts"
Cohesion: 0.09
Nodes (19): AdminModule, Module, MediaController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller (+11 more)
### Community 41 - "What You Must Do When Invoked"
Cohesion: 0.07
@ -543,7 +556,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
@ -573,45 +586,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"
Cohesion: 0.13
Nodes (12): ContactController, Body, Controller, Get, Param, Post, Put, Query (+4 more)
### Community 58 - "auth.module.ts"
Cohesion: 0.17
Nodes (10): DEFAULT_JWT_REFRESH_SECRET, DEFAULT_JWT_SECRET, getJwtSecret(), AuthModule, Module, JwtPayload, JwtStrategy, Injectable (+2 more)
### Community 59 - "compilerOptions"
Cohesion: 0.06
Nodes (30): compilerOptions, allowSyntheticDefaultImports, baseUrl, declaration, emitDecoratorMetadata, esModuleInterop, experimentalDecorators, forceConsistentCasingInFileNames (+22 more)
### Community 60 - "admin.service.ts"
Cohesion: 0.10
Nodes (12): CouponTargetInput, PaginationQuery, ProductDto, ApiPropertyOptional, IsArray, IsBoolean, IsNumber, IsOptional (+4 more)
Cohesion: 0.13
Nodes (21): CouponInput, CouponTargetInput, PaginationQuery, ProductDto, ApiPropertyOptional, IsArray, IsBoolean, IsNumber (+13 more)
### Community 61 - "ProductPage.tsx"
Cohesion: 0.10
Cohesion: 0.09
Nodes (20): ProductImageZoomModalProps, CalculatorState, GalleryMediaItem, ICON_MAP, isVideoUrl(), ProductImageZoomModal, ProductPage(), ProductReviews (+12 more)
### Community 62 - "RevalidationService"
Cohesion: 0.16
Nodes (5): RevalidationModule, Global, Module, RevalidationService, Injectable
### 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, bcrypt, bcryptjs, class-validator, compression, ioredis, @nestjs/common, @nestjs/passport (+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.18
Nodes (7): ApiQuery, Get, Query, AdminQueryDto, ApiPropertyOptional, IsOptional, IsString
### Community 65 - "BlogsService"
Cohesion: 0.09
Nodes (4): BlogsService, Injectable, RevalidationService, Injectable
### Community 66 - "ApiOperation"
Cohesion: 0.13
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 - "lib/services/api.ts"
Cohesion: 0.09
Nodes (19): BlogPost, ContactInfoItem, FAQItem, OrderDetailsModalProps, Testimonial, api, ApiErrorPayload, BASE_DOMAIN (+11 more)
### Community 68 - "useSettingsStore"
Cohesion: 0.08
Nodes (36): HomeClient(), HomeClientProps, B2BLandingClient(), BlogPostClientProps, BlogPost, BlogPreviewSection(), ContactInfoItem, EnamadBadge() (+28 more)
### Community 69 - "Required Review Group Closures"
Cohesion: 0.10
@ -622,8 +635,8 @@ Cohesion: 0.08
Nodes (23): compilerOptions, allowImportingTsExtensions, erasableSyntaxOnly, jsx, lib, module, moduleDetection, moduleResolution (+15 more)
### Community 71 - "getPageMetadata"
Cohesion: 0.10
Nodes (13): generateMetadata(), generateMetadata(), generateMetadata(), generateMetadata(), generateMetadata(), generateMetadata(), generateMetadata(), generateMetadata() (+5 more)
Cohesion: 0.08
Nodes (17): generateMetadata(), generateMetadata(), generateMetadata(), generateMetadata(), getHomeData(), Home(), generateMetadata(), generateMetadata() (+9 more)
### Community 72 - "Operational Rules & Boundaries"
Cohesion: 0.11
@ -638,12 +651,12 @@ Cohesion: 0.13
Nodes (14): ApiBearerAuth, ApiOperation, ApiQuery, ApiTags, Body, Controller, Delete, Get (+6 more)
### Community 75 - "PetsController"
Cohesion: 0.08
Nodes (32): CreateHealthLogDto, ApiProperty, ApiPropertyOptional, IsNotEmpty, IsOptional, IsString, CreateReminderDto, ApiProperty (+24 more)
Cohesion: 0.05
Nodes (47): CreateHealthLogDto, ApiProperty, ApiPropertyOptional, IsNotEmpty, IsOptional, IsString, CreatePetDto, ApiProperty (+39 more)
### Community 76 - "ProductsController"
Cohesion: 0.15
Nodes (9): ProductsController, ApiOperation, ApiTags, Body, Controller, Get, Param, Patch (+1 more)
### Community 76 - "ProductsService"
Cohesion: 0.07
Nodes (27): GetProductsDto, ApiPropertyOptional, IsEnum, IsOptional, IsString, ProductsController, ApiOperation, ApiTags (+19 more)
### Community 77 - "seo.module.ts"
Cohesion: 0.16
@ -677,9 +690,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 - "pets/pets.controller.ts"
Cohesion: 0.11
Nodes (15): CreatePetDto, ApiProperty, ApiPropertyOptional, IsArray, IsNotEmpty, IsNumber, IsOptional, IsString (+7 more)
### Community 85 - "Reports.tsx"
Cohesion: 0.20
Nodes (7): BestSellerItem, CategoryDistItem, COLORS, CustomTooltipProps, ReportData, TopCouponItem, Reports
### Community 86 - "zibal.service.ts"
Cohesion: 0.16
@ -697,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 - "UserDashboard.tsx"
Cohesion: 0.12
Nodes (11): DeleteConfirmModal(), DeleteConfirmModalProps, OrderDetailsModal(), OrderRowSkeleton(), PetProfileSkeleton(), Skeleton(), SkeletonProps, CreateTicketPayload (+3 more)
### Community 90 - "useCartStore"
Cohesion: 0.09
Nodes (19): B2BPortal, CartDrawer, B2BPortal(), CartDrawer(), DeleteConfirmModal(), DeleteConfirmModalProps, OrderSuccess(), OrderTracking() (+11 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
Nodes (29): CreateOrderDto, OrderItemDto, ApiProperty, ApiPropertyOptional, IsArray, IsNotEmpty, IsNumber, IsOptional (+21 more)
Cohesion: 0.06
Nodes (35): CreateOrderDto, OrderItemDto, ApiProperty, ApiPropertyOptional, IsArray, IsNotEmpty, IsNumber, IsOptional (+27 more)
### Community 93 - "HomeClient.tsx"
Cohesion: 0.09
Nodes (22): HomeClient(), HomeClientProps, ArchivePage(), CATEGORY_MAP, ICON_MAP, BannerPlacement(), BannerPlacementProps, BlogPreviewSection() (+14 more)
### Community 93 - "ArchivePage.tsx"
Cohesion: 0.08
Nodes (21): ArchivePage(), ArchiveProductCard(), CATEGORY_MAP, ICON_MAP, BannerPlacement(), BannerPlacementProps, OrderRowSkeleton(), PetProfileSkeleton() (+13 more)
### Community 94 - "Phase 3.1 — Human Review Preparation and Master Backlog Critique"
Cohesion: 0.13
@ -762,16 +775,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 - "AuthService"
Cohesion: 0.13
Nodes (3): AuthService, Injectable, normalizeMobile()
Cohesion: 0.18
Nodes (4): AuthService, Injectable, normalizeMobile(), UserAddressInput
### Community 107 - "PaginationDto"
Cohesion: 0.06
Nodes (25): BlogsModule, Module, BlogFilterDto, BlogsService, Injectable, PaginationDto, SortOrder, ApiPropertyOptional (+17 more)
Cohesion: 0.07
Nodes (20): CategoryQuery, BlogsModule, Module, BlogFilterDto, BlogsService, Injectable, PaginationDto, SortOrder (+12 more)
### Community 108 - "PrismaService"
Cohesion: 0.07
Nodes (20): CategoryQuery, B2BWholesaleOrderItem, MeliPayamakPattern, MeliPayamakResponse, SendPatternSmsOptions, SmsConfig, SmsLogQuery, CreateContactSubmissionDto (+12 more)
Nodes (20): WikiQuery, B2BWholesaleOrderItem, MeliPayamakPattern, MeliPayamakResponse, SendPatternSmsOptions, SmsConfig, SmsLogQuery, CreateContactSubmissionDto (+12 more)
### Community 109 - "1. Summary of Integrity Repairs Performed"
Cohesion: 0.17
@ -825,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 - "UsersService"
Cohesion: 0.06
Nodes (42): DEFAULT_JWT_REFRESH_SECRET, DEFAULT_JWT_SECRET, getJwtSecret(), AuthModule, Module, JwtPayload, JwtStrategy, Injectable (+34 more)
### Community 122 - "AdminService"
Cohesion: 0.15
Nodes (4): Body, Post, AdminService, Injectable
### Community 123 - "UsersController"
Cohesion: 0.20
Nodes (16): ApiBadRequestResponse, ApiBearerAuth, ApiCreatedResponse, ApiOkResponse, ApiOperation, ApiTags, Body, Controller (+8 more)
### Community 124 - "Repository Map"
Cohesion: 0.20
@ -846,8 +863,8 @@ 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.19
Nodes (12): AdminController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Param (+4 more)
Cohesion: 0.11
Nodes (8): AdminController, ApiBearerAuth, ApiTags, Controller, Delete, Param, Put, UseGuards
### Community 130 - "Sahel-Font"
Cohesion: 0.20
@ -905,13 +922,13 @@ 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 - "SafeImage.tsx"
Cohesion: 0.10
Nodes (20): BackButton(), BackButtonProps, BlogPostClientProps, PLAYBACK_RATES, PodcastInlinePlayer(), PodcastInlinePlayerProps, PLAYBACK_RATES, PodcastPlayerModal() (+12 more)
### Community 144 - "PodcastPlayerModal.tsx"
Cohesion: 0.40
Nodes (3): PLAYBACK_RATES, PodcastPlayerModal(), PodcastPlayerModalProps
### Community 145 - "TorobController"
Cohesion: 0.25
Nodes (6): TorobController, ApiOperation, ApiTags, Controller, Get, Query
### Community 145 - "FaqService"
Cohesion: 0.33
Nodes (4): FaqModule, Module, FaqService, Injectable
### Community 146 - "System Discovery"
Cohesion: 0.25
@ -921,10 +938,6 @@ Nodes (7): Active Core Applications, Current Architecture, Evidence-Based Status
Cohesion: 0.16
Nodes (10): HomeController, ApiOkResponse, ApiOperation, ApiTags, Controller, Get, HomeModule, Module (+2 more)
### Community 148 - "CreateUserDto"
Cohesion: 0.29
Nodes (10): CreateUserDto, ApiProperty, ApiPropertyOptional, IsEmail, IsNotEmpty, IsNumber, IsOptional, IsString (+2 more)
### Community 149 - "SmsSettingsPage.tsx"
Cohesion: 0.29
Nodes (7): PatternItem, SmsConfigState, SmsLogItem, SmsLogStats, SmsSettingsPage(), toPersianDigits(), SmsSettingsPage
@ -933,13 +946,9 @@ 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 - "CreateReviewDto"
Cohesion: 0.25
Nodes (8): CreateReviewDto, ApiProperty, IsInt, IsNotEmpty, IsOptional, IsString, Min, Max
### Community 152 - "MetricsController"
Cohesion: 0.29
Nodes (5): ApiExcludeController, MetricsController, Controller, Get, Res
### Community 152 - "RedisService"
Cohesion: 0.10
Nodes (10): ApiExcludeController, MetricsController, Controller, Get, Res, RedisModule, Global, Module (+2 more)
### Community 153 - "exclude"
Cohesion: 0.22
@ -1057,14 +1066,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 - "UpdateReviewDto"
Cohesion: 0.40
Nodes (5): ApiProperty, IsIn, IsOptional, IsString, UpdateReviewDto
### Community 185 - "app/page.tsx"
Cohesion: 0.67
Nodes (3): generateMetadata(), getHomeData(), Home()
### 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
@ -1089,9 +1090,9 @@ Nodes (3): Expanding the ESLint configuration, React Compiler, React + TypeScrip
Cohesion: 0.50
Nodes (3): Select, SelectOption, SelectProps
### Community 197 - "useSettingsStore"
Cohesion: 0.11
Nodes (20): AuthModal, B2BPortal, CartDrawer, ClientLayout(), LoginModal, B2BLandingClient(), BrandLogo(), BrandLogoProps (+12 more)
### Community 197 - "userStore.ts"
Cohesion: 0.06
Nodes (33): AuthModal, ClientLayout(), LoginModal, AuthModal(), AuthModalProps, extractOtpFromText(), BrandLogo(), BrandLogoProps (+25 more)
### Community 200 - "application/README.md"
Cohesion: 0.50
@ -1120,22 +1121,22 @@ Nodes (3): GET(), handleRevalidate(), POST()
## Knowledge Gaps
- **1346 isolated node(s):** `$schema`, `collection`, `sourceRoot`, `deleteOutDir`, `name` (+1341 more)
These have ≤1 connection - possible missing edges or undocumented components.
- **100 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
- **116 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`, `ProductsController`, `HomeController`, `UsersService`, `OrdersService`?**
_High betweenness centrality (0.084) - this node is a cross-community bridge._
- **Why does `Roles()` connect `Roles` to `WholesaleApplyDto`, `B2BService`, `FaqService`, `CmsController`, `tickets.controller.ts`, `SslController`, `BannersService`, `ProductsController`, `ReviewsService`, `TestimonialsService`, `IngredientsService`, `JwtAuthGuard`, `ProductsService`, `PrescriptionsService`, `SmartAdvisorService`, `SmsService`, `MenuService`, `ContactService`?**
_High betweenness centrality (0.064) - this node is a cross-community bridge._
- **Why does `JwtAuthGuard` connect `JwtAuthGuard` to `PetsController`, `CmsController`, `tickets.controller.ts`, `PaginationDto`, `auth.service.ts`, `DoctorQueryDto`, `ProductsService`, `admin.module.ts`, `pets/pets.controller.ts`, `UsersService`?**
_High betweenness centrality (0.035) - this node is a cross-community bridge._
- **Why does `ApiResponse` connect `src/services/api.ts` to `BlogsController`, `AuthController`, `WikiController`, `PetsController`, `ProductsService`, `HomeController`, `UsersController`, `OrdersService`?**
_High betweenness centrality (0.081) - this node is a cross-community bridge._
- **Why does `Roles()` connect `Roles` to `ContactService`, `B2BService`, `FaqController`, `CmsController`, `tickets.controller.ts`, `SslController`, `BannersService`, `ProductsService`, `CreateReviewDto`, `TestimonialsService`, `IngredientsService`, `JwtAuthGuard`, `PrescriptionsService`, `SmartAdvisorService`, `SmsService`, `MenuService`?**
_High betweenness centrality (0.065) - this node is a cross-community bridge._
- **Why does `JwtAuthGuard` connect `JwtAuthGuard` to `WikiService`, `PetsController`, `CmsController`, `tickets.controller.ts`, `admin.module.ts`, `PaginationDto`, `PetsController`, `ProductsService`, `OrdersService`, `auth.service.ts`, `DoctorQueryDto`, `users.controller.ts`, `ReportsController`, `admin.service.ts`?**
_High betweenness centrality (0.034) - this node is a cross-community bridge._
- **What connects `$schema`, `collection`, `sourceRoot` to the rest of the system?**
_1346 weakly-connected nodes found - possible documentation gaps or missing edges._
- **Should `app.module.ts` be split into smaller, more focused modules?**
_Cohesion score 0.061016949152542375 - nodes in this community are weakly interconnected._
_Cohesion score 0.062310949788263764 - nodes in this community are weakly interconnected._
- **Should `PaymentService` be split into smaller, more focused modules?**
_Cohesion score 0.11 - nodes in this community are weakly interconnected._
- **Should `productService.ts` be split into smaller, more focused modules?**
_Cohesion score 0.059907834101382486 - nodes in this community are weakly interconnected._
_Cohesion score 0.055130784708249496 - 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