@@ -51,12 +51,12 @@ export default class ArticlesController {
5151 }
5252
5353 async dashboard ( { inertia, auth } : HttpContext ) {
54- // Chaque utilisateur ne voit que ses propres statistiques
55- const stats = await ArticleStatsService . getStats ( auth . user ! . id )
54+ const isAdmin = auth . user ! . role === Role . ADMIN
55+ const stats = await ArticleStatsService . getStats ( auth . user ! . id , isAdmin )
5656 return inertia . render ( 'dashboard/index' , {
5757 publishedArticles : stats . published ,
5858 draftArticles : stats . drafts ,
59- waitingArticles : stats . waiting ,
59+ bannedArticles : stats . banned ,
6060 discussions : 0 ,
6161 questions : 0 ,
6262 } )
@@ -65,21 +65,49 @@ export default class ArticlesController {
6565 async articles ( { inertia, request, auth } : HttpContext ) {
6666 const page = request . input ( 'page' , 1 )
6767 const status = request . input ( 'status' , null )
68+ const isAdmin = auth . user ! . role === Role . ADMIN
6869
69- const query = Article . query ( )
70- . preload ( 'author' )
71- . where ( 'author_id' , auth . user ! . id )
72- . orderBy ( 'created_at' , 'desc' )
70+ let query = Article . query ( ) . preload ( 'author' ) . orderBy ( 'created_at' , 'desc' )
7371
74- if ( status && Object . values ( ArticleStatus ) . includes ( status as ArticleStatus ) ) {
75- query . where ( 'status' , status as ArticleStatus )
72+ // Logique différente selon le rôle
73+ if ( isAdmin ) {
74+ // Admin : voir tous les articles publiés/banned + ses propres brouillons
75+ if ( status && Object . values ( ArticleStatus ) . includes ( status as ArticleStatus ) ) {
76+ if ( status === ArticleStatus . PUBLISHED ) {
77+ // Voir tous les articles publiés (de tous les auteurs)
78+ query . where ( 'status' , ArticleStatus . PUBLISHED )
79+ } else if ( status === ArticleStatus . BANNED ) {
80+ // Voir tous les articles banned (de tous les auteurs)
81+ query . where ( 'status' , ArticleStatus . BANNED )
82+ } else {
83+ // Voir uniquement ses propres brouillons
84+ query . where ( 'status' , status as ArticleStatus ) . where ( 'author_id' , auth . user ! . id )
85+ }
86+ } else {
87+ // Par défaut : tous les publiés + ses brouillons
88+ query . where ( ( builder ) => {
89+ builder
90+ . where ( 'status' , ArticleStatus . PUBLISHED )
91+ . orWhere ( ( subBuilder ) => {
92+ subBuilder . where ( 'author_id' , auth . user ! . id ) . where ( 'status' , ArticleStatus . DRAFT )
93+ } )
94+ } )
95+ }
96+ } else {
97+ // Membre : voir uniquement ses propres articles
98+ query . where ( 'author_id' , auth . user ! . id )
99+
100+ if ( status && Object . values ( ArticleStatus ) . includes ( status as ArticleStatus ) ) {
101+ query . where ( 'status' , status as ArticleStatus )
102+ }
76103 }
77104
78105 const articles = await query . paginate ( page , 10 )
79106
80107 return inertia . render ( 'dashboard/articles' , {
81108 articles : articles . toJSON ( ) ,
82109 currentStatus : status ,
110+ isAdmin,
83111 } )
84112 }
85113
@@ -184,4 +212,41 @@ export default class ArticlesController {
184212 session . flash ( 'success' , 'Article dépublié avec succès' )
185213 return response . redirect ( ) . back ( )
186214 }
215+
216+ /**
217+ * Bannir un article (admin seulement)
218+ */
219+ async ban ( { params, request, response, session } : HttpContext ) {
220+ const article = await Article . query ( ) . where ( 'slug' , params . slug ) . firstOrFail ( )
221+ const banReason = request . input ( 'ban_reason' )
222+
223+ article . status = ArticleStatus . BANNED
224+ article . banReason = banReason
225+ article . publishedAt = null
226+ await article . save ( )
227+
228+ session . flash ( 'success' , 'Article banni avec succès' )
229+ return response . redirect ( ) . back ( )
230+ }
231+
232+ /**
233+ * Débannir un article (admin seulement)
234+ */
235+ async unban ( { params, response, session } : HttpContext ) {
236+ const article = await Article . query ( ) . where ( 'slug' , params . slug ) . firstOrFail ( )
237+
238+ // Vérifier que l'article est banni
239+ if ( article . status !== ArticleStatus . BANNED ) {
240+ session . flash ( 'error' , 'Cet article n\'est pas banni' )
241+ return response . redirect ( ) . back ( )
242+ }
243+
244+ // Débannir l'article (le repasser en brouillon)
245+ article . status = ArticleStatus . DRAFT
246+ article . banReason = null
247+ await article . save ( )
248+
249+ session . flash ( 'success' , 'Article débanni avec succès' )
250+ return response . redirect ( ) . back ( )
251+ }
187252}
0 commit comments