feat(blog): add admin endpoint for blog details and cache invalidation

- Implemented `adminDetail()` method in `BlogController` to retrieve blog posts of any status for admin editing.
- Introduced `BlogCacheInvalidator` service to handle cache invalidation after blog create/update/delete actions.
- Updated existing methods in `BlogController` and `RepresentationBlogController` to call cache invalidation on blog modifications.
- Enhanced `BlogFormPage` and `RepresentationBlogFormPage` to utilize the new admin endpoint for fetching blog data.
- Added tests for `BlogCacheInvalidator` to ensure proper functionality and error handling.
- Updated documentation to reflect new API endpoint and cache invalidation behavior.
This commit is contained in:
hamed
2026-07-27 18:54:35 +03:30
parent e4edaea9b8
commit 15abcb5c8a
12 changed files with 972 additions and 47 deletions
+63
View File
@@ -966,3 +966,66 @@ html, body { max-width: 100%; overflow-x: hidden; }
می‌شود تا ساعت دوتایی نشود — مثل مبدأ tauri که فقط یک ClockField دارد. */
.time-input-plain::-webkit-calendar-picker-indicator { display: none; }
.time-input-plain { appearance: none; -webkit-appearance: none; }
/* ── CKEditor 5 ────────────────────────────────────────────────────────────
ادیتور همهٔ رنگ‌هایش را از متغیرهای --ck-color-* خودش می‌گیرد و پیش‌فرض آن‌ها
روشن است؛ بدون این نگاشت، ادیتور در [data-theme="dark"] سفید می‌ماند. */
.ck-rtl { direction: rtl; }
.ck-rtl .ck.ck-editor__editable { min-height: 320px; }
/* .ck-body-wrapper هم لازم است: بالنِ لینک و جدول به <body> منتقل می‌شوند و
بیرون از .ck-editor قرار می‌گیرند، پس متغیرها به آن‌ها ارث نمی‌رسد. */
.ck.ck-editor,
.ck-body-wrapper {
--ck-color-base-background: var(--surface);
--ck-color-base-foreground: var(--surface-2);
--ck-color-base-text: var(--text);
--ck-color-base-border: var(--border);
--ck-color-base-active: var(--primary);
--ck-color-base-active-focus: var(--primary-600);
--ck-color-text: var(--text);
--ck-color-toolbar-background: var(--surface-2);
--ck-color-toolbar-border: var(--border);
--ck-color-button-default-background: transparent;
--ck-color-button-default-hover-background: var(--surface-3);
--ck-color-button-default-active-background: var(--surface-3);
--ck-color-button-on-background: var(--primary-soft);
--ck-color-button-on-hover-background: var(--primary-soft2);
--ck-color-button-on-color: var(--primary);
--ck-color-dropdown-panel-background: var(--surface);
--ck-color-dropdown-panel-border: var(--border);
--ck-color-list-background: var(--surface);
--ck-color-list-button-hover-background: var(--surface-3);
--ck-color-list-button-on-background: var(--primary-soft);
--ck-color-list-button-on-text: var(--primary);
--ck-color-panel-background: var(--surface);
--ck-color-panel-border: var(--border);
--ck-color-input-background: var(--surface);
--ck-color-input-border: var(--border);
--ck-color-input-text: var(--text);
--ck-color-input-disabled-background: var(--surface-2);
--ck-color-labeled-field-label-background: var(--surface);
--ck-color-split-button-hover-background: var(--surface-3);
--ck-color-split-button-hover-border: var(--border-2);
--ck-color-tooltip-background: var(--surface-3);
--ck-color-tooltip-text: var(--text);
--ck-color-editable-blur-selection: var(--surface-3);
--ck-border-radius: var(--r-sm);
}
.ck.ck-editor__editable_inline { background: var(--surface); color: var(--text); }
.ck.ck-editor__editable_inline.ck-focused {
border-color: var(--primary);
box-shadow: 0 0 0 4px var(--ring);
}
.ck.ck-content blockquote { border-inline-start: 3px solid var(--border-2); color: var(--text-2); }
.ck.ck-content a { color: var(--primary); }
.ck.ck-content :is(h2, h3, h4, h5, strong) { color: var(--text); }
.ck.ck-content :is(table td, table th) { border-color: var(--border); }
.ck.ck-content table th { background: var(--surface-2); }
/* آیکون‌های SVG ادیتور fill ثابت دارند؛ بدون currentColor در دارک‌مود دیده نمی‌شوند. */
[data-theme="dark"] .ck.ck-button,
[data-theme="dark"] .ck.ck-button .ck-button__label { color: var(--text-2); }
[data-theme="dark"] .ck.ck-icon,
[data-theme="dark"] .ck.ck-icon :is(path, polygon, rect, circle, ellipse) { fill: currentColor; }
[data-theme="dark"] .ck.ck-button.ck-on .ck-icon :is(path, polygon, rect, circle, ellipse) { fill: var(--primary); }