Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions config/permissions.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,18 @@
'flag' => 'api.settings',
'parent_flag' => 'settings.options',
],
[
'name' => 'Sanctum Token',
'flag' => 'api.sanctum-token.index',
],
[
'name' => 'Create',
'flag' => 'api.sanctum-token.create',
'parent_flag' => 'api.sanctum-token.index',
],
[
'name' => 'Delete',
'flag' => 'api.sanctum-token.destroy',
'parent_flag' => 'api.sanctum-token.index',
],
];
9 changes: 9 additions & 0 deletions resources/lang/en/sanctum-token.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?php

return [
'name' => 'Sanctum Token',
'create' => 'New Sanctum Token',
'abilities' => 'Abilities',
'last_used_at' => 'Last used at',
'generated_message' => 'This is your new personal access token, this token only show 1 time, make sure you have copied it.',
];
25 changes: 0 additions & 25 deletions resources/views/settings-v6.blade.php

This file was deleted.

30 changes: 30 additions & 0 deletions resources/views/table.blade.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
@extends(BaseHelper::getAdminMasterLayoutTemplate())

@section('content')
@if(session()->has('plainTextToken'))
<x-core::alert
type="success"
:title="trans('packages/api::sanctum-token.generated_message')"
>
<div class="d-flex align-items-center gap-1 mt-2">
<code>{{ session('plainTextToken') }}</code>

<a
href="javascript:void(0);"
data-bb-toggle="clipboard"
data-clipboard-action="copy"
data-clipboard-text="{{ session('plainTextToken') }}"
data-clipboard-message="{{ trans('core/table::table.copied') }}"
data-bs-toggle="tooltip"
title="{{ trans('core/table::table.copy') }}"
class="text-muted text-center text-decoration-none"
>
<span class="sr-only">{{ trans('core/table::table.copy') }}</span>
<x-core::icon name="ti ti-clipboard" />
</a>
</div>
</x-core::alert>
@endif

@include('core/table::base-table')
@stop
26 changes: 13 additions & 13 deletions routes/web.php
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
<?php

use Botble\Base\Facades\BaseHelper;
use Botble\Api\Http\Controllers\ApiController;
use Botble\Api\Http\Controllers\SanctumTokenController;
use Botble\Base\Facades\AdminHelper;
use Illuminate\Support\Facades\Route;

