33namespace App \Jobs ;
44
55use App \Models \Article ;
6+ use Illuminate \Http \Response ;
7+ use Illuminate \Support \Facades \Cache ;
8+ use Intervention \Image \Drivers \Gd \Driver ;
69use Intervention \Image \ImageManager ;
710
811final class GenerateSocialShareImage
912{
1013 const TEXT_X_POSITION = 50 ;
1114
12- const TEXT_Y_POSITION = 100 ;
15+ const TEXT_Y_POSITION = 150 ;
1316
1417 const TEXT_COLOUR = '#161e2e ' ;
1518
@@ -23,16 +26,25 @@ final class GenerateSocialShareImage
2326
2427 public function __construct (private Article $ article ) {}
2528
26- public function handle (ImageManager $ image ): mixed
29+ public function handle (): Response
2730 {
31+ $ image = new ImageManager (new Driver );
2832 $ text = wordwrap ($ this ->article ->title (), self ::CHARACTERS_PER_LINE );
2933
30- return $ image ->make (resource_path ('images/ ' .self ::TEMPLATE ))
31- ->text ($ text , self ::TEXT_X_POSITION , self ::TEXT_Y_POSITION , function ($ font ) {
32- $ font ->file (resource_path ('fonts/ ' .self ::FONT ));
33- $ font ->size (self ::FONT_SIZE );
34- $ font ->color (self ::TEXT_COLOUR );
35- })
36- ->response ('png ' );
34+ return Cache::remember (
35+ 'articleSocialImage- ' . $ this ->article ->id ,
36+ now ()->addDay (),
37+ fn () =>
38+ response (
39+ $ image ->read (resource_path ('images/ ' . self ::TEMPLATE ))
40+ ->text ($ text , self ::TEXT_X_POSITION , self ::TEXT_Y_POSITION , function ($ font ) {
41+ $ font ->file (resource_path ('fonts/ ' . self ::FONT ));
42+ $ font ->size (self ::FONT_SIZE );
43+ $ font ->color (self ::TEXT_COLOUR );
44+ })
45+ ->toPng ()
46+ )->header ('Content-Type ' , 'image/png ' )
47+ ->header ('Cache-Control ' , 'max-age=86400, public ' )
48+ );
3749 }
3850}
0 commit comments