Skip to content

Commit c0f7810

Browse files
committed
feat(phase-9): add API controllers for Discuss, Documents, Events, Frontdesk, Website
Co-Authored-By: Claude <noreply@anthropic.com>
1 parent de0bd75 commit c0f7810

5 files changed

Lines changed: 418 additions & 0 deletions

File tree

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Api\V1;
4+
5+
use App\Modules\Discuss\Models\DiscussChannel;
6+
use App\Modules\Discuss\Models\DiscussMessage;
7+
use Illuminate\Http\JsonResponse;
8+
use Illuminate\Http\Request;
9+
10+
class DiscussApiController extends ApiController
11+
{
12+
public function channels(Request $request): JsonResponse
13+
{
14+
$tenantId = app()->has('tenant') ? app('tenant')->id : $request->user()->tenant_id;
15+
16+
$paginator = DiscussChannel::where('tenant_id', $tenantId)
17+
->where('is_archived', false)
18+
->latest()
19+
->paginate(15);
20+
21+
return $this->paginated($paginator);
22+
}
23+
24+
public function messages(Request $request): JsonResponse
25+
{
26+
$tenantId = app()->has('tenant') ? app('tenant')->id : $request->user()->tenant_id;
27+
28+
$query = DiscussMessage::where('tenant_id', $tenantId)
29+
->whereNull('parent_id');
30+
31+
if ($request->filled('channel_id')) {
32+
$query->where('channel_id', $request->channel_id);
33+
}
34+
35+
return $this->paginated($query->latest()->paginate(25));
36+
}
37+
38+
public function storeMessage(Request $request): JsonResponse
39+
{
40+
$tenantId = app()->has('tenant') ? app('tenant')->id : $request->user()->tenant_id;
41+
42+
$validated = $request->validate([
43+
'channel_id' => 'required|integer|exists:discuss_channels,id',
44+
'body' => 'required|string',
45+
'parent_id' => 'nullable|integer|exists:discuss_messages,id',
46+
]);
47+
48+
$validated['tenant_id'] = $tenantId;
49+
$validated['user_id'] = $request->user()->id;
50+
51+
$message = DiscussMessage::create($validated);
52+
53+
return $this->success($message->load('user'), 201);
54+
}
55+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Api\V1;
4+
5+
use App\Modules\Documents\Models\Document;
6+
use Illuminate\Http\JsonResponse;
7+
use Illuminate\Http\Request;
8+
9+
class DocumentsApiController extends ApiController
10+
{
11+
public function index(Request $request): JsonResponse
12+
{
13+
$tenantId = app()->has('tenant') ? app('tenant')->id : $request->user()->tenant_id;
14+
15+
$query = Document::where('tenant_id', $tenantId)->with('folder');
16+
17+
if ($request->filled('folder_id')) {
18+
$query->where('folder_id', $request->folder_id);
19+
}
20+
21+
if ($request->filled('category')) {
22+
$query->where('tags', 'like', '%' . $request->category . '%');
23+
}
24+
25+
return $this->paginated($query->latest()->paginate(15));
26+
}
27+
28+
public function show(int $id): JsonResponse
29+
{
30+
$document = Document::with(['folder', 'uploader', 'versions'])->findOrFail($id);
31+
32+
return $this->success($document);
33+
}
34+
35+
public function store(Request $request): JsonResponse
36+
{
37+
$tenantId = app()->has('tenant') ? app('tenant')->id : $request->user()->tenant_id;
38+
39+
$validated = $request->validate([
40+
'title' => 'required|string|max:255',
41+
'description' => 'nullable|string',
42+
'folder_id' => 'nullable|integer|exists:document_folders,id',
43+
'file_path' => 'required|string|max:500',
44+
'file_name' => 'required|string|max:255',
45+
'file_size' => 'nullable|integer',
46+
'mime_type' => 'nullable|string|max:100',
47+
'tags' => 'nullable|array',
48+
'tags.*' => 'string',
49+
]);
50+
51+
$validated['tenant_id'] = $tenantId;
52+
$validated['uploaded_by'] = $request->user()->id;
53+
$validated['version'] = 1;
54+
55+
$document = Document::create($validated);
56+
57+
return $this->success($document, 201);
58+
}
59+
60+
public function destroy(int $id): JsonResponse
61+
{
62+
$document = Document::findOrFail($id);
63+
$document->delete();
64+
65+
return $this->success(['deleted' => true]);
66+
}
67+
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Api\V1;
4+
5+
use App\Modules\Events\Models\Event;
6+
use App\Modules\Events\Models\EventRegistration;
7+
use Illuminate\Http\JsonResponse;
8+
use Illuminate\Http\Request;
9+
10+
class EventsApiController extends ApiController
11+
{
12+
public function index(Request $request): JsonResponse
13+
{
14+
$tenantId = app()->has('tenant') ? app('tenant')->id : $request->user()->tenant_id;
15+
16+
$query = Event::where('tenant_id', $tenantId);
17+
18+
if ($request->filled('status')) {
19+
$query->where('status', $request->status);
20+
}
21+
22+
if ($request->filled('date_from')) {
23+
$query->where('starts_at', '>=', $request->date_from);
24+
}
25+
26+
return $this->paginated($query->orderBy('starts_at')->paginate(15));
27+
}
28+
29+
public function show(int $id): JsonResponse
30+
{
31+
$event = Event::withCount('registrations')->with('organizer')->findOrFail($id);
32+
33+
return $this->success($event);
34+
}
35+
36+
public function store(Request $request): JsonResponse
37+
{
38+
$tenantId = app()->has('tenant') ? app('tenant')->id : $request->user()->tenant_id;
39+
40+
$validated = $request->validate([
41+
'title' => 'required|string|max:255',
42+
'description' => 'nullable|string',
43+
'location' => 'nullable|string|max:255',
44+
'starts_at' => 'required|date',
45+
'ends_at' => 'required|date|after:starts_at',
46+
'capacity' => 'nullable|integer|min:1',
47+
'status' => 'nullable|string',
48+
'organizer_id' => 'nullable|integer|exists:users,id',
49+
]);
50+
51+
$validated['tenant_id'] = $tenantId;
52+
53+
$event = Event::create($validated);
54+
55+
return $this->success($event, 201);
56+
}
57+
58+
public function register(Request $request, int $id): JsonResponse
59+
{
60+
$tenantId = app()->has('tenant') ? app('tenant')->id : $request->user()->tenant_id;
61+
62+
$event = Event::findOrFail($id);
63+
64+
$user = $request->user();
65+
66+
$registration = EventRegistration::create([
67+
'event_id' => $event->id,
68+
'tenant_id' => $tenantId,
69+
'attendee_name' => $user->name,
70+
'attendee_email' => $user->email,
71+
'status' => 'confirmed',
72+
'registered_at' => now(),
73+
]);
74+
75+
return $this->success($registration, 201);
76+
}
77+
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Api\V1;
4+
5+
use App\Modules\Frontdesk\Models\FrontdeskStation;
6+
use App\Modules\Frontdesk\Models\VisitorLog;
7+
use Illuminate\Http\JsonResponse;
8+
use Illuminate\Http\Request;
9+
10+
class FrontdeskApiController extends ApiController
11+
{
12+
/**
13+
* GET /api/v1/frontdesk/stations
14+
*/
15+
public function stations(Request $request): JsonResponse
16+
{
17+
$tenantId = app()->has('tenant') ? app('tenant')->id : $request->user()->tenant_id;
18+
19+
$paginator = FrontdeskStation::where('tenant_id', $tenantId)->latest()->paginate(20);
20+
21+
return $this->paginated($paginator);
22+
}
23+
24+
/**
25+
* POST /api/v1/frontdesk/visitors/check-in
26+
*/
27+
public function checkIn(Request $request): JsonResponse
28+
{
29+
$validated = $request->validate([
30+
'visitor_name' => 'required|string|max:255',
31+
'visitor_email' => 'nullable|email|max:255',
32+
'visitor_phone' => 'nullable|string|max:50',
33+
'visitor_company' => 'nullable|string|max:255',
34+
'visit_purpose' => 'required|string|max:255',
35+
'station_id' => 'required|integer|exists:frontdesk_stations,id',
36+
'host_employee_id'=> 'nullable|integer|exists:users,id',
37+
'badge_number' => 'nullable|string|max:50',
38+
'notes' => 'nullable|string',
39+
]);
40+
41+
$tenantId = app()->has('tenant') ? app('tenant')->id : $request->user()->tenant_id;
42+
43+
$validated['tenant_id'] = $tenantId;
44+
$validated['status'] = 'checked_in';
45+
$validated['check_in_at'] = now();
46+
47+
$visitor = VisitorLog::create($validated);
48+
49+
return $this->success($visitor, 201);
50+
}
51+
52+
/**
53+
* POST /api/v1/frontdesk/visitors/{id}/checkout
54+
*/
55+
public function checkOut(int $id): JsonResponse
56+
{
57+
$visitor = VisitorLog::findOrFail($id);
58+
$visitor->update([
59+
'status' => 'checked_out',
60+
'check_out_at' => now(),
61+
]);
62+
63+
return $this->success($visitor);
64+
}
65+
66+
/**
67+
* GET /api/v1/frontdesk/visitors
68+
*/
69+
public function visitors(Request $request): JsonResponse
70+
{
71+
$tenantId = app()->has('tenant') ? app('tenant')->id : $request->user()->tenant_id;
72+
73+
$query = VisitorLog::where('tenant_id', $tenantId);
74+
75+
if ($stationId = $request->query('station_id')) {
76+
$query->where('station_id', $stationId);
77+
}
78+
79+
if ($date = $request->query('date')) {
80+
$query->whereDate('check_in_at', $date);
81+
}
82+
83+
$paginator = $query->latest('check_in_at')->paginate(20);
84+
85+
return $this->paginated($paginator);
86+
}
87+
}

0 commit comments

Comments
 (0)