feat: inisialisasi project kit v2
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api\V1;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Setting;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
|
||||
/**
|
||||
* @group Mobile App Config
|
||||
*
|
||||
* Public endpoint for mobile app version checks and maintenance status.
|
||||
*/
|
||||
class AppConfigController extends Controller
|
||||
{
|
||||
/**
|
||||
* Get App Config
|
||||
*
|
||||
* Returns version info and maintenance status for the given platform.
|
||||
*
|
||||
* @unauthenticated
|
||||
* @queryParam platform string The platform (android|ios). Defaults to android.
|
||||
*/
|
||||
public function __invoke(Request $request): JsonResponse
|
||||
{
|
||||
$platform = $request->input('platform', 'android');
|
||||
if (!\in_array($platform, ['android', 'ios'], true)) {
|
||||
$platform = 'android';
|
||||
}
|
||||
|
||||
$settings = Cache::get('system_settings', function () {
|
||||
try {
|
||||
return Setting::pluck('value', 'key')->toArray();
|
||||
} catch (\Throwable) {
|
||||
return [];
|
||||
}
|
||||
});
|
||||
|
||||
if ($platform === 'android') {
|
||||
$maintenance = filter_var($settings['android_maintenance_mode'] ?? false, FILTER_VALIDATE_BOOLEAN);
|
||||
|
||||
if ($maintenance) {
|
||||
return response()->json([
|
||||
'maintenance' => true,
|
||||
'message' => 'The app is temporarily under maintenance. Please try again later.',
|
||||
], 503);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'maintenance' => false,
|
||||
'latest_version' => $settings['android_latest_version'] ?? '1.0.0',
|
||||
'min_version' => $settings['android_min_version'] ?? '1.0.0',
|
||||
'store_url' => $settings['android_playstore_url'] ?? null,
|
||||
'platform' => 'android',
|
||||
]);
|
||||
}
|
||||
|
||||
// ios — placeholder using same pattern, expandable when ios settings are added
|
||||
return response()->json([
|
||||
'maintenance' => false,
|
||||
'latest_version' => $settings['ios_latest_version'] ?? '1.0.0',
|
||||
'min_version' => $settings['ios_min_version'] ?? '1.0.0',
|
||||
'store_url' => $settings['ios_appstore_url'] ?? null,
|
||||
'platform' => 'ios',
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api\V1;
|
||||
|
||||
use App\Actions\Auth\LoginAction;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Resources\UserResource;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
/**
|
||||
* @group Authentication
|
||||
*
|
||||
* APIs for managing authentication
|
||||
*/
|
||||
class AuthController extends Controller
|
||||
{
|
||||
/**
|
||||
* Login
|
||||
*
|
||||
* Authenticate a user and return a Sanctum token.
|
||||
*
|
||||
* @unauthenticated
|
||||
*/
|
||||
public function login(Request $request, LoginAction $action): JsonResponse
|
||||
{
|
||||
$credentials = $request->validate([
|
||||
'email' => 'required|email',
|
||||
'password' => 'required',
|
||||
]);
|
||||
|
||||
$result = $action->execute($credentials);
|
||||
|
||||
return response()->json([
|
||||
'data' => new UserResource($result['user']),
|
||||
'token' => $result['token'],
|
||||
'roles' => $result['roles'],
|
||||
'permissions' => $result['permissions'],
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get Current User
|
||||
*
|
||||
* Return the currently authenticated user's details.
|
||||
*/
|
||||
public function me(Request $request): UserResource
|
||||
{
|
||||
return new UserResource($request->user());
|
||||
}
|
||||
|
||||
/**
|
||||
* Logout
|
||||
*
|
||||
* Revoke the current user's token.
|
||||
*/
|
||||
public function logout(Request $request): JsonResponse
|
||||
{
|
||||
$request->user()->currentAccessToken()->delete();
|
||||
|
||||
return response()->json(['message' => 'Logged out successfully']);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,115 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api\V1;
|
||||
|
||||
use App\Actions\Users\CreateUserAction;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Resources\UserResource;
|
||||
use App\Models\User;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
|
||||
|
||||
/**
|
||||
* @group User Management
|
||||
*
|
||||
* APIs for managing users
|
||||
*/
|
||||
class UserController extends Controller
|
||||
{
|
||||
/**
|
||||
* List Users
|
||||
*
|
||||
* Get a paginated list of users.
|
||||
*/
|
||||
public function index(Request $request): AnonymousResourceCollection
|
||||
{
|
||||
$this->authorize('user.view');
|
||||
|
||||
$users = User::query()
|
||||
->when($request->search, function ($query, $search) {
|
||||
$query->where('first_name', 'like', "%{$search}%")
|
||||
->orWhere('last_name', 'like', "%{$search}%")
|
||||
->orWhere('email', 'like', "%{$search}%");
|
||||
})
|
||||
->paginate($request->perPage ?? 15);
|
||||
|
||||
return UserResource::collection($users);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create User
|
||||
*
|
||||
* Create a new user with roles.
|
||||
*/
|
||||
public function store(Request $request, CreateUserAction $action): UserResource
|
||||
{
|
||||
$this->authorize('user.create');
|
||||
|
||||
$validated = $request->validate([
|
||||
'firstName' => 'required|string|max:100',
|
||||
'lastName' => 'required|string|max:100',
|
||||
'email' => 'required|email|unique:users,email',
|
||||
'password' => 'required|min:8',
|
||||
'status' => 'string|in:active,inactive,suspended',
|
||||
'roles' => 'array',
|
||||
]);
|
||||
|
||||
$user = $action->execute($validated);
|
||||
|
||||
return new UserResource($user);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get User
|
||||
*
|
||||
* Get details of a specific user.
|
||||
*/
|
||||
public function show(User $user): UserResource
|
||||
{
|
||||
$this->authorize('user.view');
|
||||
|
||||
return new UserResource($user);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update User
|
||||
*
|
||||
* Update a user's details.
|
||||
*/
|
||||
public function update(Request $request, User $user): UserResource
|
||||
{
|
||||
$this->authorize('user.edit');
|
||||
|
||||
$validated = $request->validate([
|
||||
'firstName' => 'string|max:100',
|
||||
'lastName' => 'string|max:100',
|
||||
'email' => 'email|unique:users,email,' . $user->id,
|
||||
'status' => 'string|in:active,inactive,suspended',
|
||||
]);
|
||||
|
||||
// Mapping camelCase to snake_case for DB
|
||||
if (isset($validated['firstName'])) $user->first_name = $validated['firstName'];
|
||||
if (isset($validated['lastName'])) $user->last_name = $validated['lastName'];
|
||||
if (isset($validated['email'])) $user->email = $validated['email'];
|
||||
if (isset($validated['status'])) $user->status = $validated['status'];
|
||||
|
||||
$user->save();
|
||||
|
||||
return new UserResource($user);
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete User
|
||||
*
|
||||
* Soft delete a user.
|
||||
*/
|
||||
public function destroy(User $user): JsonResponse
|
||||
{
|
||||
$this->authorize('user.delete');
|
||||
|
||||
$user->delete();
|
||||
|
||||
return response()->json(['message' => 'User deleted successfully']);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user