File size: 4,356 Bytes
10dc6f2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
<?php

namespace App\Http\Controllers\Organizer;

use App\Http\Controllers\Controller;
use App\Models\Category;
use App\Models\Event;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;

class EventController extends Controller
{
    public function index()
    {
        $events = auth()->user()->events()
            ->with('category', 'ticketTiers')
            ->latest()
            ->paginate(10);

        return view('organizer.events.index', compact('events'));
    }

    public function create()
    {
        $categories = Category::orderBy('name')->get();
        return view('organizer.events.create', compact('categories'));
    }

    public function store(Request $request)
    {
        $validated = $request->validate([
            'title'          => 'required|string|max:255',
            'category_id'    => 'required|exists:categories,id',
            'description'    => 'required|string',
            'venue_name'     => 'nullable|string|max:255',
            'venue_address'  => 'nullable|string|max:500',
            'city'           => 'nullable|string|max:100',
            'is_online'      => 'boolean',
            'start_at'       => 'required|date|after:now',
            'end_at'         => 'required|date|after:start_at',
            'status'         => 'required|in:draft,published',
            'banner'         => 'nullable|image|max:2048',
            'terms'          => 'nullable|string',
            'refund_policy'  => 'nullable|string',
        ]);

        if ($request->hasFile('banner')) {
            $validated['banner'] = $request->file('banner')->store('banners', 'public');
        }

        $validated['organizer_id'] = auth()->id();
        $validated['is_online'] = $request->boolean('is_online');

        $event = Event::create($validated);

        return redirect()->route('organizer.events.edit', $event)
            ->with('success', 'Event berhasil dibuat! Sekarang tambahkan tiket tier.');
    }

    public function edit(Event $event)
    {
        $this->authorizeOrganizer($event);
        $categories = Category::orderBy('name')->get();
        $event->load('ticketTiers');

        return view('organizer.events.edit', compact('event', 'categories'));
    }

    public function update(Request $request, Event $event)
    {
        $this->authorizeOrganizer($event);

        $validated = $request->validate([
            'title'          => 'required|string|max:255',
            'category_id'    => 'required|exists:categories,id',
            'description'    => 'required|string',
            'venue_name'     => 'nullable|string|max:255',
            'venue_address'  => 'nullable|string|max:500',
            'city'           => 'nullable|string|max:100',
            'is_online'      => 'boolean',
            'start_at'       => 'required|date',
            'end_at'         => 'required|date|after:start_at',
            'status'         => 'required|in:draft,published,ended,cancelled',
            'banner'         => 'nullable|image|max:2048',
            'terms'          => 'nullable|string',
            'refund_policy'  => 'nullable|string',
        ]);

        if ($request->hasFile('banner')) {
            if ($event->banner) Storage::disk('public')->delete($event->banner);
            $validated['banner'] = $request->file('banner')->store('banners', 'public');
        }

        $validated['is_online'] = $request->boolean('is_online');

        $event->update($validated);

        return redirect()->route('organizer.events.index')
            ->with('success', 'Event berhasil diperbarui!');
    }

    public function destroy(Event $event)
    {
        $this->authorizeOrganizer($event);

        if ($event->orders()->where('status', 'paid')->exists()) {
            return back()->with('error', 'Event tidak bisa dihapus karena sudah memiliki order yang dibayar.');
        }

        if ($event->banner) Storage::disk('public')->delete($event->banner);
        $event->delete();

        return redirect()->route('organizer.events.index')
            ->with('success', 'Event berhasil dihapus.');
    }

    private function authorizeOrganizer(Event $event): void
    {
        if ($event->organizer_id !== auth()->id() && !auth()->user()->isAdmin()) {
            abort(403, 'Anda tidak memiliki akses ke event ini.');
        }
    }
}