Compare commits

..

No commits in common. "0f50d6bed17e4ba2ff4fe459be0e21350efcdb80" and "44e1f915f4c1790a029f62fefb4b91c11b3afc4d" have entirely different histories.

16 changed files with 5744 additions and 5861 deletions

View File

@ -1,7 +1,8 @@
/* eslint-disable @next/next/no-img-element */
"use client";
import React from "react";
import Link from "next/link";
import { Banner } from "../lib/types";
import SafeImage from "./SafeImage";
interface BannerPlacementProps {
banners: Banner[];
@ -35,14 +36,14 @@ export default function BannerPlacement({
const cardContent = (
<div className="group relative rounded-3xl overflow-hidden shadow-lg hover:shadow-2xl transition-all duration-300 border border-medical-gray-100 bg-white">
<div className="aspect-[16/7] sm:aspect-[16/6] md:aspect-[16/7] overflow-hidden bg-medical-gray-100 relative">
<SafeImage
<img
src={banner.imageUrl}
alt={banner.title || "کنینا بنر"}
className="w-full h-full"
imgClassName="w-full h-full object-cover group-hover:scale-105 transition-transform duration-500"
className="w-full h-full object-cover group-hover:scale-105 transition-transform duration-500"
loading="lazy"
/>
{(banner.title || banner.subtitle) && (
<div className="absolute inset-0 bg-gradient-to-t from-black/80 via-black/30 to-transparent p-6 flex flex-col justify-end text-white text-right pointer-events-none">
<div className="absolute inset-0 bg-gradient-to-t from-black/80 via-black/30 to-transparent p-6 flex flex-col justify-end text-white text-right">
{banner.title && (
<h4 className="text-lg sm:text-xl font-black mb-1 leading-tight">
{banner.title}
@ -97,14 +98,14 @@ export default function BannerPlacement({
const cardContent = (
<div className="group relative rounded-3xl overflow-hidden shadow-xl hover:shadow-2xl transition-all duration-300 border border-medical-gray-200 bg-white">
<div className="aspect-[21/6] sm:aspect-[21/5] min-h-[140px] sm:min-h-[180px] overflow-hidden bg-medical-gray-100 relative">
<SafeImage
<img
src={banner.imageUrl}
alt={banner.title || "کنینا"}
className="w-full h-full"
imgClassName="w-full h-full object-cover group-hover:scale-103 transition-transform duration-500"
className="w-full h-full object-cover group-hover:scale-103 transition-transform duration-500"
loading="lazy"
/>
{(banner.title || banner.subtitle) && (
<div className="absolute inset-0 bg-gradient-to-l from-black/80 via-black/40 to-transparent p-6 sm:p-10 flex flex-col justify-center text-white text-right pointer-events-none">
<div className="absolute inset-0 bg-gradient-to-l from-black/80 via-black/40 to-transparent p-6 sm:p-10 flex flex-col justify-center text-white text-right">
{banner.title && (
<h4 className="text-xl sm:text-3xl font-black mb-2 leading-tight">
{banner.title}
@ -157,14 +158,14 @@ export default function BannerPlacement({
const cardContent = (
<div className="group relative rounded-2xl overflow-hidden shadow-md hover:shadow-xl transition-all duration-300 border border-medical-gray-200 bg-white">
<div className="aspect-[4/3] overflow-hidden bg-medical-gray-100 relative">
<SafeImage
<img
src={banner.imageUrl}
alt={banner.title || "بنر کنینا"}
className="w-full h-full"
imgClassName="w-full h-full object-cover group-hover:scale-105 transition-transform duration-500"
className="w-full h-full object-cover group-hover:scale-105 transition-transform duration-500"
loading="lazy"
/>
{banner.title && (
<div className="absolute inset-0 bg-gradient-to-t from-black/80 to-transparent p-4 flex flex-col justify-end text-white text-right pointer-events-none">
<div className="absolute inset-0 bg-gradient-to-t from-black/80 to-transparent p-4 flex flex-col justify-end text-white text-right">
<span className="text-xs font-black">{banner.title}</span>
</div>
)}

View File

@ -1,7 +1,7 @@
/* eslint-disable @next/next/no-img-element */
"use client";
import React from "react";
import Link from "next/link";
import Image from "next/image";
import { useSettingsStore } from "../lib/store/settingsStore";
interface BrandLogoProps {
@ -39,18 +39,12 @@ export default function BrandLogo({
lg: "text-xl sm:text-3xl",
};
const isBlobOrData = typeof logoUrl === 'string' && (logoUrl.startsWith('blob:') || logoUrl.startsWith('data:'));
const content = (
<div className={`flex items-center gap-2.5 sm:gap-3 group shrink-0 ${className}`}>
{logoUrl ? (
<Image
<img
src={logoUrl}
alt={`${textEn} ${textFa}`}
width={180}
height={48}
priority
unoptimized={isBlobOrData}
className="h-10 sm:h-12 w-auto max-w-[160px] sm:max-w-[200px] object-contain shrink-0"
/>
) : (

View File

@ -1,6 +1,6 @@
/* eslint-disable @next/next/no-img-element */
"use client";
import React, { useState, useEffect } from "react";
import Image from "next/image";
import { Phone, Mail, MapPin, Instagram, ShieldCheck, Globe, ArrowUp, Download } from "lucide-react";
import { useSettingsStore } from "../lib/store/settingsStore";
import BrandLogo from "./BrandLogo";
@ -190,15 +190,11 @@ export default function Footer({
target="_blank"
rel="noopener noreferrer"
title="درگاه پرداخت امن و معتبر زیبال"
className="block"
>
<Image
<img
style={{ maxWidth: '65px', height: '65px', objectFit: 'contain' }}
src="https://zibal.ir/trust/assets/2.png"
alt="نماد اعتماد درگاه پرداخت زیبال"
width={65}
height={65}
unoptimized
className="max-w-[65px] h-[65px] object-contain"
/>
</a>
</div>

View File

@ -1,3 +1,4 @@
/* eslint-disable @next/next/no-img-element */
"use client";
import React, { useState } from "react";
import Link from "next/link";
@ -25,7 +26,6 @@ import { toPersian } from "../lib/utils";
import api from "../lib/services/api";
import { toast } from "sonner";
import { useSettingsStore } from "../lib/store/settingsStore";
import SafeImage from "./SafeImage";
interface OrderDetailsModalProps {
isOpen: boolean;
@ -418,14 +418,14 @@ export default function OrderDetailsModal({
<div className="flex items-center gap-4">
<div
onClick={() => setZoomedImage(pImg)}
className="w-14 h-14 bg-medical-gray-50 rounded-xl p-1 flex items-center justify-center shrink-0 border border-medical-gray-200 cursor-zoom-in hover:scale-105 transition-transform overflow-hidden"
className="w-14 h-14 bg-medical-gray-50 rounded-xl p-1.5 flex items-center justify-center shrink-0 border border-medical-gray-200 cursor-zoom-in hover:scale-105 transition-transform"
title="مشاهده تصویر بزرگ"
>
<SafeImage
<img
src={pImg}
alt={pName}
className="w-full h-full"
imgClassName="w-full h-full object-contain"
className="max-w-full max-h-full object-contain"
onError={(e: any) => { e.currentTarget.src = '/assets/images/canina-product-placeholder.png'; }}
/>
</div>
<div>
@ -711,11 +711,10 @@ export default function OrderDetailsModal({
>
<X className="w-5 h-5" />
</button>
<SafeImage
<img
src={zoomedImage}
alt="نمایش کامل تصویر محصول"
className="max-h-[70vh] w-full"
imgClassName="max-h-[70vh] w-auto object-contain rounded-2xl mx-auto"
className="max-h-[70vh] w-auto object-contain rounded-2xl"
/>
</div>
</div>

View File

@ -4,7 +4,6 @@ import { Product } from "../lib/data/products";
import { productService } from "../lib/services/productService";
import { motion, AnimatePresence } from "motion/react";
import { PetProfileSkeleton } from "./Skeleton";
import SafeImage from "./SafeImage";
import {
Dog,
Cat,
@ -29,6 +28,7 @@ import {
} from "lucide-react";
import { usePetStore, PetProfile as GlobalPetProfile, Reminder, HealthLog } from "../lib/store/usePetStore";
import { useCartStore } from "../lib/store/cartStore";
import SafeImage from "./SafeImage";
import SmartAdvisor from "./SmartAdvisor";
import OrderDetailsModal from "./OrderDetailsModal";
import { toast } from "sonner";
@ -554,11 +554,10 @@ export default function PetProfile({ initialView, advisorNeed, embedded = false
{/* Photo preview container */}
<div className="relative w-20 h-20 rounded-2xl overflow-hidden bg-medical-gray-200 border-2 border-dashed border-medical-gray-300 flex items-center justify-center shrink-0">
{formData.imageUrl ? (
<SafeImage
<img
src={formData.imageUrl.startsWith('http') ? formData.imageUrl : `${BASE_DOMAIN}${formData.imageUrl}`}
alt="عکس پت"
className="w-full h-full"
imgClassName="w-full h-full object-cover"
className="w-full h-full object-cover"
/>
) : (
<Dog className="w-8 h-8 text-medical-gray-400" />

View File

@ -14,7 +14,6 @@ import {
Loader2,
Sparkles
} from "lucide-react";
import SafeImage from "./SafeImage";
interface PodcastInlinePlayerProps {
podcast: {
@ -204,11 +203,13 @@ export default function PodcastInlinePlayer({ podcast }: PodcastInlinePlayerProp
onClick={togglePlay}
className="relative w-full md:w-56 sm:w-64 aspect-square rounded-2xl overflow-hidden cursor-pointer bg-neutral-800 border border-white/15 group-hover:border-canina-blue/50 transition-all flex items-center justify-center shrink-0 shadow-lg"
>
<SafeImage
<img
src={displayCover}
alt={podcast.title || "کاور پادکست"}
className="w-full h-full"
imgClassName={`w-full h-full object-cover transition-transform duration-700 ${isPlaying ? "scale-105" : "scale-100"}`}
className={`w-full h-full object-cover transition-transform duration-700 ${isPlaying ? "scale-105" : "scale-100"}`}
onError={(e) => {
(e.target as HTMLImageElement).src = '/images/default-podcast.png';
}}
/>
<div className="absolute inset-0 bg-black/40 group-hover:bg-black/20 transition-colors flex items-center justify-center">
<div className="w-12 h-12 rounded-full bg-canina-blue text-white flex items-center justify-center shadow-xl shadow-canina-blue/50 group-hover:scale-110 active:scale-95 transition-transform">

View File

@ -16,7 +16,6 @@ import {
Loader2,
Sparkles
} from "lucide-react";
import SafeImage from "./SafeImage";
interface PodcastPlayerModalProps {
isOpen: boolean;
@ -278,11 +277,13 @@ export default function PodcastPlayerModal({ isOpen, onClose, podcast }: Podcast
{/* Cover Art Artwork */}
<div className="relative group my-2">
<div className="w-40 h-40 sm:w-48 sm:h-48 rounded-3xl overflow-hidden shadow-2xl border-2 border-white/20 relative bg-neutral-800 flex items-center justify-center">
<SafeImage
<img
src={displayCover}
alt={podcast.title || "کاور پادکست"}
className="w-full h-full"
imgClassName={`w-full h-full object-cover transition-transform duration-700 ${isPlaying ? "scale-105" : "scale-100"}`}
className={`w-full h-full object-cover transition-transform duration-700 ${isPlaying ? "scale-105" : "scale-100"}`}
onError={(e) => {
(e.target as HTMLImageElement).src = '/images/default-podcast.png';
}}
/>
<div className="absolute inset-0 bg-gradient-to-t from-black/60 via-transparent to-transparent pointer-events-none" />

View File

@ -325,11 +325,10 @@ export default function ProductPage({ productSlug }: { productSlug: string }) {
: 'border-medical-gray-200 hover:border-canina-blue/50 opacity-70 hover:opacity-100'
}`}
>
<SafeImage
<img
src={imgUrl}
alt={`${product.name} - ${idx + 1}`}
className="w-full h-full"
imgClassName="w-full h-full object-contain"
className="w-full h-full object-contain"
/>
</button>
);
@ -708,11 +707,13 @@ export default function ProductPage({ productSlug }: { productSlug: string }) {
onClick={() => setIsVideoModalOpen(true)}
className="relative w-full md:w-80 aspect-video rounded-2xl overflow-hidden cursor-pointer bg-neutral-800 border border-white/10 group-hover:border-canina-blue/50 transition-all flex items-center justify-center shrink-0"
>
<SafeImage
<img
src={product.videoCover || product.image}
alt={product.videoTitle || product.name}
className="w-full h-full"
imgClassName="w-full h-full object-cover group-hover:scale-105 transition-transform duration-500"
className="w-full h-full object-cover group-hover:scale-105 transition-transform duration-500"
onError={(e) => {
(e.target as HTMLImageElement).src = product.image;
}}
/>
<div className="absolute inset-0 bg-black/40 group-hover:bg-black/20 transition-colors flex items-center justify-center">
<div className="w-12 h-12 rounded-full bg-canina-blue text-white flex items-center justify-center shadow-xl shadow-canina-blue/50 group-hover:scale-110 transition-transform">
@ -1136,11 +1137,10 @@ export default function ProductPage({ productSlug }: { productSlug: string }) {
{/* Main Zoomed Image Container */}
<div className="bg-white rounded-3xl p-6 sm:p-10 shadow-2xl border border-white/20 max-h-[75vh] flex items-center justify-center overflow-hidden w-full">
<SafeImage
<img
src={activeImage || product.image}
alt={product.name}
className="max-h-[60vh] max-w-full w-full"
imgClassName="max-h-[60vh] max-w-full w-auto object-contain drop-shadow-2xl mx-auto"
className="max-h-[60vh] max-w-full w-auto object-contain drop-shadow-2xl"
/>
</div>
@ -1165,7 +1165,7 @@ export default function ProductPage({ productSlug }: { productSlug: string }) {
: 'border-transparent opacity-60 hover:opacity-100'
}`}
>
<SafeImage src={img} alt="Thumbnail" className="w-full h-full" imgClassName="w-full h-full object-contain" />
<img src={img} alt="Thumbnail" className="w-full h-full object-contain" />
</button>
))}
</div>

View File

@ -43,23 +43,7 @@ export default function SafeImage({
);
}
// Check if external domain is in allowed remote patterns or relative path
const isExternal = typeof src === 'string' && (src.startsWith('http://') || src.startsWith('https://'));
const isBlobOrData = typeof src === 'string' && (src.startsWith('blob:') || src.startsWith('data:'));
const isAllowedHost = React.useMemo(() => {
if (!isExternal) return true;
try {
const url = new URL(src);
const allowedHosts = [
'canina.ir', 'api.canina.ir', 'stage.canina.ir', 'stageapi.canina.ir',
'apicanina.parsaaghayi.ir', 'canina.de', 'www.canina.de',
'images.unsplash.com', 'plus.unsplash.com', 'localhost', '127.0.0.1'
];
return allowedHosts.some(h => url.hostname === h || url.hostname.endsWith(`.${h}`));
} catch {
return false;
}
}, [src, isExternal]);
return (
<div className={cn("relative overflow-hidden group flex items-center justify-center", className)}>
@ -74,7 +58,7 @@ export default function SafeImage({
width={500}
height={500}
loading="lazy"
unoptimized={isBlobOrData || !isAllowedHost}
unoptimized={isExternal}
className={cn(
"transition-all duration-700 w-full h-full",
imgClassName,

View File

@ -1,9 +1,9 @@
{
"0": "Roles",
"1": "app.module.ts",
"2": "SmsService",
"2": "SettingsController",
"3": "productService.ts",
"4": "SafeImage.tsx",
"4": "VetGallery.tsx",
"5": "CmsController",
"6": "tickets.controller.ts",
"7": "PaginationDto",
@ -11,16 +11,16 @@
"9": "devDependencies",
"10": "CreateReviewDto",
"11": "Modal.tsx",
"12": "PetProfile.tsx",
"13": "main.ts",
"14": "lib/services/api.ts",
"12": "useCartStore",
"13": "app-audit-verification.e2e-spec.js",
"14": "userStore.ts",
"15": "src/services/api.ts",
"16": "DoctorQueryDto",
"17": "AuthService",
"17": "RedisService",
"18": "JwtAuthGuard",
"19": "ProductsService",
"20": "CreateVideoDto",
"21": "toPersian",
"21": "SmsService",
"22": "UserDashboard.tsx",
"23": "MenuService",
"24": "BE-001",
@ -34,7 +34,7 @@
"32": "Button.tsx",
"33": "WholesaleApplyDto",
"34": "B2BService",
"35": "AuthController",
"35": "auth.service.ts",
"36": "FaqService",
"37": "راهنمای تست سیستم (Software Testing)",
"38": "Button",
@ -52,16 +52,16 @@
"50": "devDependencies",
"51": "BlogsController",
"52": "PrescriptionsController",
"53": "SmartAdvisorService",
"54": "UsersService",
"53": "SmartAdvisorController",
"54": "UsersController",
"55": "UITexts.tsx",
"56": "Orders.tsx",
"56": "SettingsService",
"57": "Role & Core Objective",
"58": "ContactService",
"59": "compilerOptions",
"60": "admin.service.ts",
"61": "CreateEBankCheckoutDto",
"62": "WikiController",
"62": "OrdersService",
"63": "dependencies",
"64": "compilerOptions",
"65": "ProductPage.tsx",
@ -75,7 +75,7 @@
"73": "Operational Rules & Boundaries",
"74": "WikiController",
"75": "PetsController",
"76": "PaymentService",
"76": "Orders.tsx",
"77": "seo.module.ts",
"78": "AdminService",
"79": "🏢 AI Software Agency — Master Orchestration Protocol v3",
@ -84,29 +84,29 @@
"82": "scripts",
"83": "dependencies",
"84": "Role & Core Objective",
"85": "auth.service.ts",
"85": "UsersService",
"86": "zibal.service.ts",
"87": "dependencies",
"88": "HomeClient.tsx",
"88": "components/Skeleton.tsx",
"89": "seed-products.ts",
"90": "SmsLogQueryDto",
"91": "Reconciled Audit Roles & Assignments",
"92": "OrdersService",
"93": "app-audit-verification.e2e-spec.js",
"92": "OrdersController",
"93": "lib/services/api.ts",
"94": "Phase 3.1 — Human Review Preparation and Master Backlog Critique",
"95": "getSeoConfig",
"96": "compilerOptions",
"97": "prisma",
"98": "scripts",
"99": "HomeController",
"99": "AuthController",
"100": "Deep Audit Summary Report",
"101": "Operational Rules & Boundaries",
"102": "jest",
"103": "Comprehensive Change Log",
"104": "Coupons.tsx",
"105": "Operational Rules & Boundaries",
"106": "auth.controller.ts",
"107": "payment.service.ts",
"106": "auth.module.ts",
"107": "HomeController",
"108": "PrismaService",
"109": "1. Summary of Integrity Repairs Performed",
"110": "Operational Rules & Boundaries",
@ -143,7 +143,7 @@
"141": "application/package.json",
"142": "start-dev.js",
"143": "generate-openapi.js",
"144": "RegisterDto",
"144": "PaymentService",
"145": "eslint-config-prettier",
"146": "System Discovery",
"147": "Media.tsx",
@ -175,10 +175,10 @@
"173": "Phase 3 Audit Traceability Matrix",
"174": "rebuild_honest_ledger.js",
"175": "validate_evidence_grade.js",
"176": "InitiatePaymentDto",
"176": "AuthService",
"177": "blog/page.tsx",
"178": "prettier",
"179": "VerifyOtpDto",
"179": "PodcastPlayerModal.tsx",
"180": "API Contract Specification",
"181": "⚙️ Backend Technical Review (05_dev_backend)",
"182": "🎨 Frontend & Admin Panel Technical Review (06_dev_frontend)",
@ -223,7 +223,7 @@
"221": "Textarea.tsx",
"222": "admin-panel/tsconfig.json",
"223": "ts-jest",
"224": "SendOtpDto",
"224": "payment.service.ts",
"225": "next.config.ts",
"226": "Shabnam Font README",
"227": "AGENTS.md",
@ -306,17 +306,19 @@
"304": "@testing-library/react",
"305": "@types/react",
"306": "globals",
"307": "@types/react-dom",
"307": "RegisterDto",
"308": "vitest",
"309": "axios",
"310": "tailwindcss",
"311": "track/page.tsx",
"312": "BlogsModule",
"313": "app/page.tsx",
"311": "InitiatePaymentDto",
"312": "AddressDto",
"313": "track/page.tsx",
"314": "@eslint/js",
"315": "typescript",
"316": "search/page.tsx",
"317": "shop/page.tsx",
"318": "MaskableField.tsx",
"316": "app/page.tsx",
"317": "search/page.tsx",
"318": "shop/page.tsx",
"319": "MaskableField.tsx",
"320": "eslint-config-next",
"324": "typescript-eslint"
}

File diff suppressed because one or more lines are too long

View File

@ -1,11 +1,11 @@
# Graph Report - caninairan (2026-08-24)
## Corpus Check
- 544 files · ~1,300,486 words
- 544 files · ~1,300,704 words
- Verdict: corpus is large enough that graph structure adds value.
## Summary
- 3905 nodes · 7028 edges · 320 communities (201 shown, 119 thin omitted)
- 3905 nodes · 7020 edges · 322 communities (201 shown, 121 thin omitted)
- Extraction: 96% EXTRACTED · 4% INFERRED · 0% AMBIGUOUS · INFERRED: 270 edges (avg confidence: 0.8)
- Token cost: 0 input · 0 output
@ -17,9 +17,9 @@
## Community Hubs (Navigation)
- Roles
- app.module.ts
- SmsService
- SettingsController
- productService.ts
- SafeImage.tsx
- VetGallery.tsx
- CmsController
- tickets.controller.ts
- PaginationDto
@ -27,16 +27,16 @@
- devDependencies
- CreateReviewDto
- Modal.tsx
- PetProfile.tsx
- main.ts
- lib/services/api.ts
- useCartStore
- app-audit-verification.e2e-spec.js
- userStore.ts
- src/services/api.ts
- DoctorQueryDto
- AuthService
- RedisService
- JwtAuthGuard
- ProductsService
- CreateVideoDto
- toPersian
- SmsService
- UserDashboard.tsx
- MenuService
- BE-001
@ -50,7 +50,7 @@
- Button.tsx
- WholesaleApplyDto
- B2BService
- AuthController
- auth.service.ts
- FaqService
- راهنمای تست سیستم (Software Testing)
- Button
@ -68,16 +68,16 @@
- devDependencies
- BlogsController
- PrescriptionsController
- SmartAdvisorService
- UsersService
- SmartAdvisorController
- UsersController
- UITexts.tsx
- Orders.tsx
- SettingsService
- Role & Core Objective
- ContactService
- compilerOptions
- admin.service.ts
- CreateEBankCheckoutDto
- WikiController
- OrdersService
- dependencies
- compilerOptions
- ProductPage.tsx
@ -91,7 +91,7 @@
- Operational Rules & Boundaries
- WikiController
- PetsController
- PaymentService
- Orders.tsx
- seo.module.ts
- AdminService
- 🏢 AI Software Agency — Master Orchestration Protocol v3
@ -100,29 +100,29 @@
- scripts
- dependencies
- Role & Core Objective
- auth.service.ts
- UsersService
- zibal.service.ts
- dependencies
- HomeClient.tsx
- components/Skeleton.tsx
- seed-products.ts
- SmsLogQueryDto
- Reconciled Audit Roles & Assignments
- OrdersService
- app-audit-verification.e2e-spec.js
- OrdersController
- lib/services/api.ts
- Phase 3.1 — Human Review Preparation and Master Backlog Critique
- getSeoConfig
- compilerOptions
- prisma
- scripts
- HomeController
- AuthController
- Deep Audit Summary Report
- Operational Rules & Boundaries
- jest
- Comprehensive Change Log
- Coupons.tsx
- Operational Rules & Boundaries
- auth.controller.ts
- payment.service.ts
- auth.module.ts
- HomeController
- PrismaService
- 1. Summary of Integrity Repairs Performed
- Operational Rules & Boundaries
@ -159,7 +159,7 @@
- application/package.json
- start-dev.js
- generate-openapi.js
- RegisterDto
- PaymentService
- eslint-config-prettier
- System Discovery
- Media.tsx
@ -191,10 +191,10 @@
- Phase 3 Audit Traceability Matrix
- rebuild_honest_ledger.js
- validate_evidence_grade.js
- InitiatePaymentDto
- AuthService
- blog/page.tsx
- prettier
- VerifyOtpDto
- PodcastPlayerModal.tsx
- API Contract Specification
- ⚙️ Backend Technical Review (05_dev_backend)
- 🎨 Frontend & Admin Panel Technical Review (06_dev_frontend)
@ -239,7 +239,7 @@
- Textarea.tsx
- admin-panel/tsconfig.json
- ts-jest
- SendOtpDto
- payment.service.ts
- next.config.ts
- Shabnam Font README
- AGENTS.md
@ -307,16 +307,18 @@
- @testing-library/react
- @types/react
- globals
- @types/react-dom
- RegisterDto
- vitest
- InitiatePaymentDto
- AddressDto
- track/page.tsx
- BlogsModule
- app/page.tsx
- @eslint/js
- typescript
- app/page.tsx
- search/page.tsx
- shop/page.tsx
- MaskableField.tsx
- eslint-config-next
- typescript-eslint
## God Nodes (most connected - your core abstractions)
@ -348,27 +350,27 @@
- 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 (320 total, 119 thin omitted)
## Communities (322 total, 121 thin omitted)
### Community 0 - "Roles"
Cohesion: 0.24
Nodes (13): Roles(), PaymentController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Get (+5 more)
### Community 1 - "app.module.ts"
Cohesion: 0.08
Nodes (34): AdminModule, Module, B2BModule, Module, BannersModule, Module, CmsModule, Module (+26 more)
Cohesion: 0.07
Nodes (36): B2BModule, Module, BannersModule, Module, CmsModule, Module, SmsModule, Global (+28 more)
### Community 2 - "SmsService"
Cohesion: 0.06
Nodes (20): SmsLogQuery, SmsService, Injectable, SettingsController, ApiBearerAuth, ApiOkResponse, ApiOperation, ApiTags (+12 more)
### Community 2 - "SettingsController"
Cohesion: 0.18
Nodes (15): SettingsController, ApiBearerAuth, ApiOkResponse, ApiOperation, ApiTags, Body, Controller, Delete (+7 more)
### Community 3 - "productService.ts"
Cohesion: 0.09
Nodes (25): BlogPost, CatalogPageSpread(), CatalogPageSpreadProps, CategoryMeta, getFormBadge(), getSpeciesBadge(), FlipbookCatalog(), FlipbookCatalogProps (+17 more)
Cohesion: 0.08
Nodes (29): BlogPost, CartDrawer(), CatalogPageSpread(), CatalogPageSpreadProps, CategoryMeta, getFormBadge(), getSpeciesBadge(), FlipbookCatalog() (+21 more)
### Community 4 - "SafeImage.tsx"
Cohesion: 0.09
Nodes (20): BlogPost, BlogPreviewSection(), OrderDetailsModalProps, PLAYBACK_RATES, PodcastPlayerModal(), PodcastPlayerModalProps, SafeImage(), SafeImageProps (+12 more)
### Community 4 - "VetGallery.tsx"
Cohesion: 0.22
Nodes (9): DisplayVideoItem, FALLBACK_VIDEOS, TestimonialItem, VetGallery(), PLAYBACK_RATES, VideoModalPlayer(), VideoModalPlayerProps, Video (+1 more)
### Community 5 - "CmsController"
Cohesion: 0.09
@ -379,12 +381,12 @@ Cohesion: 0.09
Nodes (29): AdminUpdateTicketDto, CreateTicketDto, ReplyTicketDto, ApiProperty, ApiPropertyOptional, IsNotEmpty, IsOptional, IsString (+21 more)
### Community 7 - "PaginationDto"
Cohesion: 0.06
Nodes (17): BlogsService, Injectable, BlogsService, Injectable, PaginationDto, SortOrder, ApiPropertyOptional, IsEnum (+9 more)
Cohesion: 0.05
Nodes (28): BlogsService, Injectable, BlogsModule, Module, BlogsService, Injectable, PaginationDto, SortOrder (+20 more)
### Community 8 - "admin.module.ts"
Cohesion: 0.10
Nodes (13): ReportsController, ApiBearerAuth, ApiOperation, ApiTags, Controller, Get, UseGuards, ReportsService (+5 more)
Cohesion: 0.09
Nodes (15): AdminModule, Module, ReportsController, ApiBearerAuth, ApiOperation, ApiTags, Controller, Get (+7 more)
### Community 9 - "devDependencies"
Cohesion: 0.22
@ -398,17 +400,17 @@ Nodes (29): CreateReviewDto, ApiProperty, IsInt, IsNotEmpty, IsOptional, IsStrin
Cohesion: 0.07
Nodes (30): ConfirmModal(), ConfirmModalProps, getFileType(), Media, MediaSelector(), MediaSelectorProps, maxWidthClasses, Modal() (+22 more)
### Community 12 - "PetProfile.tsx"
Cohesion: 0.13
Nodes (15): FeaturedProducts(), ProductCard(), OrderSuccess(), OrderRowSkeleton(), PetProfileSkeleton(), ProductCardSkeleton(), Skeleton(), SkeletonProps (+7 more)
### Community 13 - "main.ts"
### Community 12 - "useCartStore"
Cohesion: 0.12
Nodes (8): AppModule, Module, CustomHttpExceptionFilter, Catch, PrismaExceptionFilter, Catch, DecimalInterceptor, Injectable
Nodes (24): ClientLayout(), ArchiveProductCard(), CheckoutPage(), ProductCard(), Header(), MENU_ICONS, OrderSuccess(), PrescriptionUploadModal() (+16 more)
### Community 14 - "lib/services/api.ts"
Cohesion: 0.06
Nodes (22): ContactInfoItem, PrescriptionUploadModal(), PrescriptionUploadModalProps, api, ApiErrorPayload, baseURL, ApiErr, AuthResponse (+14 more)
### Community 13 - "app-audit-verification.e2e-spec.js"
Cohesion: 0.07
Nodes (22): AppModule, Module, CustomHttpExceptionFilter, Catch, PrismaExceptionFilter, Catch, DecimalInterceptor, Injectable (+14 more)
### Community 14 - "userStore.ts"
Cohesion: 0.10
Nodes (14): AuthModal(), AuthModalProps, extractOtpFromText(), LoginModal(), LoginModalProps, ApiErr, AuthResponse, AuthService (+6 more)
### Community 15 - "src/services/api.ts"
Cohesion: 0.07
@ -418,13 +420,13 @@ Nodes (35): Layout(), ProtectedRoute(), MenuGroup, Sidebar(), SidebarProps, SubM
Cohesion: 0.09
Nodes (24): DoctorsController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+16 more)
### Community 17 - "AuthService"
Cohesion: 0.16
Nodes (3): AuthService, Injectable, normalizeMobile()
### Community 17 - "RedisService"
Cohesion: 0.10
Nodes (10): ApiExcludeController, MetricsController, Controller, Get, Res, RedisModule, Global, Module (+2 more)
### Community 18 - "JwtAuthGuard"
Cohesion: 0.17
Nodes (8): JwtAuthGuard, Injectable, B2BWholesaleOrderItem, ROLES_KEY, RequestWithUser, RolesGuard, Injectable, UserReqPayload
Cohesion: 0.20
Nodes (7): JwtAuthGuard, Injectable, ROLES_KEY, RequestWithUser, RolesGuard, Injectable, UserReqPayload
### Community 19 - "ProductsService"
Cohesion: 0.10
@ -434,17 +436,13 @@ Nodes (19): GetProductsDto, ApiPropertyOptional, IsEnum, IsOptional, IsString, P
Cohesion: 0.07
Nodes (32): CreateVideoDto, ApiProperty, ApiPropertyOptional, IsBoolean, IsNotEmpty, IsOptional, IsString, UpdateVideoDto (+24 more)
### Community 21 - "toPersian"
Cohesion: 0.15
Nodes (23): VerifyContent(), ArchiveProductCard(), AuthModal(), AuthModalProps, extractOtpFromText(), B2BPortal(), BackButton(), BackButtonProps (+15 more)
### Community 22 - "UserDashboard.tsx"
Cohesion: 0.13
Nodes (17): AddressModal(), AddressModalProps, DeleteConfirmModal(), DeleteConfirmModalProps, OrderDetailsModal(), SearchableSelect(), SearchableSelectProps, PRESET_AMOUNTS (+9 more)
Cohesion: 0.09
Nodes (32): VerifyContent(), AddressModal(), AddressModalProps, BackButton(), BackButtonProps, BlogPost, BlogPreviewSection(), DeleteConfirmModal() (+24 more)
### Community 23 - "MenuService"
Cohesion: 0.11
Nodes (18): MenuController, ApiBearerAuth, ApiOperation, ApiQuery, ApiTags, Body, Controller, Delete (+10 more)
Cohesion: 0.12
Nodes (16): MenuController, ApiBearerAuth, ApiOperation, ApiQuery, ApiTags, Body, Controller, Delete (+8 more)
### Community 24 - "BE-001"
Cohesion: 0.06
@ -490,9 +488,9 @@ Nodes (20): ApiProperty, ApiPropertyOptional, IsNotEmpty, IsOptional, IsString,
Cohesion: 0.14
Nodes (14): B2BController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Get, Param (+6 more)
### Community 35 - "AuthController"
Cohesion: 0.25
Nodes (12): AuthController, ApiBadRequestResponse, ApiBearerAuth, ApiOkResponse, ApiOperation, ApiTags, Body, Controller (+4 more)
### Community 35 - "auth.service.ts"
Cohesion: 0.08
Nodes (25): AdminLoginInput, LoginInput, RegisterInput, AdminLoginDto, ApiProperty, IsEmail, IsNotEmpty, IsString (+17 more)
### Community 36 - "FaqService"
Cohesion: 0.12
@ -552,7 +550,7 @@ Nodes (19): autoprefixer, devDependencies, autoprefixer, eslint, @eslint/js, glo
### Community 50 - "devDependencies"
Cohesion: 0.13
Nodes (15): eslint-config-next, devDependencies, eslint, eslint-config-next, jsdom, tailwindcss, @tailwindcss/postcss, @types/node (+7 more)
Nodes (15): devDependencies, eslint, jsdom, tailwindcss, @tailwindcss/postcss, @types/node, @types/react-dom, @vitejs/plugin-react (+7 more)
### Community 51 - "BlogsController"
Cohesion: 0.14
@ -562,21 +560,21 @@ Nodes (16): BlogsController, ApiBearerAuth, ApiOperation, ApiQuery, ApiTags, Bod
Cohesion: 0.16
Nodes (12): PrescriptionsController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Get, Param (+4 more)
### Community 53 - "SmartAdvisorService"
Cohesion: 0.11
Nodes (16): SmartAdvisorController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+8 more)
### Community 53 - "SmartAdvisorController"
Cohesion: 0.14
Nodes (12): SmartAdvisorController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+4 more)
### Community 54 - "UsersService"
Cohesion: 0.05
Nodes (42): DEFAULT_JWT_REFRESH_SECRET, DEFAULT_JWT_SECRET, getJwtSecret(), AuthModule, Module, JwtPayload, JwtStrategy, Injectable (+34 more)
### Community 54 - "UsersController"
Cohesion: 0.21
Nodes (16): ApiBadRequestResponse, ApiBearerAuth, ApiCreatedResponse, ApiOkResponse, ApiOperation, ApiTags, Body, Controller (+8 more)
### Community 55 - "UITexts.tsx"
Cohesion: 0.10
Nodes (18): ICON_REGISTRY, IconPickerModal(), IconPickerModalProps, COLORS, RichTextEditor(), RichTextEditorProps, ToggleSwitch(), ToggleSwitchProps (+10 more)
### Community 56 - "Orders.tsx"
Cohesion: 0.09
Nodes (20): Pagination(), PaginationProps, Skeleton(), getPaymentMethodLabel(), Order, ORDER_STATUS_MAP, OrderItem, Orders() (+12 more)
### Community 56 - "SettingsService"
Cohesion: 0.10
Nodes (3): SmsLogQuery, SettingsService, Injectable
### Community 57 - "Role & Core Objective"
Cohesion: 0.09
@ -598,9 +596,9 @@ Nodes (14): CouponInput, CouponTargetInput, PaginationQuery, CreateUserDto, ApiP
Cohesion: 0.22
Nodes (8): CreateEBankCheckoutDto, ApiProperty, ApiPropertyOptional, IsNotEmpty, IsNumber, IsOptional, IsString, Min
### Community 62 - "WikiController"
Cohesion: 0.13
Nodes (13): ApiNotFoundResponse, ApiOkResponse, ApiOperation, ApiTags, Controller, Get, Param, Query (+5 more)
### Community 62 - "OrdersService"
Cohesion: 0.09
Nodes (19): CreateOrderDto, OrderItemDto, ApiProperty, ApiPropertyOptional, IsArray, IsNotEmpty, IsNumber, IsOptional (+11 more)
### Community 63 - "dependencies"
Cohesion: 0.10
@ -619,8 +617,8 @@ Cohesion: 0.12
Nodes (8): ApiOperation, ApiQuery, Get, Query, AdminQueryDto, ApiPropertyOptional, IsOptional, IsString
### Community 67 - "PetsController"
Cohesion: 0.10
Nodes (14): PetsController, ApiBearerAuth, ApiOperation, ApiQuery, ApiTags, Controller, Delete, Get (+6 more)
Cohesion: 0.11
Nodes (13): PetsController, ApiBearerAuth, ApiOperation, ApiQuery, ApiTags, Controller, Delete, Get (+5 more)
### Community 68 - "BlogsController"
Cohesion: 0.17
@ -654,6 +652,10 @@ Nodes (14): ApiBearerAuth, ApiOperation, ApiQuery, ApiTags, Body, Controller, De
Cohesion: 0.05
Nodes (47): CreateHealthLogDto, ApiProperty, ApiPropertyOptional, IsNotEmpty, IsOptional, IsString, CreatePetDto, ApiProperty (+39 more)
### Community 76 - "Orders.tsx"
Cohesion: 0.09
Nodes (20): Pagination(), PaginationProps, Skeleton(), getPaymentMethodLabel(), Order, ORDER_STATUS_MAP, OrderItem, Orders() (+12 more)
### Community 77 - "seo.module.ts"
Cohesion: 0.16
Nodes (10): SeoController, ApiOperation, ApiTags, Controller, Get, Param, SeoModule, Module (+2 more)
@ -686,9 +688,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 - "auth.service.ts"
Cohesion: 0.15
Nodes (8): AdminLoginInput, LoginInput, RegisterInput, RedisModule, Global, Module, RedisService, Injectable
### Community 85 - "UsersService"
Cohesion: 0.12
Nodes (10): normalizeMobile(), ApiPropertyOptional, IsEmail, IsOptional, IsString, MinLength, UpdateProfileDto, Injectable (+2 more)
### Community 86 - "zibal.service.ts"
Cohesion: 0.16
@ -698,9 +700,9 @@ Nodes (9): GatewayHealthResult, IPaymentGateway, PaymentInquiryResult, PaymentRe
Cohesion: 0.12
Nodes (17): dependencies, axios, lucide-react, motion, next, react, react-dom, sonner (+9 more)
### Community 88 - "HomeClient.tsx"
Cohesion: 0.14
Nodes (17): HomeClient(), HomeClientProps, CATEGORY_MAP, ICON_MAP, BannerPlacement(), BannerPlacementProps, Hero(), StatCounter() (+9 more)
### Community 88 - "components/Skeleton.tsx"
Cohesion: 0.29
Nodes (5): OrderRowSkeleton(), PetProfileSkeleton(), ProductCardSkeleton(), Skeleton(), SkeletonProps
### Community 89 - "seed-products.ts"
Cohesion: 0.17
@ -714,13 +716,13 @@ Nodes (7): SmsLogQueryDto, ApiPropertyOptional, IsIn, IsNumber, IsOptional, IsSt
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.08
Nodes (29): CreateOrderDto, OrderItemDto, ApiProperty, ApiPropertyOptional, IsArray, IsNotEmpty, IsNumber, IsOptional (+21 more)
### Community 93 - "app-audit-verification.e2e-spec.js"
### Community 92 - "OrdersController"
Cohesion: 0.13
Nodes (14): ApiErrorResponse, ErrorDetailField, ApiProperty, app_module_1, client_1, common_1, decimal_interceptor_1, fs (+6 more)
Nodes (16): OrdersController, ApiBadRequestResponse, ApiBearerAuth, ApiCreatedResponse, ApiNotFoundResponse, ApiOkResponse, ApiOperation, ApiTags (+8 more)
### Community 93 - "lib/services/api.ts"
Cohesion: 0.11
Nodes (13): B2BPortal(), ContactInfoItem, api, ApiErrorPayload, baseURL, ApiErr, Order, OrderItem (+5 more)
### Community 94 - "Phase 3.1 — Human Review Preparation and Master Backlog Critique"
Cohesion: 0.13
@ -738,9 +740,9 @@ Nodes (32): compilerOptions, allowJs, esModuleInterop, incremental, isolatedModu
Cohesion: 0.14
Nodes (14): scripts, build, build:nest, docs:generate, lint, start, start:debug, start:dev (+6 more)
### Community 99 - "HomeController"
Cohesion: 0.16
Nodes (10): HomeController, ApiOkResponse, ApiOperation, ApiTags, Controller, Get, HomeModule, Module (+2 more)
### Community 99 - "AuthController"
Cohesion: 0.27
Nodes (12): AuthController, ApiBadRequestResponse, ApiBearerAuth, ApiOkResponse, ApiOperation, ApiTags, Body, Controller (+4 more)
### Community 100 - "Deep Audit Summary Report"
Cohesion: 0.14
@ -766,17 +768,17 @@ Nodes (13): formatPriceWithCommas(), PriceInput(), PriceInputProps, toEnglishDig
Cohesion: 0.17
Nodes (11): 1. Detect Test Runner from Tech Stack, 2. Execution Output Capture (Mandatory), 3. Acceptance Criteria Verification, 4. Failure Routing Protocol, 5. Success Routing Protocol, 6. Forbidden Actions, Expected JSON Output Schema, Operational Rules & Boundaries (+3 more)
### Community 106 - "auth.controller.ts"
Cohesion: 0.16
Nodes (11): AdminLoginDto, ApiProperty, IsEmail, IsNotEmpty, IsString, MinLength, LoginDto, ApiProperty (+3 more)
### Community 106 - "auth.module.ts"
Cohesion: 0.15
Nodes (10): DEFAULT_JWT_REFRESH_SECRET, DEFAULT_JWT_SECRET, getJwtSecret(), AuthModule, Module, JwtPayload, JwtStrategy, Injectable (+2 more)
### Community 107 - "payment.service.ts"
Cohesion: 0.20
Nodes (8): AdminTransactionFilterDto, ApiPropertyOptional, IsIn, IsNumber, IsOptional, IsString, Type, ClientMetadata
### Community 107 - "HomeController"
Cohesion: 0.16
Nodes (10): HomeController, ApiOkResponse, ApiOperation, ApiTags, Controller, Get, HomeModule, Module (+2 more)
### Community 108 - "PrismaService"
Cohesion: 0.07
Nodes (22): ApiExcludeController, MetricsController, Controller, Get, Res, MeliPayamakPattern, MeliPayamakResponse, SendPatternSmsOptions (+14 more)
Nodes (21): PetQuery, B2BWholesaleOrderItem, MeliPayamakPattern, MeliPayamakResponse, SendPatternSmsOptions, SmsConfig, CreateContactSubmissionDto, UpdateContactInfoItemDto (+13 more)
### Community 109 - "1. Summary of Integrity Repairs Performed"
Cohesion: 0.17
@ -898,10 +900,6 @@ 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 - "RegisterDto"
Cohesion: 0.22
Nodes (8): RegisterDto, ApiProperty, ApiPropertyOptional, IsEmail, IsNotEmpty, IsOptional, IsString, MinLength
### Community 146 - "System Discovery"
Cohesion: 0.25
Nodes (7): Active Core Applications, Current Architecture, Evidence-Based Status Matrix, Excluded / Non-Auditable Artifacts, Major Business Domains Discovered, System Discovery, Technical Architecture Summary
@ -994,17 +992,13 @@ Nodes (4): evidenceList, ledger, mandatoryMap, mandatoryScope
Cohesion: 0.40
Nodes (4): activeFiles, errors, validationOutput, warnings
### Community 176 - "InitiatePaymentDto"
Cohesion: 0.43
Nodes (7): InitiatePaymentDto, InitiateWalletTopupDto, ApiProperty, ApiPropertyOptional, IsNotEmpty, IsOptional, IsString
### Community 177 - "blog/page.tsx"
Cohesion: 0.50
Nodes (4): Blog(), generateMetadata(), getBlogs(), BlogPage()
### Community 179 - "VerifyOtpDto"
Cohesion: 0.29
Nodes (6): ApiProperty, IsNotEmpty, IsString, Matches, VerifyOtpDto, Length
### Community 179 - "PodcastPlayerModal.tsx"
Cohesion: 0.40
Nodes (3): PLAYBACK_RATES, PodcastPlayerModal(), PodcastPlayerModalProps
### Community 180 - "API Contract Specification"
Cohesion: 0.50
@ -1047,8 +1041,8 @@ Cohesion: 0.50
Nodes (3): Select, SelectOption, SelectProps
### Community 199 - "useSettingsStore"
Cohesion: 0.11
Nodes (22): ClientLayout(), BrandLogo(), BrandLogoProps, EnamadBadge(), FAQItem, FAQSection(), Footer(), MENU_ICONS (+14 more)
Cohesion: 0.08
Nodes (32): HomeClient(), HomeClientProps, CATEGORY_MAP, ICON_MAP, BannerPlacement(), BannerPlacementProps, BrandLogo(), BrandLogoProps (+24 more)
### Community 200 - "application/README.md"
Cohesion: 0.50
@ -1062,49 +1056,57 @@ Nodes (3): COMPOSE_DOCKER_CLI_BUILD, DOCKER_BUILDKIT, deploy.sh script
Cohesion: 0.67
Nodes (3): ADR-AUTH-001: Admin Panel Authentication Architecture & Token Management, Master Task Backlog (Phase 3.3), Phase 3 Master Execution Plan
### Community 224 - "SendOtpDto"
Cohesion: 0.33
Nodes (5): SendOtpDto, ApiProperty, IsNotEmpty, IsString, Matches
### Community 224 - "payment.service.ts"
Cohesion: 0.20
Nodes (8): AdminTransactionFilterDto, ApiPropertyOptional, IsIn, IsNumber, IsOptional, IsString, Type, ClientMetadata
### Community 226 - "Shabnam Font README"
Cohesion: 0.67
Nodes (3): Shabnam Font README, Shabnam Font Sample, Vazir Font
### Community 298 - ".initiateOrderPayment"
Cohesion: 0.18
Cohesion: 0.15
Nodes (10): ApiPropertyOptional, IsOptional, IsString, ZibalCallbackQueryDto, ApiBadRequestResponse, ApiOkResponse, Req, Res (+2 more)
### Community 301 - "app.e2e-spec.js"
Cohesion: 0.50
Nodes (3): app_module_1, supertest_1, testing_1
### Community 312 - "BlogsModule"
Cohesion: 0.33
Nodes (4): BlogsModule, Module, OrdersModule, Module
### Community 307 - "RegisterDto"
Cohesion: 0.22
Nodes (8): RegisterDto, ApiProperty, ApiPropertyOptional, IsEmail, IsNotEmpty, IsOptional, IsString, MinLength
### Community 313 - "app/page.tsx"
### Community 311 - "InitiatePaymentDto"
Cohesion: 0.43
Nodes (7): InitiatePaymentDto, InitiateWalletTopupDto, ApiProperty, ApiPropertyOptional, IsNotEmpty, IsOptional, IsString
### Community 312 - "AddressDto"
Cohesion: 0.29
Nodes (7): AddressDto, ApiProperty, ApiPropertyOptional, IsBoolean, IsNotEmpty, IsOptional, IsString
### Community 316 - "app/page.tsx"
Cohesion: 0.67
Nodes (3): generateMetadata(), getHomeData(), Home()
## Knowledge Gaps
- **1278 isolated node(s):** `$schema`, `collection`, `sourceRoot`, `deleteOutDir`, `name` (+1273 more)
These have ≤1 connection - possible missing edges or undocumented components.
- **119 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
- **121 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 `HomeController`, `AuthController`, `BlogsController`, `PetsController`, `ProductsService`, `UsersService`, `OrdersService`, `WikiController`?**
- **Why does `ApiResponse` connect `src/services/api.ts` to `AuthController`, `BlogsController`, `PaginationDto`, `HomeController`, `PetsController`, `ProductsService`, `UsersController`, `OrdersController`?**
_High betweenness centrality (0.065) - this node is a cross-community bridge._
- **Why does `Roles()` connect `Roles` to `WholesaleApplyDto`, `B2BService`, `SmsService`, `FaqService`, `CmsController`, `tickets.controller.ts`, `SslController`, `BannersService`, `CreateReviewDto`, `TestimonialsService`, `IngredientsService`, `JwtAuthGuard`, `ProductsService`, `PrescriptionsController`, `SmartAdvisorService`, `MenuService`, `ContactService`?**
- **Why does `Roles()` connect `Roles` to `WholesaleApplyDto`, `B2BService`, `SettingsController`, `FaqService`, `CmsController`, `tickets.controller.ts`, `SslController`, `BannersService`, `CreateReviewDto`, `TestimonialsService`, `IngredientsService`, `JwtAuthGuard`, `ProductsService`, `PrescriptionsController`, `SmartAdvisorController`, `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`, `CategoriesController`, `MediaController`, `PaginationDto`, `admin.module.ts`, `auth.controller.ts`, `PetsController`, `DoctorQueryDto`, `ProductsService`, `CreateVideoDto`, `UsersService`, `admin.service.ts`?**
- **Why does `JwtAuthGuard` connect `JwtAuthGuard` to `PetsController`, `auth.service.ts`, `CmsController`, `tickets.controller.ts`, `CategoriesController`, `MediaController`, `PaginationDto`, `admin.module.ts`, `PetsController`, `DoctorQueryDto`, `ProductsService`, `CreateVideoDto`, `UsersService`, `admin.service.ts`, `OrdersService`?**
_High betweenness centrality (0.036) - this node is a cross-community bridge._
- **What connects `$schema`, `collection`, `sourceRoot` to the rest of the system?**
_1278 weakly-connected nodes found - possible documentation gaps or missing edges._
- **Should `app.module.ts` be split into smaller, more focused modules?**
_Cohesion score 0.07510204081632653 - nodes in this community are weakly interconnected._
- **Should `SmsService` be split into smaller, more focused modules?**
_Cohesion score 0.060542309490416085 - nodes in this community are weakly interconnected._
_Cohesion score 0.06988120195667366 - nodes in this community are weakly interconnected._
- **Should `productService.ts` be split into smaller, more focused modules?**
_Cohesion score 0.08888888888888889 - nodes in this community are weakly interconnected._
_Cohesion score 0.07826694619147449 - nodes in this community are weakly interconnected._
- **Should `CmsController` be split into smaller, more focused modules?**
_Cohesion score 0.0899854862119013 - 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