mirror of
https://github.com/sp-tarkov/forge.git
synced 2025-02-12 12:10:41 -05:00
Basic API
Includes routes for login, logout, listing users, listing mods, listing a user, and listing a mod. Very basic, just laying out the structure. https://www.postman.com/refringe/workspace/spt-forge
This commit is contained in:
parent
251b1ffd14
commit
0e3783555e
47
app/Http/Controllers/Api/AuthController.php
Normal file
47
app/Http/Controllers/Api/AuthController.php
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Api;
|
||||||
|
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Http\Requests\Api\LoginUserRequest;
|
||||||
|
use App\Models\User;
|
||||||
|
use App\Traits\ApiResponses;
|
||||||
|
use Illuminate\Http\JsonResponse;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Facades\Auth;
|
||||||
|
|
||||||
|
class AuthController extends Controller
|
||||||
|
{
|
||||||
|
use ApiResponses;
|
||||||
|
|
||||||
|
public function login(LoginUserRequest $request): JsonResponse
|
||||||
|
{
|
||||||
|
$request->validated($request->all());
|
||||||
|
|
||||||
|
if (! Auth::attempt($request->only('email', 'password'))) {
|
||||||
|
return $this->error(__('Invalid credentials'), 401);
|
||||||
|
}
|
||||||
|
|
||||||
|
$user = User::firstWhere('email', $request->email);
|
||||||
|
$tokenName = $request->token_name ?? __('Dynamic API Token');
|
||||||
|
|
||||||
|
return $this->success(__('Authenticated'), [
|
||||||
|
// Only allowing the 'read' scope to be dynamically created. Can revisit later when writes are possible.
|
||||||
|
'token' => $user->createToken($tokenName, ['read'])->plainTextToken,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function logout(Request $request): JsonResponse
|
||||||
|
{
|
||||||
|
$request->user()->currentAccessToken()->delete();
|
||||||
|
|
||||||
|
return $this->success(__('Revoked API token'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function logoutAll(Request $request): JsonResponse
|
||||||
|
{
|
||||||
|
$request->user()->tokens()->delete();
|
||||||
|
|
||||||
|
return $this->success(__('Revoked all API tokens'));
|
||||||
|
}
|
||||||
|
}
|
52
app/Http/Controllers/Api/V0/ModController.php
Normal file
52
app/Http/Controllers/Api/V0/ModController.php
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Api\V0;
|
||||||
|
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Http\Requests\Api\V0\StoreModRequest;
|
||||||
|
use App\Http\Requests\Api\V0\UpdateModRequest;
|
||||||
|
use App\Http\Resources\Api\V0\ModResource;
|
||||||
|
use App\Models\Mod;
|
||||||
|
|
||||||
|
class ModController extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Display a listing of the resource.
|
||||||
|
*/
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
return ModResource::collection(Mod::paginate());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store a newly created resource in storage.
|
||||||
|
*/
|
||||||
|
public function store(StoreModRequest $request)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display the specified resource.
|
||||||
|
*/
|
||||||
|
public function show(Mod $mod)
|
||||||
|
{
|
||||||
|
return new ModResource($mod);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the specified resource in storage.
|
||||||
|
*/
|
||||||
|
public function update(UpdateModRequest $request, Mod $mod)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the specified resource from storage.
|
||||||
|
*/
|
||||||
|
public function destroy(Mod $mod)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
}
|
52
app/Http/Controllers/Api/V0/UsersController.php
Normal file
52
app/Http/Controllers/Api/V0/UsersController.php
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Api\V0;
|
||||||
|
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Http\Requests\Api\V0\StoreUserRequest;
|
||||||
|
use App\Http\Requests\Api\V0\UpdateUserRequest;
|
||||||
|
use App\Http\Resources\Api\V0\UserResource;
|
||||||
|
use App\Models\User;
|
||||||
|
|
||||||
|
class UsersController extends Controller
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Display a listing of the resource.
|
||||||
|
*/
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
return UserResource::collection(User::paginate());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Store a newly created resource in storage.
|
||||||
|
*/
|
||||||
|
public function store(StoreUserRequest $request)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Display the specified resource.
|
||||||
|
*/
|
||||||
|
public function show(User $user)
|
||||||
|
{
|
||||||
|
return new UserResource($user);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the specified resource in storage.
|
||||||
|
*/
|
||||||
|
public function update(UpdateUserRequest $request, User $user)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the specified resource from storage.
|
||||||
|
*/
|
||||||
|
public function destroy(User $user)
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
}
|
28
app/Http/Requests/Api/LoginUserRequest.php
Normal file
28
app/Http/Requests/Api/LoginUserRequest.php
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Requests\Api;
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
|
||||||
|
class LoginUserRequest extends FormRequest
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Determine if the user is authorized to make this request.
|
||||||
|
*/
|
||||||
|
public function authorize(): bool
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*/
|
||||||
|
public function rules(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'email' => ['required', 'string', 'email'],
|
||||||
|
'password' => ['required', 'string'],
|
||||||
|
'token_name' => ['sometimes'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
26
app/Http/Requests/Api/V0/StoreModRequest.php
Normal file
26
app/Http/Requests/Api/V0/StoreModRequest.php
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Requests\Api\V0;
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
|
||||||
|
class StoreModRequest extends FormRequest
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Determine if the user is authorized to make this request.
|
||||||
|
*/
|
||||||
|
public function authorize(): bool
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*/
|
||||||
|
public function rules(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
//
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
26
app/Http/Requests/Api/V0/StoreUserRequest.php
Normal file
26
app/Http/Requests/Api/V0/StoreUserRequest.php
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Requests\Api\V0;
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
|
||||||
|
class StoreUserRequest extends FormRequest
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Determine if the user is authorized to make this request.
|
||||||
|
*/
|
||||||
|
public function authorize(): bool
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*/
|
||||||
|
public function rules(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
//
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
26
app/Http/Requests/Api/V0/UpdateModRequest.php
Normal file
26
app/Http/Requests/Api/V0/UpdateModRequest.php
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Requests\Api\V0;
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
|
||||||
|
class UpdateModRequest extends FormRequest
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Determine if the user is authorized to make this request.
|
||||||
|
*/
|
||||||
|
public function authorize(): bool
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*/
|
||||||
|
public function rules(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
//
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
26
app/Http/Requests/Api/V0/UpdateUserRequest.php
Normal file
26
app/Http/Requests/Api/V0/UpdateUserRequest.php
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Requests\Api\V0;
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
|
||||||
|
class UpdateUserRequest extends FormRequest
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Determine if the user is authorized to make this request.
|
||||||
|
*/
|
||||||
|
public function authorize(): bool
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the validation rules that apply to the request.
|
||||||
|
*/
|
||||||
|
public function rules(): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
//
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
61
app/Http/Resources/Api/V0/ModResource.php
Normal file
61
app/Http/Resources/Api/V0/ModResource.php
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Resources\Api\V0;
|
||||||
|
|
||||||
|
use App\Models\Mod;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Http\Resources\Json\JsonResource;
|
||||||
|
|
||||||
|
/** @mixin Mod */
|
||||||
|
class ModResource extends JsonResource
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Transform the resource into an array.
|
||||||
|
*/
|
||||||
|
public function toArray(Request $request): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'type' => 'mod',
|
||||||
|
'id' => $this->id,
|
||||||
|
'attributes' => [
|
||||||
|
'name' => $this->name,
|
||||||
|
'slug' => $this->slug,
|
||||||
|
'description' => $this->when(
|
||||||
|
$request->routeIs('api.v0.mods.show'),
|
||||||
|
$this->description
|
||||||
|
),
|
||||||
|
'source_code_link' => $this->source_code_link,
|
||||||
|
'user_id' => $this->user_id,
|
||||||
|
'license_id' => $this->license_id,
|
||||||
|
'created_at' => $this->created_at,
|
||||||
|
],
|
||||||
|
'relationships' => [
|
||||||
|
'user' => [
|
||||||
|
'data' => [
|
||||||
|
'type' => 'user',
|
||||||
|
'id' => $this->user_id,
|
||||||
|
],
|
||||||
|
// TODO: Provide 'links.self' to user profile:
|
||||||
|
//'links' => ['self' => '#'],
|
||||||
|
],
|
||||||
|
'license' => [
|
||||||
|
'data' => [
|
||||||
|
'type' => 'license',
|
||||||
|
'id' => $this->license_id,
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
'included' => [
|
||||||
|
new UserResource($this->user),
|
||||||
|
// TODO: Provide 'included' data for attached 'license':
|
||||||
|
//new LicenseResource($this->license),
|
||||||
|
],
|
||||||
|
'links' => [
|
||||||
|
'self' => route('mod.show', [
|
||||||
|
'mod' => $this->id,
|
||||||
|
'slug' => $this->slug,
|
||||||
|
]),
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
40
app/Http/Resources/Api/V0/UserResource.php
Normal file
40
app/Http/Resources/Api/V0/UserResource.php
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Resources\Api\V0;
|
||||||
|
|
||||||
|
use App\Models\User;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Http\Resources\Json\JsonResource;
|
||||||
|
|
||||||
|
/** @mixin User */
|
||||||
|
class UserResource extends JsonResource
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Transform the resource into an array.
|
||||||
|
*/
|
||||||
|
public function toArray(Request $request): array
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'type' => 'user',
|
||||||
|
'id' => $this->id,
|
||||||
|
'attributes' => [
|
||||||
|
'name' => $this->name,
|
||||||
|
'user_role_id' => $this->user_role_id,
|
||||||
|
'created_at' => $this->created_at,
|
||||||
|
],
|
||||||
|
'relationships' => [
|
||||||
|
'user_role' => [
|
||||||
|
'data' => [
|
||||||
|
'type' => 'user_role',
|
||||||
|
'id' => $this->user_role_id,
|
||||||
|
],
|
||||||
|
],
|
||||||
|
],
|
||||||
|
// TODO: Provide 'included' data for attached 'user_role'
|
||||||
|
//'included' => [new UserRoleResource($this->role)],
|
||||||
|
|
||||||
|
// TODO: Provide 'links.self' to user profile:
|
||||||
|
//'links' => ['self' => '#'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
26
app/Traits/ApiResponses.php
Normal file
26
app/Traits/ApiResponses.php
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Traits;
|
||||||
|
|
||||||
|
use Illuminate\Http\JsonResponse;
|
||||||
|
|
||||||
|
trait ApiResponses
|
||||||
|
{
|
||||||
|
protected function success(string $message, ?array $data = []): JsonResponse
|
||||||
|
{
|
||||||
|
return $this->baseResponse(message: $message, data: $data, code: 200);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function baseResponse(?string $message = '', ?array $data = [], ?int $code = 200): JsonResponse
|
||||||
|
{
|
||||||
|
return response()->json([
|
||||||
|
'message' => $message,
|
||||||
|
'data' => $data,
|
||||||
|
], $code);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function error(string $message, int $code): JsonResponse
|
||||||
|
{
|
||||||
|
return $this->baseResponse(message: $message, code: $code);
|
||||||
|
}
|
||||||
|
}
|
@ -3,6 +3,7 @@
|
|||||||
use Illuminate\Foundation\Application;
|
use Illuminate\Foundation\Application;
|
||||||
use Illuminate\Foundation\Configuration\Exceptions;
|
use Illuminate\Foundation\Configuration\Exceptions;
|
||||||
use Illuminate\Foundation\Configuration\Middleware;
|
use Illuminate\Foundation\Configuration\Middleware;
|
||||||
|
use Illuminate\Support\Facades\Route;
|
||||||
use Mchev\Banhammer\Middleware\IPBanned;
|
use Mchev\Banhammer\Middleware\IPBanned;
|
||||||
|
|
||||||
return Application::configure(basePath: dirname(__DIR__))
|
return Application::configure(basePath: dirname(__DIR__))
|
||||||
@ -11,6 +12,12 @@ return Application::configure(basePath: dirname(__DIR__))
|
|||||||
api: __DIR__.'/../routes/api.php',
|
api: __DIR__.'/../routes/api.php',
|
||||||
commands: __DIR__.'/../routes/console.php',
|
commands: __DIR__.'/../routes/console.php',
|
||||||
health: '/up',
|
health: '/up',
|
||||||
|
then: function () {
|
||||||
|
Route::middleware('api')
|
||||||
|
->prefix('api/v0')
|
||||||
|
->name('api.v0.')
|
||||||
|
->group(base_path('routes/api_v0.php'));
|
||||||
|
},
|
||||||
)
|
)
|
||||||
->withMiddleware(function (Middleware $middleware) {
|
->withMiddleware(function (Middleware $middleware) {
|
||||||
$middleware->append(IPBanned::class);
|
$middleware->append(IPBanned::class);
|
||||||
|
@ -1,8 +1,14 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
use Illuminate\Http\Request;
|
use App\Http\Controllers\Api\AuthController;
|
||||||
use Illuminate\Support\Facades\Route;
|
use Illuminate\Support\Facades\Route;
|
||||||
|
|
||||||
Route::get('/user', function (Request $request) {
|
Route::get('/status', function () {
|
||||||
return $request->user();
|
return response()->json(['message' => 'okay']);
|
||||||
})->middleware('auth:sanctum');
|
});
|
||||||
|
|
||||||
|
Route::post('/login', [AuthController::class, 'login']);
|
||||||
|
Route::group(['middleware' => 'auth:sanctum'], function () {
|
||||||
|
Route::delete('/logout', [AuthController::class, 'logout']);
|
||||||
|
Route::delete('/logout/all', [AuthController::class, 'logoutAll']);
|
||||||
|
});
|
||||||
|
10
routes/api_v0.php
Normal file
10
routes/api_v0.php
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use App\Http\Controllers\Api\V0\ModController;
|
||||||
|
use App\Http\Controllers\Api\V0\UsersController;
|
||||||
|
use Illuminate\Support\Facades\Route;
|
||||||
|
|
||||||
|
Route::group(['middleware' => 'auth:sanctum'], function () {
|
||||||
|
Route::apiResource('users', UsersController::class);
|
||||||
|
Route::apiResource('mods', ModController::class);
|
||||||
|
});
|
Loading…
x
Reference in New Issue
Block a user