feat(seo): implement B2B dedicated route, structured data schemas, archive optimizations, and SEO database backfill
All checks were successful
Deploy Canina / deploy (push) Successful in 1m44s
All checks were successful
Deploy Canina / deploy (push) Successful in 1m44s
This commit is contained in:
parent
fa69aa4c49
commit
70c2627d93
@ -18,7 +18,8 @@
|
||||
"test:cov": "jest --coverage",
|
||||
"test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
|
||||
"test:e2e": "jest --config ./test/jest-e2e.json",
|
||||
"docs:generate": "ts-node -r tsconfig-paths/register scripts/generate-openapi.ts"
|
||||
"docs:generate": "ts-node -r tsconfig-paths/register scripts/generate-openapi.ts",
|
||||
"seo:backfill": "ts-node -r tsconfig-paths/register scripts/seo-backfill.ts"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nestjs/common": "^11.0.1",
|
||||
|
||||
127
backend/scripts/seo-backfill.ts
Normal file
127
backend/scripts/seo-backfill.ts
Normal file
@ -0,0 +1,127 @@
|
||||
import { PrismaClient } from '@prisma/client';
|
||||
|
||||
const prisma = new PrismaClient();
|
||||
|
||||
function stripHtml(html: string): string {
|
||||
return html.replace(/<[^>]+>/g, ' ').replace(/\s+/g, ' ').trim();
|
||||
}
|
||||
|
||||
async function runSeoBackfill() {
|
||||
console.log('🚀 Starting SEO & Content Backfill Script for Canina Iran...\n');
|
||||
|
||||
// 1. Backfill Products
|
||||
const products = await prisma.product.findMany();
|
||||
console.log(`📦 Found ${products.length} products to check...`);
|
||||
|
||||
let updatedProducts = 0;
|
||||
|
||||
for (const product of products) {
|
||||
const dataToUpdate: Record<string, any> = {};
|
||||
|
||||
if (!product.metaTitle || product.metaTitle.trim() === '') {
|
||||
dataToUpdate.metaTitle = `${product.nameFa} (${product.packageSize} ${product.unit}) | کنینا ایران`;
|
||||
}
|
||||
|
||||
if (!product.metaDescription || product.metaDescription.trim() === '') {
|
||||
const baseDesc = product.shortDescription || stripHtml(product.description || '');
|
||||
const cleanDesc = baseDesc.substring(0, 150).trim();
|
||||
dataToUpdate.metaDescription = cleanDesc
|
||||
? `${cleanDesc} | خرید اینترنتی با ضمانت اصالت کنینا آلمان.`
|
||||
: `خرید آنلاین ${product.nameFa} با ضمانت ۱۰۰٪ اصالت آلمان و ارسال سریع در کنینا ایران.`;
|
||||
}
|
||||
|
||||
if (!product.featuredImageAlt || product.featuredImageAlt.trim() === '') {
|
||||
dataToUpdate.featuredImageAlt = `مکمل دارویی ${product.nameFa} Canina آلمان`;
|
||||
}
|
||||
|
||||
if (!product.keywords || product.keywords.trim() === '') {
|
||||
const tags = [
|
||||
product.nameFa,
|
||||
product.nameEn,
|
||||
`مکمل ${product.suitableFor}`,
|
||||
'کنینا آلمان',
|
||||
'Canina',
|
||||
product.categorySlug,
|
||||
].filter(Boolean);
|
||||
dataToUpdate.keywords = tags.join(', ');
|
||||
}
|
||||
|
||||
if (Object.keys(dataToUpdate).length > 0) {
|
||||
await prisma.product.update({
|
||||
where: { id: product.id },
|
||||
data: dataToUpdate,
|
||||
});
|
||||
updatedProducts++;
|
||||
}
|
||||
}
|
||||
|
||||
console.log(`✅ Products backfill complete: ${updatedProducts} products updated.\n`);
|
||||
|
||||
// 2. Backfill Blogs & Cross-Linking
|
||||
const blogs = await prisma.blog.findMany();
|
||||
console.log(`📰 Found ${blogs.length} blog posts to check...`);
|
||||
|
||||
let updatedBlogs = 0;
|
||||
|
||||
for (const blog of blogs) {
|
||||
const dataToUpdate: Record<string, any> = {};
|
||||
|
||||
if (!blog.metaTitle || blog.metaTitle.trim() === '') {
|
||||
dataToUpdate.metaTitle = `${blog.title} | مجله تخصصی کنینا`;
|
||||
}
|
||||
|
||||
if (!blog.metaDescription || blog.metaDescription.trim() === '') {
|
||||
const baseExcerpt = blog.excerpt || stripHtml(blog.content || '');
|
||||
dataToUpdate.metaDescription = baseExcerpt.substring(0, 155).trim();
|
||||
}
|
||||
|
||||
if (!blog.imageAlt || blog.imageAlt.trim() === '') {
|
||||
dataToUpdate.imageAlt = `تصویر راهنمای تخصصی ${blog.title}`;
|
||||
}
|
||||
|
||||
// Auto Cross-Linking: If relatedProductIds is empty, match top products by category or title keywords
|
||||
if (!blog.relatedProductIds || blog.relatedProductIds.length === 0) {
|
||||
const keywords = [blog.title, blog.keywords].filter(Boolean).join(' ');
|
||||
const matchingProducts = await prisma.product.findMany({
|
||||
where: {
|
||||
OR: [
|
||||
{ categorySlug: { contains: blog.categoryId || '', mode: 'insensitive' } },
|
||||
{ nameFa: { contains: blog.title.split(' ')[0] || '', mode: 'insensitive' } },
|
||||
{ description: { contains: blog.title.split(' ')[0] || '', mode: 'insensitive' } },
|
||||
],
|
||||
},
|
||||
take: 3,
|
||||
select: { id: true },
|
||||
});
|
||||
|
||||
if (matchingProducts.length > 0) {
|
||||
dataToUpdate.relatedProductIds = matchingProducts.map((p) => p.id);
|
||||
} else {
|
||||
// Fallback: pick top 2 featured products
|
||||
const topProducts = await prisma.product.findMany({ take: 2, select: { id: true } });
|
||||
dataToUpdate.relatedProductIds = topProducts.map((p) => p.id);
|
||||
}
|
||||
}
|
||||
|
||||
if (Object.keys(dataToUpdate).length > 0) {
|
||||
await prisma.blog.update({
|
||||
where: { id: blog.id },
|
||||
data: dataToUpdate,
|
||||
});
|
||||
updatedBlogs++;
|
||||
}
|
||||
}
|
||||
|
||||
console.log(`✅ Blog posts backfill complete: ${updatedBlogs} posts updated with SEO & cross-links.\n`);
|
||||
|
||||
console.log('🎉 SEO Backfill and Internal Cross-Linking finished successfully!');
|
||||
}
|
||||
|
||||
runSeoBackfill()
|
||||
.catch((e) => {
|
||||
console.error('❌ SEO Backfill failed:', e);
|
||||
process.exit(1);
|
||||
})
|
||||
.finally(async () => {
|
||||
await prisma.$disconnect();
|
||||
});
|
||||
@ -149,7 +149,10 @@ export class BlogsService {
|
||||
decodedSlug = rawSlug;
|
||||
}
|
||||
|
||||
const isUuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(decodedSlug);
|
||||
const isUuid =
|
||||
/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(
|
||||
decodedSlug,
|
||||
);
|
||||
|
||||
const blog = await this.prisma.blog.findFirst({
|
||||
where: {
|
||||
@ -181,9 +184,17 @@ export class BlogsService {
|
||||
|
||||
// Fetch related products safely
|
||||
let relatedProducts: any[] = [];
|
||||
if (blog.relatedProductIds && Array.isArray(blog.relatedProductIds) && blog.relatedProductIds.length > 0) {
|
||||
if (
|
||||
blog.relatedProductIds &&
|
||||
Array.isArray(blog.relatedProductIds) &&
|
||||
blog.relatedProductIds.length > 0
|
||||
) {
|
||||
const validProductUuids = blog.relatedProductIds.filter(
|
||||
(id) => typeof id === 'string' && /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(id)
|
||||
(id) =>
|
||||
typeof id === 'string' &&
|
||||
/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(
|
||||
id,
|
||||
),
|
||||
);
|
||||
if (validProductUuids.length > 0) {
|
||||
try {
|
||||
@ -208,9 +219,17 @@ export class BlogsService {
|
||||
|
||||
// Fetch related blogs safely
|
||||
let relatedBlogs: any[] = [];
|
||||
if (blog.relatedBlogIds && Array.isArray(blog.relatedBlogIds) && blog.relatedBlogIds.length > 0) {
|
||||
if (
|
||||
blog.relatedBlogIds &&
|
||||
Array.isArray(blog.relatedBlogIds) &&
|
||||
blog.relatedBlogIds.length > 0
|
||||
) {
|
||||
const validBlogUuids = blog.relatedBlogIds.filter(
|
||||
(id) => typeof id === 'string' && /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(id)
|
||||
(id) =>
|
||||
typeof id === 'string' &&
|
||||
/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(
|
||||
id,
|
||||
),
|
||||
);
|
||||
if (validBlogUuids.length > 0) {
|
||||
try {
|
||||
@ -257,7 +276,10 @@ export class BlogsService {
|
||||
},
|
||||
});
|
||||
} catch (err) {
|
||||
console.warn('[BlogsService] Error fetching fallback related blogs:', err);
|
||||
console.warn(
|
||||
'[BlogsService] Error fetching fallback related blogs:',
|
||||
err,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
38
frontend/application/app/b2b/page.tsx
Normal file
38
frontend/application/app/b2b/page.tsx
Normal file
@ -0,0 +1,38 @@
|
||||
import React from "react";
|
||||
import type { Metadata } from "next";
|
||||
import B2BLandingClient from "@/components/B2BLandingClient";
|
||||
import { getPageMetadata } from "@/lib/seo";
|
||||
import { generateB2BServiceSchema, generateBreadcrumbSchema } from "@/lib/schema";
|
||||
|
||||
export async function generateMetadata(): Promise<Metadata> {
|
||||
return getPageMetadata('b2b', {
|
||||
canonicalPath: '/b2b',
|
||||
fallbackTitle: 'خرید عمده مکملهای پت کنینا | نمایندگی رسمی و همکاری B2B',
|
||||
fallbackDesc: 'تأمین عمده و همکاری تجاری مکملهای دارویی کنینا آلمان برای کلینیکها، بیمارستانهای دامپزشکی و پتشاپها با گواهی اصالت و بیشترین حاشیه سود.',
|
||||
});
|
||||
}
|
||||
|
||||
export default function B2BPage() {
|
||||
const b2bServiceSchema = generateB2BServiceSchema({
|
||||
siteUrl: process.env.NEXT_PUBLIC_SITE_URL || 'https://canina.ir',
|
||||
});
|
||||
|
||||
const breadcrumbs = generateBreadcrumbSchema([
|
||||
{ name: 'صفحه اصلی', url: 'https://canina.ir' },
|
||||
{ name: 'همکاری تجاری و خرید عمده (B2B)', url: 'https://canina.ir/b2b' },
|
||||
]);
|
||||
|
||||
return (
|
||||
<>
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{ __html: JSON.stringify(b2bServiceSchema) }}
|
||||
/>
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{ __html: JSON.stringify(breadcrumbs) }}
|
||||
/>
|
||||
<B2BLandingClient />
|
||||
</>
|
||||
);
|
||||
}
|
||||
@ -10,28 +10,58 @@ export async function generateMetadata(): Promise<Metadata> {
|
||||
});
|
||||
}
|
||||
|
||||
import { generateLocalBusinessSchema, generateBreadcrumbSchema } from "@/lib/schema";
|
||||
|
||||
export default function ContactPage() {
|
||||
const localBusinessSchema = generateLocalBusinessSchema({
|
||||
name: 'کنینا ایران',
|
||||
url: 'https://canina.ir',
|
||||
telephone: '+989211231517',
|
||||
address: {
|
||||
streetAddress: 'تهران، جردن، خیابان سعیدی، ساختمان کنینا، طبقه ۵، واحد ۱۹',
|
||||
addressLocality: 'تهران',
|
||||
addressRegion: 'تهران',
|
||||
postalCode: '1967812345',
|
||||
addressCountry: 'IR',
|
||||
},
|
||||
});
|
||||
|
||||
const breadcrumbs = generateBreadcrumbSchema([
|
||||
{ name: 'صفحه اصلی', url: 'https://canina.ir' },
|
||||
{ name: 'تماس با ما', url: 'https://canina.ir/contact' },
|
||||
]);
|
||||
|
||||
return (
|
||||
<div className="bg-medical-gray-50 py-16 px-4 sm:px-6 lg:px-8 font-vazir" dir="rtl">
|
||||
<div className="max-w-6xl mx-auto space-y-16">
|
||||
|
||||
{/* Title */}
|
||||
<div className="text-center space-y-4">
|
||||
<span className="inline-flex items-center gap-2 px-4 py-2 bg-canina-blue/5 border border-canina-blue/10 rounded-full text-canina-blue text-xs font-black uppercase tracking-widest">
|
||||
پاسخگوی شما هستیم
|
||||
</span>
|
||||
<h1 className="text-4xl lg:text-5xl font-black text-medical-gray-900 leading-tight">
|
||||
تماس با <span className="text-canina-blue italic">کنینا ایران</span>
|
||||
</h1>
|
||||
<p className="text-lg text-medical-gray-500 max-w-2xl mx-auto leading-relaxed">
|
||||
جهت مشاوره تخصصی، خرید عمده و پیگیری سفارشات با ما در ارتباط باشید.
|
||||
</p>
|
||||
<>
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{ __html: JSON.stringify(localBusinessSchema) }}
|
||||
/>
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{ __html: JSON.stringify(breadcrumbs) }}
|
||||
/>
|
||||
<div className="bg-medical-gray-50 py-16 px-4 sm:px-6 lg:px-8 font-vazir" dir="rtl">
|
||||
<div className="max-w-6xl mx-auto space-y-16">
|
||||
|
||||
{/* Title */}
|
||||
<div className="text-center space-y-4">
|
||||
<span className="inline-flex items-center gap-2 px-4 py-2 bg-canina-blue/5 border border-canina-blue/10 rounded-full text-canina-blue text-xs font-black uppercase tracking-widest">
|
||||
پاسخگوی شما هستیم
|
||||
</span>
|
||||
<h1 className="text-4xl lg:text-5xl font-black text-medical-gray-900 leading-tight">
|
||||
تماس با <span className="text-canina-blue italic">کنینا ایران</span>
|
||||
</h1>
|
||||
<p className="text-lg text-medical-gray-500 max-w-2xl mx-auto leading-relaxed">
|
||||
جهت مشاوره تخصصی، خرید عمده و پیگیری سفارشات با ما در ارتباط باشید.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<ContactFormClient />
|
||||
|
||||
</div>
|
||||
|
||||
<ContactFormClient />
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@ -95,28 +95,53 @@ export async function generateMetadata(): Promise<Metadata> {
|
||||
};
|
||||
}
|
||||
|
||||
import { generateOrganizationSchema } from '../lib/schema';
|
||||
|
||||
export default function RootLayout({
|
||||
children,
|
||||
}: {
|
||||
children: React.ReactNode;
|
||||
}) {
|
||||
const jsonLd = {
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'Organization',
|
||||
const orgSchema = generateOrganizationSchema({
|
||||
name: 'کنینا ایران',
|
||||
alternateName: 'Canina Iran (Canina pharma GmbH)',
|
||||
url: 'https://canina.ir',
|
||||
logo: 'https://canina.de/media/fb/d5/47/1683116813/Logo.png',
|
||||
contactPoint: {
|
||||
'@type': 'ContactPoint',
|
||||
telephone: '+98-21-88884444',
|
||||
contactType: 'customer service',
|
||||
email: 'info@canina.ir',
|
||||
areaServed: 'IR',
|
||||
availableLanguage: 'Persian'
|
||||
}
|
||||
logo: 'https://canina.ir/assets/images/logo.png',
|
||||
description: 'فروشگاه تخصصی و نماینده انحصاری مکملهای دارویی و تقویتی سگ و گربه کنینا آلمان با فرمولاسیون دارویی و تاییدیه بالینی سازمان دامپزشکی کشور.',
|
||||
telephone: '+989211231517',
|
||||
email: 'caninairan@gmail.com',
|
||||
address: {
|
||||
streetAddress: 'تهران، جردن، خیابان سعیدی، ساختمان کنینا، طبقه ۵، واحد ۱۹',
|
||||
addressLocality: 'تهران',
|
||||
addressRegion: 'تهران',
|
||||
postalCode: '1967812345',
|
||||
addressCountry: 'IR',
|
||||
},
|
||||
sameAs: [
|
||||
'https://instagram.com/caninairan',
|
||||
'https://t.me/caninairan',
|
||||
'https://www.canina.de',
|
||||
],
|
||||
});
|
||||
|
||||
const webSiteSchema = {
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'WebSite',
|
||||
'@id': 'https://canina.ir/#website',
|
||||
url: 'https://canina.ir',
|
||||
name: 'کنینا ایران | نماینده رسمی مکملهای دارویی Canina آلمان',
|
||||
inLanguage: 'fa-IR',
|
||||
publisher: {
|
||||
'@id': 'https://canina.ir/#organization',
|
||||
},
|
||||
potentialAction: {
|
||||
'@type': 'SearchAction',
|
||||
target: 'https://canina.ir/shop?search={search_term_string}',
|
||||
'query-input': 'required name=search_term_string',
|
||||
},
|
||||
};
|
||||
|
||||
const safeJsonLd = JSON.stringify(jsonLd).replace(/</g, '\\u003c');
|
||||
const safeJsonLd = JSON.stringify([orgSchema, webSiteSchema]).replace(/</g, '\\u003c');
|
||||
|
||||
return (
|
||||
<html lang="fa" dir="rtl" className={`${vazirmatn.variable} ${lalezar.variable}`} suppressHydrationWarning>
|
||||
|
||||
@ -2,10 +2,31 @@ import type { Metadata } from "next";
|
||||
import ArchivePage from "../../components/ArchivePage";
|
||||
import { getPageMetadata } from "../../lib/seo";
|
||||
|
||||
export async function generateMetadata(): Promise<Metadata> {
|
||||
export async function generateMetadata({
|
||||
searchParams,
|
||||
}: {
|
||||
searchParams: Promise<{ [key: string]: string | string[] | undefined }>;
|
||||
}): Promise<Metadata> {
|
||||
const resolvedParams = await searchParams;
|
||||
const category = typeof resolvedParams.category === 'string' && resolvedParams.category !== 'all' ? resolvedParams.category : '';
|
||||
|
||||
// Clean canonical: ignore faceted filter noise like symptoms, sort, search, and petType in canonical tag
|
||||
const canonicalPath = category ? `/shop?category=${encodeURIComponent(category)}` : '/shop';
|
||||
|
||||
const categoryTitles: Record<string, string> = {
|
||||
'joints': 'مکملهای مفاصل و استخوان سگ و گربه | کنینا ایران',
|
||||
'immune': 'مکملهای تقویت سیستم ایمنی و گوارش پت | کنینا ایران',
|
||||
'energy': 'ویتامینها و انرژیبخشهای درمانی سگ و گربه | کنینا ایران',
|
||||
'special-care': 'محصولات مراقبت ویژه پوست، مو و دندان پت | کنینا ایران',
|
||||
};
|
||||
|
||||
const fallbackTitle = category && categoryTitles[category]
|
||||
? categoryTitles[category]
|
||||
: 'فروشگاه تخصصی مکملهای دارویی سگ و گربه';
|
||||
|
||||
return getPageMetadata('shop', {
|
||||
canonicalPath: '/shop',
|
||||
fallbackTitle: 'فروشگاه تخصصی مکملهای دارویی سگ و گربه',
|
||||
canonicalPath,
|
||||
fallbackTitle,
|
||||
fallbackDesc: 'خرید آنلاین انواع مکملهای درمانی مفاصل، پوست و مو، گوارش و ایمنی، رشد و ویتامینه سگ و گربه با ضمانت اصالت کنینا آلمان.',
|
||||
});
|
||||
}
|
||||
|
||||
@ -1,16 +1,74 @@
|
||||
import type { Metadata } from 'next';
|
||||
import VideosPage from "../../components/VideosPage";
|
||||
import { getPageMetadata } from "../../lib/seo";
|
||||
import { generateVideoObjectSchema, generateBreadcrumbSchema } from "../../lib/schema";
|
||||
|
||||
export async function generateMetadata(): Promise<Metadata> {
|
||||
return getPageMetadata('videos', {
|
||||
canonicalPath: '/videos',
|
||||
fallbackTitle: 'ویدئوهای آموزشی و توصیههای بالینی دامپزشکان',
|
||||
fallbackDesc: 'مشاهده ویدئوهای تخصصی نحوه مصرف مکملهای درمانی، نظرات دامپزشکان و راهکارهای بالینی تصویری.',
|
||||
fallbackDesc: 'مشاهده ویدئوهای تخصصی نحوه مصرف مکملهای درمانی، نظرات دامپزشکان و راهکارهای بالینی تصویری کنینا آلمان.',
|
||||
});
|
||||
}
|
||||
|
||||
export default function Videos() {
|
||||
return <VideosPage />;
|
||||
async function getInitialVideos() {
|
||||
const apiUrl = process.env.INTERNAL_API_URL || process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4001/api';
|
||||
const apiBase = apiUrl.endsWith('/api') ? apiUrl : `${apiUrl.replace(/\/$/, '')}/api`;
|
||||
try {
|
||||
const res = await fetch(`${apiBase}/videos?limit=20`, {
|
||||
next: { revalidate: 3600, tags: ['videos'] },
|
||||
});
|
||||
if (!res.ok) return [];
|
||||
const data = await res.json();
|
||||
return Array.isArray(data) ? data : Array.isArray(data.data) ? data.data : [];
|
||||
} catch (e) {
|
||||
console.error('[Videos] Error fetching server videos for schema:', e);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
export default async function Videos() {
|
||||
const videos = await getInitialVideos();
|
||||
|
||||
const videoSchemas = videos.map((v: any) =>
|
||||
generateVideoObjectSchema({
|
||||
name: v.title || 'ویدیو آموزشی کنینا',
|
||||
description: v.description || `آموزش و توصیههای تخصصی دامپزشکی درباره مصرف مکملهای درمانی کنینا توسط ${v.doctor || 'متخصصین کنینا'}.`,
|
||||
thumbnailUrl: v.coverUrl || v.thumbnail || 'https://canina.ir/assets/images/logo.png',
|
||||
uploadDate: v.createdAt || '2025-01-01T00:00:00Z',
|
||||
contentUrl: v.videoUrl || undefined,
|
||||
embedUrl: v.videoUrl || undefined,
|
||||
})
|
||||
);
|
||||
|
||||
const breadcrumbs = generateBreadcrumbSchema([
|
||||
{ name: 'صفحه اصلی', url: 'https://canina.ir' },
|
||||
{ name: 'آکادمی ویدیوها', url: 'https://canina.ir/videos' },
|
||||
]);
|
||||
|
||||
const itemListSchema = {
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'ItemList',
|
||||
itemListElement: videoSchemas.map((vSchema: any, idx: number) => ({
|
||||
'@type': 'ListItem',
|
||||
position: idx + 1,
|
||||
item: vSchema,
|
||||
})),
|
||||
};
|
||||
|
||||
return (
|
||||
<>
|
||||
{videoSchemas.length > 0 && (
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{ __html: JSON.stringify(itemListSchema) }}
|
||||
/>
|
||||
)}
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{ __html: JSON.stringify(breadcrumbs) }}
|
||||
/>
|
||||
<VideosPage />
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
@ -1,21 +1,39 @@
|
||||
import Link from 'next/link';
|
||||
import { ChevronRight } from 'lucide-react';
|
||||
import { ChevronRight, Sparkles, Package, ArrowLeft, ShieldCheck } from 'lucide-react';
|
||||
import type { Metadata } from 'next';
|
||||
import { getSeoConfig, formatPageTitle } from "../../../lib/seo";
|
||||
import { generateMedicalWebPageSchema, generateBreadcrumbSchema } from "../../../lib/schema";
|
||||
import SafeImage from "../../../components/SafeImage";
|
||||
|
||||
const API_URL = process.env.NEXT_PUBLIC_API_URL || 'https://api.canina.ir';
|
||||
const API_URL = process.env.INTERNAL_API_URL || process.env.NEXT_PUBLIC_API_URL || 'http://localhost:4001/api';
|
||||
const apiBase = API_URL.endsWith('/api') ? API_URL : `${API_URL.replace(/\/$/, '')}/api`;
|
||||
|
||||
async function getWikiTerm(key: string) {
|
||||
try {
|
||||
const res = await fetch(`${API_URL}/api/wiki/${encodeURIComponent(key)}`, { next: { revalidate: 60 } });
|
||||
if (!res.ok) throw new Error('Failed to fetch wiki term');
|
||||
return res.json();
|
||||
const res = await fetch(`${apiBase}/wiki/${encodeURIComponent(key)}`, {
|
||||
next: { revalidate: 3600, tags: ['wiki', `wiki-${key}`] }
|
||||
});
|
||||
if (!res.ok) return null;
|
||||
return await res.json();
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
console.error('[Wiki] Error fetching term:', error);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
import { getSeoConfig, formatPageTitle } from "../../../lib/seo";
|
||||
async function getRelatedProducts(termName: string) {
|
||||
try {
|
||||
const res = await fetch(`${apiBase}/products?search=${encodeURIComponent(termName)}&limit=4`, {
|
||||
next: { revalidate: 3600, tags: ['products'] },
|
||||
});
|
||||
if (!res.ok) return [];
|
||||
const json = await res.json();
|
||||
return json.data || json || [];
|
||||
} catch (error) {
|
||||
console.error('[Wiki] Error fetching related products for ingredient:', error);
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
export async function generateMetadata({ params }: { params: Promise<{ slug: string }> }): Promise<Metadata> {
|
||||
const { slug } = await params;
|
||||
@ -28,9 +46,12 @@ export async function generateMetadata({ params }: { params: Promise<{ slug: str
|
||||
};
|
||||
}
|
||||
|
||||
const rawTitle = term.metaTitle || `ترکیب علمی ${term.term}`;
|
||||
const rawTitle = term.metaTitle || `ترکیب دارویی و خواص ${term.term}`;
|
||||
const title = formatPageTitle(rawTitle, config.brandNameFa, config.titleSeparator, config.titlePosition, false);
|
||||
const description = term.metaDescription || term.definition?.replace(/<[^>]+>/g, '').substring(0, 155).trim() || config.defaultMetaDescription;
|
||||
const description =
|
||||
term.metaDescription ||
|
||||
(term.definition ? term.definition.replace(/<[^>]+>/g, '').substring(0, 155).trim() : '') ||
|
||||
`بررسی خواص بالینی، فواید و مکملهای دارویی حاوی ${term.term} در دامپزشکی کنینا آلمان.`;
|
||||
const canonicalUrl = `${config.canonicalBaseUrl.replace(/\/$/, '')}/wiki/${slug}`;
|
||||
|
||||
return {
|
||||
@ -45,7 +66,12 @@ export async function generateMetadata({ params }: { params: Promise<{ slug: str
|
||||
url: canonicalUrl,
|
||||
siteName: config.brandNameFa,
|
||||
type: "article",
|
||||
}
|
||||
},
|
||||
twitter: {
|
||||
card: "summary",
|
||||
title,
|
||||
description,
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
@ -55,7 +81,7 @@ export default async function WikiTermPage({ params }: { params: Promise<{ slug:
|
||||
|
||||
if (!term) {
|
||||
return (
|
||||
<div className="min-h-[50vh] flex flex-col items-center justify-center font-vazir text-center" dir="rtl">
|
||||
<div className="min-h-[50vh] flex flex-col items-center justify-center font-vazir text-center px-4" dir="rtl">
|
||||
<h1 className="text-3xl font-black text-medical-gray-900 mb-4">ترکیب علمی یافت نشد</h1>
|
||||
<Link href="/wiki" className="text-canina-blue font-bold flex items-center gap-2">
|
||||
<ChevronRight className="w-4 h-4" />
|
||||
@ -65,23 +91,115 @@ export default async function WikiTermPage({ params }: { params: Promise<{ slug:
|
||||
);
|
||||
}
|
||||
|
||||
const relatedProducts = await getRelatedProducts(term.term);
|
||||
|
||||
const medicalSchema = generateMedicalWebPageSchema({
|
||||
title: `ترکیب درمانی ${term.term} - دانشنامه تخصصی کنینا`,
|
||||
description: term.metaDescription || (term.definition ? term.definition.replace(/<[^>]+>/g, '').substring(0, 160) : ''),
|
||||
url: `https://canina.ir/wiki/${slug}`,
|
||||
aspects: [term.term, 'Veterinary Supplements', 'Pet Nutrition'],
|
||||
});
|
||||
|
||||
const breadcrumbs = generateBreadcrumbSchema([
|
||||
{ name: 'صفحه اصلی', url: 'https://canina.ir' },
|
||||
{ name: 'دانشنامه ترکیبات', url: 'https://canina.ir/wiki' },
|
||||
{ name: term.term, url: `https://canina.ir/wiki/${slug}` },
|
||||
]);
|
||||
|
||||
return (
|
||||
<div className="bg-white py-20 px-4 font-vazir" dir="rtl">
|
||||
<div className="max-w-4xl mx-auto">
|
||||
<Link href="/wiki" className="inline-flex items-center gap-2 text-medical-gray-400 hover:text-canina-blue transition-colors font-bold mb-8">
|
||||
<ChevronRight className="w-5 h-5" />
|
||||
بازگشت به دانشنامه
|
||||
</Link>
|
||||
<>
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{ __html: JSON.stringify(medicalSchema) }}
|
||||
/>
|
||||
<script
|
||||
type="application/ld+json"
|
||||
dangerouslySetInnerHTML={{ __html: JSON.stringify(breadcrumbs) }}
|
||||
/>
|
||||
|
||||
<h1 className="text-4xl lg:text-5xl font-black text-medical-gray-900 mb-6 leading-tight">
|
||||
{term.term}
|
||||
</h1>
|
||||
<div className="bg-medical-gray-50 min-h-screen py-12 px-4 sm:px-6 lg:px-8 font-vazir" dir="rtl">
|
||||
<div className="max-w-4xl mx-auto space-y-8">
|
||||
|
||||
{/* Breadcrumb back link */}
|
||||
<nav className="flex items-center gap-2 text-xs font-bold text-medical-gray-500">
|
||||
<Link href="/" className="hover:text-canina-blue transition-colors">صفحه اصلی</Link>
|
||||
<ChevronRight className="w-3.5 h-3.5 text-medical-gray-300" />
|
||||
<Link href="/wiki" className="hover:text-canina-blue transition-colors">دانشنامه ترکیبات</Link>
|
||||
<ChevronRight className="w-3.5 h-3.5 text-medical-gray-300" />
|
||||
<span className="text-canina-blue">{term.term}</span>
|
||||
</nav>
|
||||
|
||||
<div
|
||||
className="prose prose-lg prose-medical-gray max-w-none prose-headings:font-black prose-p:leading-relaxed prose-a:text-canina-blue"
|
||||
dangerouslySetInnerHTML={{ __html: term.definition }}
|
||||
/>
|
||||
{/* Main Article Container */}
|
||||
<article className="bg-white border border-medical-gray-200 rounded-[3rem] p-8 md:p-12 shadow-xl space-y-8">
|
||||
<div className="space-y-3 border-b border-medical-gray-100 pb-6">
|
||||
<span className="inline-flex items-center gap-1.5 px-3 py-1 bg-canina-blue/5 border border-canina-blue/10 rounded-full text-canina-blue text-xs font-black">
|
||||
<Sparkles className="w-3.5 h-3.5" />
|
||||
ماده موثره و ترکیب بالینی
|
||||
</span>
|
||||
<h1 className="text-3xl sm:text-4xl lg:text-5xl font-black text-medical-gray-900 leading-tight">
|
||||
{term.term}
|
||||
</h1>
|
||||
</div>
|
||||
|
||||
<div
|
||||
className="prose prose-lg max-w-none text-medical-gray-700 leading-relaxed prose-headings:font-black prose-headings:text-medical-gray-900 prose-p:leading-loose"
|
||||
dangerouslySetInnerHTML={{ __html: term.definition }}
|
||||
/>
|
||||
</article>
|
||||
|
||||
{/* Related Products: Bidirectional Internal Linking */}
|
||||
{relatedProducts && relatedProducts.length > 0 && (
|
||||
<section className="bg-gradient-to-br from-white to-blue-50/50 border border-medical-gray-200 rounded-[2.5rem] p-8 shadow-lg space-y-6">
|
||||
<div className="flex items-center justify-between">
|
||||
<div>
|
||||
<span className="text-xs font-black text-canina-blue uppercase tracking-wider">
|
||||
مکملهای فرموله شده با این ماده
|
||||
</span>
|
||||
<h2 className="text-xl sm:text-2xl font-black text-medical-gray-900 mt-1">
|
||||
محصولات کنینا حاوی {term.term}
|
||||
</h2>
|
||||
</div>
|
||||
<Link
|
||||
href={`/shop?search=${encodeURIComponent(term.term)}`}
|
||||
className="text-xs font-bold text-canina-blue hover:underline flex items-center gap-1"
|
||||
>
|
||||
مشاهده همه در فروشگاه
|
||||
<ArrowLeft className="w-3.5 h-3.5" />
|
||||
</Link>
|
||||
</div>
|
||||
|
||||
<div className="grid sm:grid-cols-2 gap-4">
|
||||
{relatedProducts.map((p: any) => (
|
||||
<Link
|
||||
key={p.id}
|
||||
href={`/shop/${p.slug || p.artNo}`}
|
||||
className="bg-white border border-medical-gray-200 rounded-2xl p-4 flex items-center gap-4 hover:shadow-md hover:border-canina-blue/40 transition-all group"
|
||||
>
|
||||
<div className="w-16 h-16 relative bg-medical-gray-50 rounded-xl overflow-hidden shrink-0 border border-medical-gray-100">
|
||||
<SafeImage
|
||||
src={p.imageUrl || '/assets/images/placeholder-product.png'}
|
||||
alt={p.nameFa || p.name}
|
||||
width={64}
|
||||
height={64}
|
||||
className="w-full h-full object-contain p-1 group-hover:scale-105 transition-transform"
|
||||
/>
|
||||
</div>
|
||||
<div className="flex-1 min-w-0">
|
||||
<h3 className="text-sm font-black text-medical-gray-900 group-hover:text-canina-blue transition-colors truncate">
|
||||
{p.nameFa || p.name}
|
||||
</h3>
|
||||
<p className="text-xs text-medical-gray-500 truncate mt-1">
|
||||
{p.scientificTagline || p.categorySlug || 'مکمل دارویی استاندارد آلمان'}
|
||||
</p>
|
||||
</div>
|
||||
</Link>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
)}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
@ -671,6 +671,35 @@ export default function ArchivePage({
|
||||
))}
|
||||
</AnimatePresence>
|
||||
</div>
|
||||
|
||||
{/* SEO Category Rich Description Section (Rendered below products to maintain primary UX while boosting category SEO) */}
|
||||
{selectedCategory !== "all" && (
|
||||
<div className="mt-12 bg-white border border-medical-gray-200 rounded-[2.5rem] p-8 md:p-10 shadow-sm space-y-4 font-vazir">
|
||||
<div className="flex items-center gap-2">
|
||||
<span className="w-2.5 h-2.5 rounded-full bg-canina-blue" />
|
||||
<h3 className="text-lg md:text-xl font-black text-medical-gray-900">
|
||||
راهنمای تخصصی و درمانی {CATEGORY_LABELS[selectedCategory] || selectedCategory}
|
||||
</h3>
|
||||
</div>
|
||||
<p className="text-xs md:text-sm text-medical-gray-600 leading-relaxed">
|
||||
{selectedCategory === 'joints' &&
|
||||
'مکملهای تخصصی مفاصل و استخوان کنینا آلمان (Canina Pharma) فرموله شده با عصاره خالص صدف سبز نیوزیلند (GAG)، گلوکوزامین، کندرویتین سولفات و مواد معدنی فعال جهت درمان و پیشگیری از آرتروز، دیسپلازی مفصل ران، ضعف لیگامنتها و تسریع روند بهبود شکستگیهای استخوانی در سگها و گربهها.'}
|
||||
{selectedCategory === 'immune' &&
|
||||
'مکملهای تقویت سیستم ایمنی و سلامت دستگاه گوارش کنینا شامل پروبیوتیکهای زیستسازگار، اینولین، الگلوتامین و مخمر آبجو ارگانیک با هدف تنظیم فلور روده، جلوگیری از عفونتهای مزمن، رفع اسهال و یبوست و افزایش مقاومت طبیعی بدن پت در برابر پاتوژنها.'}
|
||||
{selectedCategory === 'energy' &&
|
||||
'مولتیویتامینها و انرژیبخشهای بالینی کنینا با نسبت بالانسشده ویتامینهای A، D3، E و گروه B، به همراه اسیدهای چرب امگا ۳ و ۶ برای ارتقای شادابی، بهبود اشتهای از دست رفته، پشتیبانی از تولههای در حال رشد و حیوانات در دوران نقاهت و سالمندی.'}
|
||||
{selectedCategory === 'special-care' &&
|
||||
'محصولات درمانی و مراقبت ویژه پوست، مو، چشم و دهان و دندان کنینا بدون مواد شیمیایی آسیبرسان و با استاندارد دارویی اروپا برای پیشگیری از ایجاد پلاک دندان، درمان ریزش موی ناشی از کمبودهای تغذیهای و التهابات آلرژیک.'}
|
||||
{!['joints', 'immune', 'energy', 'special-care'].includes(selectedCategory) &&
|
||||
'تمامی مکملهای درمانی و تقویتی کنینا آلمان با ۱۰۰٪ ترکیبات ارگانیک و مطابق با بالاترین استانداردهای داروسازی اروپا (IFS & HACCP) تولید و به صورت رسمی در ایران توزیع میگردند.'}
|
||||
</p>
|
||||
<div className="pt-2 flex flex-wrap gap-2 text-[11px] font-bold text-canina-blue">
|
||||
<span className="bg-canina-blue/5 px-3 py-1 rounded-lg border border-canina-blue/10">فرمولاسیون اختصاصی Canina Pharma آلمان</span>
|
||||
<span className="bg-canina-blue/5 px-3 py-1 rounded-lg border border-canina-blue/10">مورد تایید کلینیکهای تخصصی دامپزشکی</span>
|
||||
<span className="bg-canina-blue/5 px-3 py-1 rounded-lg border border-canina-blue/10">پروانه بهداشتی واردات رسمی</span>
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
</>
|
||||
) : (
|
||||
<div key="empty" className="bg-white rounded-[3rem] p-20 text-center border-2 border-dashed border-medical-gray-200 flex flex-col items-center">
|
||||
|
||||
442
frontend/application/components/B2BLandingClient.tsx
Normal file
442
frontend/application/components/B2BLandingClient.tsx
Normal file
@ -0,0 +1,442 @@
|
||||
"use client";
|
||||
|
||||
import React, { useState } from "react";
|
||||
import {
|
||||
Building2,
|
||||
ShieldCheck,
|
||||
Truck,
|
||||
TrendingUp,
|
||||
Download,
|
||||
CheckCircle2,
|
||||
FileSpreadsheet,
|
||||
PhoneCall,
|
||||
Award,
|
||||
Send,
|
||||
HelpCircle,
|
||||
Clock,
|
||||
Sparkles,
|
||||
ChevronDown
|
||||
} from "lucide-react";
|
||||
import { toast } from "sonner";
|
||||
import api from "../lib/services/api";
|
||||
import Link from "next/link";
|
||||
import { useSettingsStore } from "../lib/store/settingsStore";
|
||||
|
||||
export default function B2BLandingClient() {
|
||||
const [submitting, setSubmitting] = useState(false);
|
||||
const [submitted, setSubmitted] = useState(false);
|
||||
const [openFaq, setOpenFaq] = useState<number | null>(null);
|
||||
|
||||
const getText = useSettingsStore((s) => s.getText);
|
||||
const phone = getText('contact_phone', '۰۹۲۱۱۲۳۱۵۱۷');
|
||||
const wholesaleDiscount = getText('B2B_DISCOUNT_PERCENT', '۳۰');
|
||||
|
||||
const [formData, setFormData] = useState({
|
||||
businessName: '',
|
||||
contactName: '',
|
||||
phone: '',
|
||||
city: '',
|
||||
businessType: 'کلینیک دامپزشکی',
|
||||
notes: '',
|
||||
});
|
||||
|
||||
const handleSubmit = async (e: React.FormEvent) => {
|
||||
e.preventDefault();
|
||||
if (!formData.businessName || !formData.phone) {
|
||||
toast.error('لطفاً نام مجموعه و شماره تماس را وارد کنید.');
|
||||
return;
|
||||
}
|
||||
|
||||
setSubmitting(true);
|
||||
try {
|
||||
await api.post('/wholesale/apply', {
|
||||
businessName: `${formData.businessName} (${formData.businessType} - ${formData.city}) - رابط: ${formData.contactName}`,
|
||||
licenseNumber: formData.phone,
|
||||
notes: formData.notes,
|
||||
});
|
||||
setSubmitted(true);
|
||||
toast.success('درخواست همکاری شما با موفقیت ثبت شد. همکاران ما حداکثر تا ۲۴ ساعت آینده با شما تماس خواهند گرفت.');
|
||||
} catch {
|
||||
toast.error('خطایی در ثبت درخواست رخ داد. لطفاً با پشتیبانی تماس بگیرید.');
|
||||
} finally {
|
||||
setSubmitting(false);
|
||||
}
|
||||
};
|
||||
|
||||
const faqs = [
|
||||
{
|
||||
q: 'حداقل مبلغ و تعداد برای سفارش عمده B2B چقدر است؟',
|
||||
a: 'برای اولین سفارش همکاران گرامی، حداقل سبد خرید با تخفیف همکار معادل ۵ میلیون تومان تعریف شده تا فرآیند ثبت نمایندگی و تست کشش بازار به آسانی انجام شود.',
|
||||
},
|
||||
{
|
||||
q: 'نحوه ارسال سفارشات عمده به شهرستانها چگونه است؟',
|
||||
a: 'کلیه سفارشات B2B از طریق باربریهای ویژه، تیپاکس اکسپرس یا پست ویژه در بستهبندیهای استاندارد دارویی مقاوم به ضربه و دما با بیمه کامل مرسوله ارسال میگردند.',
|
||||
},
|
||||
{
|
||||
q: 'آیا برای کلینیکها و داروخانهها فاکتور رسمی صادر میشود؟',
|
||||
a: 'بله، تمامی سفارشات عمده همراه با فاکتور رسمی معتبر شرکتی و گواهی اصالت و پروانه ورود سازمان دامپزشکی کل کشور صادر میگردد.',
|
||||
},
|
||||
{
|
||||
q: 'آیا امکان دریافت نمونه یا کاتالوگ چاپی برای ویزیتورها وجود دارد؟',
|
||||
a: 'بله، پس از تأیید حساب کاربری B2B، پکیج اختصاصی شامل کاتالوگ جامع پزشکی، بروشورهای تخصصی برای مراجعین و راهنمای درمانی به آدرس کلینیک ارسال میشود.',
|
||||
},
|
||||
];
|
||||
|
||||
return (
|
||||
<div className="bg-medical-gray-50 min-h-screen font-vazir" dir="rtl">
|
||||
|
||||
{/* Top Hero Banner */}
|
||||
<section className="relative overflow-hidden bg-gradient-to-br from-canina-blue via-[#0d3b66] to-medical-gray-900 text-white py-16 lg:py-24 px-4 sm:px-6 lg:px-8">
|
||||
<div className="absolute inset-0 opacity-10 bg-[radial-gradient(#ffffff_1px,transparent_1px)] [background-size:20px_20px]" />
|
||||
|
||||
<div className="max-w-6xl mx-auto relative z-10 grid lg:grid-cols-12 gap-12 items-center">
|
||||
<div className="lg:col-span-7 space-y-6 text-center lg:text-right">
|
||||
<div className="inline-flex items-center gap-2 px-4 py-2 bg-white/10 backdrop-blur-md border border-white/20 rounded-full text-blue-200 text-xs font-bold uppercase tracking-wider">
|
||||
<Building2 className="w-4 h-4 text-amber-300" />
|
||||
پرتال رسمی همکاران تجاری، کلینیکها و پتشاپها
|
||||
</div>
|
||||
|
||||
<h1 className="text-3xl sm:text-4xl lg:text-5xl font-black leading-tight">
|
||||
تأمین عمده و همکاری تجاری مکملهای <span className="text-amber-400">کنینا آلمان</span>
|
||||
</h1>
|
||||
|
||||
<p className="text-base sm:text-lg text-white/80 leading-relaxed max-w-2xl">
|
||||
دسترسی مستقیم و بدون واسطه جامعه دامپزشکی، بیمارستانها و فروشگاههای تخصصی به کاملترین سبد مکملهای درمانی Canina با بالاترین حاشیه سود و ضمانت ۱۰۰٪ اصالت.
|
||||
</p>
|
||||
|
||||
<div className="flex flex-wrap gap-4 justify-center lg:justify-start pt-2">
|
||||
<a
|
||||
href="#b2b-form"
|
||||
className="bg-amber-400 hover:bg-amber-500 text-gray-950 font-black px-8 py-4 rounded-2xl shadow-xl shadow-amber-400/20 transition-all flex items-center gap-2 transform hover:-translate-y-0.5 cursor-pointer"
|
||||
>
|
||||
<Send className="w-5 h-5" />
|
||||
درخواست همکاری و دریافت لیست قیمت
|
||||
</a>
|
||||
<Link
|
||||
href="/catalog"
|
||||
className="bg-white/10 hover:bg-white/20 backdrop-blur-md border border-white/20 text-white font-bold px-6 py-4 rounded-2xl transition-all flex items-center gap-2 cursor-pointer"
|
||||
>
|
||||
<Download className="w-5 h-5 text-blue-300" />
|
||||
مشاهده کاتالوگ دیجیتال
|
||||
</Link>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="lg:col-span-5">
|
||||
<div className="bg-white/10 backdrop-blur-xl border border-white/20 rounded-[2.5rem] p-8 text-white shadow-2xl space-y-6">
|
||||
<div className="flex items-center justify-between border-b border-white/10 pb-4">
|
||||
<span className="text-xs font-bold text-white/70">تخفیف ویژه همکاران</span>
|
||||
<span className="bg-amber-400/20 text-amber-300 border border-amber-400/30 text-xs font-black px-3 py-1 rounded-full">
|
||||
تا {wholesaleDiscount}٪ تخفیف
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<ul className="space-y-4 text-sm text-white/90">
|
||||
<li className="flex items-center gap-3">
|
||||
<CheckCircle2 className="w-5 h-5 text-emerald-400 shrink-0" />
|
||||
<span>تأمین پیوسته و بدون قطعی از انبار مرکزی تهران</span>
|
||||
</li>
|
||||
<li className="flex items-center gap-3">
|
||||
<CheckCircle2 className="w-5 h-5 text-emerald-400 shrink-0" />
|
||||
<span>پروانه بهداشتی واردات و برچسب اصالت دامپزشکی</span>
|
||||
</li>
|
||||
<li className="flex items-center gap-3">
|
||||
<CheckCircle2 className="w-5 h-5 text-emerald-400 shrink-0" />
|
||||
<span>ارسال اکسپرس رایگان برای سبدهای همکار</span>
|
||||
</li>
|
||||
<li className="flex items-center gap-3">
|
||||
<CheckCircle2 className="w-5 h-5 text-emerald-400 shrink-0" />
|
||||
<span>مشاوره علمی و وبینارهای تخصصی ارزیابی بالینی</span>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<div className="pt-2 border-t border-white/10 flex items-center justify-between text-xs text-white/60">
|
||||
<span>پشتیبانی امور همکاران:</span>
|
||||
<a href={`tel:${phone.replace(/[^0-9]/g, '')}`} className="font-bold text-white hover:text-amber-300 transition-colors dir-ltr">
|
||||
{phone}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* Value Propositions Grid */}
|
||||
<section className="py-16 px-4 sm:px-6 lg:px-8 max-w-6xl mx-auto">
|
||||
<div className="text-center space-y-3 mb-12">
|
||||
<span className="text-canina-blue font-black text-xs uppercase tracking-widest bg-canina-blue/5 px-4 py-1.5 rounded-full border border-canina-blue/10">
|
||||
مزایای عضویت در باشگاه همکاران
|
||||
</span>
|
||||
<h2 className="text-2xl sm:text-3xl font-black text-medical-gray-900">
|
||||
چرا کلینیکها و پتشاپها کنینا را انتخاب میکنند؟
|
||||
</h2>
|
||||
</div>
|
||||
|
||||
<div className="grid md:grid-cols-2 lg:grid-cols-4 gap-6">
|
||||
<div className="bg-white border border-medical-gray-200 rounded-[2rem] p-6 shadow-sm hover:shadow-xl transition-all hover:-translate-y-1">
|
||||
<div className="w-14 h-14 bg-canina-blue text-white rounded-2xl flex items-center justify-center mb-5 shadow-lg shadow-canina-blue/20">
|
||||
<ShieldCheck className="w-7 h-7" />
|
||||
</div>
|
||||
<h3 className="text-lg font-black text-medical-gray-900 mb-2">اصالت قطعی آلمان</h3>
|
||||
<p className="text-xs text-medical-gray-500 font-bold leading-relaxed">
|
||||
واردات قانونی تحت نظارت مستقیم Canina pharma GmbH همراه با گواهی سلامت و برچسب هولوگرام اصالت.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="bg-white border border-medical-gray-200 rounded-[2rem] p-6 shadow-sm hover:shadow-xl transition-all hover:-translate-y-1">
|
||||
<div className="w-14 h-14 bg-emerald-600 text-white rounded-2xl flex items-center justify-center mb-5 shadow-lg shadow-emerald-600/20">
|
||||
<TrendingUp className="w-7 h-7" />
|
||||
</div>
|
||||
<h3 className="text-lg font-black text-medical-gray-900 mb-2">حاشیه سود رقابتی</h3>
|
||||
<p className="text-xs text-medical-gray-500 font-bold leading-relaxed">
|
||||
تخفیفهای پلکانی متناسب با حجم خرید و آفرهای فصلی ویژه همکاران فعال جهت بیشینهسازی سودآوری.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="bg-white border border-medical-gray-200 rounded-[2rem] p-6 shadow-sm hover:shadow-xl transition-all hover:-translate-y-1">
|
||||
<div className="w-14 h-14 bg-amber-500 text-white rounded-2xl flex items-center justify-center mb-5 shadow-lg shadow-amber-500/20">
|
||||
<Truck className="w-7 h-7" />
|
||||
</div>
|
||||
<h3 className="text-lg font-black text-medical-gray-900 mb-2">ارسال سریع و مطمئن</h3>
|
||||
<p className="text-xs text-medical-gray-500 font-bold leading-relaxed">
|
||||
تحویل در همان روز برای تهران و ارسال اکسپرس ۴۸ ساعته به کلینیکها و داروخانههای سراسر ایران.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div className="bg-white border border-medical-gray-200 rounded-[2rem] p-6 shadow-sm hover:shadow-xl transition-all hover:-translate-y-1">
|
||||
<div className="w-14 h-14 bg-indigo-600 text-white rounded-2xl flex items-center justify-center mb-5 shadow-lg shadow-indigo-600/20">
|
||||
<Award className="w-7 h-7" />
|
||||
</div>
|
||||
<h3 className="text-lg font-black text-medical-gray-900 mb-2">پشتیبانی علمی و بالینی</h3>
|
||||
<p className="text-xs text-medical-gray-500 font-bold leading-relaxed">
|
||||
دسترسی به منابع پژوهشی، مشاوره پروتکلهای تجویزی با تیم دامپزشکی و ارائه استندهای نمایشگاهی.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* Interactive Form & Tier Preview */}
|
||||
<section id="b2b-form" className="py-16 px-4 sm:px-6 lg:px-8 max-w-6xl mx-auto">
|
||||
<div className="bg-white border border-medical-gray-200 rounded-[3rem] p-8 md:p-14 shadow-2xl grid lg:grid-cols-12 gap-12">
|
||||
|
||||
{/* Form */}
|
||||
<div className="lg:col-span-7 space-y-6">
|
||||
<div>
|
||||
<span className="text-xs font-black text-canina-blue uppercase tracking-widest">
|
||||
ثبتنام همکاران جدید
|
||||
</span>
|
||||
<h3 className="text-2xl sm:text-3xl font-black text-medical-gray-900 mt-1">
|
||||
فرم درخواست همکاری تجاری B2B
|
||||
</h3>
|
||||
<p className="text-sm text-medical-gray-500 mt-2 leading-relaxed">
|
||||
لطفاً مشخصات مجموعه خود را تکمیل نمایید تا کد اختصاصی همکار و لیست قیمت مصوب برای شما فعال گردد.
|
||||
</p>
|
||||
</div>
|
||||
|
||||
{submitted ? (
|
||||
<div className="bg-emerald-50 border border-emerald-200 rounded-3xl p-8 text-center space-y-4 animate-fade-in">
|
||||
<div className="w-16 h-16 bg-emerald-500 text-white rounded-full flex items-center justify-center mx-auto shadow-lg shadow-emerald-500/20">
|
||||
<CheckCircle2 className="w-8 h-8" />
|
||||
</div>
|
||||
<h4 className="text-xl font-black text-emerald-900">درخواست شما با موفقیت ثبت شد</h4>
|
||||
<p className="text-sm text-emerald-700 max-w-md mx-auto leading-relaxed">
|
||||
کارشناسان فروش سازمانی کنینا ایران جهت احراز هویت و ارسال لیست قیمت با شماره ثبتشده تماس خواهند گرفت.
|
||||
</p>
|
||||
</div>
|
||||
) : (
|
||||
<form onSubmit={handleSubmit} className="space-y-4">
|
||||
<div className="grid sm:grid-cols-2 gap-4">
|
||||
<div>
|
||||
<label className="block text-xs font-bold text-medical-gray-700 mb-1.5">
|
||||
نام مجموعه / داروخانه / کلینیک <span className="text-red-500">*</span>
|
||||
</label>
|
||||
<input
|
||||
type="text"
|
||||
required
|
||||
placeholder="مثلاً کلینیک تخصصی دکتر البرزی"
|
||||
value={formData.businessName}
|
||||
onChange={(e) => setFormData({ ...formData, businessName: e.target.value })}
|
||||
className="w-full bg-medical-gray-50 border border-medical-gray-200 rounded-2xl px-4 py-3 text-sm text-medical-gray-900 focus:bg-white focus:border-canina-blue focus:ring-4 focus:ring-canina-blue/10 outline-none transition-all"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label className="block text-xs font-bold text-medical-gray-700 mb-1.5">
|
||||
نوع فعالیت <span className="text-red-500">*</span>
|
||||
</label>
|
||||
<select
|
||||
value={formData.businessType}
|
||||
onChange={(e) => setFormData({ ...formData, businessType: e.target.value })}
|
||||
className="w-full bg-medical-gray-50 border border-medical-gray-200 rounded-2xl px-4 py-3 text-sm text-medical-gray-900 focus:bg-white focus:border-canina-blue focus:ring-4 focus:ring-canina-blue/10 outline-none transition-all"
|
||||
>
|
||||
<option value="کلینیک دامپزشکی">کلینیک دامپزشکی</option>
|
||||
<option value="بیمارستان دامپزشکی">بیمارستان دامپزشکی</option>
|
||||
<option value="داروخانه دامپزشکی">داروخانه دامپزشکی</option>
|
||||
<option value="پتشاپ فیزیکی و آنلاین">پتشاپ فیزیکی و آنلاین</option>
|
||||
<option value="دامپزشک مستقل / ویزیتور">دامپزشک مستقل / ویزیتور</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="grid sm:grid-cols-3 gap-4">
|
||||
<div>
|
||||
<label className="block text-xs font-bold text-medical-gray-700 mb-1.5">
|
||||
نام رابط / مسئول خرید
|
||||
</label>
|
||||
<input
|
||||
type="text"
|
||||
placeholder="نام و نام خانوادگی"
|
||||
value={formData.contactName}
|
||||
onChange={(e) => setFormData({ ...formData, contactName: e.target.value })}
|
||||
className="w-full bg-medical-gray-50 border border-medical-gray-200 rounded-2xl px-4 py-3 text-sm text-medical-gray-900 focus:bg-white focus:border-canina-blue focus:ring-4 focus:ring-canina-blue/10 outline-none transition-all"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label className="block text-xs font-bold text-medical-gray-700 mb-1.5">
|
||||
شماره تماس همراه <span className="text-red-500">*</span>
|
||||
</label>
|
||||
<input
|
||||
type="tel"
|
||||
required
|
||||
placeholder="۰۹۱۲۳۴۵۶۷۸۹"
|
||||
value={formData.phone}
|
||||
onChange={(e) => setFormData({ ...formData, phone: e.target.value })}
|
||||
className="w-full bg-medical-gray-50 border border-medical-gray-200 rounded-2xl px-4 py-3 text-sm text-medical-gray-900 focus:bg-white focus:border-canina-blue focus:ring-4 focus:ring-canina-blue/10 outline-none transition-all dir-ltr text-right"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label className="block text-xs font-bold text-medical-gray-700 mb-1.5">
|
||||
شهر / استان
|
||||
</label>
|
||||
<input
|
||||
type="text"
|
||||
placeholder="مثلاً تهران / اصفهان"
|
||||
value={formData.city}
|
||||
onChange={(e) => setFormData({ ...formData, city: e.target.value })}
|
||||
className="w-full bg-medical-gray-50 border border-medical-gray-200 rounded-2xl px-4 py-3 text-sm text-medical-gray-900 focus:bg-white focus:border-canina-blue focus:ring-4 focus:ring-canina-blue/10 outline-none transition-all"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label className="block text-xs font-bold text-medical-gray-700 mb-1.5">
|
||||
توضیحات تکمیلی یا اقلام مدنظر (اختیاری)
|
||||
</label>
|
||||
<textarea
|
||||
rows={3}
|
||||
placeholder="در صورت داشتن نیاز دارویی خاص یا حجم تخمینی سفارش، در اینجا درج فرمایید..."
|
||||
value={formData.notes}
|
||||
onChange={(e) => setFormData({ ...formData, notes: e.target.value })}
|
||||
className="w-full bg-medical-gray-50 border border-medical-gray-200 rounded-2xl px-4 py-3 text-sm text-medical-gray-900 focus:bg-white focus:border-canina-blue focus:ring-4 focus:ring-canina-blue/10 outline-none transition-all"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<button
|
||||
type="submit"
|
||||
disabled={submitting}
|
||||
className="w-full bg-canina-blue hover:bg-canina-blue/90 text-white font-black text-base py-4 rounded-2xl shadow-xl shadow-canina-blue/20 transition-all flex items-center justify-center gap-2 cursor-pointer disabled:opacity-50"
|
||||
>
|
||||
{submitting ? (
|
||||
<span>در حال ارسال اطلاعات...</span>
|
||||
) : (
|
||||
<>
|
||||
<Send className="w-5 h-5" />
|
||||
<span>ثبت درخواست و فعالسازی حساب همکار</span>
|
||||
</>
|
||||
)}
|
||||
</button>
|
||||
</form>
|
||||
)}
|
||||
</div>
|
||||
|
||||
{/* Quick FAQ / Info sidebar */}
|
||||
<div className="lg:col-span-5 space-y-6">
|
||||
<div className="bg-medical-gray-50 rounded-3xl p-6 border border-medical-gray-200 space-y-4">
|
||||
<h4 className="text-base font-black text-medical-gray-900 flex items-center gap-2">
|
||||
<Sparkles className="w-5 h-5 text-amber-500" />
|
||||
مراحل ثبتنام و دریافت کالا
|
||||
</h4>
|
||||
|
||||
<div className="space-y-4 text-xs font-bold text-medical-gray-600">
|
||||
<div className="flex items-start gap-3">
|
||||
<div className="w-6 h-6 rounded-full bg-canina-blue text-white flex items-center justify-center text-xs font-black shrink-0">۱</div>
|
||||
<div>
|
||||
<strong className="text-medical-gray-900 block mb-0.5">ثبت فرم آنلاین</strong>
|
||||
ارسال مشخصات کلینیک یا پتشاپ از طریق فرم روبهرو.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="flex items-start gap-3">
|
||||
<div className="w-6 h-6 rounded-full bg-canina-blue text-white flex items-center justify-center text-xs font-black shrink-0">۲</div>
|
||||
<div>
|
||||
<strong className="text-medical-gray-900 block mb-0.5">تماس کارشناس B2B</strong>
|
||||
تأیید تلفنی و فعالسازی دسترسی قیمت عمده در پرتال.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="flex items-start gap-3">
|
||||
<div className="w-6 h-6 rounded-full bg-canina-blue text-white flex items-center justify-center text-xs font-black shrink-0">۳</div>
|
||||
<div>
|
||||
<strong className="text-medical-gray-900 block mb-0.5">ثبت سفارش و ارسال اکسپرس</strong>
|
||||
انتخاب محصولات با فاکتور رسمی و ارسال فوری با بیمه.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="bg-gradient-to-br from-amber-500/10 to-amber-500/5 border border-amber-500/20 rounded-3xl p-6 space-y-3">
|
||||
<div className="flex items-center gap-2 text-amber-900 font-black text-sm">
|
||||
<PhoneCall className="w-5 h-5 text-amber-600" />
|
||||
مشاوره مستقیم با مدیریت فروش سازمانی
|
||||
</div>
|
||||
<p className="text-xs text-amber-800 leading-relaxed">
|
||||
همکاران و مدیران محترم مراکز درمانی میتوانند مستقیماً با دپارتمان فروش B2B تماس حاصل فرمایند.
|
||||
</p>
|
||||
<a
|
||||
href={`tel:${phone.replace(/[^0-9]/g, '')}`}
|
||||
className="inline-flex items-center gap-2 bg-amber-500 hover:bg-amber-600 text-white font-black text-xs px-5 py-2.5 rounded-xl transition-all shadow-md dir-ltr"
|
||||
>
|
||||
{phone}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{/* Accordion FAQ */}
|
||||
<section className="py-12 px-4 sm:px-6 lg:px-8 max-w-4xl mx-auto">
|
||||
<div className="text-center space-y-2 mb-8">
|
||||
<HelpCircle className="w-8 h-8 text-canina-blue mx-auto mb-2" />
|
||||
<h3 className="text-2xl font-black text-medical-gray-900">
|
||||
پرسشهای متداول همکاران و کلینیکها
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
<div className="space-y-3">
|
||||
{faqs.map((faq, idx) => (
|
||||
<div
|
||||
key={idx}
|
||||
className="bg-white border border-medical-gray-200 rounded-2xl overflow-hidden transition-all shadow-sm"
|
||||
>
|
||||
<button
|
||||
onClick={() => setOpenFaq(openFaq === idx ? null : idx)}
|
||||
className="w-full p-5 text-right flex items-center justify-between gap-4 font-bold text-sm text-medical-gray-900 hover:text-canina-blue transition-colors cursor-pointer"
|
||||
>
|
||||
<span>{faq.q}</span>
|
||||
<ChevronDown className={`w-5 h-5 text-medical-gray-400 transition-transform ${openFaq === idx ? 'rotate-180 text-canina-blue' : ''}`} />
|
||||
</button>
|
||||
{openFaq === idx && (
|
||||
<div className="px-5 pb-5 text-xs text-medical-gray-600 leading-relaxed border-t border-medical-gray-100 pt-3 animate-fade-in">
|
||||
{faq.a}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
);
|
||||
}
|
||||
@ -119,9 +119,11 @@ export default function Footer({
|
||||
</Link>
|
||||
</li>
|
||||
{isB2BEnabled && (
|
||||
<li onClick={onB2BOpen} className="hover:text-canina-blue hover:translate-x-[-4px] transition-all cursor-pointer flex items-center gap-2 group text-blue-200">
|
||||
<div className="w-1.5 h-1.5 rounded-full bg-canina-blue group-hover:w-4 transition-all" />
|
||||
{getText('footer_link_b2b', "همکاری با کلینیکها و پتشاپها (B2B)")}
|
||||
<li>
|
||||
<Link href="/b2b" className="hover:text-canina-blue hover:translate-x-[-4px] transition-all cursor-pointer flex items-center gap-2 group text-blue-200">
|
||||
<div className="w-1.5 h-1.5 rounded-full bg-canina-blue group-hover:w-4 transition-all" />
|
||||
{getText('footer_link_b2b', "همکاری با کلینیکها و پتشاپها (B2B)")}
|
||||
</Link>
|
||||
</li>
|
||||
)}
|
||||
</ul>
|
||||
|
||||
@ -519,13 +519,13 @@ export default function Header({
|
||||
نمادهای اعتماد و مجوزهای رسمی
|
||||
</Link>
|
||||
{isB2BEnabled && (
|
||||
<button
|
||||
onClick={onB2BOpen}
|
||||
<Link
|
||||
href="/b2b"
|
||||
className="w-full text-right flex items-center gap-2 px-3 py-2 hover:bg-canina-blue/5 hover:text-canina-blue rounded-lg font-bold cursor-pointer"
|
||||
>
|
||||
<Building2 className="w-4 h-4 text-canina-blue" />
|
||||
درخواست نمایندگی B2B
|
||||
</button>
|
||||
درخواست نمایندگی و خرید عمده (B2B)
|
||||
</Link>
|
||||
)}
|
||||
<Link href="/contact" className="flex items-center gap-2 px-3 py-2 hover:bg-canina-blue/5 hover:text-canina-blue rounded-lg font-bold">
|
||||
<PhoneCall className="w-4 h-4 text-canina-blue" />
|
||||
|
||||
233
frontend/application/lib/schema.ts
Normal file
233
frontend/application/lib/schema.ts
Normal file
@ -0,0 +1,233 @@
|
||||
/**
|
||||
* Structured Data (JSON-LD) Generators for Canina Iran
|
||||
* Conforming to Schema.org and Google Search Rich Results guidelines
|
||||
*/
|
||||
|
||||
export interface OrganizationSchemaOptions {
|
||||
name?: string;
|
||||
alternateName?: string;
|
||||
url?: string;
|
||||
logo?: string;
|
||||
description?: string;
|
||||
telephone?: string;
|
||||
email?: string;
|
||||
address?: {
|
||||
streetAddress?: string;
|
||||
addressLocality?: string;
|
||||
addressRegion?: string;
|
||||
postalCode?: string;
|
||||
addressCountry?: string;
|
||||
};
|
||||
sameAs?: string[];
|
||||
}
|
||||
|
||||
export function generateOrganizationSchema(options: OrganizationSchemaOptions = {}) {
|
||||
const brandName = options.name || 'کنینا ایران';
|
||||
const siteUrl = options.url || 'https://canina.ir';
|
||||
const logoUrl = options.logo || `${siteUrl}/assets/images/logo.png`;
|
||||
|
||||
return {
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'Organization',
|
||||
'@id': `${siteUrl}#organization`,
|
||||
name: brandName,
|
||||
alternateName: options.alternateName || 'Canina pharma GmbH Iran Representative',
|
||||
url: siteUrl,
|
||||
logo: {
|
||||
'@type': 'ImageObject',
|
||||
url: logoUrl,
|
||||
caption: brandName,
|
||||
},
|
||||
image: logoUrl,
|
||||
description:
|
||||
options.description ||
|
||||
'نماینده رسمی و انحصاری مکملهای دارویی و درمانی Canina pharma GmbH آلمان در ایران.',
|
||||
telephone: options.telephone || '+989211231517',
|
||||
email: options.email || 'caninairan@gmail.com',
|
||||
address: {
|
||||
'@type': 'PostalAddress',
|
||||
streetAddress: options.address?.streetAddress || 'جردن، خیابان سعیدی، ساختمان کنینا، طبقه ۵',
|
||||
addressLocality: options.address?.addressLocality || 'تهران',
|
||||
addressRegion: options.address?.addressRegion || 'تهران',
|
||||
postalCode: options.address?.postalCode || '1967812345',
|
||||
addressCountry: options.address?.addressCountry || 'IR',
|
||||
},
|
||||
sameAs: options.sameAs || [
|
||||
'https://instagram.com/caninairan',
|
||||
'https://t.me/caninairan',
|
||||
'https://www.canina.de',
|
||||
],
|
||||
contactPoint: [
|
||||
{
|
||||
'@type': 'ContactPoint',
|
||||
telephone: options.telephone || '+989211231517',
|
||||
contactType: 'customer service',
|
||||
availableLanguage: ['Persian', 'English', 'German'],
|
||||
areaServed: 'IR',
|
||||
},
|
||||
],
|
||||
};
|
||||
}
|
||||
|
||||
export function generateLocalBusinessSchema(options: OrganizationSchemaOptions = {}) {
|
||||
const siteUrl = options.url || 'https://canina.ir';
|
||||
const brandName = options.name || 'کنینا ایران';
|
||||
const logoUrl = options.logo || `${siteUrl}/assets/images/logo.png`;
|
||||
|
||||
return {
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'VeterinaryCare',
|
||||
'@id': `${siteUrl}#localbusiness`,
|
||||
name: `${brandName} - دفتر مرکزی و پشتیبانی تخصصی`,
|
||||
image: logoUrl,
|
||||
url: siteUrl,
|
||||
telephone: options.telephone || '+989211231517',
|
||||
priceRange: '$$',
|
||||
address: {
|
||||
'@type': 'PostalAddress',
|
||||
streetAddress: options.address?.streetAddress || 'تهران، جردن، خیابان سعیدی، ساختمان کنینا، طبقه ۵، واحد ۱۹',
|
||||
addressLocality: options.address?.addressLocality || 'تهران',
|
||||
addressRegion: options.address?.addressRegion || 'تهران',
|
||||
postalCode: options.address?.postalCode || '1967812345',
|
||||
addressCountry: 'IR',
|
||||
},
|
||||
geo: {
|
||||
'@type': 'GeoCoordinates',
|
||||
latitude: 35.7785,
|
||||
longitude: 51.4172,
|
||||
},
|
||||
openingHoursSpecification: [
|
||||
{
|
||||
'@type': 'OpeningHoursSpecification',
|
||||
dayOfWeek: ['Saturday', 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday'],
|
||||
opens: '09:00',
|
||||
closes: '18:00',
|
||||
},
|
||||
],
|
||||
sameAs: options.sameAs || [
|
||||
'https://instagram.com/caninairan',
|
||||
'https://t.me/caninairan',
|
||||
],
|
||||
};
|
||||
}
|
||||
|
||||
export interface B2BServiceSchemaOptions {
|
||||
serviceName?: string;
|
||||
description?: string;
|
||||
siteUrl?: string;
|
||||
}
|
||||
|
||||
export function generateB2BServiceSchema(options: B2BServiceSchemaOptions = {}) {
|
||||
const siteUrl = options.siteUrl || 'https://canina.ir';
|
||||
return {
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'Service',
|
||||
'@id': `${siteUrl}/b2b#service`,
|
||||
name: options.serviceName || 'تأمین عمده و همکاری تجاری مکملهای دارویی کنینا آلمان',
|
||||
serviceType: 'B2B Veterinary Supply & Wholesale',
|
||||
provider: {
|
||||
'@type': 'Organization',
|
||||
name: 'کنینا ایران',
|
||||
url: siteUrl,
|
||||
logo: `${siteUrl}/assets/images/logo.png`,
|
||||
},
|
||||
areaServed: {
|
||||
'@type': 'Country',
|
||||
name: 'Iran',
|
||||
},
|
||||
description:
|
||||
options.description ||
|
||||
'تأمین مستقیم، پخش عمده و اعطای نمایندگی مکملهای تخصصی دامپزشکی Canina آلمان به کلینیکها، بیمارستانهای دامپزشکی و پتشاپهای معتبر سراسر کشور.',
|
||||
offers: {
|
||||
'@type': 'Offer',
|
||||
availability: 'https://schema.org/InStock',
|
||||
businessFunction: 'http://purl.org/goodrelations/v1#ProvideService',
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
export interface MedicalWebPageSchemaOptions {
|
||||
title: string;
|
||||
description: string;
|
||||
url: string;
|
||||
datePublished?: string;
|
||||
dateModified?: string;
|
||||
medicalAudience?: string;
|
||||
aspects?: string[];
|
||||
}
|
||||
|
||||
export function generateMedicalWebPageSchema(options: MedicalWebPageSchemaOptions) {
|
||||
return {
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'MedicalWebPage',
|
||||
name: options.title,
|
||||
headline: options.title,
|
||||
description: options.description,
|
||||
url: options.url,
|
||||
datePublished: options.datePublished || '2025-01-01',
|
||||
dateModified: options.dateModified || new Date().toISOString(),
|
||||
medicalAudience: {
|
||||
'@type': 'MedicalAudience',
|
||||
audienceType: options.medicalAudience || 'Veterinarians, Pet Care Professionals, and Pet Owners',
|
||||
},
|
||||
publisher: {
|
||||
'@type': 'Organization',
|
||||
name: 'کنینا ایران',
|
||||
url: 'https://canina.ir',
|
||||
},
|
||||
about: options.aspects?.map((aspect) => ({
|
||||
'@type': 'MedicalCondition',
|
||||
name: aspect,
|
||||
})) || [],
|
||||
};
|
||||
}
|
||||
|
||||
export interface VideoObjectSchemaOptions {
|
||||
name: string;
|
||||
description: string;
|
||||
thumbnailUrl: string;
|
||||
uploadDate: string;
|
||||
contentUrl?: string;
|
||||
embedUrl?: string;
|
||||
duration?: string;
|
||||
}
|
||||
|
||||
export function generateVideoObjectSchema(options: VideoObjectSchemaOptions) {
|
||||
return {
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'VideoObject',
|
||||
name: options.name,
|
||||
description: options.description,
|
||||
thumbnailUrl: [options.thumbnailUrl],
|
||||
uploadDate: options.uploadDate,
|
||||
contentUrl: options.contentUrl,
|
||||
embedUrl: options.embedUrl || options.contentUrl,
|
||||
duration: options.duration || 'PT3M30S',
|
||||
publisher: {
|
||||
'@type': 'Organization',
|
||||
name: 'کنینا ایران',
|
||||
logo: {
|
||||
'@type': 'ImageObject',
|
||||
url: 'https://canina.ir/assets/images/logo.png',
|
||||
},
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
export interface BreadcrumbItem {
|
||||
name: string;
|
||||
url: string;
|
||||
}
|
||||
|
||||
export function generateBreadcrumbSchema(items: BreadcrumbItem[]) {
|
||||
return {
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'BreadcrumbList',
|
||||
itemListElement: items.map((item, index) => ({
|
||||
'@type': 'ListItem',
|
||||
position: index + 1,
|
||||
name: item.name,
|
||||
item: item.url,
|
||||
})),
|
||||
};
|
||||
}
|
||||
@ -7,20 +7,20 @@
|
||||
"5": "CmsController",
|
||||
"6": "tickets.controller.ts",
|
||||
"7": "pets/pets.controller.ts",
|
||||
"8": "ReportsController",
|
||||
"8": "admin.module.ts",
|
||||
"9": "devDependencies",
|
||||
"10": "ReviewsService",
|
||||
"11": "MediaSelector.tsx",
|
||||
"12": "FeaturedProducts.tsx",
|
||||
"11": "Spinner.tsx",
|
||||
"12": "PetProfile.tsx",
|
||||
"13": "app-audit-verification.e2e-spec.js",
|
||||
"14": "lib/services/api.ts",
|
||||
"15": "src/services/api.ts",
|
||||
"16": "DoctorQueryDto",
|
||||
"17": "RedisService",
|
||||
"17": "schema.ts",
|
||||
"18": "JwtAuthGuard",
|
||||
"19": "ProductsService",
|
||||
"19": "ProductsController",
|
||||
"20": "CreateVideoDto",
|
||||
"21": "Button.tsx",
|
||||
"21": "ProductPage.tsx",
|
||||
"22": "UserDashboard.tsx",
|
||||
"23": "MenuService",
|
||||
"24": "BE-001",
|
||||
@ -32,41 +32,41 @@
|
||||
"30": "DEVOPS-001",
|
||||
"31": "DOC-001",
|
||||
"32": "adminRoutes.tsx",
|
||||
"33": "wholesale.controller.ts",
|
||||
"33": "WholesaleApplyDto",
|
||||
"34": "B2BService",
|
||||
"35": "AuthController",
|
||||
"36": "FaqService",
|
||||
"37": "راهنمای تست سیستم (Software Testing)",
|
||||
"38": "Button",
|
||||
"38": "Button.tsx",
|
||||
"39": "CategoriesController",
|
||||
"40": "MediaController",
|
||||
"41": "What You Must Do When Invoked",
|
||||
"42": "SslController",
|
||||
"43": "BannersService",
|
||||
"44": "TestimonialsService",
|
||||
"44": "TestimonialsController",
|
||||
"45": "What You Must Do When Invoked",
|
||||
"46": "ApiOperation",
|
||||
"46": "api",
|
||||
"47": "IngredientsService",
|
||||
"48": "Media.tsx",
|
||||
"48": "cartStore.ts",
|
||||
"49": "devDependencies",
|
||||
"50": "devDependencies",
|
||||
"51": "BlogsController",
|
||||
"52": "PrescriptionsService",
|
||||
"53": "SmartAdvisorService",
|
||||
"52": "PrescriptionsController",
|
||||
"53": "SmartAdvisorController",
|
||||
"54": "UsersService",
|
||||
"55": "UITexts.tsx",
|
||||
"56": "Orders.tsx",
|
||||
"57": "Role & Core Objective",
|
||||
"58": "ContactService",
|
||||
"59": "compilerOptions",
|
||||
"60": "CreateUserDto",
|
||||
"61": "CreateEBankCheckoutDto",
|
||||
"62": "GetProductsDto",
|
||||
"60": "Blogs.tsx",
|
||||
"61": "payment.controller.ts",
|
||||
"62": "ProductsService",
|
||||
"63": "dependencies",
|
||||
"64": "compilerOptions",
|
||||
"65": "app.e2e-spec.js",
|
||||
"66": "AdminQueryDto",
|
||||
"67": "admin.module.ts",
|
||||
"67": "PetsController",
|
||||
"68": "20260526145407_init/migration.sql",
|
||||
"69": "Required Review Group Closures",
|
||||
"70": "compilerOptions",
|
||||
@ -75,7 +75,7 @@
|
||||
"73": "Operational Rules & Boundaries",
|
||||
"74": "WikiController",
|
||||
"75": "PetsController",
|
||||
"76": "PaymentService",
|
||||
"76": "shop/page.tsx",
|
||||
"77": "seo.module.ts",
|
||||
"78": "route.ts",
|
||||
"79": "🏢 AI Software Agency — Master Orchestration Protocol v3",
|
||||
@ -105,14 +105,14 @@
|
||||
"103": "Comprehensive Change Log",
|
||||
"104": "Coupons.tsx",
|
||||
"105": "Operational Rules & Boundaries",
|
||||
"106": "AdminLoginDto",
|
||||
"106": "Reports.tsx",
|
||||
"107": "@types/supertest",
|
||||
"108": "PrismaService",
|
||||
"109": "1. Summary of Integrity Repairs Performed",
|
||||
"110": "Operational Rules & Boundaries",
|
||||
"111": "Operational Rules & Boundaries",
|
||||
"112": "Operational Rules & Boundaries",
|
||||
"113": "reviews.service.ts",
|
||||
"113": "reviews.controller.ts",
|
||||
"114": "AppService",
|
||||
"115": "@types/react-dom",
|
||||
"116": "Vazirmatn Changelog",
|
||||
@ -121,22 +121,24 @@
|
||||
"119": "compilerOptions",
|
||||
"120": "compilerOptions",
|
||||
"121": "backend/README.md",
|
||||
"122": "auth.module.ts",
|
||||
"122": "AuthService",
|
||||
"123": "BlogsService",
|
||||
"124": "Repository Map",
|
||||
"125": "validate_integrity.js",
|
||||
"126": "admin-panel/package.json",
|
||||
"127": "Sahel-Font",
|
||||
"128": "AdminService",
|
||||
"129": "RouteErrorBoundary",
|
||||
"130": "Sahel-Font",
|
||||
"131": "Role & Core Objective",
|
||||
"132": "orchestrate.py",
|
||||
"133": "backend/package.json",
|
||||
"134": "CreateReviewDto",
|
||||
"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",
|
||||
@ -145,13 +147,17 @@
|
||||
"145": "admin.service.ts",
|
||||
"146": "System Discovery",
|
||||
"147": "RevalidationService",
|
||||
"148": "AdminController",
|
||||
"148": "wiki/[slug]/page.tsx",
|
||||
"149": "SmsSettingsPage.tsx",
|
||||
"150": "Product Requirement Document (PRD)",
|
||||
"151": "AuthService",
|
||||
"151": "auth.service.ts",
|
||||
"152": "trust-seals/page.tsx",
|
||||
"153": "exclude",
|
||||
"154": "Baseline Command Plan & Reconciled Command History",
|
||||
"155": "seo-backfill.ts",
|
||||
"156": "@nestjs/swagger",
|
||||
"157": "ErrorPages.tsx",
|
||||
"158": "class-transformer",
|
||||
"159": "with-vpn.sh",
|
||||
"160": "Architecture Specification",
|
||||
"161": "Project Health Audit Report",
|
||||
@ -169,15 +175,16 @@
|
||||
"173": "Phase 3 Audit Traceability Matrix",
|
||||
"174": "rebuild_honest_ledger.js",
|
||||
"175": "validate_evidence_grade.js",
|
||||
"176": "@types/node",
|
||||
"178": "typescript",
|
||||
"176": "helmet",
|
||||
"177": "js-yaml",
|
||||
"178": "@nestjs/core",
|
||||
"179": "PaginationDto",
|
||||
"180": "API Contract Specification",
|
||||
"181": "⚙️ Backend Technical Review (05_dev_backend)",
|
||||
"182": "🎨 Frontend & Admin Panel Technical Review (06_dev_frontend)",
|
||||
"183": "🚀 SEO & Content Strategy Review (12_seo_content)",
|
||||
"184": "MetricsController",
|
||||
"185": "WikiController",
|
||||
"185": "@nestjs/jwt",
|
||||
"186": "seed-ui-texts.ts",
|
||||
"187": "seed-wiki.ts",
|
||||
"188": "update-blog.dto.ts",
|
||||
@ -189,12 +196,14 @@
|
||||
"194": "Raw Finding Verification & Disposition Report",
|
||||
"195": "React + TypeScript + Vite",
|
||||
"196": "Select.tsx",
|
||||
"198": "users.service.ts",
|
||||
"199": "auth.service.ts",
|
||||
"197": "@nestjs/throttler",
|
||||
"198": "passport",
|
||||
"199": "auth.controller.ts",
|
||||
"200": "application/README.md",
|
||||
"201": "deploy.sh",
|
||||
"202": "🔒 Security & Performance Review (09_devops_security)",
|
||||
"203": "👁️ UX & Persona Interface Review (08_visual_qa)",
|
||||
"204": "reflect-metadata",
|
||||
"205": "prisma/scientificTerms.ts",
|
||||
"206": "seed-blogs.ts",
|
||||
"207": "seed-custom.ts",
|
||||
@ -213,6 +222,7 @@
|
||||
"220": "Input.tsx",
|
||||
"221": "Textarea.tsx",
|
||||
"222": "admin-panel/tsconfig.json",
|
||||
"223": "swagger-ui-express",
|
||||
"224": "jest",
|
||||
"225": "next.config.ts",
|
||||
"226": "Shabnam Font README",
|
||||
@ -220,9 +230,16 @@
|
||||
"228": "rules/graphify.md",
|
||||
"229": ".agents/workflows/graphify.md",
|
||||
"230": "instructions.md",
|
||||
"231": "@eslint/eslintrc",
|
||||
"232": "@eslint/js",
|
||||
"233": "eslint-plugin-prettier",
|
||||
"234": "20260526160916_add_ui_texts_and_scientific_terms/migration.sql",
|
||||
"237": "ts-jest",
|
||||
"239": "RegisterDto",
|
||||
"235": "@nestjs/cli",
|
||||
"236": "@nestjs/testing",
|
||||
"237": "eslint",
|
||||
"238": "prisma",
|
||||
"239": "source-map-support",
|
||||
"240": "supertest",
|
||||
"241": "blog.entity.ts",
|
||||
"242": "home.entity.ts",
|
||||
"243": "wiki.entity.ts",
|
||||
@ -246,8 +263,11 @@
|
||||
"261": "User Login API",
|
||||
"262": "User Logout API",
|
||||
"263": "generate-openapi.d.ts",
|
||||
"264": "InitiatePaymentDto",
|
||||
"264": "ts-loader",
|
||||
"265": "@testing-library/jest-dom",
|
||||
"266": "ts-node",
|
||||
"267": "tsconfig-paths",
|
||||
"268": "@types/bcrypt",
|
||||
"269": "eslint-plugin-react-hooks",
|
||||
"270": "app-audit-verification.e2e-spec.d.ts",
|
||||
"271": "app.e2e-spec.d.ts",
|
||||
@ -280,13 +300,20 @@
|
||||
"298": ".initiateOrderPayment",
|
||||
"299": "@tailwindcss/postcss",
|
||||
"300": "typescript",
|
||||
"301": "@types/compression",
|
||||
"302": "typescript-eslint",
|
||||
"303": "@types/express",
|
||||
"304": "@types/jest",
|
||||
"305": "@types/react",
|
||||
"306": "globals",
|
||||
"307": "@types/js-yaml",
|
||||
"308": "vitest",
|
||||
"309": "axios",
|
||||
"310": "tailwindcss",
|
||||
"313": "Modal.tsx",
|
||||
"311": "@types/multer",
|
||||
"312": "@types/passport-jwt",
|
||||
"313": "MenuManager.tsx",
|
||||
"314": "typescript-eslint",
|
||||
"315": "typescript",
|
||||
"317": "revalidate/route.ts",
|
||||
"318": "MaskableField.tsx"
|
||||
|
||||
File diff suppressed because one or more lines are too long
@ -7,20 +7,20 @@
|
||||
"5": "CmsController",
|
||||
"6": "tickets.controller.ts",
|
||||
"7": "pets/pets.controller.ts",
|
||||
"8": "ReportsController",
|
||||
"8": "admin.module.ts",
|
||||
"9": "devDependencies",
|
||||
"10": "ReviewsController",
|
||||
"10": "ReviewsService",
|
||||
"11": "Spinner.tsx",
|
||||
"12": "PetProfile.tsx",
|
||||
"13": "app-audit-verification.e2e-spec.js",
|
||||
"14": "lib/services/api.ts",
|
||||
"15": "src/services/api.ts",
|
||||
"16": "DoctorQueryDto",
|
||||
"17": "admin.service.ts",
|
||||
"17": "schema.ts",
|
||||
"18": "JwtAuthGuard",
|
||||
"19": "ProductsService",
|
||||
"19": "ProductsController",
|
||||
"20": "CreateVideoDto",
|
||||
"21": "eslint-config-next",
|
||||
"21": "ProductPage.tsx",
|
||||
"22": "UserDashboard.tsx",
|
||||
"23": "MenuService",
|
||||
"24": "BE-001",
|
||||
@ -43,30 +43,30 @@
|
||||
"41": "What You Must Do When Invoked",
|
||||
"42": "SslController",
|
||||
"43": "BannersService",
|
||||
"44": "TestimonialsService",
|
||||
"44": "TestimonialsController",
|
||||
"45": "What You Must Do When Invoked",
|
||||
"46": "ApiOperation",
|
||||
"46": "api",
|
||||
"47": "IngredientsService",
|
||||
"48": "Reports.tsx",
|
||||
"48": "cartStore.ts",
|
||||
"49": "devDependencies",
|
||||
"50": "devDependencies",
|
||||
"51": "BlogsController",
|
||||
"52": "PrescriptionsService",
|
||||
"53": "SmartAdvisorService",
|
||||
"52": "PrescriptionsController",
|
||||
"53": "SmartAdvisorController",
|
||||
"54": "UsersService",
|
||||
"55": "UITexts.tsx",
|
||||
"56": "Orders.tsx",
|
||||
"57": "Role & Core Objective",
|
||||
"58": "ContactService",
|
||||
"59": "compilerOptions",
|
||||
"60": "admin.controller.ts",
|
||||
"61": "CreateEBankCheckoutDto",
|
||||
"62": "api",
|
||||
"60": "Blogs.tsx",
|
||||
"61": "payment.controller.ts",
|
||||
"62": "ProductsService",
|
||||
"63": "dependencies",
|
||||
"64": "compilerOptions",
|
||||
"65": "AdminTransactionFilterDto",
|
||||
"65": "app.e2e-spec.js",
|
||||
"66": "AdminQueryDto",
|
||||
"67": "PaginationDto",
|
||||
"67": "PetsController",
|
||||
"68": "20260526145407_init/migration.sql",
|
||||
"69": "Required Review Group Closures",
|
||||
"70": "compilerOptions",
|
||||
@ -84,7 +84,7 @@
|
||||
"82": "scripts",
|
||||
"83": "dependencies",
|
||||
"84": "Role & Core Objective",
|
||||
"85": "PetsController",
|
||||
"85": "eslint-config-prettier",
|
||||
"86": "zibal.service.ts",
|
||||
"87": "dependencies",
|
||||
"88": "useSettingsStore",
|
||||
@ -92,11 +92,11 @@
|
||||
"90": "HomeClient.tsx",
|
||||
"91": "Reconciled Audit Roles & Assignments",
|
||||
"92": "OrdersService",
|
||||
"93": "ProductPage.tsx",
|
||||
"93": "@nestjs/schematics",
|
||||
"94": "Phase 3.1 — Human Review Preparation and Master Backlog Critique",
|
||||
"95": "blog/[slug]/page.tsx",
|
||||
"96": "compilerOptions",
|
||||
"97": "prisma",
|
||||
"97": "prettier",
|
||||
"98": "scripts",
|
||||
"99": "BlogsController",
|
||||
"100": "Deep Audit Summary Report",
|
||||
@ -105,8 +105,8 @@
|
||||
"103": "Comprehensive Change Log",
|
||||
"104": "Coupons.tsx",
|
||||
"105": "Operational Rules & Boundaries",
|
||||
"106": "auth.controller.ts",
|
||||
"107": "shop/page.tsx",
|
||||
"106": "Reports.tsx",
|
||||
"107": "@types/supertest",
|
||||
"108": "PrismaService",
|
||||
"109": "1. Summary of Integrity Repairs Performed",
|
||||
"110": "Operational Rules & Boundaries",
|
||||
@ -114,50 +114,50 @@
|
||||
"112": "Operational Rules & Boundaries",
|
||||
"113": "reviews.controller.ts",
|
||||
"114": "AppService",
|
||||
"115": "seo.ts",
|
||||
"115": "@types/react-dom",
|
||||
"116": "Vazirmatn Changelog",
|
||||
"117": "Vazirmatn Font فونت وزیرمتن",
|
||||
"118": "Operational Rules & Boundaries",
|
||||
"119": "compilerOptions",
|
||||
"120": "compilerOptions",
|
||||
"121": "backend/README.md",
|
||||
"122": "auth.module.ts",
|
||||
"122": "AuthService",
|
||||
"123": "BlogsService",
|
||||
"124": "Repository Map",
|
||||
"125": "validate_integrity.js",
|
||||
"126": "admin-panel/package.json",
|
||||
"127": "Sahel-Font",
|
||||
"128": "AdminController",
|
||||
"129": "videos.controller.ts",
|
||||
"128": "AdminService",
|
||||
"129": "RouteErrorBoundary",
|
||||
"130": "Sahel-Font",
|
||||
"131": "Role & Core Objective",
|
||||
"132": "orchestrate.py",
|
||||
"133": "backend/package.json",
|
||||
"134": "CreateReviewDto",
|
||||
"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": "RouteErrorBoundary",
|
||||
"139": "layout.tsx",
|
||||
"140": "ErrorBoundary",
|
||||
"141": "application/package.json",
|
||||
"142": "start-dev.js",
|
||||
"143": "generate-openapi.js",
|
||||
"144": "@testing-library/react",
|
||||
"145": "ProductDto",
|
||||
"145": "admin.service.ts",
|
||||
"146": "System Discovery",
|
||||
"147": "ReviewsService",
|
||||
"148": "Body",
|
||||
"147": "RevalidationService",
|
||||
"148": "wiki/[slug]/page.tsx",
|
||||
"149": "SmsSettingsPage.tsx",
|
||||
"150": "Product Requirement Document (PRD)",
|
||||
"151": "AuthService",
|
||||
"152": "@nestjs/cli",
|
||||
"151": "auth.service.ts",
|
||||
"152": "trust-seals/page.tsx",
|
||||
"153": "exclude",
|
||||
"154": "Baseline Command Plan & Reconciled Command History",
|
||||
"155": "Blogs.tsx",
|
||||
"156": "contact/page.tsx",
|
||||
"155": "seo-backfill.ts",
|
||||
"156": "bcrypt",
|
||||
"157": "ErrorPages.tsx",
|
||||
"158": "@types/bcryptjs",
|
||||
"158": "class-transformer",
|
||||
"159": "with-vpn.sh",
|
||||
"160": "Architecture Specification",
|
||||
"161": "Project Health Audit Report",
|
||||
@ -175,16 +175,16 @@
|
||||
"173": "Phase 3 Audit Traceability Matrix",
|
||||
"174": "rebuild_honest_ledger.js",
|
||||
"175": "validate_evidence_grade.js",
|
||||
"176": "@types/node",
|
||||
"177": "blog/page.tsx",
|
||||
"178": "typescript",
|
||||
"179": "BlogsService",
|
||||
"176": "helmet",
|
||||
"177": "js-yaml",
|
||||
"178": "@nestjs/core",
|
||||
"179": "PaginationDto",
|
||||
"180": "API Contract Specification",
|
||||
"181": "⚙️ Backend Technical Review (05_dev_backend)",
|
||||
"182": "🎨 Frontend & Admin Panel Technical Review (06_dev_frontend)",
|
||||
"183": "🚀 SEO & Content Strategy Review (12_seo_content)",
|
||||
"184": "MetricsController",
|
||||
"185": "WikiController",
|
||||
"185": "@nestjs/jwt",
|
||||
"186": "seed-ui-texts.ts",
|
||||
"187": "seed-wiki.ts",
|
||||
"188": "update-blog.dto.ts",
|
||||
@ -196,14 +196,14 @@
|
||||
"194": "Raw Finding Verification & Disposition Report",
|
||||
"195": "React + TypeScript + Vite",
|
||||
"196": "Select.tsx",
|
||||
"197": "AuthService",
|
||||
"198": "users.service.ts",
|
||||
"199": "auth.service.ts",
|
||||
"197": "@nestjs/throttler",
|
||||
"198": "passport",
|
||||
"199": "auth.controller.ts",
|
||||
"200": "application/README.md",
|
||||
"201": "deploy.sh",
|
||||
"202": "🔒 Security & Performance Review (09_devops_security)",
|
||||
"203": "👁️ UX & Persona Interface Review (08_visual_qa)",
|
||||
"204": "supertest",
|
||||
"204": "reflect-metadata",
|
||||
"205": "prisma/scientificTerms.ts",
|
||||
"206": "seed-blogs.ts",
|
||||
"207": "seed-custom.ts",
|
||||
@ -222,7 +222,7 @@
|
||||
"220": "Input.tsx",
|
||||
"221": "Textarea.tsx",
|
||||
"222": "admin-panel/tsconfig.json",
|
||||
"223": "@eslint/js",
|
||||
"223": "swagger-ui-express",
|
||||
"224": "jest",
|
||||
"225": "next.config.ts",
|
||||
"226": "Shabnam Font README",
|
||||
@ -230,16 +230,16 @@
|
||||
"228": "rules/graphify.md",
|
||||
"229": ".agents/workflows/graphify.md",
|
||||
"230": "instructions.md",
|
||||
"231": "catalog/page.tsx",
|
||||
"232": "ts-loader",
|
||||
"233": "ts-node",
|
||||
"231": "@eslint/eslintrc",
|
||||
"232": "@eslint/js",
|
||||
"233": "eslint-plugin-prettier",
|
||||
"234": "20260526160916_add_ui_texts_and_scientific_terms/migration.sql",
|
||||
"235": "source-map-support",
|
||||
"236": "@types/bcrypt",
|
||||
"235": "@nestjs/cli",
|
||||
"236": "@nestjs/testing",
|
||||
"237": "ts-jest",
|
||||
"238": "tsconfig-paths",
|
||||
"239": "RegisterDto",
|
||||
"240": "eslint",
|
||||
"238": "prisma",
|
||||
"239": "source-map-support",
|
||||
"240": "supertest",
|
||||
"241": "blog.entity.ts",
|
||||
"242": "home.entity.ts",
|
||||
"243": "wiki.entity.ts",
|
||||
@ -263,10 +263,11 @@
|
||||
"261": "User Login API",
|
||||
"262": "User Logout API",
|
||||
"263": "generate-openapi.d.ts",
|
||||
"264": "InitiatePaymentDto",
|
||||
"264": "ts-loader",
|
||||
"265": "@testing-library/jest-dom",
|
||||
"267": "@types/js-yaml",
|
||||
"268": "@types/multer",
|
||||
"266": "ts-node",
|
||||
"267": "tsconfig-paths",
|
||||
"268": "@types/bcrypt",
|
||||
"269": "eslint-plugin-react-hooks",
|
||||
"270": "app-audit-verification.e2e-spec.d.ts",
|
||||
"271": "app.e2e-spec.d.ts",
|
||||
@ -296,21 +297,24 @@
|
||||
"295": "eslint-plugin-react-refresh",
|
||||
"296": "tailwindcss",
|
||||
"297": "ZibalEBankService",
|
||||
"298": "ZibalCallbackQueryDto",
|
||||
"298": ".initiateOrderPayment",
|
||||
"299": "@tailwindcss/postcss",
|
||||
"300": "typescript",
|
||||
"301": "@types/compression",
|
||||
"302": "typescript-eslint",
|
||||
"303": "@types/express",
|
||||
"304": "@types/jest",
|
||||
"305": "@types/react",
|
||||
"306": "globals",
|
||||
"307": "@types/js-yaml",
|
||||
"308": "vitest",
|
||||
"309": "axios",
|
||||
"310": "tailwindcss",
|
||||
"311": "track/page.tsx",
|
||||
"311": "@types/multer",
|
||||
"312": "@types/passport-jwt",
|
||||
"313": "MenuManager.tsx",
|
||||
"314": "layout.tsx",
|
||||
"314": "typescript-eslint",
|
||||
"315": "typescript",
|
||||
"317": "revalidate/route.ts",
|
||||
"318": "MaskableField.tsx",
|
||||
"319": "AdminService",
|
||||
"330": "@types/passport-jwt"
|
||||
"318": "MaskableField.tsx"
|
||||
}
|
||||
|
||||
@ -1,16 +1,16 @@
|
||||
# Graph Report - canina (2026-08-25)
|
||||
|
||||
## Corpus Check
|
||||
- 552 files · ~1,314,196 words
|
||||
- 557 files · ~1,318,554 words
|
||||
- Verdict: corpus is large enough that graph structure adds value.
|
||||
|
||||
## Summary
|
||||
- 4007 nodes · 7228 edges · 314 communities (207 shown, 107 thin omitted)
|
||||
- 4034 nodes · 7290 edges · 318 communities (200 shown, 118 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: `de038dba`
|
||||
- Built from commit: `fa69aa4c`
|
||||
- Run `git rev-parse HEAD` and compare to check if the graph is stale.
|
||||
- Run `graphify update .` after code changes (no API cost).
|
||||
|
||||
@ -23,20 +23,20 @@
|
||||
- CmsController
|
||||
- tickets.controller.ts
|
||||
- pets/pets.controller.ts
|
||||
- ReportsController
|
||||
- admin.module.ts
|
||||
- devDependencies
|
||||
- ReviewsController
|
||||
- ReviewsService
|
||||
- Spinner.tsx
|
||||
- PetProfile.tsx
|
||||
- app-audit-verification.e2e-spec.js
|
||||
- lib/services/api.ts
|
||||
- src/services/api.ts
|
||||
- DoctorQueryDto
|
||||
- admin.service.ts
|
||||
- schema.ts
|
||||
- JwtAuthGuard
|
||||
- ProductsService
|
||||
- ProductsController
|
||||
- CreateVideoDto
|
||||
- eslint-config-next
|
||||
- ProductPage.tsx
|
||||
- UserDashboard.tsx
|
||||
- MenuService
|
||||
- BE-001
|
||||
@ -59,30 +59,30 @@
|
||||
- What You Must Do When Invoked
|
||||
- SslController
|
||||
- BannersService
|
||||
- TestimonialsService
|
||||
- TestimonialsController
|
||||
- What You Must Do When Invoked
|
||||
- ApiOperation
|
||||
- api
|
||||
- IngredientsService
|
||||
- Reports.tsx
|
||||
- cartStore.ts
|
||||
- devDependencies
|
||||
- devDependencies
|
||||
- BlogsController
|
||||
- PrescriptionsService
|
||||
- SmartAdvisorService
|
||||
- PrescriptionsController
|
||||
- SmartAdvisorController
|
||||
- UsersService
|
||||
- UITexts.tsx
|
||||
- Orders.tsx
|
||||
- Role & Core Objective
|
||||
- ContactService
|
||||
- compilerOptions
|
||||
- admin.controller.ts
|
||||
- CreateEBankCheckoutDto
|
||||
- api
|
||||
- Blogs.tsx
|
||||
- payment.controller.ts
|
||||
- ProductsService
|
||||
- dependencies
|
||||
- compilerOptions
|
||||
- AdminTransactionFilterDto
|
||||
- app.e2e-spec.js
|
||||
- AdminQueryDto
|
||||
- PaginationDto
|
||||
- PetsController
|
||||
- 20260526145407_init/migration.sql
|
||||
- Required Review Group Closures
|
||||
- compilerOptions
|
||||
@ -100,7 +100,7 @@
|
||||
- scripts
|
||||
- dependencies
|
||||
- Role & Core Objective
|
||||
- PetsController
|
||||
- eslint-config-prettier
|
||||
- zibal.service.ts
|
||||
- dependencies
|
||||
- useSettingsStore
|
||||
@ -108,11 +108,11 @@
|
||||
- HomeClient.tsx
|
||||
- Reconciled Audit Roles & Assignments
|
||||
- OrdersService
|
||||
- ProductPage.tsx
|
||||
- @nestjs/schematics
|
||||
- Phase 3.1 — Human Review Preparation and Master Backlog Critique
|
||||
- blog/[slug]/page.tsx
|
||||
- compilerOptions
|
||||
- prisma
|
||||
- prettier
|
||||
- scripts
|
||||
- BlogsController
|
||||
- Deep Audit Summary Report
|
||||
@ -121,8 +121,8 @@
|
||||
- Comprehensive Change Log
|
||||
- Coupons.tsx
|
||||
- Operational Rules & Boundaries
|
||||
- auth.controller.ts
|
||||
- shop/page.tsx
|
||||
- Reports.tsx
|
||||
- @types/supertest
|
||||
- PrismaService
|
||||
- 1. Summary of Integrity Repairs Performed
|
||||
- Operational Rules & Boundaries
|
||||
@ -130,50 +130,50 @@
|
||||
- Operational Rules & Boundaries
|
||||
- reviews.controller.ts
|
||||
- AppService
|
||||
- seo.ts
|
||||
- @types/react-dom
|
||||
- Vazirmatn Changelog
|
||||
- Vazirmatn Font فونت وزیرمتن
|
||||
- Operational Rules & Boundaries
|
||||
- compilerOptions
|
||||
- compilerOptions
|
||||
- backend/README.md
|
||||
- auth.module.ts
|
||||
- AuthService
|
||||
- BlogsService
|
||||
- Repository Map
|
||||
- validate_integrity.js
|
||||
- admin-panel/package.json
|
||||
- Sahel-Font
|
||||
- AdminController
|
||||
- videos.controller.ts
|
||||
- AdminService
|
||||
- RouteErrorBoundary
|
||||
- Sahel-Font
|
||||
- Role & Core Objective
|
||||
- orchestrate.py
|
||||
- backend/package.json
|
||||
- CreateReviewDto
|
||||
- blog/page.tsx
|
||||
- graphify reference: extra exports and benchmark
|
||||
- Phase 2 Final Quality Gate Summary Report
|
||||
- Task Modifications Log
|
||||
- Install
|
||||
- RouteErrorBoundary
|
||||
- layout.tsx
|
||||
- ErrorBoundary
|
||||
- application/package.json
|
||||
- start-dev.js
|
||||
- generate-openapi.js
|
||||
- @testing-library/react
|
||||
- ProductDto
|
||||
- admin.service.ts
|
||||
- System Discovery
|
||||
- ReviewsService
|
||||
- Body
|
||||
- RevalidationService
|
||||
- wiki/[slug]/page.tsx
|
||||
- SmsSettingsPage.tsx
|
||||
- Product Requirement Document (PRD)
|
||||
- AuthService
|
||||
- @nestjs/cli
|
||||
- auth.service.ts
|
||||
- trust-seals/page.tsx
|
||||
- exclude
|
||||
- Baseline Command Plan & Reconciled Command History
|
||||
- Blogs.tsx
|
||||
- contact/page.tsx
|
||||
- seo-backfill.ts
|
||||
- bcrypt
|
||||
- ErrorPages.tsx
|
||||
- @types/bcryptjs
|
||||
- class-transformer
|
||||
- with-vpn.sh
|
||||
- Architecture Specification
|
||||
- Project Health Audit Report
|
||||
@ -191,16 +191,16 @@
|
||||
- Phase 3 Audit Traceability Matrix
|
||||
- rebuild_honest_ledger.js
|
||||
- validate_evidence_grade.js
|
||||
- @types/node
|
||||
- blog/page.tsx
|
||||
- typescript
|
||||
- BlogsService
|
||||
- helmet
|
||||
- js-yaml
|
||||
- @nestjs/core
|
||||
- PaginationDto
|
||||
- API Contract Specification
|
||||
- ⚙️ Backend Technical Review (05_dev_backend)
|
||||
- 🎨 Frontend & Admin Panel Technical Review (06_dev_frontend)
|
||||
- 🚀 SEO & Content Strategy Review (12_seo_content)
|
||||
- MetricsController
|
||||
- WikiController
|
||||
- @nestjs/jwt
|
||||
- seed-ui-texts.ts
|
||||
- seed-wiki.ts
|
||||
- update-blog.dto.ts
|
||||
@ -212,14 +212,14 @@
|
||||
- Raw Finding Verification & Disposition Report
|
||||
- React + TypeScript + Vite
|
||||
- Select.tsx
|
||||
- AuthService
|
||||
- users.service.ts
|
||||
- auth.service.ts
|
||||
- @nestjs/throttler
|
||||
- passport
|
||||
- auth.controller.ts
|
||||
- application/README.md
|
||||
- deploy.sh
|
||||
- 🔒 Security & Performance Review (09_devops_security)
|
||||
- 👁️ UX & Persona Interface Review (08_visual_qa)
|
||||
- supertest
|
||||
- reflect-metadata
|
||||
- prisma/scientificTerms.ts
|
||||
- seed-blogs.ts
|
||||
- seed-custom.ts
|
||||
@ -238,7 +238,7 @@
|
||||
- Input.tsx
|
||||
- Textarea.tsx
|
||||
- admin-panel/tsconfig.json
|
||||
- @eslint/js
|
||||
- swagger-ui-express
|
||||
- jest
|
||||
- next.config.ts
|
||||
- Shabnam Font README
|
||||
@ -246,16 +246,16 @@
|
||||
- rules/graphify.md
|
||||
- .agents/workflows/graphify.md
|
||||
- instructions.md
|
||||
- catalog/page.tsx
|
||||
- ts-loader
|
||||
- ts-node
|
||||
- @eslint/eslintrc
|
||||
- @eslint/js
|
||||
- eslint-plugin-prettier
|
||||
- 20260526160916_add_ui_texts_and_scientific_terms/migration.sql
|
||||
- source-map-support
|
||||
- @types/bcrypt
|
||||
- @nestjs/cli
|
||||
- @nestjs/testing
|
||||
- ts-jest
|
||||
- tsconfig-paths
|
||||
- RegisterDto
|
||||
- eslint
|
||||
- prisma
|
||||
- source-map-support
|
||||
- supertest
|
||||
- blog.entity.ts
|
||||
- home.entity.ts
|
||||
- wiki.entity.ts
|
||||
@ -275,10 +275,11 @@
|
||||
- start.sh
|
||||
- User Login API
|
||||
- User Logout API
|
||||
- InitiatePaymentDto
|
||||
- ts-loader
|
||||
- @testing-library/jest-dom
|
||||
- @types/js-yaml
|
||||
- @types/multer
|
||||
- ts-node
|
||||
- tsconfig-paths
|
||||
- @types/bcrypt
|
||||
- eslint-plugin-react-hooks
|
||||
- Canina Pharma GmbH
|
||||
- Pets Table
|
||||
@ -297,26 +298,29 @@
|
||||
- eslint-plugin-react-refresh
|
||||
- tailwindcss
|
||||
- ZibalEBankService
|
||||
- ZibalCallbackQueryDto
|
||||
- .initiateOrderPayment
|
||||
- @tailwindcss/postcss
|
||||
- typescript
|
||||
- @types/compression
|
||||
- typescript-eslint
|
||||
- @types/express
|
||||
- @types/jest
|
||||
- @types/react
|
||||
- globals
|
||||
- @types/js-yaml
|
||||
- vitest
|
||||
- track/page.tsx
|
||||
- @types/multer
|
||||
- @types/passport-jwt
|
||||
- MenuManager.tsx
|
||||
- layout.tsx
|
||||
- typescript-eslint
|
||||
- typescript
|
||||
- revalidate/route.ts
|
||||
- MaskableField.tsx
|
||||
- AdminService
|
||||
- @types/passport-jwt
|
||||
|
||||
## God Nodes (most connected - your core abstractions)
|
||||
1. `Roles()` - 106 edges
|
||||
2. `PrismaService` - 87 edges
|
||||
3. `useSettingsStore` - 53 edges
|
||||
3. `useSettingsStore` - 55 edges
|
||||
4. `api` - 44 edges
|
||||
5. `SmsService` - 42 edges
|
||||
6. `PaginationDto` - 41 edges
|
||||
@ -342,27 +346,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 (314 total, 107 thin omitted)
|
||||
## Communities (318 total, 118 thin omitted)
|
||||
|
||||
### Community 0 - "Roles"
|
||||
Cohesion: 0.18
|
||||
Nodes (19): Roles(), PaymentController, ApiBadRequestResponse, ApiBearerAuth, ApiOkResponse, ApiOperation, ApiTags, Body (+11 more)
|
||||
Cohesion: 0.24
|
||||
Nodes (13): Roles(), PaymentController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Get (+5 more)
|
||||
|
||||
### Community 1 - "app.module.ts"
|
||||
Cohesion: 0.06
|
||||
Nodes (34): AdminModule, Module, CmsModule, Module, SmsModule, Global, Module, ContactModule (+26 more)
|
||||
Cohesion: 0.07
|
||||
Nodes (34): BannersModule, Module, CmsModule, Module, SmsModule, Global, Module, ContactModule (+26 more)
|
||||
|
||||
### Community 2 - "SmsService"
|
||||
Cohesion: 0.06
|
||||
Nodes (26): SmsService, Injectable, SmsLogQueryDto, ApiPropertyOptional, IsIn, IsNumber, IsOptional, IsString (+18 more)
|
||||
Nodes (27): SmsLogQuery, SmsService, Injectable, SmsLogQueryDto, ApiPropertyOptional, IsIn, IsNumber, IsOptional (+19 more)
|
||||
|
||||
### Community 3 - "ProductService"
|
||||
Cohesion: 0.06
|
||||
Nodes (37): dynamic, revalidate, DEFAULT_CATEGORIES, dynamic, revalidate, dynamic, revalidate, ArchiveProductCard() (+29 more)
|
||||
Nodes (34): generateMetadata(), dynamic, revalidate, DEFAULT_CATEGORIES, dynamic, revalidate, dynamic, revalidate (+26 more)
|
||||
|
||||
### Community 4 - "SafeImage.tsx"
|
||||
Cohesion: 0.08
|
||||
Nodes (22): BlogPost, BlogPreviewSection(), ProductDetailModalProps, OrderDetailsModalProps, PLAYBACK_RATES, PodcastPlayerModal(), PodcastPlayerModalProps, VideoModalPlayer (+14 more)
|
||||
Cohesion: 0.09
|
||||
Nodes (21): BlogCategory, BlogPostItem, ProductDetailModalProps, OrderDetailsModalProps, PLAYBACK_RATES, PodcastInlinePlayerProps, PLAYBACK_RATES, PodcastPlayerModal() (+13 more)
|
||||
|
||||
### Community 5 - "CmsController"
|
||||
Cohesion: 0.09
|
||||
@ -373,36 +377,36 @@ Cohesion: 0.09
|
||||
Nodes (31): AdminUpdateTicketDto, CreateTicketDto, ReplyTicketDto, ApiProperty, ApiPropertyOptional, IsNotEmpty, IsOptional, IsString (+23 more)
|
||||
|
||||
### Community 7 - "pets/pets.controller.ts"
|
||||
Cohesion: 0.12
|
||||
Cohesion: 0.11
|
||||
Nodes (15): CreatePetDto, ApiProperty, ApiPropertyOptional, IsArray, IsNotEmpty, IsNumber, IsOptional, IsString (+7 more)
|
||||
|
||||
### Community 8 - "ReportsController"
|
||||
Cohesion: 0.16
|
||||
Nodes (9): ReportsController, ApiBearerAuth, ApiOperation, ApiTags, Controller, Get, UseGuards, ReportsService (+1 more)
|
||||
### Community 8 - "admin.module.ts"
|
||||
Cohesion: 0.07
|
||||
Nodes (19): AdminModule, Module, MediaService, Injectable, ReportsController, ApiBearerAuth, ApiOperation, ApiTags (+11 more)
|
||||
|
||||
### Community 9 - "devDependencies"
|
||||
Cohesion: 0.09
|
||||
Nodes (23): devDependencies, eslint-config-prettier, @eslint/eslintrc, eslint-plugin-prettier, @nestjs/schematics, @nestjs/testing, prettier, @types/compression (+15 more)
|
||||
Cohesion: 0.22
|
||||
Nodes (9): devDependencies, eslint, @types/bcryptjs, @types/node, typescript, eslint, @types/node, typescript (+1 more)
|
||||
|
||||
### Community 10 - "ReviewsController"
|
||||
Cohesion: 0.20
|
||||
Nodes (11): ReviewsController, ApiBearerAuth, ApiOperation, ApiTags, Controller, Delete, Get, Param (+3 more)
|
||||
### Community 10 - "ReviewsService"
|
||||
Cohesion: 0.13
|
||||
Nodes (16): ReviewsController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+8 more)
|
||||
|
||||
### Community 11 - "Spinner.tsx"
|
||||
Cohesion: 0.09
|
||||
Nodes (30): ConfirmModal(), ConfirmModalProps, getFileType(), Media, MediaSelector(), MediaSelectorProps, maxWidthClasses, Modal() (+22 more)
|
||||
|
||||
### Community 12 - "PetProfile.tsx"
|
||||
Cohesion: 0.11
|
||||
Nodes (20): FeaturedProducts(), ProductCard(), OrderSuccess(), SearchResultsPage(), OrderRowSkeleton(), PetProfileSkeleton(), ProductCardSkeleton(), Skeleton() (+12 more)
|
||||
Cohesion: 0.13
|
||||
Nodes (13): FeaturedProducts(), OrderDetailsModal(), OrderRowSkeleton(), PetProfileSkeleton(), ProductCardSkeleton(), Skeleton(), SkeletonProps, mockProducts (+5 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 - "lib/services/api.ts"
|
||||
Cohesion: 0.08
|
||||
Nodes (29): LoginModal, VerifyContent(), B2BPortal(), CartDrawer(), ContactInfoItem, Header(), LoginModal(), LoginModalProps (+21 more)
|
||||
Cohesion: 0.09
|
||||
Nodes (21): BlogPost, ContactInfoItem, FAQItem, Testimonial, api, ApiErrorPayload, BASE_DOMAIN, baseURL (+13 more)
|
||||
|
||||
### Community 15 - "src/services/api.ts"
|
||||
Cohesion: 0.09
|
||||
@ -412,25 +416,29 @@ Nodes (25): ProtectedRoute(), Login(), B2BManager, SeoSettingsPage, SmartAdvisor
|
||||
Cohesion: 0.09
|
||||
Nodes (24): DoctorsController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+16 more)
|
||||
|
||||
### Community 17 - "admin.service.ts"
|
||||
Cohesion: 0.11
|
||||
Nodes (11): CouponTargetInput, PaginationQuery, RevalidationModule, Global, Module, RedisModule, Global, Module (+3 more)
|
||||
### Community 17 - "schema.ts"
|
||||
Cohesion: 0.14
|
||||
Nodes (18): B2BPage(), generateMetadata(), ContactPage(), generateMetadata(), generateMetadata(), getInitialVideos(), Videos(), ContactFormClient() (+10 more)
|
||||
|
||||
### Community 18 - "JwtAuthGuard"
|
||||
Cohesion: 0.21
|
||||
Cohesion: 0.19
|
||||
Nodes (7): JwtAuthGuard, Injectable, ROLES_KEY, RequestWithUser, RolesGuard, Injectable, UserReqPayload
|
||||
|
||||
### Community 19 - "ProductsService"
|
||||
Cohesion: 0.10
|
||||
Nodes (19): GetProductsDto, ApiPropertyOptional, IsEnum, IsOptional, IsString, ProductsController, ApiOperation, ApiTags (+11 more)
|
||||
### Community 19 - "ProductsController"
|
||||
Cohesion: 0.15
|
||||
Nodes (9): ProductsController, ApiOperation, ApiTags, Body, Controller, Get, Param, Patch (+1 more)
|
||||
|
||||
### Community 20 - "CreateVideoDto"
|
||||
Cohesion: 0.09
|
||||
Nodes (24): CreateVideoDto, ApiProperty, ApiPropertyOptional, IsBoolean, IsNotEmpty, IsOptional, IsString, UpdateVideoDto (+16 more)
|
||||
|
||||
### Community 21 - "ProductPage.tsx"
|
||||
Cohesion: 0.14
|
||||
Nodes (14): PodcastInlinePlayer(), CalculatorState, ICON_MAP, ProductPage(), ProductReviews, useCalculatorStore, ProductReviews(), ProductReviewsProps (+6 more)
|
||||
|
||||
### Community 22 - "UserDashboard.tsx"
|
||||
Cohesion: 0.10
|
||||
Nodes (30): AddressModal(), AddressModalProps, AuthModal(), AuthModalProps, extractOtpFromText(), BackButton(), BackButtonProps, CheckoutPage() (+22 more)
|
||||
Nodes (38): VerifyContent(), AddressModal(), AddressModalProps, ArchiveProductCard(), B2BPortal(), BackButton(), BackButtonProps, CheckoutPage() (+30 more)
|
||||
|
||||
### Community 23 - "MenuService"
|
||||
Cohesion: 0.12
|
||||
@ -477,16 +485,16 @@ Cohesion: 0.10
|
||||
Nodes (20): ApiProperty, ApiPropertyOptional, IsNotEmpty, IsOptional, IsString, WholesaleApplyDto, ApiBearerAuth, ApiOperation (+12 more)
|
||||
|
||||
### Community 34 - "B2BService"
|
||||
Cohesion: 0.14
|
||||
Nodes (14): B2BController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Get, Param (+6 more)
|
||||
Cohesion: 0.12
|
||||
Nodes (17): B2BController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Get, Param (+9 more)
|
||||
|
||||
### Community 35 - "AuthController"
|
||||
Cohesion: 0.27
|
||||
Nodes (12): AuthController, ApiBadRequestResponse, ApiBearerAuth, ApiOkResponse, ApiOperation, ApiTags, Body, Controller (+4 more)
|
||||
|
||||
### Community 36 - "FaqService"
|
||||
Cohesion: 0.14
|
||||
Nodes (14): FaqController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+6 more)
|
||||
Cohesion: 0.12
|
||||
Nodes (16): FaqController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+8 more)
|
||||
|
||||
### Community 37 - "راهنمای تست سیستم (Software Testing)"
|
||||
Cohesion: 0.07
|
||||
@ -497,8 +505,8 @@ Cohesion: 0.07
|
||||
Nodes (26): TransactionReceiptData, TransactionReceiptModal(), TransactionReceiptModalProps, Button(), ButtonProps, ButtonSize, ButtonVariant, ThSort() (+18 more)
|
||||
|
||||
### Community 39 - "CategoriesController"
|
||||
Cohesion: 0.10
|
||||
Nodes (16): CategoriesController, ApiBearerAuth, ApiOperation, ApiQuery, ApiTags, Body, Controller, Delete (+8 more)
|
||||
Cohesion: 0.09
|
||||
Nodes (17): CategoriesController, ApiBearerAuth, ApiOperation, ApiQuery, ApiTags, Body, Controller, Delete (+9 more)
|
||||
|
||||
### Community 40 - "MediaController"
|
||||
Cohesion: 0.11
|
||||
@ -516,21 +524,25 @@ Nodes (14): SslController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controlle
|
||||
Cohesion: 0.13
|
||||
Nodes (15): BannersController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+7 more)
|
||||
|
||||
### Community 44 - "TestimonialsService"
|
||||
### Community 44 - "TestimonialsController"
|
||||
Cohesion: 0.13
|
||||
Nodes (14): TestimonialsController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+6 more)
|
||||
Nodes (12): TestimonialsController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+4 more)
|
||||
|
||||
### Community 45 - "What You Must Do When Invoked"
|
||||
Cohesion: 0.07
|
||||
Nodes (26): For /graphify add and --watch, For /graphify query, For the commit hook and native CLAUDE.md integration, For --update and --cluster-only, /graphify, Honesty Rules, Interpreter guard for subcommands, Part A - Structural extraction for code files (+18 more)
|
||||
|
||||
### Community 46 - "api"
|
||||
Cohesion: 0.13
|
||||
Nodes (13): Layout(), MenuGroup, Sidebar(), SidebarProps, SubMenuItem, LiveMonitoringSummary, SEARCHABLE_PAGES, Topbar() (+5 more)
|
||||
|
||||
### Community 47 - "IngredientsService"
|
||||
Cohesion: 0.13
|
||||
Nodes (14): IngredientsController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+6 more)
|
||||
|
||||
### Community 48 - "Reports.tsx"
|
||||
Cohesion: 0.20
|
||||
Nodes (7): BestSellerItem, CategoryDistItem, COLORS, CustomTooltipProps, ReportData, TopCouponItem, Reports
|
||||
### Community 48 - "cartStore.ts"
|
||||
Cohesion: 0.13
|
||||
Nodes (6): OrderSuccess(), OrderTracking(), OrderService, CartItem, CartStore, Order
|
||||
|
||||
### Community 49 - "devDependencies"
|
||||
Cohesion: 0.11
|
||||
@ -538,23 +550,23 @@ Nodes (19): autoprefixer, devDependencies, autoprefixer, eslint, @eslint/js, glo
|
||||
|
||||
### Community 50 - "devDependencies"
|
||||
Cohesion: 0.13
|
||||
Nodes (15): devDependencies, eslint, jsdom, tailwindcss, @tailwindcss/postcss, @types/node, @types/react-dom, @vitejs/plugin-react (+7 more)
|
||||
Nodes (15): eslint-config-next, devDependencies, eslint, eslint-config-next, jsdom, tailwindcss, @tailwindcss/postcss, @types/node (+7 more)
|
||||
|
||||
### Community 51 - "BlogsController"
|
||||
Cohesion: 0.14
|
||||
Nodes (16): BlogsController, ApiBearerAuth, ApiOperation, ApiQuery, ApiTags, Body, Controller, Delete (+8 more)
|
||||
|
||||
### Community 52 - "PrescriptionsService"
|
||||
Cohesion: 0.14
|
||||
Nodes (14): PrescriptionsController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Get, Param (+6 more)
|
||||
### Community 52 - "PrescriptionsController"
|
||||
Cohesion: 0.15
|
||||
Nodes (12): PrescriptionsController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Get, Param (+4 more)
|
||||
|
||||
### Community 53 - "SmartAdvisorService"
|
||||
Cohesion: 0.13
|
||||
Nodes (14): SmartAdvisorController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+6 more)
|
||||
### Community 53 - "SmartAdvisorController"
|
||||
Cohesion: 0.14
|
||||
Nodes (12): SmartAdvisorController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+4 more)
|
||||
|
||||
### Community 54 - "UsersService"
|
||||
Cohesion: 0.08
|
||||
Nodes (31): AddressDto, ApiProperty, ApiPropertyOptional, IsBoolean, IsNotEmpty, IsOptional, IsString, ApiPropertyOptional (+23 more)
|
||||
Cohesion: 0.06
|
||||
Nodes (42): DEFAULT_JWT_REFRESH_SECRET, DEFAULT_JWT_SECRET, getJwtSecret(), AuthModule, Module, JwtPayload, JwtStrategy, Injectable (+34 more)
|
||||
|
||||
### Community 55 - "UITexts.tsx"
|
||||
Cohesion: 0.09
|
||||
@ -576,37 +588,37 @@ Nodes (11): ContactController, Body, Controller, Get, Param, Post, Put, Query (+
|
||||
Cohesion: 0.06
|
||||
Nodes (30): compilerOptions, allowSyntheticDefaultImports, baseUrl, declaration, emitDecoratorMetadata, esModuleInterop, experimentalDecorators, forceConsistentCasingInFileNames (+22 more)
|
||||
|
||||
### Community 60 - "admin.controller.ts"
|
||||
Cohesion: 0.21
|
||||
Nodes (10): CreateUserDto, ApiProperty, ApiPropertyOptional, IsEmail, IsNotEmpty, IsNumber, IsOptional, IsString (+2 more)
|
||||
### Community 60 - "Blogs.tsx"
|
||||
Cohesion: 0.15
|
||||
Nodes (11): ActiveStates, PRESET_BG_COLORS, PRESET_COLORS, RichTextEditor(), RichTextEditorProps, AuthorUser, BlogCategory, BlogPost (+3 more)
|
||||
|
||||
### Community 61 - "CreateEBankCheckoutDto"
|
||||
Cohesion: 0.22
|
||||
Nodes (8): CreateEBankCheckoutDto, ApiProperty, ApiPropertyOptional, IsNotEmpty, IsNumber, IsOptional, IsString, Min
|
||||
### Community 61 - "payment.controller.ts"
|
||||
Cohesion: 0.08
|
||||
Nodes (26): AdminTransactionFilterDto, ApiPropertyOptional, IsIn, IsNumber, IsOptional, IsString, Type, CreateEBankCheckoutDto (+18 more)
|
||||
|
||||
### Community 62 - "api"
|
||||
Cohesion: 0.13
|
||||
Nodes (13): Layout(), MenuGroup, Sidebar(), SidebarProps, SubMenuItem, LiveMonitoringSummary, SEARCHABLE_PAGES, Topbar() (+5 more)
|
||||
### Community 62 - "ProductsService"
|
||||
Cohesion: 0.18
|
||||
Nodes (10): GetProductsDto, ApiPropertyOptional, IsEnum, IsOptional, IsString, Query, ProductsModule, Module (+2 more)
|
||||
|
||||
### Community 63 - "dependencies"
|
||||
Cohesion: 0.05
|
||||
Nodes (43): dependencies, bcrypt, bcryptjs, class-transformer, class-validator, compression, helmet, ioredis (+35 more)
|
||||
Cohesion: 0.09
|
||||
Nodes (23): dependencies, bcryptjs, class-validator, compression, ioredis, @nestjs/common, @nestjs/passport, @nestjs/platform-express (+15 more)
|
||||
|
||||
### Community 64 - "compilerOptions"
|
||||
Cohesion: 0.10
|
||||
Nodes (20): compilerOptions, allowImportingTsExtensions, erasableSyntaxOnly, lib, module, moduleDetection, moduleResolution, noEmit (+12 more)
|
||||
|
||||
### Community 65 - "AdminTransactionFilterDto"
|
||||
Cohesion: 0.25
|
||||
Nodes (7): AdminTransactionFilterDto, ApiPropertyOptional, IsIn, IsNumber, IsOptional, IsString, Type
|
||||
### Community 65 - "app.e2e-spec.js"
|
||||
Cohesion: 0.50
|
||||
Nodes (3): app_module_1, supertest_1, testing_1
|
||||
|
||||
### Community 66 - "AdminQueryDto"
|
||||
Cohesion: 0.18
|
||||
Nodes (7): ApiQuery, Get, Query, AdminQueryDto, ApiPropertyOptional, IsOptional, IsString
|
||||
|
||||
### Community 67 - "PaginationDto"
|
||||
Cohesion: 0.07
|
||||
Nodes (19): CategoryQuery, MediaService, Injectable, PetQuery, PetsService, Injectable, SslCertInfo, Injectable (+11 more)
|
||||
### Community 67 - "PetsController"
|
||||
Cohesion: 0.11
|
||||
Nodes (13): PetsController, ApiBearerAuth, ApiOperation, ApiQuery, ApiTags, Controller, Delete, Get (+5 more)
|
||||
|
||||
### Community 68 - "20260526145407_init/migration.sql"
|
||||
Cohesion: 0.27
|
||||
@ -621,8 +633,8 @@ Cohesion: 0.08
|
||||
Nodes (23): compilerOptions, allowImportingTsExtensions, erasableSyntaxOnly, jsx, lib, module, moduleDetection, moduleResolution (+15 more)
|
||||
|
||||
### Community 71 - "getPageMetadata"
|
||||
Cohesion: 0.11
|
||||
Nodes (9): generateMetadata(), generateMetadata(), generateMetadata(), generateMetadata(), generateMetadata(), generateMetadata(), generateMetadata(), generateMetadata() (+1 more)
|
||||
Cohesion: 0.08
|
||||
Nodes (18): generateMetadata(), CatalogClient(), generateMetadata(), generateMetadata(), generateMetadata(), generateMetadata(), getHomeData(), Home() (+10 more)
|
||||
|
||||
### Community 72 - "Operational Rules & Boundaries"
|
||||
Cohesion: 0.11
|
||||
@ -672,10 +684,6 @@ Nodes (21): dependencies, axios, lucide-react, react, react-dom, react-hot-toast
|
||||
Cohesion: 0.12
|
||||
Nodes (16): 1. Active Secret Scanning (All Modified Files), 2. Docker Container Verification (if Dockerfile exists), 3. CI/CD Basic Check (if `.github/workflows/` exists), 4. Failure Routing Protocol, 5. Forbidden Actions, ENFORCE MODE — Normal Operation, Expected JSON Output Schema, Operational Rules & Boundaries (+8 more)
|
||||
|
||||
### Community 85 - "PetsController"
|
||||
Cohesion: 0.15
|
||||
Nodes (11): PetsController, ApiBearerAuth, ApiOperation, ApiQuery, ApiTags, Controller, Delete, Get (+3 more)
|
||||
|
||||
### Community 86 - "zibal.service.ts"
|
||||
Cohesion: 0.16
|
||||
Nodes (9): GatewayHealthResult, IPaymentGateway, PaymentInquiryResult, PaymentRequestOptions, PaymentRequestResult, PaymentVerifyResult, ZibalInquiryResponse, ZibalRequestResponse (+1 more)
|
||||
@ -686,47 +694,43 @@ Nodes (17): dependencies, axios, lucide-react, motion, next, react, react-dom, s
|
||||
|
||||
### Community 88 - "useSettingsStore"
|
||||
Cohesion: 0.11
|
||||
Nodes (21): AuthModal, B2BPortal, CartDrawer, ClientLayout(), BrandLogo(), BrandLogoProps, EnamadBadge(), FAQItem (+13 more)
|
||||
Nodes (24): AuthModal, B2BPortal, CartDrawer, ClientLayout(), LoginModal, AuthModal(), AuthModalProps, extractOtpFromText() (+16 more)
|
||||
|
||||
### Community 89 - "seed-products.ts"
|
||||
Cohesion: 0.17
|
||||
Nodes (12): prisma, main(), prisma, determineSuitableFor(), findOrCreateCategory(), getProductImageUrl(), main(), parseSize() (+4 more)
|
||||
|
||||
### Community 90 - "HomeClient.tsx"
|
||||
Cohesion: 0.14
|
||||
Nodes (17): HomeClient(), HomeClientProps, getHomeData(), Home(), BannerPlacement(), BannerPlacementProps, Hero(), StatCounter() (+9 more)
|
||||
Cohesion: 0.10
|
||||
Nodes (20): HomeClient(), HomeClientProps, CATEGORY_MAP, ICON_MAP, BannerPlacement(), BannerPlacementProps, BlogPreviewSection(), FAQSection() (+12 more)
|
||||
|
||||
### Community 91 - "Reconciled Audit Roles & Assignments"
|
||||
Cohesion: 0.12
|
||||
Nodes (15): 10. Documentation Engineer, 1. Lead Architect / Orchestrator, 2. React / Vite Storefront Auditor, 3. NestJS Backend Auditor, 4. Admin Features Auditor, 5. Database & Data Integrity Auditor, 6. Security Auditor, 7. TypeScript & Code Quality Auditor (+7 more)
|
||||
|
||||
### Community 92 - "OrdersService"
|
||||
Cohesion: 0.06
|
||||
Nodes (35): CreateOrderDto, OrderItemDto, ApiProperty, ApiPropertyOptional, IsArray, IsNotEmpty, IsNumber, IsOptional (+27 more)
|
||||
|
||||
### Community 93 - "ProductPage.tsx"
|
||||
Cohesion: 0.13
|
||||
Nodes (15): PLAYBACK_RATES, PodcastInlinePlayer(), PodcastInlinePlayerProps, CalculatorState, ICON_MAP, ProductPage(), ProductReviews, useCalculatorStore (+7 more)
|
||||
Cohesion: 0.07
|
||||
Nodes (29): CreateOrderDto, OrderItemDto, ApiProperty, ApiPropertyOptional, IsArray, IsNotEmpty, IsNumber, IsOptional (+21 more)
|
||||
|
||||
### Community 94 - "Phase 3.1 — Human Review Preparation and Master Backlog Critique"
|
||||
Cohesion: 0.13
|
||||
Nodes (14): 10. Dependency & Wave Adjustments, 11. Acceptance Criteria Refinements, 12. Business and Product Decision Classification, 13. Final Recommended Backlog Summary, 1. Executive Assessment, 2. Findings That Require No Change, 3. Findings Requiring Task Refinements, 4. Tasks Requiring Splitting (+6 more)
|
||||
|
||||
### Community 95 - "blog/[slug]/page.tsx"
|
||||
Cohesion: 0.24
|
||||
Nodes (13): BlogPostPage(), generateMetadata(), getBlog(), revalidate, safeIso(), safeLocalDate(), generateMetadata(), revalidate (+5 more)
|
||||
Cohesion: 0.23
|
||||
Nodes (12): BlogPostPage(), generateMetadata(), getBlog(), revalidate, safeIso(), safeLocalDate(), generateMetadata(), revalidate (+4 more)
|
||||
|
||||
### Community 96 - "compilerOptions"
|
||||
Cohesion: 0.06
|
||||
Nodes (32): compilerOptions, allowJs, esModuleInterop, incremental, isolatedModules, jsx, lib, module (+24 more)
|
||||
|
||||
### Community 98 - "scripts"
|
||||
Cohesion: 0.14
|
||||
Nodes (14): scripts, build, build:nest, docs:generate, lint, start, start:debug, start:dev (+6 more)
|
||||
Cohesion: 0.13
|
||||
Nodes (15): scripts, build, build:nest, docs:generate, lint, seo:backfill, start, start:debug (+7 more)
|
||||
|
||||
### Community 99 - "BlogsController"
|
||||
Cohesion: 0.08
|
||||
Nodes (25): BlogsController, ApiBearerAuth, ApiNotFoundResponse, ApiOkResponse, ApiOperation, ApiTags, Body, Controller (+17 more)
|
||||
Cohesion: 0.06
|
||||
Nodes (34): BlogsController, ApiBearerAuth, ApiNotFoundResponse, ApiOkResponse, ApiOperation, ApiTags, Body, Controller (+26 more)
|
||||
|
||||
### Community 100 - "Deep Audit Summary Report"
|
||||
Cohesion: 0.14
|
||||
@ -752,13 +756,13 @@ Nodes (12): 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 - "Reports.tsx"
|
||||
Cohesion: 0.20
|
||||
Nodes (7): BestSellerItem, CategoryDistItem, COLORS, CustomTooltipProps, ReportData, TopCouponItem, Reports
|
||||
|
||||
### Community 108 - "PrismaService"
|
||||
Cohesion: 0.06
|
||||
Nodes (25): B2BModule, Module, B2BWholesaleOrderItem, BannersModule, Module, RevalidationService, Injectable, MeliPayamakPattern (+17 more)
|
||||
Nodes (26): PetQuery, WikiQuery, MeliPayamakPattern, MeliPayamakResponse, SendPatternSmsOptions, SmsConfig, CreateContactSubmissionDto, UpdateContactInfoItemDto (+18 more)
|
||||
|
||||
### Community 109 - "1. Summary of Integrity Repairs Performed"
|
||||
Cohesion: 0.17
|
||||
@ -777,17 +781,13 @@ Cohesion: 0.18
|
||||
Nodes (10): 1. Pre-Deployment Checklist, 2. Build Verification, 3. Deployment Strategy (Based on Target), 4. Post-Deployment Health Check, 5. Forbidden Actions, Expected JSON Output Schema, Operational Rules & Boundaries, Required Output Artifacts (What files to write/update) (+2 more)
|
||||
|
||||
### Community 113 - "reviews.controller.ts"
|
||||
Cohesion: 0.24
|
||||
Nodes (7): ApiProperty, IsIn, IsOptional, IsString, UpdateReviewDto, ReviewsModule, Module
|
||||
Cohesion: 0.15
|
||||
Nodes (13): CreateReviewDto, ApiProperty, IsInt, IsNotEmpty, IsOptional, IsString, Min, ApiProperty (+5 more)
|
||||
|
||||
### Community 114 - "AppService"
|
||||
Cohesion: 0.29
|
||||
Nodes (5): AppController, Controller, Get, AppService, Injectable
|
||||
|
||||
### Community 115 - "seo.ts"
|
||||
Cohesion: 0.18
|
||||
Nodes (6): generateMetadata(), generateMetadata(), VideosPage(), DEFAULT_SEO_CONFIG, PageMetadataOptions, SeoConfig
|
||||
|
||||
### Community 116 - "Vazirmatn Changelog"
|
||||
Cohesion: 0.18
|
||||
Nodes (10): 32.0.0, 32.1, 32.101, 32.102, 33.000, 33.001, 33.002, 33.003 (+2 more)
|
||||
@ -812,10 +812,6 @@ Nodes (9): compilerOptions, esModuleInterop, module, moduleResolution, skipLibCh
|
||||
Cohesion: 0.20
|
||||
Nodes (9): Compile and run the project, Deployment, Description, License, Project setup, Resources, Run tests, Stay in touch (+1 more)
|
||||
|
||||
### Community 122 - "auth.module.ts"
|
||||
Cohesion: 0.22
|
||||
Nodes (8): DEFAULT_JWT_REFRESH_SECRET, DEFAULT_JWT_SECRET, getJwtSecret(), AuthModule, Module, JwtPayload, JwtStrategy, Injectable
|
||||
|
||||
### Community 124 - "Repository Map"
|
||||
Cohesion: 0.20
|
||||
Nodes (9): 1. Active Customer Storefront: React 19 + Vite Application, 2. Active Backend Service: NestJS Application, 3. Excluded Placeholder / Non-Auditable Directories, Active Applications & Non-Auditable Scopes, Documentation Governance, Important Configuration & Infrastructure Files, Mandatory Global Audit Exclusions, Repository Map (+1 more)
|
||||
@ -832,13 +828,13 @@ Nodes (9): name, private, scripts, build, dev, lint, preview, type (+1 more)
|
||||
Cohesion: 0.20
|
||||
Nodes (9): Arch Linux, Contributors, Install, Known problems for variable version, License, Sahel-Font, To Do (variable), طریقه استفاده از نسخه متغیر variable (+1 more)
|
||||
|
||||
### Community 128 - "AdminController"
|
||||
Cohesion: 0.15
|
||||
Nodes (7): AdminController, ApiBearerAuth, ApiTags, Controller, Delete, Param, UseGuards
|
||||
### Community 128 - "AdminService"
|
||||
Cohesion: 0.09
|
||||
Nodes (13): AdminController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Param (+5 more)
|
||||
|
||||
### Community 129 - "videos.controller.ts"
|
||||
Cohesion: 0.20
|
||||
Nodes (8): GetVideosQueryDto, ApiPropertyOptional, IsBoolean, IsOptional, Transform, Module, VideosModule, VideoQuery
|
||||
### Community 129 - "RouteErrorBoundary"
|
||||
Cohesion: 0.22
|
||||
Nodes (3): Props, RouteErrorBoundary, State
|
||||
|
||||
### Community 130 - "Sahel-Font"
|
||||
Cohesion: 0.20
|
||||
@ -856,9 +852,9 @@ Nodes (8): cmd_next_task(), cmd_progress(), cmd_reset(), cmd_status(), cmd_unblo
|
||||
Cohesion: 0.22
|
||||
Nodes (8): author, description, license, name, prisma, seed, private, version
|
||||
|
||||
### Community 134 - "CreateReviewDto"
|
||||
Cohesion: 0.17
|
||||
Nodes (11): CreateReviewDto, ApiProperty, IsInt, IsNotEmpty, IsOptional, IsString, Min, Body (+3 more)
|
||||
### Community 134 - "blog/page.tsx"
|
||||
Cohesion: 0.38
|
||||
Nodes (6): Blog(), generateMetadata(), getBlogs(), getCategories(), revalidate, BlogPage()
|
||||
|
||||
### Community 135 - "graphify reference: extra exports and benchmark"
|
||||
Cohesion: 0.22
|
||||
@ -876,9 +872,9 @@ Nodes (8): 1. `TASK-AUTH-001`, 2. `TASK-FIN-001`, 3. `DECISION-002`, 4. `TASK-VE
|
||||
Cohesion: 0.22
|
||||
Nodes (8): Arch Linux, bower, Install, npm, Shabnam Font, yarn, طریقه استفاده در صفحات وب:, نمونه متن Sample:
|
||||
|
||||
### Community 139 - "RouteErrorBoundary"
|
||||
Cohesion: 0.22
|
||||
Nodes (3): Props, RouteErrorBoundary, State
|
||||
### Community 139 - "layout.tsx"
|
||||
Cohesion: 0.43
|
||||
Nodes (5): generateMetadata(), RootLayout(), lalezar, vazirmatn, generateOrganizationSchema()
|
||||
|
||||
### Community 140 - "ErrorBoundary"
|
||||
Cohesion: 0.22
|
||||
@ -896,17 +892,21 @@ Nodes (7): backend, distMainPath, fs, http, path, { spawn, execSync }, waitForBa
|
||||
Cohesion: 0.25
|
||||
Nodes (6): app_module_1, core_1, fs, path, swagger_1, yaml
|
||||
|
||||
### Community 145 - "ProductDto"
|
||||
Cohesion: 0.20
|
||||
Nodes (7): ProductDto, ApiPropertyOptional, IsArray, IsBoolean, IsNumber, IsOptional, IsString
|
||||
### Community 145 - "admin.service.ts"
|
||||
Cohesion: 0.13
|
||||
Nodes (20): CouponInput, CouponTargetInput, PaginationQuery, ProductDto, ApiPropertyOptional, IsArray, IsBoolean, IsNumber (+12 more)
|
||||
|
||||
### Community 146 - "System Discovery"
|
||||
Cohesion: 0.25
|
||||
Nodes (7): Active Core Applications, Current Architecture, Evidence-Based Status Matrix, Excluded / Non-Auditable Artifacts, Major Business Domains Discovered, System Discovery, Technical Architecture Summary
|
||||
|
||||
### Community 148 - "Body"
|
||||
Cohesion: 0.21
|
||||
Nodes (3): Body, Post, CouponInput
|
||||
### Community 147 - "RevalidationService"
|
||||
Cohesion: 0.17
|
||||
Nodes (5): RevalidationModule, Global, Module, RevalidationService, Injectable
|
||||
|
||||
### Community 148 - "wiki/[slug]/page.tsx"
|
||||
Cohesion: 0.60
|
||||
Nodes (5): generateMetadata(), getRelatedProducts(), getWikiTerm(), WikiTermPage(), generateMedicalWebPageSchema()
|
||||
|
||||
### Community 149 - "SmsSettingsPage.tsx"
|
||||
Cohesion: 0.29
|
||||
@ -916,9 +916,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 - "AuthService"
|
||||
Cohesion: 0.21
|
||||
Nodes (3): AuthService, Injectable, normalizeMobile()
|
||||
### Community 151 - "auth.service.ts"
|
||||
Cohesion: 0.08
|
||||
Nodes (13): AdminLoginInput, AuthService, LoginInput, RegisterInput, Injectable, SendOtpDto, ApiProperty, IsNotEmpty (+5 more)
|
||||
|
||||
### Community 153 - "exclude"
|
||||
Cohesion: 0.22
|
||||
@ -928,9 +928,9 @@ Nodes (8): exclude, extends, dist, node_modules, prisma, **/*spec.ts, test, ./ts
|
||||
Cohesion: 0.29
|
||||
Nodes (6): Attempted Command Execution Log, Backend `backend/package.json` Scripts, Baseline Command Plan & Reconciled Command History, Package Scripts Safety Analysis, Permitted Safe Checks for Phase 2, Root `package.json` Scripts
|
||||
|
||||
### Community 155 - "Blogs.tsx"
|
||||
Cohesion: 0.15
|
||||
Nodes (11): ActiveStates, PRESET_BG_COLORS, PRESET_COLORS, RichTextEditor(), RichTextEditorProps, AuthorUser, BlogCategory, BlogPost (+3 more)
|
||||
### Community 155 - "seo-backfill.ts"
|
||||
Cohesion: 0.67
|
||||
Nodes (3): prisma, runSeoBackfill(), stripHtml()
|
||||
|
||||
### Community 159 - "with-vpn.sh"
|
||||
Cohesion: 0.62
|
||||
@ -1000,13 +1000,9 @@ Nodes (4): evidenceList, ledger, mandatoryMap, mandatoryScope
|
||||
Cohesion: 0.40
|
||||
Nodes (4): activeFiles, errors, validationOutput, warnings
|
||||
|
||||
### Community 177 - "blog/page.tsx"
|
||||
Cohesion: 0.38
|
||||
Nodes (6): Blog(), generateMetadata(), getBlogs(), getCategories(), revalidate, BlogPage()
|
||||
|
||||
### Community 179 - "BlogsService"
|
||||
Cohesion: 0.15
|
||||
Nodes (5): BlogsModule, Module, BlogFilterDto, BlogsService, Injectable
|
||||
### Community 179 - "PaginationDto"
|
||||
Cohesion: 0.05
|
||||
Nodes (29): BlogsModule, Module, BlogFilterDto, BlogsService, Injectable, PaginationDto, SortOrder, ApiPropertyOptional (+21 more)
|
||||
|
||||
### Community 180 - "API Contract Specification"
|
||||
Cohesion: 0.50
|
||||
@ -1025,13 +1021,9 @@ Cohesion: 0.50
|
||||
Nodes (3): Overview & Content Foundation, SEO & Content Requirements, 🚀 SEO & Content Strategy Review (12_seo_content)
|
||||
|
||||
### Community 184 - "MetricsController"
|
||||
Cohesion: 0.18
|
||||
Cohesion: 0.29
|
||||
Nodes (5): ApiExcludeController, MetricsController, Controller, Get, Res
|
||||
|
||||
### Community 185 - "WikiController"
|
||||
Cohesion: 0.13
|
||||
Nodes (13): ApiNotFoundResponse, ApiOkResponse, ApiOperation, ApiTags, Controller, Get, Param, Query (+5 more)
|
||||
|
||||
### Community 191 - "graphify reference: add a URL and watch a folder"
|
||||
Cohesion: 0.50
|
||||
Nodes (3): For /graphify add, For --watch, graphify reference: add a URL and watch a folder
|
||||
@ -1056,13 +1048,9 @@ Nodes (3): Expanding the ESLint configuration, React Compiler, React + TypeScrip
|
||||
Cohesion: 0.50
|
||||
Nodes (3): Select, SelectOption, SelectProps
|
||||
|
||||
### Community 198 - "users.service.ts"
|
||||
Cohesion: 0.31
|
||||
Nodes (3): Module, UsersModule, UserAddressInput
|
||||
|
||||
### Community 199 - "auth.service.ts"
|
||||
Cohesion: 0.13
|
||||
Nodes (14): AdminLoginInput, LoginInput, RegisterInput, SendOtpDto, ApiProperty, IsNotEmpty, IsString, Matches (+6 more)
|
||||
### Community 199 - "auth.controller.ts"
|
||||
Cohesion: 0.08
|
||||
Nodes (25): AdminLoginDto, ApiProperty, IsEmail, IsNotEmpty, IsString, MinLength, LoginDto, ApiProperty (+17 more)
|
||||
|
||||
### Community 200 - "application/README.md"
|
||||
Cohesion: 0.50
|
||||
@ -1080,49 +1068,37 @@ Nodes (3): ADR-AUTH-001: Admin Panel Authentication Architecture & Token Managem
|
||||
Cohesion: 0.67
|
||||
Nodes (3): Shabnam Font README, Shabnam Font Sample, Vazir Font
|
||||
|
||||
### Community 239 - "RegisterDto"
|
||||
Cohesion: 0.22
|
||||
Nodes (8): RegisterDto, ApiProperty, ApiPropertyOptional, IsEmail, IsNotEmpty, IsOptional, IsString, MinLength
|
||||
|
||||
### Community 264 - "InitiatePaymentDto"
|
||||
Cohesion: 0.43
|
||||
Nodes (7): InitiatePaymentDto, InitiateWalletTopupDto, ApiProperty, ApiPropertyOptional, IsNotEmpty, IsOptional, IsString
|
||||
|
||||
### Community 298 - "ZibalCallbackQueryDto"
|
||||
Cohesion: 0.40
|
||||
Nodes (4): ApiPropertyOptional, IsOptional, IsString, ZibalCallbackQueryDto
|
||||
### Community 298 - ".initiateOrderPayment"
|
||||
Cohesion: 0.21
|
||||
Nodes (6): ApiBadRequestResponse, ApiOkResponse, Req, Res, Headers, Ip
|
||||
|
||||
### Community 313 - "MenuManager.tsx"
|
||||
Cohesion: 0.33
|
||||
Nodes (4): MENU_TABS, MenuItem, MenuType, MenuManager
|
||||
|
||||
### Community 314 - "layout.tsx"
|
||||
Cohesion: 0.47
|
||||
Nodes (3): generateMetadata(), lalezar, vazirmatn
|
||||
|
||||
### Community 317 - "revalidate/route.ts"
|
||||
Cohesion: 0.83
|
||||
Nodes (3): GET(), handleRevalidate(), POST()
|
||||
|
||||
## Knowledge Gaps
|
||||
- **1299 isolated node(s):** `$schema`, `collection`, `sourceRoot`, `deleteOutDir`, `name` (+1294 more)
|
||||
- **1307 isolated node(s):** `$schema`, `collection`, `sourceRoot`, `deleteOutDir`, `name` (+1302 more)
|
||||
These have ≤1 connection - possible missing edges or undocumented components.
|
||||
- **107 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
|
||||
- **118 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
|
||||
|
||||
## Suggested Questions
|
||||
_Questions this graph is uniquely positioned to answer:_
|
||||
|
||||
- **Why does `ApiResponse` connect `BlogsController` to `AuthController`, `PetsController`, `src/services/api.ts`, `ProductsService`, `UsersService`, `WikiController`, `OrdersService`?**
|
||||
_High betweenness centrality (0.070) - this node is a cross-community bridge._
|
||||
- **Why does `Roles()` connect `Roles` to `SmsService`, `CmsController`, `tickets.controller.ts`, `ReviewsController`, `JwtAuthGuard`, `ProductsService`, `MenuService`, `WholesaleApplyDto`, `B2BService`, `FaqService`, `SslController`, `BannersService`, `TestimonialsService`, `IngredientsService`, `PrescriptionsService`, `SmartAdvisorService`, `ContactService`, `AdminTransactionFilterDto`, `reviews.controller.ts`?**
|
||||
_High betweenness centrality (0.063) - this node is a cross-community bridge._
|
||||
- **Why does `JwtAuthGuard` connect `JwtAuthGuard` to `videos.controller.ts`, `PaginationDto`, `CmsController`, `tickets.controller.ts`, `pets/pets.controller.ts`, `ReportsController`, `users.service.ts`, `auth.controller.ts`, `OrdersService`, `DoctorQueryDto`, `reviews.controller.ts`, `BlogsService`, `ProductsService`, `admin.controller.ts`?**
|
||||
_High betweenness centrality (0.033) - this node is a cross-community bridge._
|
||||
- **Why does `ApiResponse` connect `BlogsController` to `AuthController`, `PetsController`, `src/services/api.ts`, `ProductsController`, `UsersService`, `OrdersService`?**
|
||||
_High betweenness centrality (0.069) - this node is a cross-community bridge._
|
||||
- **Why does `Roles()` connect `Roles` to `SmsService`, `CmsController`, `tickets.controller.ts`, `ReviewsService`, `JwtAuthGuard`, `ProductsController`, `MenuService`, `WholesaleApplyDto`, `B2BService`, `FaqService`, `SslController`, `BannersService`, `TestimonialsController`, `IngredientsService`, `PrescriptionsController`, `SmartAdvisorController`, `ContactService`, `payment.controller.ts`, `ProductsService`, `reviews.controller.ts`?**
|
||||
_High betweenness centrality (0.059) - this node is a cross-community bridge._
|
||||
- **Why does `JwtAuthGuard` connect `JwtAuthGuard` to `B2BService`, `PetsController`, `FaqService`, `CmsController`, `tickets.controller.ts`, `CategoriesController`, `admin.module.ts`, `auth.controller.ts`, `pets/pets.controller.ts`, `DoctorQueryDto`, `admin.service.ts`, `reviews.controller.ts`, `PaginationDto`, `UsersService`, `payment.controller.ts`, `ProductsService`?**
|
||||
_High betweenness centrality (0.030) - this node is a cross-community bridge._
|
||||
- **What connects `$schema`, `collection`, `sourceRoot` to the rest of the system?**
|
||||
_1299 weakly-connected nodes found - possible documentation gaps or missing edges._
|
||||
_1307 weakly-connected nodes found - possible documentation gaps or missing edges._
|
||||
- **Should `app.module.ts` be split into smaller, more focused modules?**
|
||||
_Cohesion score 0.05555555555555555 - nodes in this community are weakly interconnected._
|
||||
_Cohesion score 0.07215686274509804 - nodes in this community are weakly interconnected._
|
||||
- **Should `SmsService` be split into smaller, more focused modules?**
|
||||
_Cohesion score 0.055964653902798235 - nodes in this community are weakly interconnected._
|
||||
_Cohesion score 0.055040197897340756 - nodes in this community are weakly interconnected._
|
||||
- **Should `ProductService` be split into smaller, more focused modules?**
|
||||
_Cohesion score 0.06041986687147977 - nodes in this community are weakly interconnected._
|
||||
_Cohesion score 0.060814383923849816 - nodes in this community are weakly interconnected._
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,16 +1,16 @@
|
||||
# Graph Report - canina (2026-08-25)
|
||||
|
||||
## Corpus Check
|
||||
- 553 files · ~1,314,301 words
|
||||
- 557 files · ~1,318,566 words
|
||||
- Verdict: corpus is large enough that graph structure adds value.
|
||||
|
||||
## Summary
|
||||
- 4010 nodes · 7232 edges · 291 communities (201 shown, 90 thin omitted)
|
||||
- 4034 nodes · 7290 edges · 318 communities (201 shown, 117 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: `b854298a`
|
||||
- Built from commit: `fa69aa4c`
|
||||
- Run `git rev-parse HEAD` and compare to check if the graph is stale.
|
||||
- Run `graphify update .` after code changes (no API cost).
|
||||
|
||||
@ -23,20 +23,20 @@
|
||||
- CmsController
|
||||
- tickets.controller.ts
|
||||
- pets/pets.controller.ts
|
||||
- ReportsController
|
||||
- admin.module.ts
|
||||
- devDependencies
|
||||
- ReviewsService
|
||||
- MediaSelector.tsx
|
||||
- FeaturedProducts.tsx
|
||||
- Spinner.tsx
|
||||
- PetProfile.tsx
|
||||
- app-audit-verification.e2e-spec.js
|
||||
- lib/services/api.ts
|
||||
- src/services/api.ts
|
||||
- DoctorQueryDto
|
||||
- RedisService
|
||||
- schema.ts
|
||||
- JwtAuthGuard
|
||||
- ProductsService
|
||||
- ProductsController
|
||||
- CreateVideoDto
|
||||
- Button.tsx
|
||||
- ProductPage.tsx
|
||||
- UserDashboard.tsx
|
||||
- MenuService
|
||||
- BE-001
|
||||
@ -48,41 +48,41 @@
|
||||
- DEVOPS-001
|
||||
- DOC-001
|
||||
- adminRoutes.tsx
|
||||
- wholesale.controller.ts
|
||||
- WholesaleApplyDto
|
||||
- B2BService
|
||||
- AuthController
|
||||
- FaqService
|
||||
- راهنمای تست سیستم (Software Testing)
|
||||
- Button
|
||||
- Button.tsx
|
||||
- CategoriesController
|
||||
- MediaController
|
||||
- What You Must Do When Invoked
|
||||
- SslController
|
||||
- BannersService
|
||||
- TestimonialsService
|
||||
- TestimonialsController
|
||||
- What You Must Do When Invoked
|
||||
- ApiOperation
|
||||
- api
|
||||
- IngredientsService
|
||||
- Media.tsx
|
||||
- cartStore.ts
|
||||
- devDependencies
|
||||
- devDependencies
|
||||
- BlogsController
|
||||
- PrescriptionsService
|
||||
- SmartAdvisorService
|
||||
- PrescriptionsController
|
||||
- SmartAdvisorController
|
||||
- UsersService
|
||||
- UITexts.tsx
|
||||
- Orders.tsx
|
||||
- Role & Core Objective
|
||||
- ContactService
|
||||
- compilerOptions
|
||||
- CreateUserDto
|
||||
- CreateEBankCheckoutDto
|
||||
- GetProductsDto
|
||||
- Blogs.tsx
|
||||
- payment.controller.ts
|
||||
- ProductsService
|
||||
- dependencies
|
||||
- compilerOptions
|
||||
- app.e2e-spec.js
|
||||
- AdminQueryDto
|
||||
- admin.module.ts
|
||||
- PetsController
|
||||
- 20260526145407_init/migration.sql
|
||||
- Required Review Group Closures
|
||||
- compilerOptions
|
||||
@ -91,7 +91,7 @@
|
||||
- Operational Rules & Boundaries
|
||||
- WikiController
|
||||
- PetsController
|
||||
- PaymentService
|
||||
- shop/page.tsx
|
||||
- seo.module.ts
|
||||
- route.ts
|
||||
- 🏢 AI Software Agency — Master Orchestration Protocol v3
|
||||
@ -121,14 +121,14 @@
|
||||
- Comprehensive Change Log
|
||||
- Coupons.tsx
|
||||
- Operational Rules & Boundaries
|
||||
- AdminLoginDto
|
||||
- Reports.tsx
|
||||
- @types/supertest
|
||||
- PrismaService
|
||||
- 1. Summary of Integrity Repairs Performed
|
||||
- Operational Rules & Boundaries
|
||||
- Operational Rules & Boundaries
|
||||
- Operational Rules & Boundaries
|
||||
- reviews.service.ts
|
||||
- reviews.controller.ts
|
||||
- AppService
|
||||
- @types/react-dom
|
||||
- Vazirmatn Changelog
|
||||
@ -137,22 +137,24 @@
|
||||
- compilerOptions
|
||||
- compilerOptions
|
||||
- backend/README.md
|
||||
- auth.module.ts
|
||||
- AuthService
|
||||
- BlogsService
|
||||
- Repository Map
|
||||
- validate_integrity.js
|
||||
- admin-panel/package.json
|
||||
- Sahel-Font
|
||||
- AdminService
|
||||
- RouteErrorBoundary
|
||||
- Sahel-Font
|
||||
- Role & Core Objective
|
||||
- orchestrate.py
|
||||
- backend/package.json
|
||||
- CreateReviewDto
|
||||
- blog/page.tsx
|
||||
- graphify reference: extra exports and benchmark
|
||||
- Phase 2 Final Quality Gate Summary Report
|
||||
- Task Modifications Log
|
||||
- Install
|
||||
- layout.tsx
|
||||
- ErrorBoundary
|
||||
- application/package.json
|
||||
- start-dev.js
|
||||
@ -161,13 +163,17 @@
|
||||
- admin.service.ts
|
||||
- System Discovery
|
||||
- RevalidationService
|
||||
- AdminController
|
||||
- wiki/[slug]/page.tsx
|
||||
- SmsSettingsPage.tsx
|
||||
- Product Requirement Document (PRD)
|
||||
- AuthService
|
||||
- auth.service.ts
|
||||
- trust-seals/page.tsx
|
||||
- exclude
|
||||
- Baseline Command Plan & Reconciled Command History
|
||||
- seo-backfill.ts
|
||||
- @nestjs/swagger
|
||||
- ErrorPages.tsx
|
||||
- class-transformer
|
||||
- with-vpn.sh
|
||||
- Architecture Specification
|
||||
- Project Health Audit Report
|
||||
@ -185,15 +191,16 @@
|
||||
- Phase 3 Audit Traceability Matrix
|
||||
- rebuild_honest_ledger.js
|
||||
- validate_evidence_grade.js
|
||||
- @types/node
|
||||
- typescript
|
||||
- helmet
|
||||
- js-yaml
|
||||
- @nestjs/core
|
||||
- PaginationDto
|
||||
- API Contract Specification
|
||||
- ⚙️ Backend Technical Review (05_dev_backend)
|
||||
- 🎨 Frontend & Admin Panel Technical Review (06_dev_frontend)
|
||||
- 🚀 SEO & Content Strategy Review (12_seo_content)
|
||||
- MetricsController
|
||||
- WikiController
|
||||
- @nestjs/jwt
|
||||
- seed-ui-texts.ts
|
||||
- seed-wiki.ts
|
||||
- update-blog.dto.ts
|
||||
@ -205,12 +212,14 @@
|
||||
- Raw Finding Verification & Disposition Report
|
||||
- React + TypeScript + Vite
|
||||
- Select.tsx
|
||||
- users.service.ts
|
||||
- auth.service.ts
|
||||
- @nestjs/throttler
|
||||
- passport
|
||||
- auth.controller.ts
|
||||
- application/README.md
|
||||
- deploy.sh
|
||||
- 🔒 Security & Performance Review (09_devops_security)
|
||||
- 👁️ UX & Persona Interface Review (08_visual_qa)
|
||||
- reflect-metadata
|
||||
- prisma/scientificTerms.ts
|
||||
- seed-blogs.ts
|
||||
- seed-custom.ts
|
||||
@ -229,6 +238,7 @@
|
||||
- Input.tsx
|
||||
- Textarea.tsx
|
||||
- admin-panel/tsconfig.json
|
||||
- swagger-ui-express
|
||||
- jest
|
||||
- next.config.ts
|
||||
- Shabnam Font README
|
||||
@ -236,9 +246,16 @@
|
||||
- rules/graphify.md
|
||||
- .agents/workflows/graphify.md
|
||||
- instructions.md
|
||||
- @eslint/eslintrc
|
||||
- @eslint/js
|
||||
- eslint-plugin-prettier
|
||||
- 20260526160916_add_ui_texts_and_scientific_terms/migration.sql
|
||||
- ts-jest
|
||||
- RegisterDto
|
||||
- @nestjs/cli
|
||||
- @nestjs/testing
|
||||
- eslint
|
||||
- prisma
|
||||
- source-map-support
|
||||
- supertest
|
||||
- blog.entity.ts
|
||||
- home.entity.ts
|
||||
- wiki.entity.ts
|
||||
@ -258,8 +275,11 @@
|
||||
- start.sh
|
||||
- User Login API
|
||||
- User Logout API
|
||||
- InitiatePaymentDto
|
||||
- ts-loader
|
||||
- @testing-library/jest-dom
|
||||
- ts-node
|
||||
- tsconfig-paths
|
||||
- @types/bcrypt
|
||||
- eslint-plugin-react-hooks
|
||||
- Canina Pharma GmbH
|
||||
- Pets Table
|
||||
@ -281,11 +301,18 @@
|
||||
- .initiateOrderPayment
|
||||
- @tailwindcss/postcss
|
||||
- typescript
|
||||
- @types/compression
|
||||
- typescript-eslint
|
||||
- @types/express
|
||||
- @types/jest
|
||||
- @types/react
|
||||
- globals
|
||||
- @types/js-yaml
|
||||
- vitest
|
||||
- Modal.tsx
|
||||
- @types/multer
|
||||
- @types/passport-jwt
|
||||
- MenuManager.tsx
|
||||
- typescript-eslint
|
||||
- typescript
|
||||
- revalidate/route.ts
|
||||
- MaskableField.tsx
|
||||
@ -293,7 +320,7 @@
|
||||
## God Nodes (most connected - your core abstractions)
|
||||
1. `Roles()` - 106 edges
|
||||
2. `PrismaService` - 87 edges
|
||||
3. `useSettingsStore` - 53 edges
|
||||
3. `useSettingsStore` - 55 edges
|
||||
4. `api` - 44 edges
|
||||
5. `SmsService` - 42 edges
|
||||
6. `PaginationDto` - 41 edges
|
||||
@ -307,39 +334,39 @@
|
||||
docs/02-user-guide.md → backend/uploads/1781288429353-508765350.jpg
|
||||
- `AuthController` --references--> `ApiResponse` [EXTRACTED]
|
||||
backend/src/auth/auth.controller.ts → frontend/admin-panel/src/types/admin.ts
|
||||
- `BlogsController` --references--> `ApiResponse` [EXTRACTED]
|
||||
backend/src/blogs/blogs.controller.ts → frontend/admin-panel/src/types/admin.ts
|
||||
- `HomeController` --references--> `ApiResponse` [EXTRACTED]
|
||||
backend/src/home/home.controller.ts → frontend/admin-panel/src/types/admin.ts
|
||||
- `OrdersController` --references--> `ApiResponse` [EXTRACTED]
|
||||
backend/src/orders/orders.controller.ts → frontend/admin-panel/src/types/admin.ts
|
||||
- `PetsController` --references--> `ApiResponse` [EXTRACTED]
|
||||
backend/src/pets/pets.controller.ts → frontend/admin-panel/src/types/admin.ts
|
||||
- `ProductsController` --references--> `ApiResponse` [EXTRACTED]
|
||||
backend/src/products/products.controller.ts → frontend/admin-panel/src/types/admin.ts
|
||||
|
||||
## Import Cycles
|
||||
- 3-file cycle: `frontend/application/lib/services/api.ts -> frontend/application/lib/store/userStore.ts -> frontend/application/lib/services/authService.ts -> frontend/application/lib/services/api.ts`
|
||||
- 3-file cycle: `frontend/application/lib/services/api.ts -> frontend/application/lib/store/userStore.ts -> frontend/application/lib/store/cartStore.ts -> frontend/application/lib/services/api.ts`
|
||||
- 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 (291 total, 90 thin omitted)
|
||||
## Communities (318 total, 117 thin omitted)
|
||||
|
||||
### Community 0 - "Roles"
|
||||
Cohesion: 0.24
|
||||
Nodes (13): Roles(), PaymentController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Get (+5 more)
|
||||
|
||||
### Community 1 - "app.module.ts"
|
||||
Cohesion: 0.06
|
||||
Nodes (40): AppModule, Module, B2BModule, Module, BannersModule, Module, CmsModule, Module (+32 more)
|
||||
Cohesion: 0.07
|
||||
Nodes (34): BannersModule, Module, CmsModule, Module, SmsModule, Global, Module, ContactModule (+26 more)
|
||||
|
||||
### Community 2 - "SmsService"
|
||||
Cohesion: 0.06
|
||||
Nodes (26): SmsService, Injectable, SmsLogQueryDto, ApiPropertyOptional, IsIn, IsNumber, IsOptional, IsString (+18 more)
|
||||
Nodes (27): SmsLogQuery, SmsService, Injectable, SmsLogQueryDto, ApiPropertyOptional, IsIn, IsNumber, IsOptional (+19 more)
|
||||
|
||||
### Community 3 - "ProductService"
|
||||
Cohesion: 0.06
|
||||
Nodes (36): CatalogClient(), generateMetadata(), CartDrawer, dynamic, revalidate, DEFAULT_CATEGORIES, dynamic, revalidate (+28 more)
|
||||
Nodes (34): generateMetadata(), dynamic, revalidate, DEFAULT_CATEGORIES, dynamic, revalidate, dynamic, revalidate (+26 more)
|
||||
|
||||
### Community 4 - "SafeImage.tsx"
|
||||
Cohesion: 0.06
|
||||
Nodes (26): BlogPostClientProps, BlogPost, BlogPreviewSection(), OrderDetailsModal(), OrderDetailsModalProps, PLAYBACK_RATES, PodcastInlinePlayer(), PodcastInlinePlayerProps (+18 more)
|
||||
Cohesion: 0.09
|
||||
Nodes (21): BlogCategory, BlogPostItem, ProductDetailModalProps, OrderDetailsModalProps, PLAYBACK_RATES, PodcastInlinePlayerProps, PLAYBACK_RATES, PodcastPlayerModal() (+13 more)
|
||||
|
||||
### Community 5 - "CmsController"
|
||||
Cohesion: 0.09
|
||||
@ -347,71 +374,71 @@ 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 - "pets/pets.controller.ts"
|
||||
Cohesion: 0.11
|
||||
Nodes (15): CreatePetDto, ApiProperty, ApiPropertyOptional, IsArray, IsNotEmpty, IsNumber, IsOptional, IsString (+7 more)
|
||||
|
||||
### Community 8 - "ReportsController"
|
||||
Cohesion: 0.17
|
||||
Nodes (9): ReportsController, ApiBearerAuth, ApiOperation, ApiTags, Controller, Get, UseGuards, ReportsService (+1 more)
|
||||
### Community 8 - "admin.module.ts"
|
||||
Cohesion: 0.07
|
||||
Nodes (19): AdminModule, Module, MediaService, Injectable, ReportsController, ApiBearerAuth, ApiOperation, ApiTags (+11 more)
|
||||
|
||||
### Community 9 - "devDependencies"
|
||||
Cohesion: 0.05
|
||||
Nodes (43): devDependencies, eslint, @eslint/eslintrc, @eslint/js, eslint-plugin-prettier, @nestjs/cli, @nestjs/testing, prisma (+35 more)
|
||||
Cohesion: 0.22
|
||||
Nodes (9): devDependencies, ts-jest, @types/bcryptjs, @types/node, typescript, @types/node, typescript, ts-jest (+1 more)
|
||||
|
||||
### Community 10 - "ReviewsService"
|
||||
Cohesion: 0.15
|
||||
Nodes (13): ReviewsController, ApiBearerAuth, ApiOperation, ApiTags, Controller, Delete, Get, Param (+5 more)
|
||||
Cohesion: 0.13
|
||||
Nodes (16): ReviewsController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+8 more)
|
||||
|
||||
### Community 11 - "MediaSelector.tsx"
|
||||
Cohesion: 0.07
|
||||
Nodes (33): ConfirmModal(), ConfirmModalProps, getFileType(), Media, MediaSelector(), MediaSelectorProps, Pagination(), PaginationProps (+25 more)
|
||||
### Community 11 - "Spinner.tsx"
|
||||
Cohesion: 0.09
|
||||
Nodes (30): ConfirmModal(), ConfirmModalProps, getFileType(), Media, MediaSelector(), MediaSelectorProps, maxWidthClasses, Modal() (+22 more)
|
||||
|
||||
### Community 12 - "FeaturedProducts.tsx"
|
||||
Cohesion: 0.19
|
||||
Nodes (8): FeaturedProducts(), ProductCard(), OrderRowSkeleton(), PetProfileSkeleton(), ProductCardSkeleton(), Skeleton(), SkeletonProps, mockProducts
|
||||
### Community 12 - "PetProfile.tsx"
|
||||
Cohesion: 0.13
|
||||
Nodes (13): FeaturedProducts(), OrderDetailsModal(), OrderRowSkeleton(), PetProfileSkeleton(), ProductCardSkeleton(), Skeleton(), SkeletonProps, mockProducts (+5 more)
|
||||
|
||||
### Community 13 - "app-audit-verification.e2e-spec.js"
|
||||
Cohesion: 0.05
|
||||
Nodes (30): CustomHttpExceptionFilter, Catch, PrismaExceptionFilter, Catch, DecimalInterceptor, Injectable, ApiErrorResponse, ErrorDetailField (+22 more)
|
||||
Cohesion: 0.07
|
||||
Nodes (22): AppModule, Module, CustomHttpExceptionFilter, Catch, PrismaExceptionFilter, Catch, DecimalInterceptor, Injectable (+14 more)
|
||||
|
||||
### Community 14 - "lib/services/api.ts"
|
||||
Cohesion: 0.06
|
||||
Nodes (22): ProductReviews, ProductReviews(), ProductReviewsProps, ReviewItem, api, ApiErrorPayload, baseURL, ApiErr (+14 more)
|
||||
Cohesion: 0.09
|
||||
Nodes (21): BlogPost, ContactInfoItem, FAQItem, Testimonial, api, ApiErrorPayload, BASE_DOMAIN, baseURL (+13 more)
|
||||
|
||||
### Community 15 - "src/services/api.ts"
|
||||
Cohesion: 0.08
|
||||
Nodes (32): Layout(), ProtectedRoute(), MenuGroup, Sidebar(), SidebarProps, SubMenuItem, LiveMonitoringSummary, SEARCHABLE_PAGES (+24 more)
|
||||
Cohesion: 0.09
|
||||
Nodes (25): ProtectedRoute(), Login(), B2BManager, SeoSettingsPage, SmartAdvisorManager, SystemSettingsPage, ApiErrorPayload, failedQueue (+17 more)
|
||||
|
||||
### Community 16 - "DoctorQueryDto"
|
||||
Cohesion: 0.09
|
||||
Nodes (24): DoctorsController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+16 more)
|
||||
|
||||
### Community 17 - "RedisService"
|
||||
Cohesion: 0.15
|
||||
Nodes (5): RedisModule, Global, Module, RedisService, Injectable
|
||||
### Community 17 - "schema.ts"
|
||||
Cohesion: 0.14
|
||||
Nodes (18): B2BPage(), generateMetadata(), ContactPage(), generateMetadata(), generateMetadata(), getInitialVideos(), Videos(), ContactFormClient() (+10 more)
|
||||
|
||||
### Community 18 - "JwtAuthGuard"
|
||||
Cohesion: 0.17
|
||||
Nodes (8): JwtAuthGuard, Injectable, B2BWholesaleOrderItem, ROLES_KEY, RequestWithUser, RolesGuard, Injectable, UserReqPayload
|
||||
Cohesion: 0.19
|
||||
Nodes (7): JwtAuthGuard, Injectable, ROLES_KEY, RequestWithUser, RolesGuard, Injectable, UserReqPayload
|
||||
|
||||
### Community 19 - "ProductsService"
|
||||
Cohesion: 0.13
|
||||
Nodes (13): ProductsController, ApiOperation, ApiTags, Body, Controller, Get, Param, Patch (+5 more)
|
||||
### Community 19 - "ProductsController"
|
||||
Cohesion: 0.15
|
||||
Nodes (9): ProductsController, ApiOperation, ApiTags, Body, Controller, Get, Param, Patch (+1 more)
|
||||
|
||||
### Community 20 - "CreateVideoDto"
|
||||
Cohesion: 0.09
|
||||
Nodes (24): CreateVideoDto, ApiProperty, ApiPropertyOptional, IsBoolean, IsNotEmpty, IsOptional, IsString, UpdateVideoDto (+16 more)
|
||||
|
||||
### Community 21 - "Button.tsx"
|
||||
Cohesion: 0.11
|
||||
Nodes (14): ButtonProps, ButtonSize, ButtonVariant, Spinner(), Doctor, FAQ, ProductReview, Reviews() (+6 more)
|
||||
### Community 21 - "ProductPage.tsx"
|
||||
Cohesion: 0.14
|
||||
Nodes (14): PodcastInlinePlayer(), CalculatorState, ICON_MAP, ProductPage(), ProductReviews, useCalculatorStore, ProductReviews(), ProductReviewsProps (+6 more)
|
||||
|
||||
### Community 22 - "UserDashboard.tsx"
|
||||
Cohesion: 0.07
|
||||
Nodes (54): AuthModal, LoginModal, VerifyContent(), AddressModal(), AddressModalProps, ArchiveProductCard(), AuthModal(), AuthModalProps (+46 more)
|
||||
Cohesion: 0.10
|
||||
Nodes (38): VerifyContent(), AddressModal(), AddressModalProps, ArchiveProductCard(), B2BPortal(), BackButton(), BackButtonProps, CheckoutPage() (+30 more)
|
||||
|
||||
### Community 23 - "MenuService"
|
||||
Cohesion: 0.12
|
||||
@ -450,36 +477,36 @@ 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 (23): App(), Props, RouteErrorBoundary, State, HeroBanner, VetTestimonial, CategoryDist, DashboardData (+15 more)
|
||||
Cohesion: 0.07
|
||||
Nodes (21): App(), CategoryDist, DashboardData, WholesaleRequest, AdminRouteConfig, BannersManager, Categories, Dashboard (+13 more)
|
||||
|
||||
### Community 33 - "wholesale.controller.ts"
|
||||
### Community 33 - "WholesaleApplyDto"
|
||||
Cohesion: 0.10
|
||||
Nodes (22): ApiProperty, ApiPropertyOptional, IsNotEmpty, IsOptional, IsString, WholesaleApplyDto, ApiBearerAuth, ApiOperation (+14 more)
|
||||
Nodes (20): ApiProperty, ApiPropertyOptional, IsNotEmpty, IsOptional, IsString, WholesaleApplyDto, ApiBearerAuth, ApiOperation (+12 more)
|
||||
|
||||
### Community 34 - "B2BService"
|
||||
Cohesion: 0.14
|
||||
Nodes (14): B2BController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Get, Param (+6 more)
|
||||
Cohesion: 0.12
|
||||
Nodes (17): B2BController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Get, Param (+9 more)
|
||||
|
||||
### Community 35 - "AuthController"
|
||||
Cohesion: 0.27
|
||||
Nodes (12): AuthController, ApiBadRequestResponse, ApiBearerAuth, ApiOkResponse, ApiOperation, ApiTags, Body, Controller (+4 more)
|
||||
|
||||
### Community 36 - "FaqService"
|
||||
Cohesion: 0.14
|
||||
Nodes (14): FaqController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+6 more)
|
||||
Cohesion: 0.12
|
||||
Nodes (16): FaqController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+8 more)
|
||||
|
||||
### Community 37 - "راهنمای تست سیستم (Software Testing)"
|
||||
Cohesion: 0.07
|
||||
Nodes (25): اجرای بکاند, اجرای فرانتاند, اجرای پروژه در سرور با PM2, برای راهاندازی بکاند:, برای راهاندازی فرانتاند Next.js:, بیلد کردن پروژه (Building), ذخیره پروسهها تا پس از ریاستارت سرور قطع نشوند:, راهاندازی و انتشار سیستم (Setup & Deployment) (+17 more)
|
||||
|
||||
### Community 38 - "Button"
|
||||
Cohesion: 0.16
|
||||
Nodes (13): TransactionReceiptData, TransactionReceiptModal(), TransactionReceiptModalProps, Button(), ThSort(), ThSortProps, GatewayHealth, Stats (+5 more)
|
||||
### Community 38 - "Button.tsx"
|
||||
Cohesion: 0.07
|
||||
Nodes (26): TransactionReceiptData, TransactionReceiptModal(), TransactionReceiptModalProps, Button(), ButtonProps, ButtonSize, ButtonVariant, ThSort() (+18 more)
|
||||
|
||||
### Community 39 - "CategoriesController"
|
||||
Cohesion: 0.10
|
||||
Nodes (16): CategoriesController, ApiBearerAuth, ApiOperation, ApiQuery, ApiTags, Body, Controller, Delete (+8 more)
|
||||
Cohesion: 0.09
|
||||
Nodes (17): CategoriesController, ApiBearerAuth, ApiOperation, ApiQuery, ApiTags, Body, Controller, Delete (+9 more)
|
||||
|
||||
### Community 40 - "MediaController"
|
||||
Cohesion: 0.11
|
||||
@ -497,21 +524,25 @@ Nodes (14): SslController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controlle
|
||||
Cohesion: 0.13
|
||||
Nodes (15): BannersController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+7 more)
|
||||
|
||||
### Community 44 - "TestimonialsService"
|
||||
### Community 44 - "TestimonialsController"
|
||||
Cohesion: 0.13
|
||||
Nodes (14): TestimonialsController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+6 more)
|
||||
Nodes (12): TestimonialsController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+4 more)
|
||||
|
||||
### Community 45 - "What You Must Do When Invoked"
|
||||
Cohesion: 0.07
|
||||
Nodes (26): For /graphify add and --watch, For /graphify query, For the commit hook and native CLAUDE.md integration, For --update and --cluster-only, /graphify, Honesty Rules, Interpreter guard for subcommands, Part A - Structural extraction for code files (+18 more)
|
||||
|
||||
### Community 46 - "api"
|
||||
Cohesion: 0.13
|
||||
Nodes (13): Layout(), MenuGroup, Sidebar(), SidebarProps, SubMenuItem, LiveMonitoringSummary, SEARCHABLE_PAGES, Topbar() (+5 more)
|
||||
|
||||
### Community 47 - "IngredientsService"
|
||||
Cohesion: 0.13
|
||||
Nodes (14): IngredientsController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+6 more)
|
||||
|
||||
### Community 48 - "Media.tsx"
|
||||
Cohesion: 0.19
|
||||
Nodes (9): ImagePreviewModal(), ImagePreviewModalProps, getFileType(), Media, MediaManager(), ProductItem, Media, PrescriptionsManager (+1 more)
|
||||
### Community 48 - "cartStore.ts"
|
||||
Cohesion: 0.13
|
||||
Nodes (6): OrderSuccess(), OrderTracking(), OrderService, CartItem, CartStore, Order
|
||||
|
||||
### Community 49 - "devDependencies"
|
||||
Cohesion: 0.11
|
||||
@ -525,21 +556,21 @@ Nodes (15): eslint-config-next, devDependencies, eslint, eslint-config-next, jsd
|
||||
Cohesion: 0.14
|
||||
Nodes (16): BlogsController, ApiBearerAuth, ApiOperation, ApiQuery, ApiTags, Body, Controller, Delete (+8 more)
|
||||
|
||||
### Community 52 - "PrescriptionsService"
|
||||
Cohesion: 0.14
|
||||
Nodes (14): PrescriptionsController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Get, Param (+6 more)
|
||||
### Community 52 - "PrescriptionsController"
|
||||
Cohesion: 0.15
|
||||
Nodes (12): PrescriptionsController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Get, Param (+4 more)
|
||||
|
||||
### Community 53 - "SmartAdvisorService"
|
||||
Cohesion: 0.13
|
||||
Nodes (14): SmartAdvisorController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+6 more)
|
||||
### Community 53 - "SmartAdvisorController"
|
||||
Cohesion: 0.14
|
||||
Nodes (12): SmartAdvisorController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Get (+4 more)
|
||||
|
||||
### Community 54 - "UsersService"
|
||||
Cohesion: 0.08
|
||||
Nodes (31): AddressDto, ApiProperty, ApiPropertyOptional, IsBoolean, IsNotEmpty, IsOptional, IsString, ApiPropertyOptional (+23 more)
|
||||
Cohesion: 0.06
|
||||
Nodes (42): DEFAULT_JWT_REFRESH_SECRET, DEFAULT_JWT_SECRET, getJwtSecret(), AuthModule, Module, JwtPayload, JwtStrategy, Injectable (+34 more)
|
||||
|
||||
### Community 55 - "UITexts.tsx"
|
||||
Cohesion: 0.09
|
||||
Nodes (20): ICON_REGISTRY, IconPickerModal(), IconPickerModalProps, ActiveStates, PRESET_BG_COLORS, PRESET_COLORS, RichTextEditor(), RichTextEditorProps (+12 more)
|
||||
Nodes (19): ICON_REGISTRY, IconPickerModal(), IconPickerModalProps, ImagePreviewModal(), ImagePreviewModalProps, ToggleSwitch(), ToggleSwitchProps, ProductItem (+11 more)
|
||||
|
||||
### Community 56 - "Orders.tsx"
|
||||
Cohesion: 0.09
|
||||
@ -557,21 +588,21 @@ Nodes (11): ContactController, Body, Controller, Get, Param, Post, Put, Query (+
|
||||
Cohesion: 0.06
|
||||
Nodes (30): compilerOptions, allowSyntheticDefaultImports, baseUrl, declaration, emitDecoratorMetadata, esModuleInterop, experimentalDecorators, forceConsistentCasingInFileNames (+22 more)
|
||||
|
||||
### Community 60 - "CreateUserDto"
|
||||
Cohesion: 0.24
|
||||
Nodes (10): CreateUserDto, ApiProperty, ApiPropertyOptional, IsEmail, IsNotEmpty, IsNumber, IsOptional, IsString (+2 more)
|
||||
### Community 60 - "Blogs.tsx"
|
||||
Cohesion: 0.15
|
||||
Nodes (11): ActiveStates, PRESET_BG_COLORS, PRESET_COLORS, RichTextEditor(), RichTextEditorProps, AuthorUser, BlogCategory, BlogPost (+3 more)
|
||||
|
||||
### Community 61 - "CreateEBankCheckoutDto"
|
||||
Cohesion: 0.22
|
||||
Nodes (8): CreateEBankCheckoutDto, ApiProperty, ApiPropertyOptional, IsNotEmpty, IsNumber, IsOptional, IsString, Min
|
||||
### Community 61 - "payment.controller.ts"
|
||||
Cohesion: 0.10
|
||||
Nodes (22): AdminTransactionFilterDto, ApiPropertyOptional, IsIn, IsNumber, IsOptional, IsString, Type, CreateEBankCheckoutDto (+14 more)
|
||||
|
||||
### Community 62 - "GetProductsDto"
|
||||
Cohesion: 0.29
|
||||
Nodes (6): GetProductsDto, ApiPropertyOptional, IsEnum, IsOptional, IsString, Query
|
||||
### Community 62 - "ProductsService"
|
||||
Cohesion: 0.18
|
||||
Nodes (10): GetProductsDto, ApiPropertyOptional, IsEnum, IsOptional, IsString, Query, ProductsModule, Module (+2 more)
|
||||
|
||||
### Community 63 - "dependencies"
|
||||
Cohesion: 0.05
|
||||
Nodes (43): dependencies, bcrypt, bcryptjs, class-transformer, class-validator, compression, helmet, ioredis (+35 more)
|
||||
Cohesion: 0.09
|
||||
Nodes (23): dependencies, bcrypt, bcryptjs, class-validator, compression, ioredis, @nestjs/common, @nestjs/passport (+15 more)
|
||||
|
||||
### Community 64 - "compilerOptions"
|
||||
Cohesion: 0.10
|
||||
@ -582,12 +613,12 @@ Cohesion: 0.50
|
||||
Nodes (3): app_module_1, supertest_1, testing_1
|
||||
|
||||
### Community 66 - "AdminQueryDto"
|
||||
Cohesion: 0.21
|
||||
Nodes (6): ApiQuery, Query, AdminQueryDto, ApiPropertyOptional, IsOptional, IsString
|
||||
Cohesion: 0.18
|
||||
Nodes (7): ApiQuery, Get, Query, AdminQueryDto, ApiPropertyOptional, IsOptional, IsString
|
||||
|
||||
### Community 67 - "admin.module.ts"
|
||||
Cohesion: 0.06
|
||||
Nodes (22): AdminModule, Module, MediaService, Injectable, PetsController, ApiBearerAuth, ApiOperation, ApiQuery (+14 more)
|
||||
### Community 67 - "PetsController"
|
||||
Cohesion: 0.11
|
||||
Nodes (13): PetsController, ApiBearerAuth, ApiOperation, ApiQuery, ApiTags, Controller, Delete, Get (+5 more)
|
||||
|
||||
### Community 68 - "20260526145407_init/migration.sql"
|
||||
Cohesion: 0.27
|
||||
@ -602,8 +633,8 @@ Cohesion: 0.08
|
||||
Nodes (23): compilerOptions, allowImportingTsExtensions, erasableSyntaxOnly, jsx, lib, module, moduleDetection, moduleResolution (+15 more)
|
||||
|
||||
### Community 71 - "getPageMetadata"
|
||||
Cohesion: 0.05
|
||||
Nodes (30): generateMetadata(), Blog(), generateMetadata(), getBlogs(), getCategories(), revalidate, generateMetadata(), generateMetadata() (+22 more)
|
||||
Cohesion: 0.09
|
||||
Nodes (16): generateMetadata(), CatalogClient(), generateMetadata(), generateMetadata(), generateMetadata(), generateMetadata(), getHomeData(), Home() (+8 more)
|
||||
|
||||
### Community 72 - "Operational Rules & Boundaries"
|
||||
Cohesion: 0.11
|
||||
@ -621,10 +652,6 @@ Nodes (14): ApiBearerAuth, ApiOperation, ApiQuery, ApiTags, Body, Controller, De
|
||||
Cohesion: 0.08
|
||||
Nodes (32): CreateHealthLogDto, ApiProperty, ApiPropertyOptional, IsNotEmpty, IsOptional, IsString, CreateReminderDto, ApiProperty (+24 more)
|
||||
|
||||
### Community 76 - "PaymentService"
|
||||
Cohesion: 0.11
|
||||
Nodes (9): AdminTransactionFilterDto, ApiPropertyOptional, IsIn, IsNumber, IsOptional, IsString, Type, PaymentService (+1 more)
|
||||
|
||||
### Community 77 - "seo.module.ts"
|
||||
Cohesion: 0.16
|
||||
Nodes (10): SeoController, ApiOperation, ApiTags, Controller, Get, Param, SeoModule, Module (+2 more)
|
||||
@ -666,16 +693,16 @@ Cohesion: 0.12
|
||||
Nodes (17): dependencies, axios, lucide-react, motion, next, react, react-dom, sonner (+9 more)
|
||||
|
||||
### Community 88 - "useSettingsStore"
|
||||
Cohesion: 0.09
|
||||
Nodes (26): B2BPortal, ClientLayout(), BrandLogo(), BrandLogoProps, EnamadBadge(), FAQItem, FAQSection(), Footer() (+18 more)
|
||||
Cohesion: 0.11
|
||||
Nodes (24): AuthModal, B2BPortal, CartDrawer, ClientLayout(), LoginModal, AuthModal(), AuthModalProps, extractOtpFromText() (+16 more)
|
||||
|
||||
### Community 89 - "seed-products.ts"
|
||||
Cohesion: 0.17
|
||||
Nodes (12): prisma, main(), prisma, determineSuitableFor(), findOrCreateCategory(), getProductImageUrl(), main(), parseSize() (+4 more)
|
||||
|
||||
### Community 90 - "HomeClient.tsx"
|
||||
Cohesion: 0.12
|
||||
Nodes (20): HomeClient(), HomeClientProps, generateMetadata(), getHomeData(), Home(), CATEGORY_MAP, ICON_MAP, BannerPlacement() (+12 more)
|
||||
Cohesion: 0.10
|
||||
Nodes (20): HomeClient(), HomeClientProps, CATEGORY_MAP, ICON_MAP, BannerPlacement(), BannerPlacementProps, BlogPreviewSection(), FAQSection() (+12 more)
|
||||
|
||||
### Community 91 - "Reconciled Audit Roles & Assignments"
|
||||
Cohesion: 0.12
|
||||
@ -690,20 +717,20 @@ Cohesion: 0.13
|
||||
Nodes (14): 10. Dependency & Wave Adjustments, 11. Acceptance Criteria Refinements, 12. Business and Product Decision Classification, 13. Final Recommended Backlog Summary, 1. Executive Assessment, 2. Findings That Require No Change, 3. Findings Requiring Task Refinements, 4. Tasks Requiring Splitting (+6 more)
|
||||
|
||||
### Community 95 - "blog/[slug]/page.tsx"
|
||||
Cohesion: 0.15
|
||||
Nodes (17): BlogPostPage(), generateMetadata(), getBlog(), revalidate, safeIso(), safeLocalDate(), generateMetadata(), generateMetadata() (+9 more)
|
||||
Cohesion: 0.23
|
||||
Nodes (12): BlogPostPage(), generateMetadata(), getBlog(), revalidate, safeIso(), safeLocalDate(), generateMetadata(), revalidate (+4 more)
|
||||
|
||||
### Community 96 - "compilerOptions"
|
||||
Cohesion: 0.06
|
||||
Nodes (32): compilerOptions, allowJs, esModuleInterop, incremental, isolatedModules, jsx, lib, module (+24 more)
|
||||
|
||||
### Community 98 - "scripts"
|
||||
Cohesion: 0.14
|
||||
Nodes (14): scripts, build, build:nest, docs:generate, lint, start, start:debug, start:dev (+6 more)
|
||||
Cohesion: 0.13
|
||||
Nodes (15): scripts, build, build:nest, docs:generate, lint, seo:backfill, start, start:debug (+7 more)
|
||||
|
||||
### Community 99 - "BlogsController"
|
||||
Cohesion: 0.16
|
||||
Nodes (14): BlogsController, ApiBearerAuth, ApiNotFoundResponse, ApiOkResponse, ApiOperation, ApiTags, Body, Controller (+6 more)
|
||||
Cohesion: 0.06
|
||||
Nodes (34): BlogsController, ApiBearerAuth, ApiNotFoundResponse, ApiOkResponse, ApiOperation, ApiTags, Body, Controller (+26 more)
|
||||
|
||||
### Community 100 - "Deep Audit Summary Report"
|
||||
Cohesion: 0.14
|
||||
@ -722,20 +749,20 @@ Cohesion: 0.15
|
||||
Nodes (12): 10. `TASK-VERIFY-001`, 1. `TASK-SEC-001`, 2. `TASK-SEC-002`, 3. `TASK-SEC-003`, 4. `TASK-FIN-001`, 5. `TASK-BUILD-001`, 6. `TASK-AUTH-001`, 7. `TASK-FE-001` (+4 more)
|
||||
|
||||
### Community 104 - "Coupons.tsx"
|
||||
Cohesion: 0.15
|
||||
Nodes (11): formatPriceWithCommas(), PriceInput(), PriceInputProps, toEnglishDigits(), Coupon, CouponFormData, CouponModalProps, CouponTarget (+3 more)
|
||||
Cohesion: 0.13
|
||||
Nodes (12): formatPriceWithCommas(), PriceInput(), PriceInputProps, toEnglishDigits(), Coupon, CouponFormData, CouponModalProps, CouponTarget (+4 more)
|
||||
|
||||
### Community 105 - "Operational Rules & Boundaries"
|
||||
Cohesion: 0.17
|
||||
Nodes (11): 1. Detect Test Runner from Tech Stack, 2. Execution Output Capture (Mandatory), 3. Acceptance Criteria Verification, 4. Failure Routing Protocol, 5. Success Routing Protocol, 6. Forbidden Actions, Expected JSON Output Schema, Operational Rules & Boundaries (+3 more)
|
||||
|
||||
### Community 106 - "AdminLoginDto"
|
||||
Cohesion: 0.29
|
||||
Nodes (6): AdminLoginDto, ApiProperty, IsEmail, IsNotEmpty, IsString, MinLength
|
||||
### Community 106 - "Reports.tsx"
|
||||
Cohesion: 0.20
|
||||
Nodes (7): BestSellerItem, CategoryDistItem, COLORS, CustomTooltipProps, ReportData, TopCouponItem, Reports
|
||||
|
||||
### Community 108 - "PrismaService"
|
||||
Cohesion: 0.07
|
||||
Nodes (19): CategoryQuery, MeliPayamakPattern, MeliPayamakResponse, SendPatternSmsOptions, SmsConfig, SmsLogQuery, CreateContactSubmissionDto, UpdateContactInfoItemDto (+11 more)
|
||||
Cohesion: 0.06
|
||||
Nodes (26): PetQuery, WikiQuery, MeliPayamakPattern, MeliPayamakResponse, SendPatternSmsOptions, SmsConfig, CreateContactSubmissionDto, UpdateContactInfoItemDto (+18 more)
|
||||
|
||||
### Community 109 - "1. Summary of Integrity Repairs Performed"
|
||||
Cohesion: 0.17
|
||||
@ -753,9 +780,9 @@ Nodes (10): 1. Mark Active Task as Complete, 2. Documentation Updates, 3. Dynami
|
||||
Cohesion: 0.18
|
||||
Nodes (10): 1. Pre-Deployment Checklist, 2. Build Verification, 3. Deployment Strategy (Based on Target), 4. Post-Deployment Health Check, 5. Forbidden Actions, Expected JSON Output Schema, Operational Rules & Boundaries, Required Output Artifacts (What files to write/update) (+2 more)
|
||||
|
||||
### Community 113 - "reviews.service.ts"
|
||||
Cohesion: 0.29
|
||||
Nodes (5): ApiProperty, IsIn, IsOptional, IsString, UpdateReviewDto
|
||||
### Community 113 - "reviews.controller.ts"
|
||||
Cohesion: 0.15
|
||||
Nodes (13): CreateReviewDto, ApiProperty, IsInt, IsNotEmpty, IsOptional, IsString, Min, ApiProperty (+5 more)
|
||||
|
||||
### Community 114 - "AppService"
|
||||
Cohesion: 0.29
|
||||
@ -785,10 +812,6 @@ Nodes (9): compilerOptions, esModuleInterop, module, moduleResolution, skipLibCh
|
||||
Cohesion: 0.20
|
||||
Nodes (9): Compile and run the project, Deployment, Description, License, Project setup, Resources, Run tests, Stay in touch (+1 more)
|
||||
|
||||
### Community 122 - "auth.module.ts"
|
||||
Cohesion: 0.18
|
||||
Nodes (10): DEFAULT_JWT_REFRESH_SECRET, DEFAULT_JWT_SECRET, getJwtSecret(), AuthModule, Module, JwtPayload, JwtStrategy, Injectable (+2 more)
|
||||
|
||||
### Community 124 - "Repository Map"
|
||||
Cohesion: 0.20
|
||||
Nodes (9): 1. Active Customer Storefront: React 19 + Vite Application, 2. Active Backend Service: NestJS Application, 3. Excluded Placeholder / Non-Auditable Directories, Active Applications & Non-Auditable Scopes, Documentation Governance, Important Configuration & Infrastructure Files, Mandatory Global Audit Exclusions, Repository Map (+1 more)
|
||||
@ -806,8 +829,12 @@ 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 - "AdminService"
|
||||
Cohesion: 0.13
|
||||
Nodes (5): Delete, Param, Put, AdminService, Injectable
|
||||
Cohesion: 0.09
|
||||
Nodes (13): AdminController, ApiBearerAuth, ApiOperation, ApiTags, Body, Controller, Delete, Param (+5 more)
|
||||
|
||||
### Community 129 - "RouteErrorBoundary"
|
||||
Cohesion: 0.22
|
||||
Nodes (3): Props, RouteErrorBoundary, State
|
||||
|
||||
### Community 130 - "Sahel-Font"
|
||||
Cohesion: 0.20
|
||||
@ -825,9 +852,9 @@ Nodes (8): cmd_next_task(), cmd_progress(), cmd_reset(), cmd_status(), cmd_unblo
|
||||
Cohesion: 0.22
|
||||
Nodes (8): author, description, license, name, prisma, seed, private, version
|
||||
|
||||
### Community 134 - "CreateReviewDto"
|
||||
Cohesion: 0.17
|
||||
Nodes (11): CreateReviewDto, ApiProperty, IsInt, IsNotEmpty, IsOptional, IsString, Min, Body (+3 more)
|
||||
### Community 134 - "blog/page.tsx"
|
||||
Cohesion: 0.38
|
||||
Nodes (6): Blog(), generateMetadata(), getBlogs(), getCategories(), revalidate, BlogPage()
|
||||
|
||||
### Community 135 - "graphify reference: extra exports and benchmark"
|
||||
Cohesion: 0.22
|
||||
@ -845,6 +872,10 @@ Nodes (8): 1. `TASK-AUTH-001`, 2. `TASK-FIN-001`, 3. `DECISION-002`, 4. `TASK-VE
|
||||
Cohesion: 0.22
|
||||
Nodes (8): Arch Linux, bower, Install, npm, Shabnam Font, yarn, طریقه استفاده در صفحات وب:, نمونه متن Sample:
|
||||
|
||||
### Community 139 - "layout.tsx"
|
||||
Cohesion: 0.43
|
||||
Nodes (5): generateMetadata(), RootLayout(), lalezar, vazirmatn, generateOrganizationSchema()
|
||||
|
||||
### Community 140 - "ErrorBoundary"
|
||||
Cohesion: 0.22
|
||||
Nodes (3): ErrorBoundary, Props, State
|
||||
@ -862,20 +893,20 @@ Cohesion: 0.25
|
||||
Nodes (6): app_module_1, core_1, fs, path, swagger_1, yaml
|
||||
|
||||
### Community 145 - "admin.service.ts"
|
||||
Cohesion: 0.16
|
||||
Nodes (11): CouponInput, CouponTargetInput, PaginationQuery, ProductDto, ApiPropertyOptional, IsArray, IsBoolean, IsNumber (+3 more)
|
||||
Cohesion: 0.13
|
||||
Nodes (20): CouponInput, CouponTargetInput, PaginationQuery, ProductDto, ApiPropertyOptional, IsArray, IsBoolean, IsNumber (+12 more)
|
||||
|
||||
### Community 146 - "System Discovery"
|
||||
Cohesion: 0.25
|
||||
Nodes (7): Active Core Applications, Current Architecture, Evidence-Based Status Matrix, Excluded / Non-Auditable Artifacts, Major Business Domains Discovered, System Discovery, Technical Architecture Summary
|
||||
|
||||
### Community 147 - "RevalidationService"
|
||||
Cohesion: 0.14
|
||||
Cohesion: 0.17
|
||||
Nodes (5): RevalidationModule, Global, Module, RevalidationService, Injectable
|
||||
|
||||
### Community 148 - "AdminController"
|
||||
Cohesion: 0.16
|
||||
Nodes (7): AdminController, ApiBearerAuth, ApiTags, Body, Controller, Post, UseGuards
|
||||
### Community 148 - "wiki/[slug]/page.tsx"
|
||||
Cohesion: 0.60
|
||||
Nodes (5): generateMetadata(), getRelatedProducts(), getWikiTerm(), WikiTermPage(), generateMedicalWebPageSchema()
|
||||
|
||||
### Community 149 - "SmsSettingsPage.tsx"
|
||||
Cohesion: 0.29
|
||||
@ -885,9 +916,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 - "AuthService"
|
||||
Cohesion: 0.21
|
||||
Nodes (3): AuthService, Injectable, normalizeMobile()
|
||||
### Community 151 - "auth.service.ts"
|
||||
Cohesion: 0.08
|
||||
Nodes (13): AdminLoginInput, AuthService, LoginInput, RegisterInput, Injectable, SendOtpDto, ApiProperty, IsNotEmpty (+5 more)
|
||||
|
||||
### Community 153 - "exclude"
|
||||
Cohesion: 0.22
|
||||
@ -897,6 +928,10 @@ Nodes (8): exclude, extends, dist, node_modules, prisma, **/*spec.ts, test, ./ts
|
||||
Cohesion: 0.29
|
||||
Nodes (6): Attempted Command Execution Log, Backend `backend/package.json` Scripts, Baseline Command Plan & Reconciled Command History, Package Scripts Safety Analysis, Permitted Safe Checks for Phase 2, Root `package.json` Scripts
|
||||
|
||||
### Community 155 - "seo-backfill.ts"
|
||||
Cohesion: 0.67
|
||||
Nodes (3): prisma, runSeoBackfill(), stripHtml()
|
||||
|
||||
### Community 159 - "with-vpn.sh"
|
||||
Cohesion: 0.62
|
||||
Nodes (6): cleanup(), log(), with-vpn.sh script, start_vpn(), stop_vpn(), vpn_is_up()
|
||||
@ -966,8 +1001,8 @@ Cohesion: 0.40
|
||||
Nodes (4): activeFiles, errors, validationOutput, warnings
|
||||
|
||||
### Community 179 - "PaginationDto"
|
||||
Cohesion: 0.06
|
||||
Nodes (25): BlogsModule, Module, BlogFilterDto, BlogsService, Injectable, PaginationDto, SortOrder, ApiPropertyOptional (+17 more)
|
||||
Cohesion: 0.05
|
||||
Nodes (29): BlogsModule, Module, BlogFilterDto, BlogsService, Injectable, PaginationDto, SortOrder, ApiPropertyOptional (+21 more)
|
||||
|
||||
### Community 180 - "API Contract Specification"
|
||||
Cohesion: 0.50
|
||||
@ -989,10 +1024,6 @@ Nodes (3): Overview & Content Foundation, SEO & Content Requirements, 🚀 SEO &
|
||||
Cohesion: 0.29
|
||||
Nodes (5): ApiExcludeController, MetricsController, Controller, Get, Res
|
||||
|
||||
### Community 185 - "WikiController"
|
||||
Cohesion: 0.13
|
||||
Nodes (13): ApiNotFoundResponse, ApiOkResponse, ApiOperation, ApiTags, Controller, Get, Param, Query (+5 more)
|
||||
|
||||
### Community 191 - "graphify reference: add a URL and watch a folder"
|
||||
Cohesion: 0.50
|
||||
Nodes (3): For /graphify add, For --watch, graphify reference: add a URL and watch a folder
|
||||
@ -1017,9 +1048,9 @@ Nodes (3): Expanding the ESLint configuration, React Compiler, React + TypeScrip
|
||||
Cohesion: 0.50
|
||||
Nodes (3): Select, SelectOption, SelectProps
|
||||
|
||||
### Community 199 - "auth.service.ts"
|
||||
Cohesion: 0.11
|
||||
Nodes (19): AdminLoginInput, LoginInput, RegisterInput, LoginDto, ApiProperty, IsNotEmpty, IsString, MinLength (+11 more)
|
||||
### Community 199 - "auth.controller.ts"
|
||||
Cohesion: 0.08
|
||||
Nodes (25): AdminLoginDto, ApiProperty, IsEmail, IsNotEmpty, IsString, MinLength, LoginDto, ApiProperty (+17 more)
|
||||
|
||||
### Community 200 - "application/README.md"
|
||||
Cohesion: 0.50
|
||||
@ -1037,45 +1068,41 @@ Nodes (3): ADR-AUTH-001: Admin Panel Authentication Architecture & Token Managem
|
||||
Cohesion: 0.67
|
||||
Nodes (3): Shabnam Font README, Shabnam Font Sample, Vazir Font
|
||||
|
||||
### Community 239 - "RegisterDto"
|
||||
Cohesion: 0.22
|
||||
Nodes (8): RegisterDto, ApiProperty, ApiPropertyOptional, IsEmail, IsNotEmpty, IsOptional, IsString, MinLength
|
||||
|
||||
### Community 264 - "InitiatePaymentDto"
|
||||
Cohesion: 0.43
|
||||
Nodes (7): InitiatePaymentDto, InitiateWalletTopupDto, ApiProperty, ApiPropertyOptional, IsNotEmpty, IsOptional, IsString
|
||||
### Community 294 - "ZibalService"
|
||||
Cohesion: 0.09
|
||||
Nodes (4): PaymentService, Injectable, Injectable, ZibalService
|
||||
|
||||
### Community 298 - ".initiateOrderPayment"
|
||||
Cohesion: 0.20
|
||||
Nodes (10): ApiPropertyOptional, IsOptional, IsString, ZibalCallbackQueryDto, ApiBadRequestResponse, ApiOkResponse, Req, Res (+2 more)
|
||||
|
||||
### Community 313 - "Modal.tsx"
|
||||
Cohesion: 0.08
|
||||
Nodes (17): maxWidthClasses, Modal(), ModalProps, ContactInfoItem, ContactSubmission, MENU_TABS, MenuItem, MenuType (+9 more)
|
||||
### Community 313 - "MenuManager.tsx"
|
||||
Cohesion: 0.33
|
||||
Nodes (4): MENU_TABS, MenuItem, MenuType, MenuManager
|
||||
|
||||
### Community 317 - "revalidate/route.ts"
|
||||
Cohesion: 0.83
|
||||
Nodes (3): GET(), handleRevalidate(), POST()
|
||||
|
||||
## Knowledge Gaps
|
||||
- **1300 isolated node(s):** `$schema`, `collection`, `sourceRoot`, `deleteOutDir`, `name` (+1295 more)
|
||||
- **1307 isolated node(s):** `$schema`, `collection`, `sourceRoot`, `deleteOutDir`, `name` (+1302 more)
|
||||
These have ≤1 connection - possible missing edges or undocumented components.
|
||||
- **90 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
|
||||
- **117 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`, `PetsController`, `app-audit-verification.e2e-spec.js`, `ProductsService`, `UsersService`, `WikiController`, `OrdersService`?**
|
||||
_High betweenness centrality (0.070) - this node is a cross-community bridge._
|
||||
- **Why does `Roles()` connect `Roles` to `wholesale.controller.ts`, `B2BService`, `SmsService`, `FaqService`, `CmsController`, `tickets.controller.ts`, `SslController`, `BannersService`, `ReviewsService`, `TestimonialsService`, `IngredientsService`, `JwtAuthGuard`, `ProductsService`, `PrescriptionsService`, `SmartAdvisorService`, `MenuService`, `ContactService`?**
|
||||
_High betweenness centrality (0.063) - this node is a cross-community bridge._
|
||||
- **Why does `JwtAuthGuard` connect `JwtAuthGuard` to `wholesale.controller.ts`, `admin.module.ts`, `CmsController`, `tickets.controller.ts`, `auth.service.ts`, `pets/pets.controller.ts`, `users.service.ts`, `DoctorQueryDto`, `admin.service.ts`, `PaginationDto`?**
|
||||
_High betweenness centrality (0.033) - this node is a cross-community bridge._
|
||||
- **Why does `ApiResponse` connect `BlogsController` to `AuthController`, `PetsController`, `src/services/api.ts`, `ProductsController`, `UsersService`, `OrdersService`?**
|
||||
_High betweenness centrality (0.069) - this node is a cross-community bridge._
|
||||
- **Why does `Roles()` connect `Roles` to `SmsService`, `CmsController`, `tickets.controller.ts`, `ReviewsService`, `JwtAuthGuard`, `ProductsController`, `MenuService`, `WholesaleApplyDto`, `B2BService`, `FaqService`, `SslController`, `BannersService`, `TestimonialsController`, `IngredientsService`, `PrescriptionsController`, `SmartAdvisorController`, `ContactService`, `payment.controller.ts`, `ProductsService`, `reviews.controller.ts`?**
|
||||
_High betweenness centrality (0.059) - this node is a cross-community bridge._
|
||||
- **Why does `JwtAuthGuard` connect `JwtAuthGuard` to `B2BService`, `PetsController`, `FaqService`, `CmsController`, `tickets.controller.ts`, `CategoriesController`, `admin.module.ts`, `auth.controller.ts`, `pets/pets.controller.ts`, `DoctorQueryDto`, `admin.service.ts`, `reviews.controller.ts`, `PaginationDto`, `UsersService`, `payment.controller.ts`, `ProductsService`?**
|
||||
_High betweenness centrality (0.030) - this node is a cross-community bridge._
|
||||
- **What connects `$schema`, `collection`, `sourceRoot` to the rest of the system?**
|
||||
_1300 weakly-connected nodes found - possible documentation gaps or missing edges._
|
||||
_1307 weakly-connected nodes found - possible documentation gaps or missing edges._
|
||||
- **Should `app.module.ts` be split into smaller, more focused modules?**
|
||||
_Cohesion score 0.05632360471070148 - nodes in this community are weakly interconnected._
|
||||
_Cohesion score 0.07215686274509804 - nodes in this community are weakly interconnected._
|
||||
- **Should `SmsService` be split into smaller, more focused modules?**
|
||||
_Cohesion score 0.055964653902798235 - nodes in this community are weakly interconnected._
|
||||
_Cohesion score 0.055040197897340756 - nodes in this community are weakly interconnected._
|
||||
- **Should `ProductService` be split into smaller, more focused modules?**
|
||||
_Cohesion score 0.057342657342657345 - nodes in this community are weakly interconnected._
|
||||
_Cohesion score 0.060814383923849816 - nodes in this community are weakly interconnected._
|
||||
File diff suppressed because one or more lines are too long
2
graphify-out/cache/stat-index.json
vendored
2
graphify-out/cache/stat-index.json
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
14397
graphify-out/graph.json
14397
graphify-out/graph.json
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user