Route::group(['namespace' => 'Botble\Api\Http\Controllers', 'middleware' => ['web', 'core']], function () {
Route::group(['prefix' => BaseHelper::getAdminPrefix(), 'middleware' => 'auth'], function () {
Route::group(['prefix' => 'settings/api'], function () {
Route::get('', [
'as' => 'api.settings',
'uses' => 'ApiController@settings',
]);
AdminHelper::registerRoutes(function () {
Route::name('api.')->group(function () {
Route::prefix('sanctum-token')->name('sanctum-token.')->group(function () {
Route::resource('/', SanctumTokenController::class)
->parameters(['' => 'sanctum-token'])
->except('edit', 'update', 'show');
});

Route::post('', [
'as' => 'api.settings.update',
'uses' => 'ApiController@storeSettings',
'permission' => 'api.settings',
]);
Route::group(['prefix' => 'settings/api', 'permission' => 'api.settings'], function () {
Route::get('/', [ApiController::class, 'edit'])->name('settings');
Route::post('/', [ApiController::class, 'update'])->name('settings.update');
});
});
});
20 changes: 20 additions & 0 deletions src/Forms/SanctumTokenForm.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php

namespace Botble\Api\Forms;

use Botble\Api\Http\Requests\StoreSanctumTokenRequest;
use Botble\Api\Models\PersonalAccessToken;
use Botble\Base\Forms\FieldOptions\NameFieldOption;
use Botble\Base\Forms\Fields\TextField;
use Botble\Base\Forms\FormAbstract;

class SanctumTokenForm extends FormAbstract
{
public function buildForm(): void
{
$this
->setupModel(new PersonalAccessToken())
->setValidatorClass(StoreSanctumTokenRequest::class)
->add('name', TextField::class, NameFieldOption::make()->toArray());
}
}
40 changes: 8 additions & 32 deletions src/Http/Controllers/ApiController.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,16 @@

use Botble\Api\Http\Requests\ApiSettingRequest;
use Botble\Base\Facades\Assets;
use Botble\Base\Facades\PageTitle;
use Botble\Base\Http\Controllers\BaseController;
use Botble\Base\Http\Responses\BaseHttpResponse;
use Botble\Base\Supports\Breadcrumb;
use Botble\Setting\Http\Controllers\SettingController;

class ApiController extends BaseController
class ApiController extends SettingController
{
public function settings()
public function edit()
{
PageTitle::setTitle(trans('packages/api::api.settings'));
$this->pageTitle(trans('packages/api::api.settings'));

Assets::addScriptsDirectly('vendor/core/core/setting/js/setting.js');
Assets::addStylesDirectly('vendor/core/core/setting/css/setting.css');

if (version_compare('7.0.0', get_core_version(), '>')) {
return view('packages/api::settings-v6');
}
Assets::addScriptsDirectly('vendor/core/core/setting/js/setting.js')
->addStylesDirectly('vendor/core/core/setting/css/setting.css');

$this->breadcrumb()
->add(trans('core/setting::setting.title'), route('settings.index'))
Expand All @@ -29,25 +22,8 @@ public function settings()
return view('packages/api::settings');
}

public function storeSettings(ApiSettingRequest $request, BaseHttpResponse $response)
public function update(ApiSettingRequest $request)
{
$this->saveSettings($request->validated());

return $response
->setPreviousUrl(route('api.settings'))
->setMessage(trans('core/base::notices.update_success_message'));
}

protected function saveSettings(array $data)
{
foreach ($data as $settingKey => $settingValue) {
if (is_array($settingValue)) {
$settingValue = json_encode(array_filter($settingValue));
}

setting()->set($settingKey, (string)$settingValue);
}

setting()->save();
return $this->performUpdate($request->validated());
}
}
48 changes: 48 additions & 0 deletions src/Http/Controllers/SanctumTokenController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<?php

namespace Botble\Api\Http\Controllers;

use Botble\Api\Forms\SanctumTokenForm;
use Botble\Api\Http\Requests\StoreSanctumTokenRequest;
use Botble\Api\Models\PersonalAccessToken;
use Botble\Api\Tables\SanctumTokenTable;
use Botble\Base\Http\Actions\DeleteResourceAction;
use Botble\Base\Http\Controllers\BaseController;
use Botble\Base\Http\Responses\BaseHttpResponse;
use Illuminate\Contracts\View\View;
use Illuminate\Http\JsonResponse;

class SanctumTokenController extends BaseController
{
public function index(SanctumTokenTable $sanctumTokenTable): JsonResponse|View
{
$this->pageTitle(trans('packages/api::sanctum-token.name'));

return $sanctumTokenTable->renderTable();
}

public function create()
{
$this->pageTitle(trans('packages/api::sanctum-token.create'));

return SanctumTokenForm::create()->renderForm();
}

public function store(StoreSanctumTokenRequest $request): BaseHttpResponse
{
$accessToken = $request->user()->createToken($request->input('name'));

session()->flash('plainTextToken', $accessToken->plainTextToken);

return $this
->httpResponse()
->setPreviousUrl(route('api.sanctum-token.index'))
->setNextUrl(route('api.sanctum-token.index'))
->withCreatedSuccessMessage();
}

public function destroy(PersonalAccessToken $sanctumToken): DeleteResourceAction
{
return DeleteResourceAction::make($sanctumToken);
}
}
3 changes: 2 additions & 1 deletion src/Http/Requests/ApiSettingRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,15 @@

namespace Botble\Api\Http\Requests;

use Botble\Base\Rules\OnOffRule;
use Botble\Support\Http\Requests\Request;

class ApiSettingRequest extends Request
{
public function rules(): array
{
return [
'api_enabled' => 'nullable|in:0,1',
'api_enabled' => [new OnOffRule()],
];
}
}
16 changes: 16 additions & 0 deletions src/Http/Requests/StoreSanctumTokenRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php

namespace Botble\Api\Http\Requests;

use Botble\Support\Http\Requests\Request;

class StoreSanctumTokenRequest extends Request
{
public function rules(): array
{
return [
'name' => ['required', 'string', 'max:255'],
'abilities' => ['nullable', 'array'],
];
}
}
16 changes: 16 additions & 0 deletions src/Models/PersonalAccessToken.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php

namespace Botble\Api\Models;

use Botble\Base\Contracts\BaseModel;
use Botble\Base\Models\Concerns\HasBaseEloquentBuilder;
use Botble\Base\Models\Concerns\HasMetadata;
use Botble\Base\Models\Concerns\HasUuidsOrIntegerIds;
use Laravel\Sanctum\PersonalAccessToken as SanctumPersonalAccessToken;

class PersonalAccessToken extends SanctumPersonalAccessToken implements BaseModel
{
use HasMetadata;
use HasUuidsOrIntegerIds;
use HasBaseEloquentBuilder;
}
Loading