Refactor user and session migrations to use UUIDs; update DatabaseSeeder for test user creation; enhance LetterController with search functionality and API route protection

This commit is contained in:
NoBody313
2025-03-24 11:26:00 +07:00
parent 6d431d9610
commit e7477e204f
9 changed files with 559 additions and 127 deletions
@@ -3,89 +3,192 @@
namespace App\Http\Controllers;
use App\Models\CompletionTemplate;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Exception;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Validation\ValidationException;
/**
* @group Template Management
*
* APIs for managing completion letter templates
* @authenticated
*/
class CompletionTemplateController extends Controller
{
/**
* Menampilkan semua data completion template.
* GET /api/completion_templates
* Display all completion templates
*
* @authenticated
* @return JsonResponse
*/
public function index()
public function index(): JsonResponse
{
$templates = CompletionTemplate::all();
return response()->json($templates);
try {
$templates = CompletionTemplate::latest()->get();
return response()->json([
'success' => true,
'data' => $templates
]);
} catch (Exception $e) {
return response()->json([
'success' => false,
'message' => 'Error fetching templates',
'error' => $e->getMessage()
], 500);
}
}
/**
* Menyimpan data completion template baru.
* POST /api/completion_templates
* Store new completion template
*
* @authenticated
* @param Request $request
* @return JsonResponse
*/
public function store(Request $request)
public function store(Request $request): JsonResponse
{
$validated = $request->validate([
'greeting' => 'required|string',
'content' => 'required|string',
'closing' => 'required|string',
'sign_person' => 'required|string',
'position_name' => 'required|string',
'signature' => 'nullable|string',
]);
try {
$validated = $request->validate([
'greeting' => 'required|string|max:255',
'content' => 'required|string',
'closing' => 'required|string|max:255',
'sign_person' => 'required|string|max:255',
'position_name' => 'required|string|max:255',
'signature' => 'nullable|string'
]);
$template = CompletionTemplate::create($validated);
$template = CompletionTemplate::create($validated);
return response()->json([
'message' => 'Completion Template berhasil dibuat.',
'data' => $template
], 201);
return response()->json([
'success' => true,
'message' => 'Template berhasil dibuat',
'data' => $template
], 201);
} catch (ValidationException $e) {
return response()->json([
'success' => false,
'message' => 'Validation failed',
'errors' => $e->errors()
], 422);
} catch (Exception $e) {
return response()->json([
'success' => false,
'message' => 'Error creating template',
'error' => $e->getMessage()
], 500);
}
}
/**
* Menampilkan detail data completion template.
* GET /api/completion_templates/{id}
* Display specific completion template
*
* @authenticated
* @param string $id
* @return JsonResponse
*/
public function show($id)
public function show(string $id): JsonResponse
{
$template = CompletionTemplate::findOrFail($id);
return response()->json($template);
try {
$template = CompletionTemplate::findOrFail($id);
return response()->json([
'success' => true,
'data' => $template
]);
} catch (ModelNotFoundException $e) {
return response()->json([
'success' => false,
'message' => 'Template not found'
], 404);
} catch (Exception $e) {
return response()->json([
'success' => false,
'message' => 'Error retrieving template',
'error' => $e->getMessage()
], 500);
}
}
/**
* Mengupdate data completion template.
* PUT/PATCH /api/completion_templates/{id}
* Update completion template
*
* @authenticated
* @param Request $request
* @param string $id
* @return JsonResponse
*/
public function update(Request $request, $id)
public function update(Request $request, string $id): JsonResponse
{
$template = CompletionTemplate::findOrFail($id);
try {
$template = CompletionTemplate::findOrFail($id);
$validated = $request->validate([
'greeting' => 'required|string',
'content' => 'required|string',
'closing' => 'required|string',
'sign_person' => 'required|string',
'position_name' => 'required|string',
'signature' => 'nullable|string',
]);
$validated = $request->validate([
'greeting' => 'sometimes|string|max:255',
'content' => 'sometimes|string',
'closing' => 'sometimes|string|max:255',
'sign_person' => 'sometimes|string|max:255',
'position_name' => 'sometimes|string|max:255',
'signature' => 'nullable|string'
]);
$template->update($validated);
$template->update($validated);
return response()->json([
'message' => 'Completion Template berhasil diupdate.',
'data' => $template
]);
return response()->json([
'success' => true,
'message' => 'Template berhasil diperbarui',
'data' => $template
]);
} catch (ModelNotFoundException $e) {
return response()->json([
'success' => false,
'message' => 'Template not found'
], 404);
} catch (ValidationException $e) {
return response()->json([
'success' => false,
'message' => 'Validation failed',
'errors' => $e->errors()
], 422);
} catch (Exception $e) {
return response()->json([
'success' => false,
'message' => 'Error updating template',
'error' => $e->getMessage()
], 500);
}
}
/**
* Menghapus data completion template.
* DELETE /api/completion_templates/{id}
* Delete completion template
*
* @authenticated
* @param string $id
* @return JsonResponse
*/
public function destroy($id)
public function destroy(string $id): JsonResponse
{
$template = CompletionTemplate::findOrFail($id);
$template->delete();
try {
$template = CompletionTemplate::findOrFail($id);
$template->delete();
return response()->json([
'message' => 'Completion Template berhasil dihapus.'
]);
return response()->json([
'success' => true,
'message' => 'Template berhasil dihapus'
]);
} catch (ModelNotFoundException $e) {
return response()->json([
'success' => false,
'message' => 'Template not found'
], 404);
} catch (Exception $e) {
return response()->json([
'success' => false,
'message' => 'Error deleting template',
'error' => $e->getMessage()
], 500);
}
}
}