feat(seo): add SEO controller for robots.txt and sitemap.xml

- Implemented SeoController with methods for serving robots.txt and sitemap.xml.
- Updated robots.txt logic to disallow access to /admin and /api paths.
- Enhanced meta tags and Open Graph data in home.html.twig for better SEO.
- Added X-Robots-Tag header in SecurityHeadersSubscriber for /admin and /api routes.
This commit is contained in:
hamed
2026-06-28 22:28:07 +03:30
parent 89451e8d3b
commit 1bf9035f5f
10 changed files with 2368 additions and 1920 deletions
+21 -1
View File
@@ -644,5 +644,25 @@
"642": "Community 642",
"643": "Community 643",
"644": "Community 644",
"645": "Community 645"
"645": "Community 645",
"646": "Community 646",
"647": "Community 647",
"648": "Community 648",
"649": "Community 649",
"650": "Community 650",
"651": "Community 651",
"652": "Community 652",
"653": "Community 653",
"654": "Community 654",
"655": "Community 655",
"656": "Community 656",
"657": "Community 657",
"658": "Community 658",
"659": "Community 659",
"660": "Community 660",
"661": "Community 661",
"662": "Community 662",
"663": "Community 663",
"664": "Community 664",
"665": "Community 665"
}
+187 -95
View File
@@ -1,16 +1,16 @@
# Graph Report - clinicpro (2026-06-28)
## Corpus Check
- 627 files · ~428,854 words
- 628 files · ~429,014 words
- Verdict: corpus is large enough that graph structure adds value.
## Summary
- 8086 nodes · 11149 edges · 646 communities (524 shown, 122 thin omitted)
- 8093 nodes · 11163 edges · 666 communities (542 shown, 124 thin omitted)
- Extraction: 98% EXTRACTED · 2% INFERRED · 0% AMBIGUOUS · INFERRED: 261 edges (avg confidence: 0.8)
- Token cost: 0 input · 0 output
## Graph Freshness
- Built from commit: `8705b882`
- Built from commit: `89451e8d`
- Run `git rev-parse HEAD` and compare to check if the graph is stale.
- Run `graphify update .` after code changes (no API cost).
@@ -647,6 +647,26 @@
- [[_COMMUNITY_Community 641|Community 641]]
- [[_COMMUNITY_Community 642|Community 642]]
- [[_COMMUNITY_Community 643|Community 643]]
- [[_COMMUNITY_Community 646|Community 646]]
- [[_COMMUNITY_Community 647|Community 647]]
- [[_COMMUNITY_Community 648|Community 648]]
- [[_COMMUNITY_Community 649|Community 649]]
- [[_COMMUNITY_Community 650|Community 650]]
- [[_COMMUNITY_Community 651|Community 651]]
- [[_COMMUNITY_Community 652|Community 652]]
- [[_COMMUNITY_Community 653|Community 653]]
- [[_COMMUNITY_Community 654|Community 654]]
- [[_COMMUNITY_Community 655|Community 655]]
- [[_COMMUNITY_Community 656|Community 656]]
- [[_COMMUNITY_Community 657|Community 657]]
- [[_COMMUNITY_Community 658|Community 658]]
- [[_COMMUNITY_Community 659|Community 659]]
- [[_COMMUNITY_Community 660|Community 660]]
- [[_COMMUNITY_Community 661|Community 661]]
- [[_COMMUNITY_Community 662|Community 662]]
- [[_COMMUNITY_Community 663|Community 663]]
- [[_COMMUNITY_Community 664|Community 664]]
- [[_COMMUNITY_Community 665|Community 665]]
## God Nodes (most connected - your core abstractions)
1. `BaseController` - 74 edges
@@ -667,31 +687,31 @@
assets/admin/components/ui/Pagination.tsx → assets/admin/lib/utils.ts
- `PersianDatePicker()` --calls--> `formatDate()` [EXTRACTED]
assets/admin/components/ui/PersianDatePicker.tsx → assets/admin/lib/utils.ts
- `SettlementsPage()` --calls--> `formatRial()` [EXTRACTED]
assets/admin/pages/SettlementsPage.tsx → assets/admin/lib/utils.ts
- `NewAppointmentModal()` --calls--> `useAuthStore` [EXTRACTED]
assets/admin/pages/AppointmentsPage.tsx → assets/admin/stores/authStore.ts
- `MyFinancialPage()` --calls--> `formatRial()` [EXTRACTED]
assets/admin/pages/MyFinancialPage.tsx → assets/admin/lib/utils.ts
- `RepresentationSettlementPage()` --calls--> `formatRial()` [EXTRACTED]
assets/admin/pages/RepresentationSettlementPage.tsx → assets/admin/lib/utils.ts
## Import Cycles
- None detected.
## Communities (646 total, 122 thin omitted)
## Communities (666 total, 124 thin omitted)
### Community 0 - "Community 0"
Cohesion: 0.05
Nodes (41): ALLOWED_ROLES, PrivateRoute(), PublicRoute(), RoleRoute(), queryClient, toastStyle, FormData, schema (+33 more)
Nodes (43): ALLOWED_ROLES, PrivateRoute(), PublicRoute(), RoleRoute(), queryClient, toastStyle, LogoUploadField(), TabActions() (+35 more)
### Community 1 - "Community 1"
Cohesion: 0.03
Nodes (41): AddressData, AddrForm, addrSchema, AVATAR_COLORS, BookingMeta, CityOpt, DateOverrideData, DEFAULT_BOOKING_META (+33 more)
Nodes (42): iranMobileOptionalSchema, AddressData, AddrForm, addrSchema, AVATAR_COLORS, BookingMeta, CityOpt, DateOverrideData (+34 more)
### Community 2 - "Community 2"
Cohesion: 0.05
Nodes (47): FreeVisitPrice(), Pricing, usePaymentConfig(), api, ApiResponse, getToken(), refreshOnce(), request() (+39 more)
Cohesion: 0.06
Nodes (31): api, ApiResponse, getToken(), refreshOnce(), request(), FinancialSummary, MonthlyEntry, MyFinancialPage() (+23 more)
### Community 3 - "Community 3"
Cohesion: 0.04
Nodes (48): PaginatedResponse, formatDate(), maskMobile(), STATUS_FILTERS, FILTERS, Breakdown, SOURCE_LABEL, Summary (+40 more)
Cohesion: 0.05
Nodes (39): PaginatedResponse, formatDate(), maskMobile(), STATUS_FILTERS, FILTERS, Breakdown, SOURCE_LABEL, Summary (+31 more)
### Community 4 - "Community 4"
Cohesion: 0.06
@@ -710,8 +730,8 @@ Cohesion: 0.07
Nodes (5): Clinic, Collection, Doctor, self, User
### Community 8 - "Community 8"
Cohesion: 0.13
Nodes (18): useSubscription(), AdminLayout(), avatarBg(), buildSections(), HUES, Props, ROLE_LABELS, Section (+10 more)
Cohesion: 0.09
Nodes (26): useSubscription(), AdminLayout(), avatarBg(), buildSections(), HUES, Props, ROLE_LABELS, Section (+18 more)
### Community 9 - "Community 9"
Cohesion: 0.04
@@ -722,20 +742,20 @@ Cohesion: 0.04
Nodes (46): Clinic Address Management, Clinic API, DELETE `/api/v1/admin/clinic/{clinicUuid}/doctor/{doctorUuid}`, `DELETE /api/v1/clinic/{clinicUuid}/address/{addressUuid}`, Errors, Errors, Errors, Errors (+38 more)
### Community 11 - "Community 11"
Cohesion: 0.08
Nodes (15): Claim, ClaimItem, DebtRow, InsuranceOption, KIND_LABEL, STATUS_FILTERS, STATUS_META, IbanItem (+7 more)
Cohesion: 0.12
Nodes (9): Claim, ClaimItem, DebtRow, InsuranceOption, KIND_LABEL, STATUS_FILTERS, STATUS_META, PersianDatePicker() (+1 more)
### Community 12 - "Community 12"
Cohesion: 0.05
Nodes (44): Clinic Doctor Invitation API, DELETE `/api/v1/admin/clinic/invitation/{invUuid}`, Errors, Errors, Errors, Errors, Errors, Errors (+36 more)
### Community 13 - "Community 13"
Cohesion: 0.05
Nodes (30): iranMobileOptionalSchema, iranMobileSchema, isValidIranMobile(), sanitizeMobileInput(), toEnglishDigits(), ClinicAddress, ClinicDoctorItem, ClinicInvitation (+22 more)
Cohesion: 0.06
Nodes (26): iranMobileSchema, isValidIranMobile(), sanitizeMobileInput(), toEnglishDigits(), ClinicAddress, ClinicDoctorItem, ClinicInvitation, EditForm (+18 more)
### Community 14 - "Community 14"
Cohesion: 0.15
Nodes (8): AppointmentSettingsController, Holiday, HolidayRepository, JsonResponse, Request, User, Doctor, ManagerRegistry
Cohesion: 0.10
Nodes (12): AppointmentSettingsController, DateOverride, Holiday, DateOverrideRepository, HolidayRepository, JsonResponse, Request, User (+4 more)
### Community 15 - "Community 15"
Cohesion: 0.10
@@ -754,20 +774,20 @@ Cohesion: 0.05
Nodes (38): API, API, API, API, API, Route, Route, Route (+30 more)
### Community 19 - "Community 19"
Cohesion: 0.07
Nodes (32): Contract, InsuranceOption, KIND_LABEL, calcFinalPrice(), EMPTY_RECORDS, EMPTY_SESSIONS, fileNumber(), getPatientName() (+24 more)
Cohesion: 0.06
Nodes (27): Contract, InsuranceOption, KIND_LABEL, FormData, schema, Contract, CoverageRow, fieldLabel (+19 more)
### Community 20 - "Community 20"
Cohesion: 0.15
Nodes (3): AdminApiController, JsonResponse, Request
### Community 21 - "Community 21"
Cohesion: 0.06
Nodes (31): formatNumber(), ClinicDetailPage(), AdminCharts, AdminDashboard(), AdminRecent, AdminStats, APPT_CLS, APPT_COLOR (+23 more)
Cohesion: 0.07
Nodes (28): formatNumber(), ClinicDetailPage(), AdminCharts, AdminDashboard(), AdminRecent, AdminStats, APPT_CLS, APPT_COLOR (+20 more)
### Community 22 - "Community 22"
Cohesion: 0.09
Nodes (15): RatingController, Like, Rate, CommentListNPlusOneTest, LikeRepository, RateRepository, JsonResponse, Request (+7 more)
Cohesion: 0.15
Nodes (9): RatingController, Like, LikeRepository, JsonResponse, Request, User, Comment, ManagerRegistry (+1 more)
### Community 23 - "Community 23"
Cohesion: 0.05
@@ -786,8 +806,8 @@ Cohesion: 0.24
Nodes (4): InsuranceController, JsonResponse, Request, User
### Community 27 - "Community 27"
Cohesion: 0.05
Nodes (40): 55. 🟢 `GET` all tag, 56. 🟢 `GET` supplementary_insurance, 57. 🟢 `GET` categories list, 58. 🟢 `GET` all state, 59. 🟢 `GET` all city, 60. 🟢 `GET` all specially doctor, 61. 🔵 `POST` post, 62. 🟡 `PATCH` patch (+32 more)
Cohesion: 0.06
Nodes (35): 55. 🟢 `GET` all tag, 56. 🟢 `GET` supplementary_insurance, 57. 🟢 `GET` categories list, 58. 🟢 `GET` all state, 59. 🟢 `GET` all city, 60. 🟢 `GET` all specially doctor, 61. 🔵 `POST` post, 63. 🔴 `DELETE` DELETE (+27 more)
### Community 28 - "Community 28"
Cohesion: 0.09
@@ -843,7 +863,7 @@ Nodes (4): User, PasswordAuthenticatedUserInterface, self, UserInterface
### Community 41 - "Community 41"
Cohesion: 0.04
Nodes (53): ALL_STATUSES, AppointmentDetailPage(), CityForm, citySchema, InsuranceForm, insuranceSchema, ProvinceForm, provinceSchema (+45 more)
Nodes (52): ALL_STATUSES, CityForm, citySchema, InsuranceForm, insuranceSchema, ProvinceForm, provinceSchema, ServiceForm (+44 more)
### Community 42 - "Community 42"
Cohesion: 0.07
@@ -890,8 +910,8 @@ Cohesion: 0.07
Nodes (26): الزامات UI, باگ‌فیکس صفحه نوبت‌ها, باگ ۱ — کرش تقویم, باگ ۲ — روز هفته در DateNavigator, باگ ۳ — پیام «slot نیست», باگ ۴ — نوبت جدید: نام اجباری + find-or-create patient, باگ ۵ — patient_mobile نشان می‌دهد موبایل پزشک, باگ ۶ — نوبت‌های رزرو شده در نمایش زمانبندی (+18 more)
### Community 53 - "Community 53"
Cohesion: 0.09
Nodes (13): ClaimItemRepository, InvoiceRepository, PreRegistrationRepository, SessionServiceRepository, SiteConfigRepository, ServiceEntityRepository, ManagerRegistry, ManagerRegistry (+5 more)
Cohesion: 0.10
Nodes (14): ClaimItemRepository, ClinicStaffRepository, InvoiceItemRepository, PreRegistrationRepository, TaxRateHistoryRepository, ServiceEntityRepository, ManagerRegistry, ManagerRegistry (+6 more)
### Community 54 - "Community 54"
Cohesion: 0.10
@@ -910,8 +930,8 @@ Cohesion: 0.08
Nodes (24): Blog API, DELETE `/api/v1/blog/{uuid}`, Errors, Errors, Errors, Errors, Errors, GET `/api/v1/blog/{slug}` (+16 more)
### Community 58 - "Community 58"
Cohesion: 0.28
Nodes (4): Blog, BlogRepository, ManagerRegistry, QueryBuilder
Cohesion: 0.15
Nodes (8): Blog, BlogController, BlogRepository, JsonResponse, Request, User, ManagerRegistry, QueryBuilder
### Community 59 - "Community 59"
Cohesion: 0.22
@@ -942,8 +962,8 @@ Cohesion: 0.08
Nodes (24): 2. کاربر (User), 4. 🔵 `POST` verify code, 5. 🔵 `POST` send code, 6. 🔵 `POST` register, 7. 🔴 `DELETE` delete user, 8. 🟡 `PATCH` patch, 9. 🟢 `GET` list secretary, Request Body (+16 more)
### Community 66 - "Community 66"
Cohesion: 0.07
Nodes (4): ClinicStaff, SmsWallet, AppointmentExpiryService, self
Cohesion: 0.06
Nodes (6): ClinicStaff, SiteConfig, SmsWallet, AppointmentExpiryService, self, self
### Community 67 - "Community 67"
Cohesion: 0.11
@@ -1010,8 +1030,8 @@ Cohesion: 0.10
Nodes (21): devDependencies, @babel/core, @babel/preset-env, @babel/preset-react, @babel/preset-typescript, core-js, @hotwired/stimulus, postcss (+13 more)
### Community 86 - "Community 86"
Cohesion: 0.08
Nodes (13): AppointmentExpiryServiceTest, LowTierFixesTest, SendCodeMobileRateLimitTest, ClaimsListPaginationTest, ServiceItemStaffOwnershipTest, EntityManagerInterface, KernelBrowser, CommentPaginationTest (+5 more)
Cohesion: 0.07
Nodes (14): AppointmentExpiryServiceTest, LowTierFixesTest, SendCodeMobileRateLimitTest, ClaimsListPaginationTest, ServiceItemDeleteCleanupTest, ServiceItemStaffOwnershipTest, EntityManagerInterface, KernelBrowser (+6 more)
### Community 87 - "Community 87"
Cohesion: 0.10
@@ -1378,8 +1398,8 @@ Cohesion: 0.23
Nodes (3): WeeklySchedule, Doctor, self
### Community 182 - "Community 182"
Cohesion: 0.15
Nodes (11): emptyFeatures(), FEATURE_KEYS, FEATURE_LABELS, PeriodForm, periodSchema, PLAN_DISPLAY, PlanForm, planSchema (+3 more)
Cohesion: 0.06
Nodes (30): usePaymentConfig(), emptyFeatures(), FEATURE_KEYS, FEATURE_LABELS, PeriodForm, periodSchema, PLAN_DISPLAY, PlanForm (+22 more)
### Community 183 - "Community 183"
Cohesion: 0.14
@@ -1451,7 +1471,7 @@ Nodes (13): Endpoint ها, PATCH /api/v1/secretary/{uuid}, POST /api/v1/secretar
### Community 201 - "Community 201"
Cohesion: 0.15
Nodes (13): Admin API, Clinic Invitation Management, GET `/api/v1/admin/payments`, GET `/api/v1/admin/pre-registrations`, GET /api/v1/admin/settings, PATCH /api/v1/admin/settings, Payment Management, POST `/api/v1/admin/pre-registrations/{uuid}/approve` (+5 more)
Nodes (13): Admin API, Clinic Invitation Management, GET `/api/v1/admin/secretaries`, GET /api/v1/admin/settings, GET `/api/v1/admin/settlements`, PATCH /api/v1/admin/settings, Query Parameters, Query Parameters (+5 more)
### Community 202 - "Community 202"
Cohesion: 0.15
@@ -1466,16 +1486,16 @@ Cohesion: 0.21
Nodes (6): AuthenticationException, ExceptionSubscriber, SecurityHeadersSubscriber, EventSubscriberInterface, ExceptionEvent, ResponseEvent
### Community 205 - "Community 205"
Cohesion: 0.16
Nodes (10): Command, CancelExpiredAppointmentsCommand, CreateAdminCommand, SeedSmsMessageTemplatesCommand, InputInterface, OutputInterface, InputInterface, OutputInterface (+2 more)
Cohesion: 0.10
Nodes (14): Command, CancelExpiredAppointmentsCommand, CreateAdminCommand, SeedSmsMessageTemplatesCommand, SmsMessageTemplateRepository, SmsTextResolver, SmsMessageTemplate, InputInterface (+6 more)
### Community 206 - "Community 206"
Cohesion: 0.35
Nodes (6): DashboardController, Clinic, DoctorSecretary, JsonResponse, Request, User
### Community 207 - "Community 207"
Cohesion: 0.07
Nodes (30): ۲. مدل داده و موجودیت‌ها, ۲.۱ کاربر (User), ۲.۱۰ پرداخت (Payment Types), ۲.۱۰.۱ پرداخت نوبت, ۲.۱۰.۲ پرداخت اشتراک, ۲.۱۱ پروفایل بیمار (Profile), ۲.۱۲ وبلاگ (Blog), ۲.۱۳ نظرات، لایک و امتیازدهی (+22 more)
Cohesion: 0.15
Nodes (13): ۲. مدل داده و موجودیت‌ها, ۲.۱ کاربر (User), ۲.۱۰ پرداخت (Payment Types), ۲.۱۰.۱ پرداخت نوبت, ۲.۱۰.۲ پرداخت اشتراک, ۲.۱۱ پروفایل بیمار (Profile), ۲.۱۲ وبلاگ (Blog), ۲.۳ دکتر (Doctor) (+5 more)
### Community 208 - "Community 208"
Cohesion: 0.23
@@ -1566,8 +1586,8 @@ Cohesion: 0.21
Nodes (3): SmsWalletTransaction, Payment, SmsWallet
### Community 235 - "Community 235"
Cohesion: 0.08
Nodes (21): formatDateTime(), toDate(), SessionRow(), FormValues, schema, Settings, TaxHistoryRow, SettlementDetailPage() (+13 more)
Cohesion: 0.13
Nodes (12): AdminUserDetail, AVATAR_COLORS, EditForm, editSchema, GENDER_LABELS, getPrimaryRole(), MARITAL_LABELS, MEDICAL_SECTIONS (+4 more)
### Community 236 - "Community 236"
Cohesion: 0.17
@@ -1642,8 +1662,8 @@ Cohesion: 0.18
Nodes (11): 1. 🔵 `POST` refresh token, 1. احراز هویت (Authentication), 2. 🟢 `GET` X-CSRF-Token, 3. 🟢 `GET` user info 🆕, Request Body, بخش دوم — مستند کامل API, خطاهای عمومی, فهرست مطالب (+3 more)
### Community 255 - "Community 255"
Cohesion: 0.11
Nodes (19): GET /api/v1/appointment-settings/slots — دریافت اسلات‌های خالی, GET /api/v1/categories/cities — شهرها, GET /api/v1/categories/states — استان‌ها, GET /api/v1/doctors/{id}, GET /api/v1/doctors/{id}/insurances, GET /api/v1/representations/{id}, GET /oauth/userinfo — اطلاعات کاربر (سازگار با دروپال), POST /api/v1/appointment-settings/holidays — ثبت تعطیلی (فقط ادمین) (+11 more)
Cohesion: 0.18
Nodes (11): GET /api/v1/doctors/{id}, GET /api/v1/doctors/{id}/insurances, GET /api/v1/representations/{id}, GET /oauth/userinfo — اطلاعات کاربر (سازگار با دروپال), POST /api/v1/representations/{id}/bank-accounts, POST /oauth/token — تجدید توکن (Refresh), POST /oauth/token — ورود به سیستم, Task-02: احراز هویت (Authentication) (+3 more)
### Community 256 - "Community 256"
Cohesion: 0.29
@@ -1678,8 +1698,8 @@ Cohesion: 0.33
Nodes (4): RepresentationRepository, ManagerRegistry, Representation, User
### Community 265 - "Community 265"
Cohesion: 0.25
Nodes (4): SmsMessageTemplateRepository, SmsTextResolver, SmsMessageTemplate, ManagerRegistry
Cohesion: 0.09
Nodes (28): FreeVisitPrice(), Pricing, formatDateTime(), formatRial(), toDate(), AppointmentDetailPage(), calcFinalPrice(), EMPTY_RECORDS (+20 more)
### Community 266 - "Community 266"
Cohesion: 0.33
@@ -1714,8 +1734,8 @@ Cohesion: 0.18
Nodes (10): Endpoint های موجود که تغییر می‌کنند, GET /api/v1/admin/dashboard/charts?from=UNIX&to=UNIX, GET /api/v1/dashboard/clinic, GET /api/v1/dashboard/doctor, تسک ۱۶: داشبورد هوشمند — چارت + فیلتر زمانی, توضیح, زمان تخمینی, فیلتر بازه زمانی (+2 more)
### Community 274 - "Community 274"
Cohesion: 0.14
Nodes (11): Appointment Settings API, Available Locations, Errors, `GET /api/v1/appointment-settings/available-locations/{doctorUuid}`, Response `200`, Slot Calculation Logic (Reference), Authentication, ClinicPro — API Documentation Index (+3 more)
Cohesion: 0.28
Nodes (5): Authentication, ClinicPro — API Documentation Index, Error Code Reference, Modules, Standard Response Envelope
### Community 275 - "Community 275"
Cohesion: 0.38
@@ -1726,8 +1746,8 @@ Cohesion: 0.20
Nodes (9): Architecture Audit — ClinicPro Symfony 7 Migration, Architecture Score (بعد از اصلاحات), Architecture Violations, Executive Summary, Final Verdict (بعد از اصلاحات), Missing Requirements (کامل), اصلاحات اعمال‌شده (بعد از Audit), دلیل تصمیم (+1 more)
### Community 277 - "Community 277"
Cohesion: 0.08
Nodes (23): GET /api/v1/sms/balance — موجودی حساب پیامک, POST /api/v1/sms/queue — افزودن به صف, بخش اول — مستند محصول (PRD), ثبت‌نام دکتر — از طریق نماینده, ثبت‌نام دکتر — از طریق کلینیک, ثبت‌نام دکتر — مستقل, فهرست کلی, کلینیک پرو — مستند جامع فنی و API (+15 more)
Cohesion: 0.20
Nodes (9): بخش اول — مستند محصول (PRD), فهرست کلی, کلینیک پرو — مستند جامع فنی و API, ۵. فهرست مشکلات شناسایی‌شده و اصلاحات لازم, ۶. پیوست, ۶.۱ دیاگرام وضعیت نوبت, ۶.۲ جریان کمیسیون, ۶.۳ بررسی محدودیت منشی (+1 more)
### Community 279 - "Community 279"
Cohesion: 0.20
@@ -1794,8 +1814,8 @@ Cohesion: 0.24
Nodes (10): gridItemStyle, JALALI_MONTHS, jalaliFirstWeekday(), jalaliToGregorian(), navBtnStyle, PersianCalendar(), pf, Props (+2 more)
### Community 295 - "Community 295"
Cohesion: 0.33
Nodes (5): AbstractController, AdminController, HomeController, Response, Response
Cohesion: 0.22
Nodes (8): AbstractController, AdminController, HomeController, SeoController, Response, Response, Request, Response
### Community 296 - "Community 296"
Cohesion: 0.22
@@ -1830,12 +1850,12 @@ Cohesion: 0.12
Nodes (16): آماده‌سازی پروژه ClinicPro برای دیپلوی روی Coolify با Docker Compose, زمینه, فایل‌های مرتبط, نکات مهم (محدودیت‌ها و edge caseها), هدف, وظایف, ۱. ساخت `Dockerfile` چندمرحله‌ای, ۱۰. ساخت راهنمای `docs/deploy/coolify.md` (+8 more)
### Community 304 - "Community 304"
Cohesion: 0.04
Nodes (50): 29. 🟢 `GET` clinic list 🆕, 30. 🟢 `GET` get 🆕, 33. 🔵 `POST` image_clinic, 34. 🔵 `POST` image logo, 35. 🟡 `PATCH` patch, 36. 🟢 `GET` get my rate, 38. 🟢 `GET` Unapproved comments, 39. 🟡 `PATCH` Comment confirmation (+42 more)
Cohesion: 0.22
Nodes (9): 29. 🟢 `GET` clinic list 🆕, 30. 🟢 `GET` get 🆕, 33. 🔵 `POST` image_clinic, 6. کلینیک (Clinic), هدرهای اضافی, پارامترهای Query, پاسخ‌ها, پاسخ‌ها (+1 more)
### Community 306 - "Community 306"
Cohesion: 0.33
Nodes (4): BlogController, JsonResponse, Request, User
Cohesion: 0.38
Nodes (5): Rate, RateRepository, Doctor, ManagerRegistry, User
### Community 307 - "Community 307"
Cohesion: 0.28
@@ -1882,8 +1902,8 @@ Cohesion: 0.36
Nodes (3): TariffRepository, ManagerRegistry, Tariff
### Community 318 - "Community 318"
Cohesion: 0.12
Nodes (6): ServiceItemDeleteCleanupTest, ServiceCoverageNPlusOneTest, TenantServiceCoverageRepository, TenantInsuranceCleanupService, ManagerRegistry, TenantServiceCoverage
Cohesion: 0.21
Nodes (4): ServiceCoverageNPlusOneTest, TenantServiceCoverageRepository, ManagerRegistry, TenantServiceCoverage
### Community 319 - "Community 319"
Cohesion: 0.39
@@ -1986,16 +2006,16 @@ Cohesion: 0.39
Nodes (3): CityRepository, City, ManagerRegistry
### Community 347 - "Community 347"
Cohesion: 0.39
Nodes (3): ClinicStaffRepository, ClinicStaff, ManagerRegistry
Cohesion: 0.25
Nodes (8): ثبت‌نام دکتر — از طریق نماینده, ثبت‌نام دکتر — از طریق کلینیک, ثبت‌نام دکتر — مستقل, ۱. معرفی محصول, ۱.۱ نقش‌های سیستم, ۱.۲ فلوهای عملیاتی اصلی, ۱.۳ پلن‌های اشتراک, ۱.۴ سیستم پیامک
### Community 348 - "Community 348"
Cohesion: 0.39
Nodes (3): ProvinceRepository, ManagerRegistry, Province
### Community 349 - "Community 349"
Cohesion: 0.22
Nodes (4): EntityInsurancePricing, TenantInsuranceCleanupTest, EntityInsurancePricingRepository, ManagerRegistry
Cohesion: 0.15
Nodes (5): EntityInsurancePricing, TenantInsuranceCleanupTest, EntityInsurancePricingRepository, TenantInsuranceCleanupService, ManagerRegistry
### Community 350 - "Community 350"
Cohesion: 0.43
@@ -2061,10 +2081,6 @@ Nodes (7): ادمین, دکتر نمونه کامل — تبریز, دکتران
Cohesion: 0.29
Nodes (7): Dashboard, GET `/api/v1/admin/dashboard/charts`, GET `/api/v1/admin/dashboard/recent`, GET `/api/v1/admin/dashboard/stats`, Response `200`, Response `200`, Response `200`
### Community 368 - "Community 368"
Cohesion: 0.21
Nodes (5): DateOverrideOwnershipTest, DateOverride, DateOverrideRepository, Doctor, ManagerRegistry
### Community 369 - "Community 369"
Cohesion: 0.29
Nodes (7): php-http/discovery, symfony/flex, symfony/runtime, config, allow-plugins, bump-after-update, sort-packages
@@ -2077,6 +2093,10 @@ Nodes (7): Authentication, Authorization, Input Validation, Logging Security, Ra
Cohesion: 0.15
Nodes (6): UniqueConstraintsTest, FinancialBreakdown, FinancialBreakdownRepository, FinancialBreakdownIntegrityTest, ManagerRegistry, Payment
### Community 372 - "Community 372"
Cohesion: 0.25
Nodes (8): ۲.۲ انواع دسته‌بندی (Category Types), ۲.۲.۱ تگ (Tag), ۲.۲.۲ استان (State), ۲.۲.۳ شهر (City), ۲.۲.۴ بیمه پایه (Basic Insurance), ۲.۲.۵ بیمه مکمل (Supplementary Insurance), ۲.۲.۶ تخصص دکتر (Doctor Specialty), ۲.۲.۷ خدمات دکتر (Doctor Services)
### Community 374 - "Community 374"
Cohesion: 0.29
Nodes (7): API, Entity جدید, Frontend, اپیک ۱ — پرسنل (Staff), توضیح, فایل‌های جدید, نیازمندی‌های کارکردی
@@ -2103,7 +2123,7 @@ Nodes (7): بک‌اند — endpoint جدید: `GET /api/v1/my/appointments` `
### Community 380 - "Community 380"
Cohesion: 0.43
Nodes (3): InvoiceItemRepository, InvoiceItem, ManagerRegistry
Nodes (3): InvoiceRepository, Invoice, ManagerRegistry
### Community 381 - "Community 381"
Cohesion: 0.13
@@ -2173,14 +2193,18 @@ Nodes (6): ClaimAmountBoundsTest, ClaimsListNPlusOneTest, ClaimItem, Claim, Doct
Cohesion: 0.33
Nodes (4): initiate(), verify(), PaymentInitResult, PaymentVerifyResult
### Community 399 - "Community 399"
### Community 400 - "Community 400"
Cohesion: 0.23
Nodes (5): AbstractMigration, Schema, Version20260609130407, Schema, Version20260610110921
Nodes (5): AbstractMigration, Schema, Version20260609131553, Schema, Version20260625135132
### Community 418 - "Community 418"
Cohesion: 0.17
Nodes (11): دیپلوی ClinicPro روی Coolify (Docker Compose), رفع اشکال, مراحل دیپلوی, معماری دیپلوی, نکات عملیاتی, چند دامنه فرانت‌اند (مهم), ۱. ساخت Resource در Coolify, ۲. اختصاص دامنه (+3 more)
### Community 456 - "Community 456"
Cohesion: 0.29
Nodes (6): Appointment Settings API, Available Locations, Errors, `GET /api/v1/appointment-settings/available-locations/{doctorUuid}`, Response `200`, Slot Calculation Logic (Reference)
### Community 458 - "Community 458"
Cohesion: 0.47
Nodes (6): formatPersianDate(), gToJ(), jFirstDayOfWeek(), PersianDateInput(), todayGregorian(), toPersianNums()
@@ -2201,10 +2225,6 @@ Nodes (6): ادمین — همه لینک‌های فعلی (بدون تغییر
Cohesion: 0.33
Nodes (6): سناریوهای چند-context, قانون انتخاب context:, مفاهیم کلیدی معماری Multi-Context (مهم — قبل از پیاده‌سازی بخوان), مفهوم `available_contexts`, مفهوم `db_key`, مفهوم `db_uuid`
### Community 463 - "Community 463"
Cohesion: 0.20
Nodes (8): AdminUser, ChangeRoleModal(), getPrimaryRole(), HUES_LIST, ROLE_META, ROLE_TABS, RoleBadge(), UserStats
### Community 466 - "Community 466"
Cohesion: 0.33
Nodes (5): آدرس مطب, آپدیت میانگین امتیاز, فیلتر لیست دکترها, مجوزها, نکات پیاده‌سازی — تسک ۰۵: ماژول دکتر
@@ -2266,8 +2286,8 @@ Cohesion: 0.40
Nodes (5): Errors, Notes, POST `/api/v1/notification-mobile/request-otp`, Request Body, Response `200`
### Community 482 - "Community 482"
Cohesion: 0.53
Nodes (3): TaxRateHistoryRepository, ManagerRegistry, TaxRateHistory
Cohesion: 0.33
Nodes (6): GET /api/v1/sms/balance — موجودی حساب پیامک, POST /api/v1/sms/queue — افزودن به صف, ۴. سیستم حساب و صف پیامک, ۴.۱ حساب پیامک (SMS Account), ۴.۲ صف پیامک (SMS Queue), ۴.۳ API پیامک
### Community 483 - "Community 483"
Cohesion: 0.40
@@ -2673,13 +2693,9 @@ Nodes (5): 37. 🔵 `POST` post, Request Body, مثال Request, هدرهای ا
Cohesion: 0.67
Nodes (3): بک‌اند, فرانت‌اند, وضعیت فعلی کد (مهم — قبل از تغییر بخوان)
### Community 613 - "Community 613"
Cohesion: 0.50
Nodes (4): GET `/api/v1/admin/secretaries`, Query Parameters, Response `200`, Secretary Management
### Community 625 - "Community 625"
Cohesion: 0.50
Nodes (4): GET `/api/v1/admin/settlements`, Query Parameters, Response `200`, Settlement Management
Cohesion: 0.53
Nodes (3): SessionServiceRepository, ManagerRegistry, SessionService
### Community 631 - "Community 631"
Cohesion: 0.50
@@ -2717,25 +2733,101 @@ Nodes (3): GET `/api/v1/insurances`, Query Parameters, Response `200`
Cohesion: 0.67
Nodes (3): POST `/api/v1/admin/insurance/{id}/upload-logo`, Request, Response `200`
### Community 646 - "Community 646"
Cohesion: 0.40
Nodes (5): 35. 🟡 `PATCH` patch, Request Body, مثال Request, هدرهای اضافی, پاسخ‌ها
### Community 647 - "Community 647"
Cohesion: 0.40
Nodes (5): 62. 🟡 `PATCH` patch, Request Body, مثال Request, هدرهای اضافی, پاسخ‌ها
### Community 648 - "Community 648"
Cohesion: 0.40
Nodes (5): ۲.۸ تنظیمات نوبت (Appointment Settings), ۲.۸.۱ برنامه هفتگی (Weekly Schedule), ۲.۸.۲ تعطیلات (Holidays), ۲.۸.۳ لغو تعطیل (Date Override), ۲.۸.۴ الگوریتم محاسبه اسلات‌های خالی
### Community 650 - "Community 650"
Cohesion: 0.40
Nodes (3): Props, StatTone, TONE
### Community 651 - "Community 651"
Cohesion: 0.50
Nodes (4): GET `/api/v1/admin/payments`, Payment Management, Query Parameters, Response `200`
### Community 652 - "Community 652"
Cohesion: 0.50
Nodes (4): GET `/api/v1/admin/pre-registrations`, POST `/api/v1/admin/pre-registrations/{uuid}/approve`, POST `/api/v1/admin/pre-registrations/{uuid}/reject`, Pre-Registration Management
### Community 653 - "Community 653"
Cohesion: 0.50
Nodes (4): 38. 🟢 `GET` Unapproved comments, هدرهای اضافی, پارامترهای Query, پاسخ‌ها
### Community 654 - "Community 654"
Cohesion: 0.50
Nodes (4): 39. 🟡 `PATCH` Comment confirmation, مثال Request, هدرهای اضافی, پاسخ‌ها
### Community 655 - "Community 655"
Cohesion: 0.50
Nodes (4): 40. 🔵 `POST` post, مثال Request, هدرهای اضافی, پاسخ‌ها
### Community 656 - "Community 656"
Cohesion: 0.50
Nodes (4): 44. 🟢 `GET` list comment, هدرهای اضافی, پارامترهای Query, پاسخ‌ها
### Community 657 - "Community 657"
Cohesion: 0.50
Nodes (4): 45. 🔵 `POST` post, مثال Request, هدرهای اضافی, پاسخ‌ها
### Community 658 - "Community 658"
Cohesion: 0.50
Nodes (4): 46. 🟡 `PATCH` patch, مثال Request, هدرهای اضافی, پاسخ‌ها
### Community 659 - "Community 659"
Cohesion: 0.50
Nodes (4): GET /api/v1/appointment-settings/slots — دریافت اسلات‌های خالی, POST /api/v1/appointment-settings/holidays — ثبت تعطیلی (فقط ادمین), POST /api/v1/appointment-settings/overrides — ثبت Override توسط دکتر, Task-09: API تنظیمات نوبت
### Community 660 - "Community 660"
Cohesion: 0.50
Nodes (4): GET /api/v1/categories/cities — شهرها, GET /api/v1/categories/states — استان‌ها, Task-08: API دسته‌بندی‌ها, سایر Endpoint های دسته‌بندی — الزامی
### Community 661 - "Community 661"
Cohesion: 0.50
Nodes (4): ۲.۱۳ نظرات، لایک و امتیازدهی, ۲.۱۳.۱ نظر (Comment), ۲.۱۳.۲ لایک (Like), ۲.۱۳.۳ امتیاز (Rate)
### Community 662 - "Community 662"
Cohesion: 0.67
Nodes (3): 34. 🔵 `POST` image logo, هدرهای اضافی, پاسخ‌ها
### Community 663 - "Community 663"
Cohesion: 0.67
Nodes (3): 36. 🟢 `GET` get my rate, هدرهای اضافی, پاسخ‌ها
### Community 664 - "Community 664"
Cohesion: 0.67
Nodes (3): 42. 🔴 `DELETE` delete, هدرهای اضافی, پاسخ‌ها
### Community 665 - "Community 665"
Cohesion: 0.67
Nodes (3): 43. 🟢 `GET` get, هدرهای اضافی, پاسخ‌ها
## Knowledge Gaps
- **3448 isolated node(s):** `ALLOWED_ROLES`, `Pricing`, `TenantInsurance`, `CoverageRow`, `Draft` (+3443 more)
These have ≤1 connection - possible missing edges or undocumented components.
- **122 thin communities (<3 nodes) omitted from report** — run `graphify query` to explore isolated nodes.
- **124 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 `BaseController` connect `Community 108` to `Community 6`, `Community 138`, `Community 139`, `Community 14`, `Community 15`, `Community 275`, `Community 20`, `Community 22`, `Community 26`, `Community 164`, `Community 295`, `Community 300`, `Community 301`, `Community 175`, `Community 176`, `Community 177`, `Community 306`, `Community 59`, `Community 63`, `Community 64`, `Community 70`, `Community 71`, `Community 75`, `Community 206`, `Community 230`, `Community 103`, `Community 104`, `Community 107`, `Community 109`, `Community 121`, `Community 122`, `Community 251`, `Community 252`?**
- **Why does `BaseController` connect `Community 108` to `Community 6`, `Community 138`, `Community 139`, `Community 14`, `Community 15`, `Community 275`, `Community 20`, `Community 22`, `Community 26`, `Community 164`, `Community 295`, `Community 300`, `Community 301`, `Community 175`, `Community 176`, `Community 177`, `Community 58`, `Community 59`, `Community 63`, `Community 64`, `Community 70`, `Community 71`, `Community 75`, `Community 206`, `Community 230`, `Community 103`, `Community 104`, `Community 107`, `Community 109`, `Community 121`, `Community 122`, `Community 251`, `Community 252`?**
_High betweenness centrality (0.030) - this node is a cross-community bridge._
- **Why does `Version20260614181657` connect `Community 431` to `Community 399`?**
_High betweenness centrality (0.019) - this node is a cross-community bridge._
- **Why does `Version20260625150304` connect `Community 457` to `Community 399`?**
- **Why does `AppointmentRepository` connect `Community 119` to `Community 53`?**
_High betweenness centrality (0.020) - this node is a cross-community bridge._
- **Why does `Version20260614181657` connect `Community 431` to `Community 400`?**
_High betweenness centrality (0.019) - this node is a cross-community bridge._
- **What connects `ALLOWED_ROLES`, `Pricing`, `TenantInsurance` to the rest of the system?**
_3448 weakly-connected nodes found - possible documentation gaps or missing edges._
- **Should `Community 0` be split into smaller, more focused modules?**
_Cohesion score 0.04850964348334307 - nodes in this community are weakly interconnected._
_Cohesion score 0.049094097019286964 - nodes in this community are weakly interconnected._
- **Should `Community 1` be split into smaller, more focused modules?**
_Cohesion score 0.028985507246376812 - nodes in this community are weakly interconnected._
_Cohesion score 0.02857142857142857 - nodes in this community are weakly interconnected._
- **Should `Community 2` be split into smaller, more focused modules?**
_Cohesion score 0.04951923076923077 - nodes in this community are weakly interconnected._
_Cohesion score 0.06201550387596899 - nodes in this community are weakly interconnected._
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+2039 -1820
View File
File diff suppressed because it is too large Load Diff
+7 -2
View File
@@ -1570,8 +1570,8 @@
"semantic_hash": ""
},
"src/Shared/EventSubscriber/SecurityHeadersSubscriber.php": {
"mtime": 1781946833.720618,
"ast_hash": "b95292f604fa2b37dbb416c257343b64",
"mtime": 1782672841.0804546,
"ast_hash": "57d66396929ab5b7823859143ec1f563",
"semantic_hash": ""
},
"src/Shared/Exception/AppException.php": {
@@ -3273,5 +3273,10 @@
"mtime": 1782410984.7928963,
"ast_hash": "913a9ec57dd96b9d1fcead197e25e71b",
"semantic_hash": ""
},
"src/Shared/Controller/SeoController.php": {
"mtime": 1782672834.274309,
"ast_hash": "7b148f2bee655e2b1e70adf6476b5598",
"semantic_hash": ""
}
}
+53
View File
@@ -0,0 +1,53 @@
<?php
namespace App\Shared\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class SeoController extends AbstractController
{
#[Route('/robots.txt', name: 'seo_robots', methods: ['GET'])]
public function robots(Request $request): Response
{
if ($this->isStaging($request)) {
$body = "User-agent: *\nDisallow: /\n";
} else {
$base = $request->getSchemeAndHttpHost();
$body = "User-agent: *\n"
. "Disallow: /admin\n"
. "Disallow: /api\n"
. "Allow: /\n\n"
. "Sitemap: {$base}/sitemap.xml\n";
}
return new Response($body, Response::HTTP_OK, ['Content-Type' => 'text/plain; charset=UTF-8']);
}
#[Route('/sitemap.xml', name: 'seo_sitemap', methods: ['GET'])]
public function sitemap(Request $request): Response
{
$base = $request->getSchemeAndHttpHost();
$xml = '<?xml version="1.0" encoding="UTF-8"?>' . "\n"
. '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">' . "\n"
. ' <url>' . "\n"
. " <loc>{$base}/</loc>\n"
. ' <changefreq>weekly</changefreq>' . "\n"
. ' <priority>1.0</priority>' . "\n"
. ' </url>' . "\n"
. '</urlset>' . "\n";
return new Response($xml, Response::HTTP_OK, ['Content-Type' => 'application/xml; charset=UTF-8']);
}
private function isStaging(Request $request): bool
{
$host = $request->getHost();
return str_ends_with($host, '.ddev.site')
|| str_contains($host, 'localhost')
|| str_starts_with($host, '127.0.0.1');
}
}
@@ -29,6 +29,10 @@ class SecurityHeadersSubscriber implements EventSubscriberInterface
if (str_starts_with($path, '/api') && !str_starts_with($path, '/api/doc')) {
$response->headers->set('Content-Security-Policy', "default-src 'none'");
}
if (str_starts_with($path, '/admin') || str_starts_with($path, '/api')) {
$response->headers->set('X-Robots-Tag', 'noindex, nofollow');
}
}
public static function getSubscribedEvents(): array
+54 -1
View File
@@ -3,7 +3,60 @@
<head>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<title>کلینیک پرو — نرم‌افزار مدیریت مطب</title>
<title>کلینیک پرو — نرم‌افزار مدیریت مطب و نوبت‌دهی آنلاین</title>
{% set base = app.request.schemeAndHttpHost %}
<meta name="description" content="کلینیک پرو؛ نرم‌افزار مدیریت مطب و کلینیک — نوبت‌دهی آنلاین، پرونده‌ی بیمار و حسابداری مطب، همه در یک پنل ساده و سریع."/>
<link rel="canonical" href="{{ base }}/"/>
<meta name="robots" content="index, follow, max-image-preview:large"/>
<meta property="og:type" content="website"/>
<meta property="og:site_name" content="کلینیک پرو"/>
<meta property="og:title" content="کلینیک پرو — نرم‌افزار مدیریت مطب و نوبت‌دهی آنلاین"/>
<meta property="og:description" content="نوبت‌دهی آنلاین، پرونده‌ی بیمار و حساب مطب در یک پنل ساده و سریع."/>
<meta property="og:url" content="{{ base }}/"/>
<meta property="og:image" content="{{ base }}/icons/icon-512.png"/>
<meta property="og:locale" content="fa_IR"/>
<meta name="twitter:card" content="summary_large_image"/>
<meta name="twitter:title" content="کلینیک پرو — نرم‌افزار مدیریت مطب و نوبت‌دهی آنلاین"/>
<meta name="twitter:description" content="نوبت‌دهی آنلاین، پرونده‌ی بیمار و حساب مطب در یک پنل ساده و سریع."/>
<meta name="twitter:image" content="{{ base }}/icons/icon-512.png"/>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "{{ base }}/#org",
"name": "کلینیک پرو",
"url": "{{ base }}/",
"logo": "{{ base }}/icons/icon-512.png",
"contactPoint": {
"@type": "ContactPoint",
"telephone": "+98-74-91012178",
"contactType": "customer support",
"areaServed": "IR",
"availableLanguage": "fa"
},
"address": {
"@type": "PostalAddress",
"addressLocality": "یاسوج",
"streetAddress": "مهریان، خیابان شهید ستاره شیرازی، خیابان امام‌زاده احمد، پلاک ۸",
"addressCountry": "IR"
}
},
{
"@type": "WebSite",
"@id": "{{ base }}/#website",
"url": "{{ base }}/",
"name": "کلینیک پرو",
"inLanguage": "fa-IR",
"publisher": { "@id": "{{ base }}/#org" }
}
]
}
</script>
<link rel="preconnect" href="https://cdn.jsdelivr.net" crossorigin/>
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500;600&display=swap"/>
{{ encore_entry_link_tags('home') }}