3131
3232namespace App \Http \Controllers \FrontEnd ;
3333
34- use App \Facades \Counter ;
35- use App \Http \Controllers \FrontEndController ;
34+ use App \Models \Event ;
3635use App \Models \Artikel ;
36+ use App \Facades \Counter ;
3737use App \Models \DataDesa ;
38- use App \Models \Event ;
3938use Illuminate \Http \Request ;
39+ use PhpParser \Node \Stmt \Catch_ ;
4040use Illuminate \Support \Facades \DB ;
41+ use Illuminate \Support \Facades \Session ;
4142use willvincent \Feeds \Facades \FeedsFacade ;
43+ use App \Http \Controllers \FrontEndController ;
44+ use Jenssegers \Agent \Agent ;
4245
4346class PageController extends FrontEndController
4447{
@@ -72,7 +75,32 @@ public function beritaDesa()
7275
7376 private function getFeeds ()
7477 {
75- return getFeeds ();
78+ $ all_desa = DataDesa::websiteUrl ()->get ()
79+ ->map (function ($ desa ) {
80+ return $ desa ->website_url_feed ;
81+ })->all ();
82+
83+ $ feeds = [];
84+ foreach ($ all_desa as $ desa ) {
85+ $ getFeeds = FeedsFacade::make ($ desa ['website ' ], 5 , true );
86+ foreach ($ getFeeds ->get_items () as $ item ) {
87+ $ feeds [] = [
88+ 'desa_id ' => $ desa ['desa_id ' ],
89+ 'nama_desa ' => $ desa ['nama ' ],
90+ 'feed_link ' => $ item ->get_feed ()->get_permalink (),
91+ 'feed_title ' => $ item ->get_feed ()->get_title (),
92+ 'link ' => $ item ->get_link (),
93+ 'date ' => \Carbon \Carbon::parse ($ item ->get_date ('U ' )),
94+ 'author ' => $ item ->get_author ()->get_name () ?? 'Administrator ' ,
95+ 'title ' => $ item ->get_title (),
96+ 'image ' => get_tag_image ($ item ->get_description ()),
97+ 'description ' => strip_tags (substr (str_replace (['& ' , 'nbsp; ' , '[...] ' ], '' , $ item ->get_description ()), 0 , 250 ) . '[...] ' ),
98+ 'content ' => $ item ->get_content (),
99+ ];
100+ }
101+ }
102+
103+ return $ feeds ?? null ;
76104 }
77105
78106 public function filterFeeds (Request $ request )
@@ -142,7 +170,7 @@ public function DesaShow($slug)
142170 // Counter::count('desa.show');
143171
144172 $ desa = DataDesa::nama ($ slug )->firstOrFail ();
145- $ page_title = 'Desa ' . $ desa ->nama ;
173+ $ page_title = 'Desa ' . $ desa ->nama ;
146174 $ page_description = 'Data Desa ' ;
147175
148176 return view ('pages.desa.desa_show ' , compact ('page_title ' , 'page_description ' , 'desa ' ));
@@ -153,16 +181,141 @@ public function refresh_captcha()
153181 return response ()->json (['captcha ' => captcha_img ('mini ' )]);
154182 }
155183
156- public function detailBerita ($ slug )
184+ public function detailBerita ($ slug, Request $ request )
157185 {
158- $ artikel = Artikel::where ('slug ' , $ slug )->status ()->firstOrFail ();
186+ // Temukan artikel berdasarkan slug
187+ $ artikel = Artikel::where ('slug ' , $ slug )
188+ ->with (['comments ' => function ($ query ) use ($ request ) {
189+ // Ambil komentar yang di-approve atau yang milik user dari session
190+ $ userCommentIds = $ request ->session ()->get ('session_user_comments ' , []);
191+
192+ // Ambil komentar utama (tanpa parent) yang di-approve atau yang dimiliki oleh user
193+ $ query ->whereNull ('comment_id ' )
194+ ->where (function ($ query ) use ($ userCommentIds ) {
195+ $ query ->where ('status ' , 'enable ' )
196+ ->orWhereIn ('id ' , $ userCommentIds );
197+ })
198+ ->with (['replies ' => function ($ query ) use ($ userCommentIds ) {
199+ // Ambil balasan yang di-approve atau yang milik user
200+ $ query ->where (function ($ query ) use ($ userCommentIds ) {
201+ $ query ->where ('status ' , 'enable ' )
202+ ->orWhereIn ('id ' , $ userCommentIds );
203+ });
204+ }]);
205+ }])
206+ ->firstOrFail ();
207+
159208 $ page_title = $ artikel ->judul ;
160- $ page_description = substr ($ artikel ->isi , 0 , 300 ). ' ... ' ;
209+ $ page_description = substr ($ artikel ->isi , 0 , 300 ) . ' ... ' ;
161210 $ page_image = $ artikel ->gambar ;
162211
163- return view ('pages.berita.detail ' , compact ('page_title ' , 'page_description ' , 'page_image ' , 'artikel ' ));
212+ // Ambil komentar utama yang terkait dengan artikel ini
213+ $ comments = $ artikel ->comments ;
214+
215+ return view ('pages.berita.detail ' , compact ('page_title ' , 'page_description ' , 'page_image ' , 'artikel ' , 'comments ' ));
216+ }
217+
218+
219+ public function kirimKomentar (Request $ request )
220+ {
221+
222+ // Validasi input
223+ $ validated = $ request ->validate ([
224+ 'nama ' => 'required|string|max:255 ' ,
225+ 'email ' => 'required|email|max:255 ' ,
226+ 'body ' => 'required|string ' ,
227+ 'das_artikel_id ' => 'required|exists:das_artikel,id ' ,
228+ 'captcha_main ' => 'required|captcha ' ,
229+ ]);
230+
231+ try {
232+ // Mendeteksi IP address
233+ $ ipAddress = $ request ->ip ();
234+
235+ // Mendeteksi device menggunakan jenssegers/agent
236+ $ agent = new Agent ();
237+ $ device = $ agent ->device () ?: 'Desktop ' ;
238+ $ platform = $ agent ->platform () ?: 'Unknown Platform ' ;
239+ $ browser = $ agent ->browser () ?: 'Unknown Browser ' ;
240+
241+ // Format informasi device
242+ $ deviceInfo = "{$ device } on {$ platform } using {$ browser }" ;
243+
244+ // Simpan komentar baru
245+ $ comment = \App \Models \Comment::create ([
246+ 'nama ' => $ validated ['nama ' ],
247+ 'email ' => $ validated ['email ' ],
248+ 'body ' => $ validated ['body ' ],
249+ 'status ' => 'disable ' , // Set status default ke 'disable' untuk moderasi
250+ 'das_artikel_id ' => $ validated ['das_artikel_id ' ],
251+ 'comment_id ' => $ request ->input ('comment_id ' , null ), // Jika ini adalah balasan
252+ 'ip_address ' => $ ipAddress ,
253+ 'device ' => $ deviceInfo ,
254+ ]);
255+
256+ // Simpan comment_id ke dalam session agar user bisa melihat komentarnya sendiri
257+ $ request ->session ()->push ('session_user_comments ' , $ comment ->id );
258+
259+ // Redirect dengan pesan sukses
260+ return redirect ()->back ()->with ('success ' , 'Komentar Anda telah ditambahkan. ' );
261+ } catch (\Throwable $ th ) {
262+ // Penanganan kesalahan
263+ return redirect ()->back ()->withInput ($ request ->all ())->withErrors ([$ th ->getMessage ()]);
264+ }
265+ }
266+
267+ public function modalKirimBalasan (Request $ request )
268+ {
269+ $ commentId = $ request ->input ('comment_id ' );
270+ $ artikelId = $ request ->input ('artikel_id ' );
271+ return view ('pages.berita.comment ' , compact ('commentId ' , 'artikelId ' ));
272+ }
273+
274+ public function kirimBalasan (Request $ request )
275+ {
276+ $ request ->validate ([
277+ 'nama ' => 'required|string|max:255 ' ,
278+ 'email ' => 'required|email|max:255 ' ,
279+ 'body ' => 'required|string ' ,
280+ 'captcha_main ' => 'required|captcha ' ,
281+ 'das_artikel_id ' => 'required|exists:das_artikel,id ' , // Pastikan artikel terkait ada
282+ 'comment_id ' => 'required|exists:das_artikel_comment,id ' , // Pastikan comment_id ada
283+ ]);
284+
285+ try {
286+ // Mendeteksi IP address
287+ $ ipAddress = $ request ->ip ();
288+
289+ // Mendeteksi device menggunakan jenssegers/agent
290+ $ agent = new Agent ();
291+ $ device = $ agent ->device () ?: 'Desktop ' ;
292+ $ platform = $ agent ->platform () ?: 'Unknown Platform ' ;
293+ $ browser = $ agent ->browser () ?: 'Unknown Browser ' ;
294+
295+ // Format informasi device
296+ $ deviceInfo = "{$ device } on {$ platform } using {$ browser }" ;
297+
298+ $ comment = \App \Models \Comment::create ([
299+ 'nama ' => $ request ->nama ,
300+ 'email ' => $ request ->email ,
301+ 'body ' => $ request ->body ,
302+ 'status ' => 'disable ' ,
303+ 'das_artikel_id ' => $ request ->das_artikel_id ,
304+ 'comment_id ' => $ request ->comment_id ,
305+ 'ip_address ' => $ ipAddress ,
306+ 'device ' => $ deviceInfo
307+ ]);
308+
309+ // Simpan comment_id ke dalam session agar user bisa melihat komentarnya sendiri
310+ $ request ->session ()->push ('session_user_comments ' , $ comment ->id );
311+
312+ return redirect ()->back ()->with ('success ' , 'Balasan berhasil dikirim. ' );
313+ } catch (\Throwable $ th ) {
314+ return redirect ()->back ()->withInput ($ request ->all ())->withErrors ([$ th ->getMessage ()]);
315+ }
164316 }
165317
318+
166319 public function eventDetail ($ slug )
167320 {
168321 $ event = Event::slug ($ slug )->firstOrFail ();
0 commit comments