refactor: unify domain and contact emails to canina.ir across all apps and seeds
All checks were successful
Deploy Canina / deploy (push) Successful in 1m55s

This commit is contained in:
parsa aghaei 2026-08-19 11:52:36 +03:30
parent bc011f4407
commit 6eb45cd467
33 changed files with 662 additions and 665 deletions

View File

@ -446,7 +446,7 @@ export async function main() {
create: {
id: adminId,
mobile: '09120000000',
email: 'admin@canino-iran.com',
email: 'admin@canina.ir',
firstName: 'Admin',
lastName: 'User',
role: 'ADMIN',

View File

@ -120,7 +120,7 @@ const UI_TEXTS: Record<string, string> = {
"footer_phone_label": "خط ویژه فروش",
"footer_phone": "۰۲۱-۸۸۸۸ ۴۴۴۴",
"footer_email_label": "مکاتبات رسمی",
"footer_email": "info@canino-iran.com",
"footer_email": "info@canina.ir",
"footer_address_label": "دفتر مرکزی",
"footer_address": "تهران، جردن، خیابان سعیدی، ساختمان کنینا، طبقه ۵، واحد ۱۹",
"footer_auth_title": "اصالت کالا تضمین می‌شود",

View File

@ -33,7 +33,7 @@ async function main() {
console.log('Creating Admin User...');
const adminHashedPassword = await bcrypt.hash('admin123', 10);
await prisma.user.upsert({
where: { email: 'admin@canino-iran.com' },
where: { email: 'admin@canina.ir' },
update: {
password: adminHashedPassword,
role: 'Admin',
@ -42,7 +42,7 @@ async function main() {
id: '12345678-1234-1234-1234-123456789012',
firstName: 'مدیر',
lastName: 'سیستم',
email: 'admin@canino-iran.com',
email: 'admin@canina.ir',
password: adminHashedPassword,
role: 'Admin',
mobile: '09120000001'

View File

@ -261,7 +261,7 @@ export class AuthService {
}
async adminLogin(body: AdminLoginInput) {
const adminEmail = process.env.ADMIN_EMAIL || 'admin@canina-iran.com';
const adminEmail = process.env.ADMIN_EMAIL || 'admin@canina.ir';
const adminPassword = process.env.ADMIN_PASSWORD || 'admin123';
// First check database for user with role 'Admin' or 'SUPER_ADMIN'

View File

@ -2,7 +2,7 @@ import { IsEmail, IsNotEmpty, IsString, MinLength } from 'class-validator';
import { ApiProperty } from '@nestjs/swagger';
export class AdminLoginDto {
@ApiProperty({ description: 'ایمیل ادمین', example: 'admin@canina-iran.com' })
@ApiProperty({ description: 'ایمیل ادمین', example: 'admin@canina.ir' })
@IsEmail({}, { message: 'فرمت ایمیل وارد شده معتبر نمی‌باشد.' })
@IsNotEmpty({ message: 'ایمیل الزامی است.' })
email!: string;

View File

@ -93,7 +93,7 @@ export class ContactService {
{
key: 'email_info',
title: 'پست الکترونیک',
value: 'info@canina-iran.com\n\nپاسخگویی در کمتر از ۲۴ ساعت کاری',
value: 'info@canina.ir\n\nپاسخگویی در کمتر از ۲۴ ساعت کاری',
icon: 'mail',
order: 2,
},

View File

@ -417,7 +417,7 @@ export class OrdersService {
await this.smsService
.sendSms(
order.user.mobile,
`کاربر گرامی، مکمل درمانی پت شما در حال اتمام است. جهت شارژ مجدد و استفاده از ۵٪ تخفیف دوره جدید به لینک زیر مراجعه کنید:\nhttps://canina-iran.com/shop`,
`کاربر گرامی، مکمل درمانی پت شما در حال اتمام است. جهت شارژ مجدد و استفاده از ۵٪ تخفیف دوره جدید به لینک زیر مراجعه کنید:\nhttps://canina.ir/shop`,
)
.catch(() => {});
}

View File

@ -59,7 +59,7 @@ export class SeoService {
},
offers: {
'@type': 'Offer',
url: `https://canino-iran.com/shop/${product.slug}`,
url: `https://canina.ir/shop/${product.slug}`,
priceCurrency: 'IRR',
price: Number(product.priceValue) * 10, // Toman to Rial conversion if needed
availability: 'https://schema.org/InStock',

View File

@ -68,7 +68,7 @@ export class UsersService {
id: '12345678-1234-1234-1234-123456789012',
firstName: 'مدیر',
lastName: 'سیستم',
email: process.env.ADMIN_EMAIL || 'admin@canina-iran.com',
email: process.env.ADMIN_EMAIL || 'admin@canina.ir',
mobile: '09120000000',
role: 'Admin',
walletBalance: new Prisma.Decimal(0),

View File

@ -72,14 +72,14 @@ pm2 startup
## ۳. تنظیمات Nginx (Reverse Proxy)
سرور Nginx مسئول دریافت ترافیک عمومی و هدایت آن‌ها به پورت‌های صحیح لوکال است.
- ترافیک‌های دامنه `canino-iran.com` به پورت فرانت‌اند (`3000`) هدایت می‌شوند.
- ترافیک‌های دامنه `canina.ir` به پورت فرانت‌اند (`3000`) هدایت می‌شوند.
- ترافیک‌هایی که دارای آدرس `/api/` در مسیر خود هستند مستقیماً به پورت بک‌اند (`3001`) هدایت می‌شوند.
### نمونه فایل کانفیگ Nginx
```nginx
server {
listen 80;
server_name canino-iran.com www.canino-iran.com;
server_name canina.ir www.canina.ir;
# ارسال ترافیک /api به Backend
location /api/ {

View File

@ -236,8 +236,8 @@ This document defines the strict integration contract between the NestJS backend
"defaultMetaTitle": "کنینا ایران | مکمل‌های دارویی آلمانی حیوانات خانگی",
"defaultMetaDescription": "نمایندگی رسمی محصولات کنینا فارما آلمان",
"keywords": "مکمل سگ, مکمل گربه, کنهیدروکس, کنینا",
"canonicalBaseUrl": "https://caninairan.com",
"ogImageUrl": "https://caninairan.com/og-default.jpg"
"canonicalBaseUrl": "https://canina.ir",
"ogImageUrl": "https://canina.ir/og-default.jpg"
}
```
- **`PATCH /api/settings/seo`**
@ -313,7 +313,7 @@ This document defines the strict integration contract between the NestJS backend
```json
{
"petId": "pet-uuid-optional",
"fileUrl": "https://cdn.caninairan.com/prescriptions/rx-123.pdf",
"fileUrl": "https://cdn.canina.ir/prescriptions/rx-123.pdf",
"notes": "نسخه مربوط به کلینیک دکتر رضایی"
}
```

View File

@ -132,7 +132,7 @@ export default function Login() {
value={email}
onChange={(e) => setEmail(e.target.value)}
className="block w-full pl-3 pr-10 py-3 border border-gray-200 rounded-xl focus:ring-purple-500 focus:border-purple-500 sm:text-sm bg-gray-50 font-bold transition-all"
placeholder="admin@canino-iran.com"
placeholder="admin@canina.ir"
dir="ltr"
/>
</div>

View File

@ -11,8 +11,8 @@ export default function SeoSettingsPage() {
defaultMetaTitle: 'کنینا ایران | مکمل‌های دارویی آلمانی حیوانات خانگی',
defaultMetaDescription: 'نمایندگی رسمی محصولات کنینا فارما آلمان در ایران',
keywords: 'مکمل سگ, مکمل گربه, کنهیدروکس, کنینا',
canonicalBaseUrl: 'https://caninairan.com',
ogImageUrl: 'https://caninairan.com/og-default.jpg',
canonicalBaseUrl: 'https://canina.ir',
ogImageUrl: 'https://canina.ir/og-default.jpg',
});
const [isLoading, setIsLoading] = useState(true);
const [isSaving, setIsSaving] = useState(false);

View File

@ -34,7 +34,7 @@ export default function Settings() {
BRAND_TYPOGRAPHY: 'vazirmatn',
CONTACT_PHONE: '۰۲۱-۸۸۸۸ ۴۴۴۴',
CONTACT_PHONE_LINK: 'tel:02188884444',
CONTACT_EMAIL: 'info@canina-iran.com',
CONTACT_EMAIL: 'info@canina.ir',
SOCIAL_WHATSAPP: '09120000000',
SOCIAL_INSTAGRAM: 'https://instagram.com/canina_iran',
SOCIAL_TELEGRAM: 'https://t.me/canina_iran',
@ -61,7 +61,7 @@ export default function Settings() {
BRAND_TYPOGRAPHY: d.BRAND_TYPOGRAPHY || 'vazirmatn',
CONTACT_PHONE: d.CONTACT_PHONE || d.contact_phone || '۰۲۱-۸۸۸۸ ۴۴۴۴',
CONTACT_PHONE_LINK: d.CONTACT_PHONE_LINK || d.contact_phone_link || 'tel:02188884444',
CONTACT_EMAIL: d.CONTACT_EMAIL || d.contact_email || 'info@canina-iran.com',
CONTACT_EMAIL: d.CONTACT_EMAIL || d.contact_email || 'info@canina.ir',
SOCIAL_WHATSAPP: d.SOCIAL_WHATSAPP || d.contact_whatsapp || '09120000000',
SOCIAL_INSTAGRAM: d.SOCIAL_INSTAGRAM || d.contact_instagram || 'https://instagram.com/canina_iran',
SOCIAL_TELEGRAM: d.SOCIAL_TELEGRAM || d.contact_telegram || 'https://t.me/canina_iran',

View File

@ -8,4 +8,4 @@ This version has breaking changes — APIs, conventions, and file structure may
نام برند رسمی «**کنینا**» / «**Canina**» است (نه «کانینو» / «Canino»). در سرتاسر پروژه باید از Canina / کنینا استفاده شود.
- CSS class names: `canina-blue`, `canina-gold`, `canina-teal`, `canina-dark`
- Store/cookie names: `canina-user`, `canina-cart`, `canina-pets`
- URL `https://canino-iran.com` (domain name, بدون تغییر می‌ماند)
- URL `https://canina.ir` (domain name)

View File

@ -10,7 +10,7 @@ export const metadata: Metadata = {
openGraph: {
title: "درباره ما - کنینا ایران",
description: "داستان کنینا ایران و میراث ۴۰ ساله شرکت Canina pharma GmbH آلمان در تولید مکمل‌های فوق‌تخصصی دامپزشکی.",
url: "https://canina-iran.com/about",
url: "https://canina.ir/about",
siteName: "کنینا ایران",
locale: "fa_IR",
type: "website",

View File

@ -10,7 +10,7 @@ export const metadata: Metadata = {
openGraph: {
title: "مجله سلامت حیوانات خانگی - کنینا ایران",
description: "آخرین مقالات، آموزش‌ها و اخبار علمی در زمینه نگهداری، تغذیه و سلامت سگ و گربه.",
url: "https://canina-iran.com/blog",
url: "https://canina.ir/blog",
siteName: "کنینا ایران",
locale: "fa_IR",
type: "website",

View File

@ -10,7 +10,7 @@ export const metadata: Metadata = {
openGraph: {
title: "کاتالوگ رسمی مکمل‌های درمانی Canina Pharma Germany",
description: "دانلود و مشاهده آنلاین کاتالوگ مکمل‌های دارویی حیوانات خانگی کنینا آلمان",
url: "https://canina-iran.com/catalog",
url: "https://canina.ir/catalog",
siteName: "کنینا ایران",
locale: "fa_IR",
type: "website",

View File

@ -10,7 +10,7 @@ export const metadata: Metadata = {
openGraph: {
title: "تماس با ما - کنینا ایران",
description: "راه‌های ارتباطی با نمایندگی رسمی مکمل‌های دامپزشکی کنینا در ایران.",
url: "https://canina-iran.com/contact",
url: "https://canina.ir/contact",
siteName: "کنینا ایران",
locale: "fa_IR",
type: "website",

View File

@ -21,7 +21,7 @@ export async function generateMetadata(): Promise<Metadata> {
console.error('[SEO] Error fetching dynamic SEO settings:', err);
}
const siteUrl = seoSettings?.canonicalBaseUrl || process.env.NEXT_PUBLIC_SITE_URL || 'https://canina-iran.com';
const siteUrl = seoSettings?.canonicalBaseUrl || process.env.NEXT_PUBLIC_SITE_URL || 'https://canina.ir';
const titleDefault = seoSettings?.defaultMetaTitle || 'کنینا ایران - مکمل‌های درمانی حیوانات خانگی با گرید دارویی اختصاصی';
const descriptionDefault = seoSettings?.defaultMetaDescription || 'تدارک هوشمندانه سلامت برای همراهان وفادار شما. کنینا ایران واردکننده انحصاری مکمل‌های درمانی با گرید دارویی اختصاصی از آلمان.';
@ -118,13 +118,13 @@ export default function RootLayout({
'@context': 'https://schema.org',
'@type': 'Organization',
name: 'کنینا ایران',
url: 'https://canina-iran.com',
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-iran.com',
email: 'info@canina.ir',
areaServed: 'IR',
availableLanguage: 'Persian'
}

View File

@ -10,7 +10,7 @@ export const metadata: Metadata = {
openGraph: {
title: "کنینا ایران - مکمل‌های درمانی حیوانات خانگی با گرید دارویی اختصاصی",
description: "واردکننده انحصاری مکمل‌های درمانی با گرید دارویی اختصاصی از آلمان",
url: "https://canina-iran.com",
url: "https://canina.ir",
siteName: "کنینا ایران",
locale: "fa_IR",
type: "website",

View File

@ -10,7 +10,7 @@ export const metadata: Metadata = {
openGraph: {
title: "حریم خصوصی کاربران - کنینا ایران",
description: "سیاست‌های حفاظت از اطلاعات شخصی کاربران در وب‌سایت کنینا ایران.",
url: "https://canina-iran.com/privacy",
url: "https://canina.ir/privacy",
siteName: "کنینا ایران",
locale: "fa_IR",
type: "website",

View File

@ -1,7 +1,7 @@
import { MetadataRoute } from 'next';
export default function robots(): MetadataRoute.Robots {
const baseUrl = process.env.NEXT_PUBLIC_SITE_URL || 'https://canina-iran.com';
const baseUrl = process.env.NEXT_PUBLIC_SITE_URL || 'https://canina.ir';
const isStaging =
process.env.NEXT_PUBLIC_APP_ENV === 'staging' ||
process.env.NODE_ENV !== 'production' ||

View File

@ -48,7 +48,7 @@ export default async function ShopProductPage({ params }: { params: Promise<{ sl
return <ProductPage productSlug={resolvedParams.slug} />;
}
const siteUrl = process.env.NEXT_PUBLIC_SITE_URL || 'https://canina-iran.com';
const siteUrl = process.env.NEXT_PUBLIC_SITE_URL || 'https://canina.ir';
const productUrl = `${siteUrl}/shop/${resolvedParams.slug}`;
const priceInRial = product.priceValue * 10;

View File

@ -10,7 +10,7 @@ export const metadata: Metadata = {
openGraph: {
title: "فروشگاه تخصصی مکمل‌های دارویی - کنینا ایران",
description: "خرید آنلاین انواع مکمل‌های درمانی، مفاصل و استخوان، گوارش و ایمنی، ویتامین‌ها و مراقبت‌های ویژه سگ و گربه.",
url: "https://canina-iran.com/shop",
url: "https://canina.ir/shop",
siteName: "کنینا ایران",
locale: "fa_IR",
type: "website",

View File

@ -3,7 +3,7 @@ import { productService } from '../lib/services/productService';
import { PRODUCTS } from '../lib/data/products';
export default async function sitemap(): Promise<MetadataRoute.Sitemap> {
const baseUrl = process.env.NEXT_PUBLIC_SITE_URL || 'https://canina-iran.com';
const baseUrl = process.env.NEXT_PUBLIC_SITE_URL || 'https://canina.ir';
// Static routes
const staticRoutes: MetadataRoute.Sitemap = [

View File

@ -2,7 +2,7 @@ import Link from 'next/link';
import { ChevronRight } from 'lucide-react';
import type { Metadata } from 'next';
const API_URL = process.env.NEXT_PUBLIC_API_URL || 'https://apicanina.parsaaghayi.ir';
const API_URL = process.env.NEXT_PUBLIC_API_URL || 'https://api.canina.ir';
async function getWikiTerm(key: string) {
try {

View File

@ -11,7 +11,7 @@ export const metadata: Metadata = {
openGraph: {
title: "دانشنامه ترکیبات دارویی و علمی - کنینا ایران",
description: "اطلاعات کامل در مورد مواد موثره، ویتامین‌ها و ترکیبات گیاهی به کار رفته در محصولات تخصصی کنینا ایران.",
url: "https://canina-iran.com/wiki",
url: "https://canina.ir/wiki",
siteName: "کنینا ایران",
locale: "fa_IR",
type: "website",

View File

@ -136,7 +136,7 @@ export default function ContactFormClient() {
<h4 className="text-xs font-black text-medical-gray-400 uppercase tracking-wider mb-1">
پست الکترونیک
</h4>
<p className="text-sm font-black text-medical-gray-900">info@canina-iran.com</p>
<p className="text-sm font-black text-medical-gray-900">info@canina.ir</p>
<p className="text-xs text-medical-gray-500 font-bold">
پاسخگویی در کمتر از ۲۴ ساعت کاری
</p>

View File

@ -29,10 +29,6 @@ const nextConfig: NextConfig = {
protocol: 'https',
hostname: 'stageapi.canina.ir',
},
{
protocol: 'https',
hostname: 'canina-iran.com',
},
{
protocol: 'https',
hostname: 'apicanina.parsaaghayi.ir',

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff