. */ namespace App\Http\Controllers\Admin; use App\ApiKey; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Illuminate\Support\Str; use Carbon\Carbon; class ApiKeyController extends Controller { public function index(Request $request) { return view('admin.api_key.index', [ 'api_keys' => $this->getApiKeysQuery($request)->with('account')->get() ]); } public function create(Request $request) { return view('admin.api_key.create', [ 'account' => $request->user() ]); } public function store(Request $request) { $request->validate([ 'name' => 'required|min:3', 'expires_after_last_used_minutes' => 'integer|min:0' ]); $apiKey = new ApiKey; $apiKey->account_id = $request->user()->id; $apiKey->name = $request->get('name'); $apiKey->expires_after_last_used_minutes = $request->get('expires_after_last_used_minutes'); $apiKey->last_used_at = Carbon::now(); $apiKey->key = Str::random(40); $apiKey->save(); return redirect()->route('admin.api_keys.index'); } public function delete(Request $request, string $key) { return view('admin.api_key.delete', [ 'api_key' => $this->getApiKeysQuery($request)->where('key', $key)->first() ]); } public function destroy(Request $request) { $this->getApiKeysQuery($request)->where('key', $request->get('key'))->delete(); return redirect()->route('admin.api_keys.index'); } private function getApiKeysQuery(Request $request) { $apiKeys = ApiKey::whereIn('account_id', function ($query) { $query->select('id') ->from('accounts') ->where('admin', true); })->whereNotNull('expires_after_last_used_minutes'); if (!$request->user()->superAdmin) { $apiKeys->whereIn('account_id', function ($query) use ($request) { $query->select('id') ->from('accounts') ->where('domain', $request->user()->domain); }); } return $apiKeys; } }