- Bloc GEO/IA (resume IA, FAQ, points cles, entites) + rendu public "En bref"/"A retenir"/FAQ + JSON-LD Article & FAQPage. - Corbeille: soft-delete (deleted_at), filtres Tous/Publies/Brouillons/ Planifies/Corbeille, restauration + suppression definitive. - Duplication d'un article (nouveau brouillon, slug unique). - Drag & drop de l'image de couverture. - Recadrage auto de la couverture en 16:9 (sharp) via endpoint dedie /admin/blog/cover-images. - Migration AddGeoAndTrashToBlogPosts (ai_summary, faq, key_takeaways, ai_entities, deleted_at). Ajout dependance sharp. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
27 lines
948 B
TypeScript
27 lines
948 B
TypeScript
import { BlogPost, BlogPostCategory, BlogPostStatus } from '@domain/entities/blog-post.entity';
|
|
|
|
export const BLOG_POST_REPOSITORY = 'BlogPostRepository';
|
|
|
|
export interface BlogPostFilters {
|
|
status?: BlogPostStatus;
|
|
category?: BlogPostCategory;
|
|
search?: string;
|
|
isFeatured?: boolean;
|
|
limit?: number;
|
|
offset?: number;
|
|
/** When true, also include SCHEDULED posts whose publishedAt <= now */
|
|
includeScheduled?: boolean;
|
|
/** When true, return only trashed posts; otherwise trashed posts are excluded. */
|
|
trashed?: boolean;
|
|
}
|
|
|
|
export interface BlogPostRepository {
|
|
save(post: BlogPost): Promise<BlogPost>;
|
|
findById(id: string): Promise<BlogPost | null>;
|
|
findBySlug(slug: string): Promise<BlogPost | null>;
|
|
findByFilters(filters: BlogPostFilters): Promise<BlogPost[]>;
|
|
count(filters: BlogPostFilters): Promise<number>;
|
|
delete(id: string): Promise<void>;
|
|
slugExists(slug: string, excludeId?: string): Promise<boolean>;
|
|
}
|