Add manifest.json for graphify-out documentation with metadata for various files
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
import React from 'react';
|
||||
import { MagnifyingGlassIcon } from '@heroicons/react/24/outline';
|
||||
import { MagnifyingGlassIcon, ChevronUpIcon, ChevronDownIcon, ChevronUpDownIcon } from '@heroicons/react/24/outline';
|
||||
|
||||
export interface Column<T> {
|
||||
key: string;
|
||||
@@ -20,6 +20,9 @@ interface Props<T> {
|
||||
emptyMessage?: string;
|
||||
emptyAction?: React.ReactNode;
|
||||
headerExtra?: React.ReactNode;
|
||||
sortKey?: string | null;
|
||||
sortDir?: 'asc' | 'desc';
|
||||
onSort?: (key: string) => void;
|
||||
}
|
||||
|
||||
function SkeletonRow({ cols }: { cols: number }) {
|
||||
@@ -45,6 +48,9 @@ export default function DataTable<T extends object>({
|
||||
emptyMessage = 'هیچ موردی یافت نشد',
|
||||
emptyAction,
|
||||
headerExtra,
|
||||
sortKey,
|
||||
sortDir,
|
||||
onSort,
|
||||
}: Props<T>) {
|
||||
const allColumns = actions
|
||||
? [...columns, { key: '__actions', header: 'اقدامات', className: 'w-[120px]' }]
|
||||
@@ -74,11 +80,29 @@ export default function DataTable<T extends object>({
|
||||
<table className="t">
|
||||
<thead>
|
||||
<tr>
|
||||
{allColumns.map((col) => (
|
||||
<th key={col.key} className={col.className ?? ''}>
|
||||
{col.header}
|
||||
</th>
|
||||
))}
|
||||
{allColumns.map((col) => {
|
||||
const sortable = (col as Column<T>).sortable && onSort;
|
||||
const active = sortKey === col.key;
|
||||
return (
|
||||
<th
|
||||
key={col.key}
|
||||
className={col.className ?? ''}
|
||||
onClick={sortable ? () => onSort!(col.key) : undefined}
|
||||
style={sortable ? { cursor: 'pointer', userSelect: 'none' } : undefined}
|
||||
>
|
||||
<span style={{ display: 'inline-flex', alignItems: 'center', gap: 4 }}>
|
||||
{col.header}
|
||||
{sortable && (
|
||||
active
|
||||
? (sortDir === 'desc'
|
||||
? <ChevronDownIcon style={{ width: 13, height: 13 }} />
|
||||
: <ChevronUpIcon style={{ width: 13, height: 13 }} />)
|
||||
: <ChevronUpDownIcon style={{ width: 13, height: 13, opacity: 0.4 }} />
|
||||
)}
|
||||
</span>
|
||||
</th>
|
||||
);
|
||||
})}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
@@ -276,9 +276,13 @@ function ProvincesTab() {
|
||||
const [editTarget, setEditTarget] = useState<Province | null>(null);
|
||||
const [deleteTarget, setDeleteTarget] = useState<Province | null>(null);
|
||||
|
||||
const [idSort, setIdSort] = useState<'asc' | 'desc' | null>(null);
|
||||
const sortQs = idSort ? `&sort=id&order=${idSort}` : '';
|
||||
const toggleSort = () => { setIdSort((p) => (p === 'asc' ? 'desc' : 'asc')); setPage(1); };
|
||||
|
||||
const { data, isLoading } = useQuery({
|
||||
queryKey: ['admin-provinces', page, search],
|
||||
queryFn: () => api.get<PaginatedResponse<Province>>(`/api/v1/admin/provinces?page=${page}&limit=20&search=${encodeURIComponent(search)}`),
|
||||
queryKey: ['admin-provinces', page, search, idSort],
|
||||
queryFn: () => api.get<PaginatedResponse<Province>>(`/api/v1/admin/provinces?page=${page}&limit=20&search=${encodeURIComponent(search)}${sortQs}`),
|
||||
});
|
||||
|
||||
const items = data?.data ?? [];
|
||||
@@ -315,7 +319,7 @@ function ProvincesTab() {
|
||||
};
|
||||
|
||||
const columns: Column<Province>[] = [
|
||||
{ key: 'id', header: 'شناسه', render: (p) => <span className="muted" style={{ fontFamily: 'monospace', fontSize: 12 }}>{p.id}</span> },
|
||||
{ key: 'id', sortable: true, header: 'شناسه', render: (p) => <span className="muted" style={{ fontFamily: 'monospace', fontSize: 12 }}>{p.id}</span> },
|
||||
{ key: 'name', header: 'نام', render: (p) => <b>{p.name}</b> },
|
||||
{ key: 'weight', header: 'ترتیب', render: (p) => <span className="muted">{p.weight}</span> },
|
||||
{ key: 'status', header: 'وضعیت', render: (p) => <SBadge status={p.status} /> },
|
||||
@@ -324,7 +328,7 @@ function ProvincesTab() {
|
||||
return (
|
||||
<>
|
||||
<TabActions label="افزودن استان" onClick={() => { reset({ status: '1', weight: '0' }); setAddOpen(true); }} exportUrl="/api/v1/admin/categories/provinces/export" exportFile="state.json" bundle="provinces" entityLabel="استانها" onImported={() => qc.invalidateQueries({ queryKey: ['admin-provinces'] })} />
|
||||
<DataTable<Province> columns={columns} data={items} loading={isLoading} searchValue={search} onSearchChange={(v) => { setSearch(v); setPage(1); }} searchPlaceholder="جستجو در استانها..." emptyMessage="هیچ استانی یافت نشد"
|
||||
<DataTable<Province> columns={columns} data={items} loading={isLoading} sortKey={idSort ? 'id' : null} sortDir={idSort ?? undefined} onSort={toggleSort} searchValue={search} onSearchChange={(v) => { setSearch(v); setPage(1); }} searchPlaceholder="جستجو در استانها..." emptyMessage="هیچ استانی یافت نشد"
|
||||
actions={(p) => (
|
||||
<>
|
||||
<button onClick={() => openEdit(p)} className="mini-btn" title="ویرایش"><PencilIcon style={{ width: 14, height: 14 }} /></button>
|
||||
@@ -388,9 +392,13 @@ function CitiesTab() {
|
||||
const [editTarget, setEditTarget] = useState<City | null>(null);
|
||||
const [deleteTarget, setDeleteTarget] = useState<City | null>(null);
|
||||
|
||||
const [idSort, setIdSort] = useState<'asc' | 'desc' | null>(null);
|
||||
const sortQs = idSort ? `&sort=id&order=${idSort}` : '';
|
||||
const toggleSort = () => { setIdSort((p) => (p === 'asc' ? 'desc' : 'asc')); setPage(1); };
|
||||
|
||||
const { data, isLoading } = useQuery({
|
||||
queryKey: ['admin-cities', page, search],
|
||||
queryFn: () => api.get<PaginatedResponse<City>>(`/api/v1/admin/cities?page=${page}&limit=20&search=${encodeURIComponent(search)}`),
|
||||
queryKey: ['admin-cities', page, search, idSort],
|
||||
queryFn: () => api.get<PaginatedResponse<City>>(`/api/v1/admin/cities?page=${page}&limit=20&search=${encodeURIComponent(search)}${sortQs}`),
|
||||
});
|
||||
|
||||
const provincesQuery = useQuery({
|
||||
@@ -472,7 +480,7 @@ function CitiesTab() {
|
||||
};
|
||||
|
||||
const columns: Column<City>[] = [
|
||||
{ key: 'id', header: 'شناسه', render: (c) => <span className="muted" style={{ fontFamily: 'monospace', fontSize: 12 }}>{c.id}</span> },
|
||||
{ key: 'id', sortable: true, header: 'شناسه', render: (c) => <span className="muted" style={{ fontFamily: 'monospace', fontSize: 12 }}>{c.id}</span> },
|
||||
{ key: 'name', header: 'نام', render: (c) => <b>{c.name}</b> },
|
||||
{ key: 'province_id', header: 'استان', render: (c) => c.province_id ? <span className="chip">{provinceMap[c.province_id] ?? `#${c.province_id}`}</span> : <span className="muted">—</span> },
|
||||
{ key: 'representation_id', header: 'نماینده', render: (c) => c.representation_id ? <span className="muted" style={{ fontSize: 12 }}>{representationMap[c.representation_id] ?? `#${c.representation_id}`}</span> : <span className="muted">—</span> },
|
||||
@@ -484,7 +492,7 @@ function CitiesTab() {
|
||||
return (
|
||||
<>
|
||||
<TabActions label="افزودن شهر" onClick={() => { reset({ status: '1', weight: '0' }); setAddOpen(true); }} exportUrl="/api/v1/admin/categories/cities/export" exportFile="city.json" bundle="cities" entityLabel="شهرها" onImported={() => qc.invalidateQueries({ queryKey: ['admin-cities'] })} />
|
||||
<DataTable<City> columns={columns} data={items} loading={isLoading} searchValue={search} onSearchChange={(v) => { setSearch(v); setPage(1); }} searchPlaceholder="جستجو در شهرها..." emptyMessage="هیچ شهری یافت نشد"
|
||||
<DataTable<City> columns={columns} data={items} loading={isLoading} sortKey={idSort ? 'id' : null} sortDir={idSort ?? undefined} onSort={toggleSort} searchValue={search} onSearchChange={(v) => { setSearch(v); setPage(1); }} searchPlaceholder="جستجو در شهرها..." emptyMessage="هیچ شهری یافت نشد"
|
||||
actions={(c) => (
|
||||
<>
|
||||
<button onClick={() => openEdit(c)} className="mini-btn" title="ویرایش"><PencilIcon style={{ width: 14, height: 14 }} /></button>
|
||||
@@ -584,9 +592,13 @@ function SpecialtiesTab() {
|
||||
const [editTarget, setEditTarget] = useState<SpecialtyFull | null>(null);
|
||||
const [deleteTarget, setDeleteTarget] = useState<SpecialtyFull | null>(null);
|
||||
|
||||
const [idSort, setIdSort] = useState<'asc' | 'desc' | null>(null);
|
||||
const sortQs = idSort ? `&sort=id&order=${idSort}` : '';
|
||||
const toggleSort = () => { setIdSort((p) => (p === 'asc' ? 'desc' : 'asc')); setPage(1); };
|
||||
|
||||
const { data, isLoading } = useQuery({
|
||||
queryKey: ['admin-specialties', page, search],
|
||||
queryFn: () => api.get<PaginatedResponse<SpecialtyFull>>(`/api/v1/admin/specialties?page=${page}&limit=20&search=${encodeURIComponent(search)}`),
|
||||
queryKey: ['admin-specialties', page, search, idSort],
|
||||
queryFn: () => api.get<PaginatedResponse<SpecialtyFull>>(`/api/v1/admin/specialties?page=${page}&limit=20&search=${encodeURIComponent(search)}${sortQs}`),
|
||||
});
|
||||
|
||||
const { data: rootData } = useQuery({
|
||||
@@ -633,7 +645,7 @@ function SpecialtiesTab() {
|
||||
const parentOptions = rootItems.map((s) => ({ value: s.id, label: s.name }));
|
||||
|
||||
const columns: Column<SpecialtyFull>[] = [
|
||||
{ key: 'id', header: 'شناسه', render: (s) => <span className="muted" style={{ fontFamily: 'monospace', fontSize: 12 }}>{s.id}</span> },
|
||||
{ key: 'id', sortable: true, header: 'شناسه', render: (s) => <span className="muted" style={{ fontFamily: 'monospace', fontSize: 12 }}>{s.id}</span> },
|
||||
{ key: 'name', header: 'نام', render: (s) => <b>{s.name}</b> },
|
||||
{ key: 'slug', header: 'slug', render: (s) => <span className="muted" style={{ fontFamily: 'monospace', fontSize: 12 }}>{s.slug}</span> },
|
||||
{ key: 'parent_id', header: 'والد', render: (s) => s.parent_id ? <span className="chip">{parentMap[s.parent_id] ?? `#${s.parent_id}`}</span> : <span className="muted">—</span> },
|
||||
@@ -644,7 +656,7 @@ function SpecialtiesTab() {
|
||||
return (
|
||||
<>
|
||||
<TabActions label="افزودن تخصص" onClick={() => { reset({ status: '1', weight: '0' }); setAddOpen(true); }} exportUrl="/api/v1/admin/categories/specialties/export" exportFile="specialties.json" bundle="specialties" entityLabel="تخصصها" onImported={() => { qc.invalidateQueries({ queryKey: ['admin-specialties'] }); qc.invalidateQueries({ queryKey: ['admin-specialties-roots'] }); }} />
|
||||
<DataTable<SpecialtyFull> columns={columns} data={items} loading={isLoading} searchValue={search} onSearchChange={(v) => { setSearch(v); setPage(1); }} searchPlaceholder="جستجو در تخصصها..." emptyMessage="هیچ تخصصی یافت نشد"
|
||||
<DataTable<SpecialtyFull> columns={columns} data={items} loading={isLoading} sortKey={idSort ? 'id' : null} sortDir={idSort ?? undefined} onSort={toggleSort} searchValue={search} onSearchChange={(v) => { setSearch(v); setPage(1); }} searchPlaceholder="جستجو در تخصصها..." emptyMessage="هیچ تخصصی یافت نشد"
|
||||
actions={(s) => (
|
||||
<>
|
||||
<button onClick={() => openEdit(s)} className="mini-btn" title="ویرایش"><PencilIcon style={{ width: 14, height: 14 }} /></button>
|
||||
@@ -708,9 +720,13 @@ function DoctorServicesTab() {
|
||||
const [editTarget, setEditTarget] = useState<DoctorService | null>(null);
|
||||
const [deleteTarget, setDeleteTarget] = useState<DoctorService | null>(null);
|
||||
|
||||
const [idSort, setIdSort] = useState<'asc' | 'desc' | null>(null);
|
||||
const sortQs = idSort ? `&sort=id&order=${idSort}` : '';
|
||||
const toggleSort = () => { setIdSort((p) => (p === 'asc' ? 'desc' : 'asc')); setPage(1); };
|
||||
|
||||
const { data, isLoading } = useQuery({
|
||||
queryKey: ['admin-doctor-services', page, search],
|
||||
queryFn: () => api.get<PaginatedResponse<DoctorService>>(`/api/v1/admin/doctor-services?page=${page}&limit=20&search=${encodeURIComponent(search)}`),
|
||||
queryKey: ['admin-doctor-services', page, search, idSort],
|
||||
queryFn: () => api.get<PaginatedResponse<DoctorService>>(`/api/v1/admin/doctor-services?page=${page}&limit=20&search=${encodeURIComponent(search)}${sortQs}`),
|
||||
});
|
||||
|
||||
const specialtiesQuery = useQuery({
|
||||
@@ -755,7 +771,7 @@ function DoctorServicesTab() {
|
||||
};
|
||||
|
||||
const columns: Column<DoctorService>[] = [
|
||||
{ key: 'id', header: 'شناسه', render: (s) => <span className="muted" style={{ fontFamily: 'monospace', fontSize: 12 }}>{s.id}</span> },
|
||||
{ key: 'id', sortable: true, header: 'شناسه', render: (s) => <span className="muted" style={{ fontFamily: 'monospace', fontSize: 12 }}>{s.id}</span> },
|
||||
{ key: 'name', header: 'نام', render: (s) => <b>{s.name}</b> },
|
||||
{ key: 'specialty_id', header: 'تخصص', render: (s) => s.specialty_id ? <span className="badge violet"><span className="bdot" />{specialtyMap[s.specialty_id] ?? `#${s.specialty_id}`}</span> : <span className="muted">—</span> },
|
||||
{ key: 'weight', header: 'ترتیب', render: (s) => <span className="muted">{s.weight}</span> },
|
||||
@@ -765,7 +781,7 @@ function DoctorServicesTab() {
|
||||
return (
|
||||
<>
|
||||
<TabActions label="افزودن خدمت" onClick={() => { reset({ status: '1', weight: '0' }); setAddOpen(true); }} exportUrl="/api/v1/admin/categories/doctor_services/export" exportFile="doctor-services.json" bundle="doctor_services" entityLabel="خدمات پزشک" onImported={() => qc.invalidateQueries({ queryKey: ['admin-doctor-services'] })} />
|
||||
<DataTable<DoctorService> columns={columns} data={items} loading={isLoading} searchValue={search} onSearchChange={(v) => { setSearch(v); setPage(1); }} searchPlaceholder="جستجو در خدمات..." emptyMessage="هیچ خدمتی یافت نشد"
|
||||
<DataTable<DoctorService> columns={columns} data={items} loading={isLoading} sortKey={idSort ? 'id' : null} sortDir={idSort ?? undefined} onSort={toggleSort} searchValue={search} onSearchChange={(v) => { setSearch(v); setPage(1); }} searchPlaceholder="جستجو در خدمات..." emptyMessage="هیچ خدمتی یافت نشد"
|
||||
actions={(s) => (
|
||||
<>
|
||||
<button onClick={() => openEdit(s)} className="mini-btn" title="ویرایش"><PencilIcon style={{ width: 14, height: 14 }} /></button>
|
||||
@@ -830,9 +846,13 @@ function InsurancesTab() {
|
||||
const [logoUrl, setLogoUrl] = useState<string | null>(null);
|
||||
const [uploadTarget, setUploadTarget] = useState<number | null>(null);
|
||||
|
||||
const [idSort, setIdSort] = useState<'asc' | 'desc' | null>(null);
|
||||
const sortQs = idSort ? `&sort=id&order=${idSort}` : '';
|
||||
const toggleSort = () => { setIdSort((p) => (p === 'asc' ? 'desc' : 'asc')); setPage(1); };
|
||||
|
||||
const { data, isLoading } = useQuery({
|
||||
queryKey: ['admin-insurances', page, search],
|
||||
queryFn: () => api.get<PaginatedResponse<Insurance>>(`/api/v1/admin/insurances?page=${page}&limit=20&search=${encodeURIComponent(search)}`),
|
||||
queryKey: ['admin-insurances', page, search, idSort],
|
||||
queryFn: () => api.get<PaginatedResponse<Insurance>>(`/api/v1/admin/insurances?page=${page}&limit=20&search=${encodeURIComponent(search)}${sortQs}`),
|
||||
});
|
||||
|
||||
const items = data?.data ?? [];
|
||||
@@ -871,7 +891,7 @@ function InsurancesTab() {
|
||||
};
|
||||
|
||||
const columns: Column<Insurance>[] = [
|
||||
{ key: 'id', header: 'شناسه', render: (i) => <span className="muted" style={{ fontFamily: 'monospace', fontSize: 12 }}>{i.id}</span> },
|
||||
{ key: 'id', sortable: true, header: 'شناسه', render: (i) => <span className="muted" style={{ fontFamily: 'monospace', fontSize: 12 }}>{i.id}</span> },
|
||||
{ key: 'name', header: 'نام', render: (i) => (
|
||||
<div style={{ display: 'flex', alignItems: 'center', gap: 8 }}>
|
||||
{i.logo_url ? (
|
||||
@@ -891,7 +911,7 @@ function InsurancesTab() {
|
||||
return (
|
||||
<>
|
||||
<TabActions label="افزودن بیمه" onClick={() => { reset({ status: '1', type: 'basic' }); setLogoUrl(null); setUploadTarget(null); setAddOpen(true); }} exportUrl="/api/v1/admin/categories/insurances/export" exportFile="insurances.json" bundle="insurances" entityLabel="بیمهها" onImported={() => qc.invalidateQueries({ queryKey: ['admin-insurances'] })} />
|
||||
<DataTable<Insurance> columns={columns} data={items} loading={isLoading} searchValue={search} onSearchChange={(v) => { setSearch(v); setPage(1); }} searchPlaceholder="جستجو در بیمهها..." emptyMessage="هیچ بیمهای یافت نشد"
|
||||
<DataTable<Insurance> columns={columns} data={items} loading={isLoading} sortKey={idSort ? 'id' : null} sortDir={idSort ?? undefined} onSort={toggleSort} searchValue={search} onSearchChange={(v) => { setSearch(v); setPage(1); }} searchPlaceholder="جستجو در بیمهها..." emptyMessage="هیچ بیمهای یافت نشد"
|
||||
actions={(i) => (
|
||||
<>
|
||||
<button onClick={() => openEdit(i)} className="mini-btn" title="ویرایش"><PencilIcon style={{ width: 14, height: 14 }} /></button>
|
||||
@@ -957,9 +977,13 @@ function TagsTab() {
|
||||
const [editTarget, setEditTarget] = useState<Tag | null>(null);
|
||||
const [deleteTarget, setDeleteTarget] = useState<Tag | null>(null);
|
||||
|
||||
const [idSort, setIdSort] = useState<'asc' | 'desc' | null>(null);
|
||||
const sortQs = idSort ? `&sort=id&order=${idSort}` : '';
|
||||
const toggleSort = () => { setIdSort((p) => (p === 'asc' ? 'desc' : 'asc')); setPage(1); };
|
||||
|
||||
const { data, isLoading } = useQuery({
|
||||
queryKey: ['admin-tags', page, search],
|
||||
queryFn: () => api.get<PaginatedResponse<Tag>>(`/api/v1/admin/tags?page=${page}&limit=20&search=${encodeURIComponent(search)}`),
|
||||
queryKey: ['admin-tags', page, search, idSort],
|
||||
queryFn: () => api.get<PaginatedResponse<Tag>>(`/api/v1/admin/tags?page=${page}&limit=20&search=${encodeURIComponent(search)}${sortQs}`),
|
||||
});
|
||||
|
||||
const items = data?.data ?? [];
|
||||
@@ -996,7 +1020,7 @@ function TagsTab() {
|
||||
};
|
||||
|
||||
const columns: Column<Tag>[] = [
|
||||
{ key: 'id', header: 'شناسه', render: (t) => <span className="muted" style={{ fontFamily: 'monospace', fontSize: 12 }}>{t.id}</span> },
|
||||
{ key: 'id', sortable: true, header: 'شناسه', render: (t) => <span className="muted" style={{ fontFamily: 'monospace', fontSize: 12 }}>{t.id}</span> },
|
||||
{ key: 'name', header: 'نام', render: (t) => <span className="chip">{t.name}</span> },
|
||||
{ key: 'slug', header: 'slug', render: (t) => <span className="muted" style={{ fontFamily: 'monospace', fontSize: 12 }}>{t.slug}</span> },
|
||||
{ key: 'status', header: 'وضعیت', render: (t) => <SBadge status={t.status} /> },
|
||||
@@ -1005,7 +1029,7 @@ function TagsTab() {
|
||||
return (
|
||||
<>
|
||||
<TabActions label="افزودن تگ" onClick={() => { reset({ status: '1' }); setAddOpen(true); }} exportUrl="/api/v1/admin/categories/tags/export" exportFile="tags.json" bundle="tags" entityLabel="تگها" onImported={() => qc.invalidateQueries({ queryKey: ['admin-tags'] })} />
|
||||
<DataTable<Tag> columns={columns} data={items} loading={isLoading} searchValue={search} onSearchChange={(v) => { setSearch(v); setPage(1); }} searchPlaceholder="جستجو در تگها..." emptyMessage="هیچ تگی یافت نشد"
|
||||
<DataTable<Tag> columns={columns} data={items} loading={isLoading} sortKey={idSort ? 'id' : null} sortDir={idSort ?? undefined} onSort={toggleSort} searchValue={search} onSearchChange={(v) => { setSearch(v); setPage(1); }} searchPlaceholder="جستجو در تگها..." emptyMessage="هیچ تگی یافت نشد"
|
||||
actions={(t) => (
|
||||
<>
|
||||
<button onClick={() => openEdit(t)} className="mini-btn" title="ویرایش"><PencilIcon style={{ width: 14, height: 14 }} /></button>
|
||||
|
||||
@@ -151,3 +151,10 @@ Delete a doctor service.
|
||||
|
||||
Full-table JSON export and strict wipe+replace import for this category live under
|
||||
`/api/v1/admin/categories/{bundle}/{export|import}` — see [category-import.md](category-import.md).
|
||||
|
||||
|
||||
### Sorting by id
|
||||
|
||||
The admin list endpoint accepts `sort=id&order=asc|desc` to order by `id`
|
||||
(used by the admin «دستهبندیها» page when clicking the «شناسه» column).
|
||||
Without `sort`, the default ordering (weight/name) is unchanged.
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
{
|
||||
"0": "Community 0",
|
||||
"1": "Community 1",
|
||||
"2": "Community 2",
|
||||
"3": "Community 3",
|
||||
"4": "Community 4",
|
||||
"5": "Community 5",
|
||||
"6": "Community 6",
|
||||
"7": "Community 7",
|
||||
"8": "Community 8",
|
||||
"9": "Community 9",
|
||||
"10": "Community 10",
|
||||
"11": "Community 11",
|
||||
"12": "Community 12",
|
||||
"13": "Community 13",
|
||||
"14": "Community 14",
|
||||
"15": "Community 15",
|
||||
"16": "Community 16",
|
||||
"17": "Community 17",
|
||||
"18": "Community 18",
|
||||
"19": "Community 19",
|
||||
"20": "Community 20",
|
||||
"21": "Community 21",
|
||||
"22": "Community 22",
|
||||
"23": "Community 23",
|
||||
"24": "Community 24",
|
||||
"25": "Community 25",
|
||||
"26": "Community 26",
|
||||
"27": "Community 27",
|
||||
"28": "Community 28",
|
||||
"29": "Community 29",
|
||||
"30": "Community 30",
|
||||
"31": "Community 31",
|
||||
"32": "Community 32",
|
||||
"33": "Community 33",
|
||||
"34": "Community 34",
|
||||
"35": "Community 35",
|
||||
"36": "Community 36",
|
||||
"37": "Community 37",
|
||||
"38": "Community 38",
|
||||
"39": "Community 39",
|
||||
"40": "Community 40",
|
||||
"41": "Community 41",
|
||||
"42": "Community 42",
|
||||
"43": "Community 43",
|
||||
"44": "Community 44",
|
||||
"45": "Community 45",
|
||||
"46": "Community 46",
|
||||
"47": "Community 47",
|
||||
"48": "Community 48",
|
||||
"49": "Community 49",
|
||||
"50": "Community 50",
|
||||
"51": "Community 51",
|
||||
"52": "Community 52",
|
||||
"53": "Community 53",
|
||||
"54": "Community 54",
|
||||
"55": "Community 55",
|
||||
"56": "Community 56",
|
||||
"57": "Community 57",
|
||||
"58": "Community 58",
|
||||
"59": "Community 59",
|
||||
"60": "Community 60",
|
||||
"61": "Community 61",
|
||||
"62": "Community 62",
|
||||
"63": "Community 63",
|
||||
"64": "Community 64",
|
||||
"65": "Community 65",
|
||||
"66": "Community 66",
|
||||
"67": "Community 67",
|
||||
"68": "Community 68",
|
||||
"69": "Community 69",
|
||||
"70": "Community 70",
|
||||
"71": "Community 71",
|
||||
"72": "Community 72",
|
||||
"73": "Community 73",
|
||||
"74": "Community 74",
|
||||
"75": "Community 75",
|
||||
"76": "Community 76",
|
||||
"77": "Community 77",
|
||||
"78": "Community 78",
|
||||
"79": "Community 79",
|
||||
"80": "Community 80",
|
||||
"81": "Community 81",
|
||||
"82": "Community 82",
|
||||
"83": "Community 83",
|
||||
"84": "Community 84",
|
||||
"85": "Community 85",
|
||||
"86": "Community 86",
|
||||
"87": "Community 87"
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
.
|
||||
@@ -0,0 +1,499 @@
|
||||
# Graph Report - api (2026-06-30)
|
||||
|
||||
## Corpus Check
|
||||
- 28 files · ~36,437 words
|
||||
- Verdict: corpus is large enough that graph structure adds value.
|
||||
|
||||
## Summary
|
||||
- 957 nodes · 957 edges · 88 communities
|
||||
- Extraction: 100% EXTRACTED · 0% INFERRED · 0% AMBIGUOUS
|
||||
- Token cost: 0 input · 0 output
|
||||
|
||||
## Graph Freshness
|
||||
- Built from commit: `9eb5a032`
|
||||
- Run `git rev-parse HEAD` and compare to check if the graph is stale.
|
||||
- Run `graphify update .` after code changes (no API cost).
|
||||
|
||||
## Community Hubs (Navigation)
|
||||
- [[_COMMUNITY_Community 0|Community 0]]
|
||||
- [[_COMMUNITY_Community 1|Community 1]]
|
||||
- [[_COMMUNITY_Community 2|Community 2]]
|
||||
- [[_COMMUNITY_Community 3|Community 3]]
|
||||
- [[_COMMUNITY_Community 4|Community 4]]
|
||||
- [[_COMMUNITY_Community 5|Community 5]]
|
||||
- [[_COMMUNITY_Community 6|Community 6]]
|
||||
- [[_COMMUNITY_Community 7|Community 7]]
|
||||
- [[_COMMUNITY_Community 8|Community 8]]
|
||||
- [[_COMMUNITY_Community 9|Community 9]]
|
||||
- [[_COMMUNITY_Community 10|Community 10]]
|
||||
- [[_COMMUNITY_Community 11|Community 11]]
|
||||
- [[_COMMUNITY_Community 12|Community 12]]
|
||||
- [[_COMMUNITY_Community 13|Community 13]]
|
||||
- [[_COMMUNITY_Community 14|Community 14]]
|
||||
- [[_COMMUNITY_Community 15|Community 15]]
|
||||
- [[_COMMUNITY_Community 16|Community 16]]
|
||||
- [[_COMMUNITY_Community 17|Community 17]]
|
||||
- [[_COMMUNITY_Community 18|Community 18]]
|
||||
- [[_COMMUNITY_Community 19|Community 19]]
|
||||
- [[_COMMUNITY_Community 20|Community 20]]
|
||||
- [[_COMMUNITY_Community 21|Community 21]]
|
||||
- [[_COMMUNITY_Community 22|Community 22]]
|
||||
- [[_COMMUNITY_Community 23|Community 23]]
|
||||
- [[_COMMUNITY_Community 24|Community 24]]
|
||||
- [[_COMMUNITY_Community 25|Community 25]]
|
||||
- [[_COMMUNITY_Community 26|Community 26]]
|
||||
- [[_COMMUNITY_Community 27|Community 27]]
|
||||
- [[_COMMUNITY_Community 28|Community 28]]
|
||||
- [[_COMMUNITY_Community 29|Community 29]]
|
||||
- [[_COMMUNITY_Community 30|Community 30]]
|
||||
- [[_COMMUNITY_Community 31|Community 31]]
|
||||
- [[_COMMUNITY_Community 32|Community 32]]
|
||||
- [[_COMMUNITY_Community 33|Community 33]]
|
||||
- [[_COMMUNITY_Community 34|Community 34]]
|
||||
- [[_COMMUNITY_Community 35|Community 35]]
|
||||
- [[_COMMUNITY_Community 36|Community 36]]
|
||||
- [[_COMMUNITY_Community 37|Community 37]]
|
||||
- [[_COMMUNITY_Community 38|Community 38]]
|
||||
- [[_COMMUNITY_Community 39|Community 39]]
|
||||
- [[_COMMUNITY_Community 40|Community 40]]
|
||||
- [[_COMMUNITY_Community 41|Community 41]]
|
||||
- [[_COMMUNITY_Community 42|Community 42]]
|
||||
- [[_COMMUNITY_Community 43|Community 43]]
|
||||
- [[_COMMUNITY_Community 44|Community 44]]
|
||||
- [[_COMMUNITY_Community 45|Community 45]]
|
||||
- [[_COMMUNITY_Community 46|Community 46]]
|
||||
- [[_COMMUNITY_Community 47|Community 47]]
|
||||
- [[_COMMUNITY_Community 48|Community 48]]
|
||||
- [[_COMMUNITY_Community 49|Community 49]]
|
||||
- [[_COMMUNITY_Community 50|Community 50]]
|
||||
- [[_COMMUNITY_Community 51|Community 51]]
|
||||
- [[_COMMUNITY_Community 52|Community 52]]
|
||||
- [[_COMMUNITY_Community 53|Community 53]]
|
||||
- [[_COMMUNITY_Community 54|Community 54]]
|
||||
- [[_COMMUNITY_Community 55|Community 55]]
|
||||
- [[_COMMUNITY_Community 56|Community 56]]
|
||||
- [[_COMMUNITY_Community 57|Community 57]]
|
||||
- [[_COMMUNITY_Community 58|Community 58]]
|
||||
- [[_COMMUNITY_Community 59|Community 59]]
|
||||
- [[_COMMUNITY_Community 60|Community 60]]
|
||||
- [[_COMMUNITY_Community 61|Community 61]]
|
||||
- [[_COMMUNITY_Community 62|Community 62]]
|
||||
- [[_COMMUNITY_Community 63|Community 63]]
|
||||
- [[_COMMUNITY_Community 64|Community 64]]
|
||||
- [[_COMMUNITY_Community 65|Community 65]]
|
||||
- [[_COMMUNITY_Community 66|Community 66]]
|
||||
- [[_COMMUNITY_Community 67|Community 67]]
|
||||
- [[_COMMUNITY_Community 68|Community 68]]
|
||||
- [[_COMMUNITY_Community 69|Community 69]]
|
||||
- [[_COMMUNITY_Community 70|Community 70]]
|
||||
- [[_COMMUNITY_Community 71|Community 71]]
|
||||
- [[_COMMUNITY_Community 72|Community 72]]
|
||||
- [[_COMMUNITY_Community 73|Community 73]]
|
||||
- [[_COMMUNITY_Community 74|Community 74]]
|
||||
- [[_COMMUNITY_Community 75|Community 75]]
|
||||
- [[_COMMUNITY_Community 76|Community 76]]
|
||||
- [[_COMMUNITY_Community 77|Community 77]]
|
||||
- [[_COMMUNITY_Community 78|Community 78]]
|
||||
- [[_COMMUNITY_Community 79|Community 79]]
|
||||
- [[_COMMUNITY_Community 80|Community 80]]
|
||||
- [[_COMMUNITY_Community 81|Community 81]]
|
||||
- [[_COMMUNITY_Community 82|Community 82]]
|
||||
- [[_COMMUNITY_Community 83|Community 83]]
|
||||
- [[_COMMUNITY_Community 84|Community 84]]
|
||||
- [[_COMMUNITY_Community 85|Community 85]]
|
||||
- [[_COMMUNITY_Community 86|Community 86]]
|
||||
- [[_COMMUNITY_Community 87|Community 87]]
|
||||
|
||||
## God Nodes (most connected - your core abstractions)
|
||||
1. `User Management` - 20 edges
|
||||
2. `Authentication API` - 18 edges
|
||||
3. `Admin API` - 17 edges
|
||||
4. `Insurance API` - 17 edges
|
||||
5. `Weekly Schedule` - 16 edges
|
||||
6. `Date Overrides` - 15 edges
|
||||
7. `SMS API` - 15 edges
|
||||
8. `Holidays` - 13 edges
|
||||
9. `Doctor API` - 13 edges
|
||||
10. `Location API (Province & City)` - 13 edges
|
||||
|
||||
## Surprising Connections (you probably didn't know these)
|
||||
- None detected - all connections are within the same source files.
|
||||
|
||||
## Import Cycles
|
||||
- None detected.
|
||||
|
||||
## Communities (88 total, 0 thin omitted)
|
||||
|
||||
### Community 0 - "Community 0"
|
||||
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 1 - "Community 1"
|
||||
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 2 - "Community 2"
|
||||
Cohesion: 0.05
|
||||
Nodes (41): DELETE `/api/v1/representation/iban/{id}`, Errors, Errors, Errors, Errors, Errors, Errors, Errors (+33 more)
|
||||
|
||||
### Community 3 - "Community 3"
|
||||
Cohesion: 0.05
|
||||
Nodes (39): Appointment API, Error Responses, Errors, Errors, Errors, Errors, Errors, Errors (+31 more)
|
||||
|
||||
### Community 4 - "Community 4"
|
||||
Cohesion: 0.05
|
||||
Nodes (38): DELETE `/api/v1/comment/{uuid}`, Errors, Errors, Errors, Errors, Errors, Errors, Errors (+30 more)
|
||||
|
||||
### Community 5 - "Community 5"
|
||||
Cohesion: 0.06
|
||||
Nodes (35): Appointment Settings API, Available Locations, Day Index Convention, DELETE `/api/v1/appointment-settings/holidays/{uuid}`, DELETE `/api/v1/booking-setting/{uuid}`, Errors, Errors, Errors (+27 more)
|
||||
|
||||
### Community 6 - "Community 6"
|
||||
Cohesion: 0.06
|
||||
Nodes (35): Bulk import / export, DELETE `/api/v1/admin/city/{id}`, DELETE `/api/v1/admin/province/{id}`, Errors, Errors, Errors, Errors, GET `/api/v1/admin/cities` (+27 more)
|
||||
|
||||
### Community 7 - "Community 7"
|
||||
Cohesion: 0.07
|
||||
Nodes (25): Authentication, ClinicPro — API Documentation Index, Error Code Reference, Modules, Standard Response Envelope, Bulk import / export, DELETE `/api/v1/admin/tag/{id}`, Errors (+17 more)
|
||||
|
||||
### Community 8 - "Community 8"
|
||||
Cohesion: 0.06
|
||||
Nodes (32): Errors, Errors, Errors, Errors, Errors, Errors, Errors, FinancialBreakdown (لاگ مالی) (+24 more)
|
||||
|
||||
### Community 9 - "Community 9"
|
||||
Cohesion: 0.07
|
||||
Nodes (29): DELETE `/api/v1/representation/{uuid}`, Errors, Errors, Errors, Errors, Errors, Errors, GET `/api/v1/representation/dashboard/summary` (+21 more)
|
||||
|
||||
### Community 10 - "Community 10"
|
||||
Cohesion: 0.07
|
||||
Nodes (27): Errors, Errors, Errors, Errors, GET `/api/v1/my/payments`, GET `/api/v1/payment/callback/{gateway}`, GET `/api/v1/payment/config`, GET `/api/v1/payment/{uuid}` (+19 more)
|
||||
|
||||
### Community 11 - "Community 11"
|
||||
Cohesion: 0.07
|
||||
Nodes (27): DELETE `/api/v1/secretary/{uuid}`, Errors, Errors, Errors, Errors, Errors, Errors, GET `/api/v1/secretaries/clinic/{clinicUuid}` (+19 more)
|
||||
|
||||
### Community 12 - "Community 12"
|
||||
Cohesion: 0.08
|
||||
Nodes (25): Bulk import / export, DELETE `/api/v1/admin/specialty/{id}`, Errors, Errors, Errors, Errors, GET `/api/v1/admin/specialties`, GET `/api/v1/specialties` (+17 more)
|
||||
|
||||
### Community 13 - "Community 13"
|
||||
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 14 - "Community 14"
|
||||
Cohesion: 0.08
|
||||
Nodes (22): Billing API — صورتحساب (فاز ۴ سیستم صورتحساب/بیمه), Claims — مطالبات بیمه (فاز ۵), GET /api/v1/billing/claims, GET /api/v1/billing/invoices/{uuid}, GET /api/v1/billing/reports/insurance-debt, POST /api/v1/billing/claims, POST /api/v1/billing/claims/{uuid}/{action}, POST /api/v1/billing/invoices (+14 more)
|
||||
|
||||
### Community 15 - "Community 15"
|
||||
Cohesion: 0.09
|
||||
Nodes (21): Bulk import / export, DELETE `/api/v1/admin/doctor-service/{id}`, Doctor Service API, Errors, Errors, Errors, Errors, GET `/api/v1/admin/doctor-services` (+13 more)
|
||||
|
||||
### Community 16 - "Community 16"
|
||||
Cohesion: 0.09
|
||||
Nodes (21): DELETE `/api/v1/user-profile/{uuid}`, Errors, Errors, Errors, Errors, Errors, GET `/api/v1/user-profile/{uuid}`, PATCH `/api/v1/user-profile/{uuid}` (+13 more)
|
||||
|
||||
### Community 17 - "Community 17"
|
||||
Cohesion: 0.10
|
||||
Nodes (20): DELETE `/api/v1/admin/users/{uuid}`, Errors, Errors, GET `/api/v1/admin/users`, GET `/api/v1/admin/users/stats`, GET `/api/v1/admin/users/{uuid}`, POST `/api/v1/admin/users/{uuid}/status`, PUT `/api/v1/admin/users/{uuid}` (+12 more)
|
||||
|
||||
### Community 18 - "Community 18"
|
||||
Cohesion: 0.12
|
||||
Nodes (15): Dashboard API, Errors, Errors, Errors, GET /api/v1/admin/dashboard/charts, GET /api/v1/dashboard/clinic, GET /api/v1/dashboard/doctor, GET /api/v1/dashboard/secretary (+7 more)
|
||||
|
||||
### Community 19 - "Community 19"
|
||||
Cohesion: 0.12
|
||||
Nodes (15): Admin Endpoints, DELETE /api/v1/admin/subscription/period/{uuid}, Error Codes, GET /api/v1/admin/subscription/plans, GET /api/v1/admin/subscription/report, GET /api/v1/subscription/my, GET /api/v1/subscription-payment/callback/{gateway}, GET /api/v1/subscription/plans (+7 more)
|
||||
|
||||
### Community 20 - "Community 20"
|
||||
Cohesion: 0.13
|
||||
Nodes (15): Date Overrides, DELETE `/api/v1/appointment-settings/date-override/{uuid}`, Errors, Errors, GET `/api/v1/appointment-settings/date-override/list/{doctorUuid}`, GET `/api/v1/appointment-settings/date-override/{uuid}`, PATCH `/api/v1/appointment-settings/date-override/{uuid}`, POST `/api/v1/appointment-settings/date-override` (+7 more)
|
||||
|
||||
### Community 21 - "Community 21"
|
||||
Cohesion: 0.14
|
||||
Nodes (14): Doctor Management, Errors, Errors, GET `/api/v1/admin/doctors`, GET `/api/v1/admin/doctors/stats`, POST `/api/v1/admin/clinic`, POST `/api/v1/admin/doctors`, POST `/api/v1/admin/doctors/{uuid}/status` (+6 more)
|
||||
|
||||
### Community 22 - "Community 22"
|
||||
Cohesion: 0.15
|
||||
Nodes (12): Clinic Services API, DELETE /api/v1/service-item/{uuid}, DELETE /api/v1/service-section/{uuid}, GET /api/v1/service-items/{sectionUuid}, GET /api/v1/service-items/{uuid}/tariffs, GET /api/v1/service-sections, PATCH /api/v1/service-item/{uuid}, PATCH /api/v1/service-section/{uuid} (+4 more)
|
||||
|
||||
### Community 23 - "Community 23"
|
||||
Cohesion: 0.18
|
||||
Nodes (11): Appointment Management, Error Responses, GET `/api/v1/admin/appointments`, GET `/api/v1/admin/appointments/today-stats`, POST `/api/v1/admin/appointment`, Query Parameters, Query Parameters, Request Body (+3 more)
|
||||
|
||||
### Community 24 - "Community 24"
|
||||
Cohesion: 0.18
|
||||
Nodes (11): Category Import / Export API, Errors, Errors, GET `/api/v1/admin/categories/{bundle}/export`, Per-row validation rules, POST `/api/v1/admin/categories/{bundle}/import`, Request Body (`application/json`), Response `200` (+3 more)
|
||||
|
||||
### Community 25 - "Community 25"
|
||||
Cohesion: 0.20
|
||||
Nodes (10): Bulk import / export, DELETE `/api/v1/admin/insurance/{id}`, DELETE `/api/v1/insurance/{id}`, EntityInsurancePricing — قیمتگذاری ویزیت بر اساس بیمه, GET `/api/v1/insurance/{id}`, Insurance API, Response `200`, Response `200` (+2 more)
|
||||
|
||||
### Community 26 - "Community 26"
|
||||
Cohesion: 0.22
|
||||
Nodes (9): Admin API, Application Logs, Clinic Invitation Management, GET `/api/v1/admin/logs`, GET /api/v1/admin/settings, PATCH /api/v1/admin/settings, Query Parameters, Response `200` (+1 more)
|
||||
|
||||
### Community 27 - "Community 27"
|
||||
Cohesion: 0.22
|
||||
Nodes (9): Clinic Management, DELETE `/api/v1/admin/clinic/{uuid}`, Errors, GET `/api/v1/admin/clinics`, PATCH `/api/v1/admin/clinic/{uuid}/status`, Query Parameters, Response `200`, Response `200` (+1 more)
|
||||
|
||||
### Community 28 - "Community 28"
|
||||
Cohesion: 0.22
|
||||
Nodes (8): Authentication API, DELETE `/api/v1/notification-mobile/{target}`, Errors, Notification Mobile (OTP), POST `/oauth/logout`, Request Body, Response `200`, Response `200`
|
||||
|
||||
### Community 29 - "Community 29"
|
||||
Cohesion: 0.25
|
||||
Nodes (7): DELETE `/api/v1/clinic-pro/doctor-address/{id}`, Doctor API, Errors, GET `/api/v1/doctors`, Query Parameters, Response `200`, Response `200`
|
||||
|
||||
### Community 30 - "Community 30"
|
||||
Cohesion: 0.25
|
||||
Nodes (8): Errors, GET `/api/v1/admin/sms/messages`, PATCH `/api/v1/admin/sms/messages/{tag}`, Path Parameters, Request Body, Response `200`, Response `200`, متن ویرایشپذیر پیامکهای سیستمی
|
||||
|
||||
### Community 31 - "Community 31"
|
||||
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 32 - "Community 32"
|
||||
Cohesion: 0.33
|
||||
Nodes (6): GET `/api/v1/admin/sms/logs`, GET `/api/v1/admin/sms/templates`, Query Parameters, Response `200`, Response `200`, SMS Management (Admin)
|
||||
|
||||
### Community 33 - "Community 33"
|
||||
Cohesion: 0.33
|
||||
Nodes (6): GET `/api/v1/admin/sms/templates`, GET /api/v1/sms/settings, PATCH /api/v1/sms/settings, Response `200`, SMS API, SMS Settings
|
||||
|
||||
### Community 34 - "Community 34"
|
||||
Cohesion: 0.33
|
||||
Nodes (5): GET /api/v1/staff, PATCH /api/v1/staff/{uuid}, PATCH /api/v1/staff/{uuid}/toggle, POST /api/v1/staff, Staff API
|
||||
|
||||
### Community 35 - "Community 35"
|
||||
Cohesion: 0.40
|
||||
Nodes (5): GET `/api/v1/admin/comments`, GET `/api/v1/admin/rates`, Query Parameters, Query Parameters, Rating & Comment Management
|
||||
|
||||
### Community 36 - "Community 36"
|
||||
Cohesion: 0.40
|
||||
Nodes (5): GET `/api/v1/admin/financial-breakdowns`, GET `/api/v1/admin/financial-summary`, GET `/api/v1/admin/settings/tax-history`, GET `/api/v1/admin/settlement/{uuid}`, موتور مالی نمایندگی
|
||||
|
||||
### Community 37 - "Community 37"
|
||||
Cohesion: 0.40
|
||||
Nodes (5): Errors, Notes, POST `/api/v1/notification-mobile/request-otp`, Request Body, Response `200`
|
||||
|
||||
### Community 38 - "Community 38"
|
||||
Cohesion: 0.40
|
||||
Nodes (5): Errors, GET `/api/v1/clinic/my-doctor/{doctorUuid}`, Path Parameters, Response `200`, Schedule Fields Notes
|
||||
|
||||
### Community 39 - "Community 39"
|
||||
Cohesion: 0.40
|
||||
Nodes (5): Errors, PATCH `/api/v1/doctor/{uuid}`, Path Parameters, Request Body (`application/json`), Response `200`
|
||||
|
||||
### Community 40 - "Community 40"
|
||||
Cohesion: 0.40
|
||||
Nodes (5): Errors, PATCH `/api/v1/clinic-pro/doctor-address/{id}`, Path Parameters, Request Body, Response `200`
|
||||
|
||||
### Community 41 - "Community 41"
|
||||
Cohesion: 0.40
|
||||
Nodes (5): DELETE `/api/v1/billing/tenant-insurances/{uuid}`, GET `/api/v1/billing/tenant-insurances`, PATCH `/api/v1/billing/tenant-insurances/{uuid}`, POST `/api/v1/billing/tenant-insurances`, TenantInsurance — قراردادهای بیمهی tenant (فاز ۱ سیستم صورتحساب)
|
||||
|
||||
### Community 42 - "Community 42"
|
||||
Cohesion: 0.40
|
||||
Nodes (5): Admin Endpoints, GET /api/v1/admin/sms/settings/review, GET /api/v1/admin/sms/wallet-report, POST /api/v1/admin/sms/settings/{id}/approve, POST /api/v1/admin/sms/settings/{id}/reject
|
||||
|
||||
### Community 43 - "Community 43"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): GET `/api/v1/admin/payments`, Payment Management, Query Parameters, Response `200`
|
||||
|
||||
### Community 44 - "Community 44"
|
||||
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 45 - "Community 45"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): GET `/api/v1/admin/representations`, Query Parameters, Representation Management, Response `200`
|
||||
|
||||
### Community 46 - "Community 46"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): GET `/api/v1/admin/secretaries`, Query Parameters, Response `200`, Secretary Management
|
||||
|
||||
### Community 47 - "Community 47"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): GET `/api/v1/admin/settlements`, Query Parameters, Response `200`, Settlement Management
|
||||
|
||||
### Community 48 - "Community 48"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): Error Codes, POST `/api/v1/pre-registration`, Request Body, Response `200`
|
||||
|
||||
### Community 49 - "Community 49"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): Error Codes, POST `/api/v1/user/otp-login`, Request Body, Response `200`
|
||||
|
||||
### Community 50 - "Community 50"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): Error Codes, POST `/api/v1/user/reset-password`, Request Body, Response `200`
|
||||
|
||||
### Community 51 - "Community 51"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): Errors, POST `/api/v1/user/send-code`, Request Body, Response `200`
|
||||
|
||||
### Community 52 - "Community 52"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): Errors, POST `/api/v1/user/register`, Request Body, Response `201`
|
||||
|
||||
### Community 53 - "Community 53"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): Errors, POST `/api/v1/user/login`, Request Body, Response `200`
|
||||
|
||||
### Community 54 - "Community 54"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): Errors, POST `/oauth/token`, Request Body, Response `200`
|
||||
|
||||
### Community 55 - "Community 55"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): Errors, POST `/oauth/token/refresh`, Request Body, Response `200`
|
||||
|
||||
### Community 56 - "Community 56"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): Errors, GET `/oauth/userinfo`, Headers, Response `200`
|
||||
|
||||
### Community 57 - "Community 57"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): Errors, POST `/api/v1/auth/switch-context`, Request Body, Response `200`
|
||||
|
||||
### Community 58 - "Community 58"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): Errors, POST `/api/v1/notification-mobile/verify`, Request Body, Response `200`
|
||||
|
||||
### Community 59 - "Community 59"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): Errors, POST `/api/v1/user/verify-code`, Request Body, Response `200`
|
||||
|
||||
### Community 60 - "Community 60"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): DELETE `/api/v1/doctor/{uuid}`, Errors, Path Parameters, Response `200`
|
||||
|
||||
### Community 61 - "Community 61"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): Errors, POST `/api/v1/doctor`, Request Body (`application/json`), Response `201`
|
||||
|
||||
### Community 62 - "Community 62"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): Errors, GET `/api/v1/doctor/{uuid}`, Path Parameters, Response `200`
|
||||
|
||||
### Community 63 - "Community 63"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): Errors, POST `/file/upload/clinic_pro/doctor/field_image`, Request, Response `200`
|
||||
|
||||
### Community 64 - "Community 64"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): Errors, POST `/api/v1/clinic-pro/doctor-address`, Request Body, Response `201`
|
||||
|
||||
### Community 65 - "Community 65"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): Errors, Path Parameters, POST `/api/v1/clinic-pro/doctor-address/from-clinic/{clinicUuid}`, Response `201`
|
||||
|
||||
### Community 66 - "Community 66"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): Errors, GET `/api/v1/admin/insurances`, Query Parameters, Response `200`
|
||||
|
||||
### Community 67 - "Community 67"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): Errors, POST `/api/v1/admin/insurance`, Request Body (`application/json`), Response `201`
|
||||
|
||||
### Community 68 - "Community 68"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): Errors, PATCH `/api/v1/admin/insurance/{id}`, Path Parameters, Response `200`
|
||||
|
||||
### Community 69 - "Community 69"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): Errors, POST `/api/v1/insurance/`, Request Body (`application/json`), Response `201`
|
||||
|
||||
### Community 70 - "Community 70"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): Errors, PATCH `/api/v1/insurance/{id}`, Request Body, Response `200`
|
||||
|
||||
### Community 71 - "Community 71"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): PUT `/api/v1/insurance-pricing`, Request Body, Response `200`, خطاها
|
||||
|
||||
### Community 72 - "Community 72"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): Errors, POST `/api/v1/sms/send`, Request Body (`application/json`), Response `200`
|
||||
|
||||
### Community 73 - "Community 73"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): Errors, POST `/api/v1/sms/template`, Request Body (`application/json`), Response `201`
|
||||
|
||||
### Community 74 - "Community 74"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): Errors, PATCH `/api/v1/sms/template/{uuid}`, Request Body (`application/json`), Response `200`
|
||||
|
||||
### Community 75 - "Community 75"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): Errors, POST `/api/v1/admin/sms/template/{uuid}/reject`, Request Body, Response `200`
|
||||
|
||||
### Community 76 - "Community 76"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): Errors, POST `/api/v1/sms/send-template`, Request Body (`application/json`), Response `200`
|
||||
|
||||
### Community 77 - "Community 77"
|
||||
Cohesion: 0.50
|
||||
Nodes (4): GET /api/v1/sms/wallet/balance, GET /api/v1/sms/wallet/logs, POST /api/v1/sms/wallet/charge, SMS Wallet
|
||||
|
||||
### Community 78 - "Community 78"
|
||||
Cohesion: 0.67
|
||||
Nodes (3): Errors, GET `/api/v1/notification-mobile/{target}`, Response `200`
|
||||
|
||||
### Community 79 - "Community 79"
|
||||
Cohesion: 0.67
|
||||
Nodes (3): GET `/api/v1/clinic-pro/doctor-addresses/{doctorId}`, Path Parameters, Response `200`
|
||||
|
||||
### Community 80 - "Community 80"
|
||||
Cohesion: 0.67
|
||||
Nodes (3): GET `/api/v1/billing/tenant-insurances/{uuid}/service-coverage`, PUT `/api/v1/billing/tenant-insurances/{uuid}/service-coverage`, TenantServiceCoverage — پوشش خدمت تحت یک قرارداد بیمه (فاز ۲)
|
||||
|
||||
### Community 81 - "Community 81"
|
||||
Cohesion: 0.67
|
||||
Nodes (3): GET `/api/v1/insurance-pricing`, Response `200`, خطاها
|
||||
|
||||
### Community 82 - "Community 82"
|
||||
Cohesion: 0.67
|
||||
Nodes (3): GET `/api/v1/insurances`, Query Parameters, Response `200`
|
||||
|
||||
### Community 83 - "Community 83"
|
||||
Cohesion: 0.67
|
||||
Nodes (3): POST `/api/v1/admin/insurance/{id}/upload-logo`, Request, Response `200`
|
||||
|
||||
### Community 84 - "Community 84"
|
||||
Cohesion: 0.67
|
||||
Nodes (3): DELETE `/api/v1/sms/template/{uuid}`, Errors, Response `200`
|
||||
|
||||
### Community 85 - "Community 85"
|
||||
Cohesion: 0.67
|
||||
Nodes (3): Errors, GET `/api/v1/sms/template/{uuid}`, Response `200`
|
||||
|
||||
### Community 86 - "Community 86"
|
||||
Cohesion: 0.67
|
||||
Nodes (3): Errors, POST `/api/v1/sms/template/{uuid}/submit`, Response `200`
|
||||
|
||||
### Community 87 - "Community 87"
|
||||
Cohesion: 0.67
|
||||
Nodes (3): POST `/api/v1/admin/sms/template/{uuid}/approve`, Request Body (`application/json`), Response `200`
|
||||
|
||||
## Knowledge Gaps
|
||||
- **686 isolated node(s):** `Authentication`, `Standard Response Envelope`, `Modules`, `Error Code Reference`, `GET `/api/v1/admin/dashboard/stats`` (+681 more)
|
||||
These have ≤1 connection - possible missing edges or undocumented components.
|
||||
|
||||
## Suggested Questions
|
||||
_Questions this graph is uniquely positioned to answer:_
|
||||
|
||||
- **Why does `Admin API` connect `Community 26` to `Community 32`, `Community 35`, `Community 36`, `Community 7`, `Community 43`, `Community 44`, `Community 45`, `Community 46`, `Community 47`, `Community 17`, `Community 21`, `Community 23`, `Community 27`, `Community 31`?**
|
||||
_High betweenness centrality (0.189) - this node is a cross-community bridge._
|
||||
- **Why does `Representation (Agent) API` connect `Community 9` to `Community 2`?**
|
||||
_High betweenness centrality (0.126) - this node is a cross-community bridge._
|
||||
- **Why does `Authentication API` connect `Community 28` to `Community 37`, `Community 78`, `Community 48`, `Community 49`, `Community 50`, `Community 51`, `Community 52`, `Community 53`, `Community 54`, `Community 55`, `Community 56`, `Community 57`, `Community 58`, `Community 59`?**
|
||||
_High betweenness centrality (0.117) - this node is a cross-community bridge._
|
||||
- **What connects `Authentication`, `Standard Response Envelope`, `Modules` to the rest of the system?**
|
||||
_686 weakly-connected nodes found - possible documentation gaps or missing edges._
|
||||
- **Should `Community 0` be split into smaller, more focused modules?**
|
||||
_Cohesion score 0.0425531914893617 - nodes in this community are weakly interconnected._
|
||||
- **Should `Community 1` be split into smaller, more focused modules?**
|
||||
_Cohesion score 0.045454545454545456 - nodes in this community are weakly interconnected._
|
||||
- **Should `Community 2` be split into smaller, more focused modules?**
|
||||
_Cohesion score 0.04878048780487805 - nodes in this community are weakly interconnected._
|
||||
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_hamed_pj_my_pj_clinic_pro_clinicpro_docs_api_staff_md", "label": "staff.md", "file_type": "document", "source_file": "staff.md", "source_location": "L1"}, {"id": "api_staff_staff_api", "label": "Staff API", "file_type": "document", "source_file": "staff.md", "source_location": "L1"}, {"id": "api_staff_get_api_v1_staff", "label": "GET /api/v1/staff", "file_type": "document", "source_file": "staff.md", "source_location": "L7"}, {"id": "api_staff_post_api_v1_staff", "label": "POST /api/v1/staff", "file_type": "document", "source_file": "staff.md", "source_location": "L37"}, {"id": "api_staff_patch_api_v1_staff_uuid", "label": "PATCH /api/v1/staff/{uuid}", "file_type": "document", "source_file": "staff.md", "source_location": "L90"}, {"id": "api_staff_patch_api_v1_staff_uuid_toggle", "label": "PATCH /api/v1/staff/{uuid}/toggle", "file_type": "document", "source_file": "staff.md", "source_location": "L117"}], "edges": [{"source": "users_hamed_pj_my_pj_clinic_pro_clinicpro_docs_api_staff_md", "target": "api_staff_staff_api", "relation": "contains", "confidence": "EXTRACTED", "source_file": "staff.md", "source_location": "L1", "weight": 1.0}, {"source": "api_staff_staff_api", "target": "api_staff_get_api_v1_staff", "relation": "contains", "confidence": "EXTRACTED", "source_file": "staff.md", "source_location": "L7", "weight": 1.0}, {"source": "api_staff_staff_api", "target": "api_staff_post_api_v1_staff", "relation": "contains", "confidence": "EXTRACTED", "source_file": "staff.md", "source_location": "L37", "weight": 1.0}, {"source": "api_staff_staff_api", "target": "api_staff_patch_api_v1_staff_uuid", "relation": "contains", "confidence": "EXTRACTED", "source_file": "staff.md", "source_location": "L90", "weight": 1.0}, {"source": "api_staff_staff_api", "target": "api_staff_patch_api_v1_staff_uuid_toggle", "relation": "contains", "confidence": "EXTRACTED", "source_file": "staff.md", "source_location": "L117", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0}
|
||||
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
@@ -0,0 +1 @@
|
||||
{"nodes": [{"id": "users_hamed_pj_my_pj_clinic_pro_clinicpro_docs_api_patient_md", "label": "patient.md", "file_type": "document", "source_file": "patient.md", "source_location": "L1"}, {"id": "api_patient_patient_records_sessions_api", "label": "Patient Records & Sessions API", "file_type": "document", "source_file": "patient.md", "source_location": "L1"}, {"id": "api_patient_overview", "label": "Overview", "file_type": "document", "source_file": "patient.md", "source_location": "L3"}, {"id": "api_patient_endpoints", "label": "Endpoints", "file_type": "document", "source_file": "patient.md", "source_location": "L12"}, {"id": "api_patient_list_patients", "label": "List Patients", "file_type": "document", "source_file": "patient.md", "source_location": "L14"}, {"id": "api_patient_create_patient_record", "label": "Create Patient Record", "file_type": "document", "source_file": "patient.md", "source_location": "L62"}, {"id": "api_patient_get_patient_record", "label": "Get Patient Record", "file_type": "document", "source_file": "patient.md", "source_location": "L118"}, {"id": "api_patient_list_patient_sessions", "label": "List Patient Sessions", "file_type": "document", "source_file": "patient.md", "source_location": "L172"}, {"id": "api_patient_create_session", "label": "Create Session", "file_type": "document", "source_file": "patient.md", "source_location": "L218"}, {"id": "api_patient_update_session", "label": "Update Session", "file_type": "document", "source_file": "patient.md", "source_location": "L277"}, {"id": "api_patient_auto_creation_on_appointment_confirm", "label": "Auto-Creation on Appointment Confirm", "file_type": "document", "source_file": "patient.md", "source_location": "L311"}], "edges": [{"source": "users_hamed_pj_my_pj_clinic_pro_clinicpro_docs_api_patient_md", "target": "api_patient_patient_records_sessions_api", "relation": "contains", "confidence": "EXTRACTED", "source_file": "patient.md", "source_location": "L1", "weight": 1.0}, {"source": "api_patient_patient_records_sessions_api", "target": "api_patient_overview", "relation": "contains", "confidence": "EXTRACTED", "source_file": "patient.md", "source_location": "L3", "weight": 1.0}, {"source": "api_patient_patient_records_sessions_api", "target": "api_patient_endpoints", "relation": "contains", "confidence": "EXTRACTED", "source_file": "patient.md", "source_location": "L12", "weight": 1.0}, {"source": "api_patient_endpoints", "target": "api_patient_list_patients", "relation": "contains", "confidence": "EXTRACTED", "source_file": "patient.md", "source_location": "L14", "weight": 1.0}, {"source": "api_patient_endpoints", "target": "api_patient_create_patient_record", "relation": "contains", "confidence": "EXTRACTED", "source_file": "patient.md", "source_location": "L62", "weight": 1.0}, {"source": "api_patient_endpoints", "target": "api_patient_get_patient_record", "relation": "contains", "confidence": "EXTRACTED", "source_file": "patient.md", "source_location": "L118", "weight": 1.0}, {"source": "api_patient_endpoints", "target": "api_patient_list_patient_sessions", "relation": "contains", "confidence": "EXTRACTED", "source_file": "patient.md", "source_location": "L172", "weight": 1.0}, {"source": "api_patient_endpoints", "target": "api_patient_create_session", "relation": "contains", "confidence": "EXTRACTED", "source_file": "patient.md", "source_location": "L218", "weight": 1.0}, {"source": "users_hamed_pj_my_pj_clinic_pro_clinicpro_docs_api_patient_md", "target": "users_hamed_pj_my_pj_clinic_pro_clinicpro_docs_api_billing_md", "relation": "references", "confidence": "EXTRACTED", "source_file": "patient.md", "source_location": "L257", "weight": 1.0}, {"source": "api_patient_endpoints", "target": "api_patient_update_session", "relation": "contains", "confidence": "EXTRACTED", "source_file": "patient.md", "source_location": "L277", "weight": 1.0}, {"source": "api_patient_patient_records_sessions_api", "target": "api_patient_auto_creation_on_appointment_confirm", "relation": "contains", "confidence": "EXTRACTED", "source_file": "patient.md", "source_location": "L311", "weight": 1.0}], "input_tokens": 0, "output_tokens": 0}
|
||||
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
File diff suppressed because one or more lines are too long
+1
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
@@ -0,0 +1,142 @@
|
||||
{
|
||||
"README.md": {
|
||||
"mtime": 1781158395.4128418,
|
||||
"ast_hash": "e431373476ec0ca91ced105ca22ef985",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"admin.md": {
|
||||
"mtime": 1782750435.7712955,
|
||||
"ast_hash": "6a68974b5f71e8d4104ffea4cab99edf",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"appointment-settings.md": {
|
||||
"mtime": 1782728407.106611,
|
||||
"ast_hash": "340ea903ea45d63825001c90b6baa8c0",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"appointment.md": {
|
||||
"mtime": 1782728407.1071143,
|
||||
"ast_hash": "ae2bbfd8dc1e905f3b664d665c9dc1c3",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"auth.md": {
|
||||
"mtime": 1782728407.1075277,
|
||||
"ast_hash": "c193f86d49bb42a6198807d0497ff145",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"billing.md": {
|
||||
"mtime": 1782728407.1078966,
|
||||
"ast_hash": "0866219af2626141c1df0f0c9f874470",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"blog.md": {
|
||||
"mtime": 1782050526.5533028,
|
||||
"ast_hash": "8adc84cb5b0039d3f6bb0d6d4dd50fe1",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"category-import.md": {
|
||||
"mtime": 1782844030.4935105,
|
||||
"ast_hash": "d7eaf7bd2002ca82b3a95e16b0eb34dd",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"clinic-invitation.md": {
|
||||
"mtime": 1781360269.6587257,
|
||||
"ast_hash": "795a1bbbfdc94fd633859cd624aa8b4c",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"clinic-services.md": {
|
||||
"mtime": 1782728407.1083,
|
||||
"ast_hash": "06e7cab24284ccf31c55348b6cdbb61a",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"clinic.md": {
|
||||
"mtime": 1782035382.8888016,
|
||||
"ast_hash": "24d7edcb8e5218250a6f7653e43c5d4f",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"dashboard.md": {
|
||||
"mtime": 1781516938.5608273,
|
||||
"ast_hash": "b8c8449d58c7d9088ebaffab92e4e128",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"doctor-service.md": {
|
||||
"mtime": 1782844893.6804142,
|
||||
"ast_hash": "513b9a4f7674d8b749eb46efbe277797",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"doctor.md": {
|
||||
"mtime": 1782728407.108632,
|
||||
"ast_hash": "6dedc0cdfc171e0f7c31fb29647cb27b",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"insurance.md": {
|
||||
"mtime": 1782844893.6809301,
|
||||
"ast_hash": "9d6d21db0004b0e780025123ea3a63c9",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"location.md": {
|
||||
"mtime": 1782844893.6796494,
|
||||
"ast_hash": "bd93b9cdb9c60259814f49193b6cab77",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"patient.md": {
|
||||
"mtime": 1782289600.4894524,
|
||||
"ast_hash": "dbb64cd5f77ae397ec13ce763886b004",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"payment.md": {
|
||||
"mtime": 1782728407.1095557,
|
||||
"ast_hash": "599a89165ddf5f33daeb04a6d97a3b5a",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"rating.md": {
|
||||
"mtime": 1782728407.1106706,
|
||||
"ast_hash": "ab1f1c46ee73542ebd50f8eddc428efb",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"representation.md": {
|
||||
"mtime": 1782728407.1112525,
|
||||
"ast_hash": "3f525b4581e326a353afc4a563f19fca",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"secretary.md": {
|
||||
"mtime": 1781520442.059899,
|
||||
"ast_hash": "5b095b626c415a5040be915cce3e0da0",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"settlement.md": {
|
||||
"mtime": 1782728407.112459,
|
||||
"ast_hash": "4a65139e00f3140eb6c3b7f56b08e178",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"sms.md": {
|
||||
"mtime": 1782367200.5063455,
|
||||
"ast_hash": "613eaa742d3ca4a72845425c46ad546c",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"specialty.md": {
|
||||
"mtime": 1782844893.6802263,
|
||||
"ast_hash": "7dd9e75c13f557620e04a3d04cf58140",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"staff.md": {
|
||||
"mtime": 1781516938.5622861,
|
||||
"ast_hash": "1fc887b9c4cb88c7f691af2db7536509",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"subscription.md": {
|
||||
"mtime": 1781516938.5630767,
|
||||
"ast_hash": "dd89fadf917c707c907188708106a092",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"tag.md": {
|
||||
"mtime": 1782844893.6810575,
|
||||
"ast_hash": "7b0cd30025e12582e9fa5af37d10d9fb",
|
||||
"semantic_hash": ""
|
||||
},
|
||||
"user-profile.md": {
|
||||
"mtime": 1782289592.5979342,
|
||||
"ast_hash": "3f27197eb3c684a2d5337b6c5fd8fec0",
|
||||
"semantic_hash": ""
|
||||
}
|
||||
}
|
||||
@@ -463,3 +463,10 @@ override پوشش یک خدمت خاص تحت قرارداد یک بیمه. فی
|
||||
|
||||
Full-table JSON export and strict wipe+replace import for this category live under
|
||||
`/api/v1/admin/categories/{bundle}/{export|import}` — see [category-import.md](category-import.md).
|
||||
|
||||
|
||||
### Sorting by id
|
||||
|
||||
The admin list endpoint accepts `sort=id&order=asc|desc` to order by `id`
|
||||
(used by the admin «دستهبندیها» page when clicking the «شناسه» column).
|
||||
Without `sort`, the default ordering (weight/name) is unchanged.
|
||||
|
||||
@@ -254,3 +254,10 @@ Legacy endpoint that proxies to the new endpoints.
|
||||
|
||||
Full-table JSON export and strict wipe+replace import for this category live under
|
||||
`/api/v1/admin/categories/{bundle}/{export|import}` — see [category-import.md](category-import.md).
|
||||
|
||||
|
||||
### Sorting by id
|
||||
|
||||
The admin list endpoint accepts `sort=id&order=asc|desc` to order by `id`
|
||||
(used by the admin «دستهبندیها» page when clicking the «شناسه» column).
|
||||
Without `sort`, the default ordering (weight/name) is unchanged.
|
||||
|
||||
@@ -200,3 +200,10 @@ Delete a specialty.
|
||||
|
||||
Full-table JSON export and strict wipe+replace import for this category live under
|
||||
`/api/v1/admin/categories/{bundle}/{export|import}` — see [category-import.md](category-import.md).
|
||||
|
||||
|
||||
### Sorting by id
|
||||
|
||||
The admin list endpoint accepts `sort=id&order=asc|desc` to order by `id`
|
||||
(used by the admin «دستهبندیها» page when clicking the «شناسه» column).
|
||||
Without `sort`, the default ordering (weight/name) is unchanged.
|
||||
|
||||
@@ -137,3 +137,10 @@ Delete a tag.
|
||||
|
||||
Full-table JSON export and strict wipe+replace import for this category live under
|
||||
`/api/v1/admin/categories/{bundle}/{export|import}` — see [category-import.md](category-import.md).
|
||||
|
||||
|
||||
### Sorting by id
|
||||
|
||||
The admin list endpoint accepts `sort=id&order=asc|desc` to order by `id`
|
||||
(used by the admin «دستهبندیها» page when clicking the «شناسه» column).
|
||||
Without `sort`, the default ordering (weight/name) is unchanged.
|
||||
|
||||
@@ -104,9 +104,12 @@ class DoctorServiceController extends BaseController
|
||||
$search = trim((string) $request->query->get('search', ''));
|
||||
$specialtyId = $request->query->get('specialty_id');
|
||||
|
||||
$qb = $this->repo->createQueryBuilder('ds')
|
||||
->orderBy('ds.weight', 'ASC')
|
||||
->addOrderBy('ds.name', 'ASC');
|
||||
$qb = $this->repo->createQueryBuilder('ds');
|
||||
if ($request->query->get('sort') === 'id') {
|
||||
$qb->orderBy('ds.id', strtoupper((string) $request->query->get('order')) === 'DESC' ? 'DESC' : 'ASC');
|
||||
} else {
|
||||
$qb->orderBy('ds.weight', 'ASC')->addOrderBy('ds.name', 'ASC');
|
||||
}
|
||||
|
||||
if ($search !== '') {
|
||||
$qb->andWhere('ds.name LIKE :s')->setParameter('s', '%' . $search . '%');
|
||||
|
||||
@@ -144,7 +144,12 @@ class InsuranceController extends BaseController
|
||||
$search = trim((string) $request->query->get('search', ''));
|
||||
$typeParam = $request->query->get('type');
|
||||
|
||||
$qb = $this->insuranceRepo->createQueryBuilder('i')->orderBy('i.name', 'ASC');
|
||||
$qb = $this->insuranceRepo->createQueryBuilder('i');
|
||||
if ($request->query->get('sort') === 'id') {
|
||||
$qb->orderBy('i.id', strtoupper((string) $request->query->get('order')) === 'DESC' ? 'DESC' : 'ASC');
|
||||
} else {
|
||||
$qb->orderBy('i.name', 'ASC');
|
||||
}
|
||||
|
||||
if ($search !== '') {
|
||||
$qb->andWhere('i.name LIKE :s')->setParameter('s', '%' . $search . '%');
|
||||
|
||||
@@ -161,7 +161,12 @@ class LocationController extends BaseController
|
||||
$limit = min(100, max(1, (int) $request->query->get('limit', 15)));
|
||||
$search = trim((string) $request->query->get('search', ''));
|
||||
|
||||
$qb = $this->provinceRepo->createQueryBuilder('p')->orderBy('p.weight', 'ASC')->addOrderBy('p.name', 'ASC');
|
||||
$qb = $this->provinceRepo->createQueryBuilder('p');
|
||||
if ($request->query->get('sort') === 'id') {
|
||||
$qb->orderBy('p.id', strtoupper((string) $request->query->get('order')) === 'DESC' ? 'DESC' : 'ASC');
|
||||
} else {
|
||||
$qb->orderBy('p.weight', 'ASC')->addOrderBy('p.name', 'ASC');
|
||||
}
|
||||
if ($search !== '') {
|
||||
$qb->andWhere('p.name LIKE :s')->setParameter('s', '%' . $search . '%');
|
||||
}
|
||||
@@ -188,9 +193,12 @@ class LocationController extends BaseController
|
||||
|
||||
$qb = $this->cityRepo->createQueryBuilder('c')
|
||||
->leftJoin('c.province', 'p')
|
||||
->addSelect('p')
|
||||
->orderBy('c.weight', 'ASC')
|
||||
->addOrderBy('c.name', 'ASC');
|
||||
->addSelect('p');
|
||||
if ($request->query->get('sort') === 'id') {
|
||||
$qb->orderBy('c.id', strtoupper((string) $request->query->get('order')) === 'DESC' ? 'DESC' : 'ASC');
|
||||
} else {
|
||||
$qb->orderBy('c.weight', 'ASC')->addOrderBy('c.name', 'ASC');
|
||||
}
|
||||
|
||||
if ($search !== '') {
|
||||
$qb->andWhere('c.name LIKE :s')->setParameter('s', '%' . $search . '%');
|
||||
|
||||
@@ -131,9 +131,12 @@ class SpecialtyController extends BaseController
|
||||
|
||||
$qb = $this->repo->createQueryBuilder('s')
|
||||
->leftJoin('s.parent', 'p')
|
||||
->addSelect('p')
|
||||
->orderBy('s.weight', 'ASC')
|
||||
->addOrderBy('s.name', 'ASC');
|
||||
->addSelect('p');
|
||||
if ($request->query->get('sort') === 'id') {
|
||||
$qb->orderBy('s.id', strtoupper((string) $request->query->get('order')) === 'DESC' ? 'DESC' : 'ASC');
|
||||
} else {
|
||||
$qb->orderBy('s.weight', 'ASC')->addOrderBy('s.name', 'ASC');
|
||||
}
|
||||
|
||||
if ($search !== '') {
|
||||
$qb->andWhere('s.name LIKE :s')->setParameter('s', '%' . $search . '%');
|
||||
|
||||
@@ -86,7 +86,12 @@ class TagController extends BaseController
|
||||
$limit = min(100, max(1, (int) $request->query->get('limit', 15)));
|
||||
$search = trim((string) $request->query->get('search', ''));
|
||||
|
||||
$qb = $this->repo->createQueryBuilder('t')->orderBy('t.name', 'ASC');
|
||||
$qb = $this->repo->createQueryBuilder('t');
|
||||
if ($request->query->get('sort') === 'id') {
|
||||
$qb->orderBy('t.id', strtoupper((string) $request->query->get('order')) === 'DESC' ? 'DESC' : 'ASC');
|
||||
} else {
|
||||
$qb->orderBy('t.name', 'ASC');
|
||||
}
|
||||
if ($search !== '') {
|
||||
$qb->andWhere('t.name LIKE :s')->setParameter('s', '%' . $search . '%');
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user