@@ -70,6 +70,11 @@ public function getSuggestions(Request $request, $analysisId): JsonResponse
7070 'meta_data ' => $ suggestion ->meta_data ,
7171 'created_at ' => $ suggestion ->created_at ,
7272 'implemented_at ' => $ suggestion ->implemented_at ,
73+ // Image generation fields
74+ 'generate_image ' => $ suggestion ->generate_image ,
75+ 'generated_image_url ' => $ suggestion ->generated_image_url ,
76+ 'image_generation_status ' => $ suggestion ->image_generation_status ,
77+ 'has_generated_image ' => !empty ($ suggestion ->generated_image_url ) && $ suggestion ->image_generation_status === 'completed ' ,
7378 ];
7479 }),
7580 'summary ' => [
@@ -340,6 +345,12 @@ public function getSuggestionDetail(Request $request, $suggestionId): JsonRespon
340345 'created_at ' => $ suggestion ->created_at ,
341346 'updated_at ' => $ suggestion ->updated_at ,
342347 'implemented_at ' => $ suggestion ->implemented_at ,
348+ // Image generation fields
349+ 'generate_image ' => $ suggestion ->generate_image ,
350+ 'generated_image_url ' => $ suggestion ->generated_image_url ,
351+ 'image_generation_status ' => $ suggestion ->image_generation_status ,
352+ 'image_generation_error ' => $ suggestion ->image_generation_error ,
353+ 'has_generated_image ' => !empty ($ suggestion ->generated_image_url ) && $ suggestion ->image_generation_status === 'completed ' ,
343354 ],
344355 'analysis ' => [
345356 'id ' => $ suggestion ->articleAnalysis ->id ,
@@ -496,4 +507,140 @@ private function formatAsMarkdown(array $data): string
496507
497508 return $ markdown ;
498509 }
510+
511+ /**
512+ * Toggle image generation for a suggestion (WordPress API)
513+ */
514+ public function toggleImageGeneration (Request $ request , $ suggestionId ): JsonResponse
515+ {
516+ $ validated = $ request ->validate ([
517+ 'generate_image ' => 'required|boolean ' ,
518+ ]);
519+
520+ try {
521+ $ suggestion = AiSuggestion::with (['articleAnalysis.wordpressPost ' ])
522+ ->where ('id ' , $ suggestionId )
523+ ->first ();
524+
525+ if (!$ suggestion ) {
526+ return response ()->json ([
527+ 'success ' => false ,
528+ 'message ' => 'Suggestion not found ' ,
529+ ], 404 );
530+ }
531+
532+ // Check authorization
533+ $ wordPressSite = $ request ->attributes ->get ('wordpress_site ' );
534+ if ($ suggestion ->articleAnalysis ->wordpressPost ->wordpress_site_id !== $ wordPressSite ->id ) {
535+ return response ()->json ([
536+ 'success ' => false ,
537+ 'message ' => 'Unauthorized access ' ,
538+ ], 403 );
539+ }
540+
541+ // Only allow for new_article type suggestions
542+ if ($ suggestion ->type !== 'new_article ' ) {
543+ return response ()->json ([
544+ 'success ' => false ,
545+ 'message ' => 'Image generation is only available for new article suggestions ' ,
546+ ], 400 );
547+ }
548+
549+ // Update the suggestion
550+ $ suggestion ->update ([
551+ 'generate_image ' => $ validated ['generate_image ' ],
552+ 'image_generation_status ' => $ validated ['generate_image ' ] ? 'pending ' : 'skipped ' ,
553+ ]);
554+
555+ // If enabled, dispatch the image generation job
556+ if ($ validated ['generate_image ' ]) {
557+ \App \Jobs \GenerateSuggestionImageJob::dispatch ($ suggestion ->id );
558+
559+ return response ()->json ([
560+ 'success ' => true ,
561+ 'message ' => 'Image generation queued successfully ' ,
562+ 'data ' => [
563+ 'suggestion_id ' => $ suggestion ->id ,
564+ 'generate_image ' => true ,
565+ 'image_generation_status ' => 'pending ' ,
566+ 'estimated_time ' => '3-5 seconds ' ,
567+ ],
568+ ]);
569+ }
570+
571+ return response ()->json ([
572+ 'success ' => true ,
573+ 'message ' => 'Image generation disabled ' ,
574+ 'data ' => [
575+ 'suggestion_id ' => $ suggestion ->id ,
576+ 'generate_image ' => false ,
577+ 'image_generation_status ' => 'skipped ' ,
578+ ],
579+ ]);
580+
581+ } catch (\Exception $ e ) {
582+ Log::error ('Toggle image generation failed ' , [
583+ 'suggestion_id ' => $ suggestionId ,
584+ 'error ' => $ e ->getMessage (),
585+ ]);
586+
587+ return response ()->json ([
588+ 'success ' => false ,
589+ 'message ' => 'Failed to toggle image generation ' ,
590+ 'error ' => config ('app.debug ' ) ? $ e ->getMessage () : 'Internal server error ' ,
591+ ], 500 );
592+ }
593+ }
594+
595+ /**
596+ * Get image generation status for a suggestion (WordPress API)
597+ */
598+ public function getImageStatus (Request $ request , $ suggestionId ): JsonResponse
599+ {
600+ try {
601+ $ suggestion = AiSuggestion::with (['articleAnalysis.wordpressPost ' ])
602+ ->where ('id ' , $ suggestionId )
603+ ->first ();
604+
605+ if (!$ suggestion ) {
606+ return response ()->json ([
607+ 'success ' => false ,
608+ 'message ' => 'Suggestion not found ' ,
609+ ], 404 );
610+ }
611+
612+ // Check authorization
613+ $ wordPressSite = $ request ->attributes ->get ('wordpress_site ' );
614+ if ($ suggestion ->articleAnalysis ->wordpressPost ->wordpress_site_id !== $ wordPressSite ->id ) {
615+ return response ()->json ([
616+ 'success ' => false ,
617+ 'message ' => 'Unauthorized access ' ,
618+ ], 403 );
619+ }
620+
621+ return response ()->json ([
622+ 'success ' => true ,
623+ 'data ' => [
624+ 'suggestion_id ' => $ suggestion ->id ,
625+ 'generate_image ' => $ suggestion ->generate_image ,
626+ 'image_generation_status ' => $ suggestion ->image_generation_status ,
627+ 'generated_image_url ' => $ suggestion ->generated_image_url ,
628+ 'image_generation_error ' => $ suggestion ->image_generation_error ,
629+ 'has_generated_image ' => !empty ($ suggestion ->generated_image_url ) && $ suggestion ->image_generation_status === 'completed ' ,
630+ ],
631+ ]);
632+
633+ } catch (\Exception $ e ) {
634+ Log::error ('Get image status failed ' , [
635+ 'suggestion_id ' => $ suggestionId ,
636+ 'error ' => $ e ->getMessage (),
637+ ]);
638+
639+ return response ()->json ([
640+ 'success ' => false ,
641+ 'message ' => 'Failed to get image status ' ,
642+ 'error ' => config ('app.debug ' ) ? $ e ->getMessage () : 'Internal server error ' ,
643+ ], 500 );
644+ }
645+ }
499646}
0 commit comments