Reorganize files to prepare API versioning

This commit is contained in:
Bubka
2021-11-04 20:10:41 +01:00
parent affd4bdf8d
commit 9ca9fcc9ef
29 changed files with 1 additions and 1 deletions

View File

@@ -1,34 +0,0 @@
<?php
namespace App\Http\Controllers\Auth;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
class ForgotPasswordController extends Controller
{
/*
|--------------------------------------------------------------------------
| Password Reset Controller
|--------------------------------------------------------------------------
|
| This controller is responsible for handling password reset emails and
| includes a trait which assists in sending these notifications from
| your application to your users. Feel free to explore this trait.
|
*/
use SendsPasswordResetEmails;
/**
* Validate the email for the given request.
*
* @param \Illuminate\Http\Request $request
* @return void
*/
protected function validateEmail(Request $request)
{
$request->validate(['email' => 'required|exists:users,email']);
}
}

View File

@@ -1,35 +0,0 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Requests\UserPatchPwdRequest;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
class PasswordController extends Controller
{
/**
* Update the user's password.
*
* @param \App\Http\Requests\UserPatchPwdRequest $request
* @return \Illuminate\Http\Response
*/
public function update(UserPatchPwdRequest $request)
{
$validated = $request->validated();
if (!Hash::check( $validated['currentPassword'], Auth::user()->password) ) {
return response()->json(['message' => __('errors.wrong_current_password')], 400);
}
if (!config('2fauth.config.isDemoApp') ) {
$request->user()->update([
'password' => bcrypt($validated['password']),
]);
}
return response()->json(['message' => __('auth.forms.password_successfully_changed')]);
}
}

View File

@@ -1,62 +0,0 @@
<?php
namespace App\Http\Controllers\Auth;
use App\User;
use App\Http\Requests\UserStoreRequest;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;
use Illuminate\Auth\Events\Registered;
use Illuminate\Foundation\Auth\RegistersUsers;
class RegisterController extends Controller
{
/*
|--------------------------------------------------------------------------
| Register Controller
|--------------------------------------------------------------------------
|
| This controller handles the registration of new users as well as their
| validation and creation. By default this controller uses a trait to
| provide this functionality without requiring any additional code.
|
*/
use RegistersUsers;
/**
* Handle a registration request for the application.
*
* @param \App\Http\Requests\UserStoreRequest $request
* @return \Illuminate\Http\JsonResponse
*/
public function register(UserStoreRequest $request)
{
$validated = $request->validated();
event(new Registered($user = $this->create($validated)));
$this->attemptLogin($request);
return response()->json([
'message' => 'account created',
'name' => $user->name,
], 201);
}
/**
* Create a new user instance after a valid registration.
*
* @param array $data
* @return \App\User
*/
protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
]);
}
}

View File

@@ -1,24 +0,0 @@
<?php
namespace App\Http\Controllers\Auth;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ResetsPasswords;
class ResetPasswordController extends Controller
{
/*
|--------------------------------------------------------------------------
| Password Reset Controller
|--------------------------------------------------------------------------
|
| This controller is responsible for handling password reset requests
| and uses a simple trait to include this behavior. You're free to
| explore this trait and override any methods you wish to tweak.
|
*/
use ResetsPasswords;
}

View File

@@ -1,54 +0,0 @@
<?php
namespace App\Http\Controllers\Auth;
use App\User;
use App\Http\Requests\UserUpdateRequest;
use App\Http\Resources\UserResource;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
class UserController extends Controller
{
/**
* Get detailed information about a user
*
* @return \App\Http\Resources\UserResource
*/
public function show()
{
$user = User::first();
return $user
? new UserResource($user)
: response()->json(['name' => null], 200);
}
/**
* Update the user's profile information.
*
* @param \App\Http\Requests\UserUpdateRequest $request
* @return \App\Http\Resources\UserResource
*/
public function update(UserUpdateRequest $request)
{
$user = $request->user();
$validated = $request->validated();
if (!Hash::check( $request->password, Auth::user()->password) ) {
return response()->json(['message' => __('errors.wrong_current_password')], 400);
}
if (!config('2fauth.config.isDemoApp') ) {
tap($user)->update([
'name' => $validated['name'],
'email' => $validated['email'],
]);
}
return new UserResource($user);
}
}

View File

@@ -1,139 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Group;
use App\Services\GroupService;
use App\Http\Requests\GroupStoreRequest;
use App\Http\Requests\GroupAssignRequest;
use App\Http\Resources\GroupResource;
use App\Http\Resources\TwoFAccountCollection;
class GroupController extends Controller
{
/**
* The TwoFAccount Service instance.
*/
protected $groupService;
/**
* Create a new controller instance.
*
* @param GroupService $groupService
* @return void
*/
public function __construct(GroupService $groupService)
{
$this->groupService = $groupService;
}
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$groups = $this->groupService->getAll();
return GroupResource::collection($groups);
}
/**
* Store a newly created resource in storage.
*
* @param \App\Http\Requests\GroupRequest $request
* @return \App\Http\Resources\GroupResource
*/
public function store(GroupStoreRequest $request)
{
$validated = $request->validated();
$group = $this->groupService->Create($validated);
return (new GroupResource($group))
->response()
->setStatusCode(201);
}
/**
* Display the specified resource.
*
* @param \App\Group $group
* @return \Illuminate\Http\Response
*/
public function show(Group $group)
{
return new GroupResource($group);
}
/**
* Update the specified resource in storage.
*
* @param \App\Http\Requests\GroupRequest $request
* @param \App\Group $group
* @return \App\Http\Resources\GroupResource
*/
public function update(GroupStoreRequest $request, Group $group)
{
$validated = $request->validated();
$this->groupService->update($group, $validated);
return new GroupResource($group);
}
/**
* Associate the specified accounts with the group
*
* @param \App\Http\Requests\GroupAssignRequest $request
* @param \App\Group $group
* @return \Illuminate\Http\Response
*/
public function assignAccounts(GroupAssignRequest $request, Group $group)
{
$validated = $request->validated();
$this->groupService->assign($validated['ids'], $group);
return response()->json($group, 200);
}
/**
* Get accounts assign to the group
*
* @param \App\Group $group
* @return \App\Http\Resources\TwoFAccountCollection
*/
public function accounts(Group $group)
{
$groups = $this->groupService->getAccounts($group);
return new TwoFAccountCollection($groups);
}
/**
* Remove the specified resource from storage.
*
* @param \App\Group $group
* @return \Illuminate\Http\Response
*/
public function destroy(Group $group)
{
$this->groupService->delete($group->id);
return response()->json(null, 204);
}
}

View File

@@ -1,42 +0,0 @@
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
class IconController extends Controller
{
/**
* Handle uploaded icon image
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function upload(Request $request)
{
$this->validate($request, [
'icon' => 'required|image',
]);
$path = $request->file('icon')->store('public/icons');
$response['filename'] = pathinfo($path)['basename'];
return response()->json($response, 201);
}
/**
* delete an icon
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function delete($icon)
{
Storage::delete('public/icons/' . $icon);
return response()->json(null, 204);
}
}

View File

@@ -1,65 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\TwoFAccount;
use App\Services\QrCodeService;
use App\Services\TwoFAccountService;
use App\Http\Requests\QrCodeDecodeRequest;
class QrCodeController extends Controller
{
/**
* The QR code Service instance.
*/
protected $qrcodeService;
/**
* The TwoFAccount Service instance.
*/
protected $twofaccountService;
/**
* Create a new controller instance.
*
* @param \App\Services\QrCodeService $qrcodeService
* @param \App\Services\TwoFAccountService $twofaccountService
* @return void
*/
public function __construct(QrCodeService $qrcodeService, TwoFAccountService $twofaccountService)
{
$this->qrcodeService = $qrcodeService;
$this->twofaccountService = $twofaccountService;
}
/**
* Show a QR code image
*
* @param App\TwoFAccount $twofaccount
* @return \Illuminate\Http\Response
*/
public function show(TwoFAccount $twofaccount)
{
$uri = $this->twofaccountService->getURI($twofaccount);
return response()->json(['qrcode' => $this->qrcodeService->encode($uri)], 200);
}
/**
* Decode an uploaded QR Code image
*
* @param \App\Http\Requests\QrCodeDecodeRequest $request
* @return \Illuminate\Http\Response
*/
public function decode(QrCodeDecodeRequest $request)
{
$file = $request->file('qrcode');
return response()->json(['data' => $this->qrcodeService->decode($file)], 200);
}
}

View File

@@ -1,154 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\Exceptions\DbEncryptionException;
use App\Services\DbEncryptionService;
use App\Services\SettingServiceInterface;
use App\Http\Requests\SettingStoreRequest;
use App\Http\Requests\SettingUpdateRequest;
use App\Http\Controllers\Controller;
class SettingController extends Controller
{
/**
* The Settings Service instance.
*/
protected SettingServiceInterface $settingService;
/**
* The Settings Service instance.
*/
protected DbEncryptionService $dbEncryptionService;
/**
* Create a new controller instance.
*
*/
public function __construct(SettingServiceInterface $SettingServiceInterface, DbEncryptionService $dbEncryptionService)
{
$this->settingService = $SettingServiceInterface;
$this->dbEncryptionService = $dbEncryptionService;
}
/**
* List all settings
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$settings = $this->settingService->all();
$settingsResources = collect();
$settings->each(function ($item, $key) use ($settingsResources) {
$settingsResources->push([
'key' => $key,
'value' => $item
]);
});
// return SettingResource::collection($tata);
return response()->json($settingsResources->all(), 200);
}
/**
* Display a resource
*
* @param string $settingName
*
* @return \App\Http\Resources\TwoFAccountReadResource
*/
public function show($settingName)
{
$setting = $this->settingService->get($settingName);
if (!$setting) {
abort(404);
}
return response()->json([
'key' => $settingName,
'value' => $setting
], 200);
}
/**
* Save options
* @return [type] [description]
*/
public function store(SettingStoreRequest $request)
{
$validated = $request->validated();
$this->settingService->set($validated['key'], $validated['value']);
return response()->json([
'key' => $validated['key'],
'value' => $validated['value']
], 201);
}
/**
* Save options
* @return [type] [description]
*/
public function update(SettingUpdateRequest $request, $settingName)
{
$validated = $request->validated();
// The useEncryption setting impacts records in DB so we delegate the work to the
// dedicated db encryption service
if( $settingName === 'useEncryption')
{
try {
$this->dbEncryptionService->setTo($validated['value']);
}
catch(DbEncryptionException $ex) {
return response()->json([
'message' => $ex->getMessage()
], 400);
}
}
else $this->settingService->set($settingName, $validated['value']);
return response()->json([
'key' => $settingName,
'value' => $validated['value']
], 200);
}
/**
* Save options
* @return [type] [description]
*/
public function destroy($settingName)
{
$setting = $this->settingService->get($settingName);
if (is_null($setting)) {
abort(404);
}
$optionsConfig = config('2fauth.options');
if(array_key_exists($settingName, $optionsConfig)) {
return response()->json(
['message' => 'bad request',
'reason' => [__('errors.delete_user_setting_only')]
], 400);
}
$this->settingService->delete($settingName);
return response()->json(null, 204);
}
}

View File

@@ -1,284 +0,0 @@
<?php
namespace App\Http\Controllers;
use App\TwoFAccount;
use App\Exceptions\UndecipherableException;
use App\Http\Requests\TwoFAccountReorderRequest;
use App\Http\Requests\TwoFAccountStoreRequest;
use App\Http\Requests\TwoFAccountUpdateRequest;
use App\Http\Requests\TwoFAccountBatchRequest;
use App\Http\Requests\TwoFAccountUriRequest;
use App\Http\Requests\TwoFAccountDynamicRequest;
use App\Http\Resources\TwoFAccountCollection;
use App\Http\Resources\TwoFAccountReadResource;
use App\Http\Resources\TwoFAccountStoreResource;
use App\Services\GroupService;
use App\Services\TwoFAccountService;
use Illuminate\Support\Arr;
use Illuminate\Http\Request;
class TwoFAccountController extends Controller
{
/**
* The TwoFAccount Service instance.
*/
protected $twofaccountService;
/**
* The Group Service instance.
*/
protected $groupService;
/**
* Create a new controller instance.
*
* @param TwoFAccountService $twofaccountService
* @return void
*/
public function __construct(TwoFAccountService $twofaccountService, GroupService $groupService)
{
$this->twofaccountService = $twofaccountService;
$this->groupService = $groupService;
}
/**
* List all resources
*
* @return \App\Http\Resources\TwoFAccountCollection
*/
public function index(Request $request)
{
return new TwoFAccountCollection(TwoFAccount::ordered()->get());
}
/**
* Display a resource
*
* @param \App\TwoFAccount $twofaccount
*
* @return \App\Http\Resources\TwoFAccountReadResource
*/
public function show(TwoFAccount $twofaccount)
{
return new TwoFAccountReadResource($twofaccount);
}
/**
* Store a newly created resource in storage.
*
* @param \App\Http\Requests\TwoFAccountDynamicRequest $request
* @return \App\Http\Resources\TwoFAccountReadResource
*/
public function store(TwoFAccountDynamicRequest $request)
{
// Two possible cases :
// - The most common case, an URI is provided by the QuickForm, thanks to a QR code live scan or file upload
// -> We use that URI to define the account
// - The advanced form has been used and all individual parameters
// -> We use the parameters array to define the account
$validated = $request->validated();
$twofaccount = Arr::has($validated, 'uri')
? $this->twofaccountService->createFromUri($validated['uri'])
: $this->twofaccountService->createFromParameters($validated);
// Possible group association
$this->groupService->assign($twofaccount->id);
return (new TwoFAccountReadResource($twofaccount))
->response()
->setStatusCode(201);
}
/**
* Update the specified resource in storage.
*
* @param \App\Http\TwoFAccountUpdateRequest $request
* @param \App\TwoFAccount $twofaccount
* @return \Illuminate\Http\Response
*/
public function update(TwoFAccountUpdateRequest $request, TwoFAccount $twofaccount)
{
$validated = $request->validated();
$this->twofaccountService->update($twofaccount, $validated);
return (new TwoFAccountReadResource($twofaccount))
->response()
->setStatusCode(200);
}
/**
* Set new order.
*
* @param App\Http\Requests\TwoFAccountReorderRequest $request
* @return \Illuminate\Http\Response
*/
public function reorder(TwoFAccountReorderRequest $request)
{
$validated = $request->validated();
TwoFAccount::setNewOrder($validated['orderedIds']);
return response()->json(['message' => 'order saved'], 200);
}
/**
* Preview account using an uri, without any db moves
*
* @param \App\Http\Requests\TwoFAccountUriRequest $request
* @return \App\Http\Resources\TwoFAccountStoreResource
*/
public function preview(TwoFAccountUriRequest $request)
{
$twofaccount = $this->twofaccountService->createFromUri($request->uri, false);
return new TwoFAccountStoreResource($twofaccount);
}
/**
* Get a One-Time Password
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function otp(Request $request, $id = null)
{
$inputs = $request->all();
// The request input is the ID of an existing account
if ( $id ) {
try {
$otp = $this->twofaccountService->getOTP((int) $id);
}
catch (UndecipherableException $ex) {
return response()->json([
'message' => __('errors.cannot_decipher_secret')
], 400);
}
}
// The request input is an uri
else if ( count($inputs) === 1 && $request->has('uri') ) {
$validatedData = $request->validate((new TwoFAccountUriRequest)->rules());
$otp = $this->twofaccountService->getOTP($validatedData['uri']);
}
else if ( count($inputs) > 1 && $request->has('uri')) {
return response()->json([
'message' => 'bad request',
'reason' => ['uri' => __('validation.single', ['attribute' => 'uri'])]
], 400);
}
// The request inputs should define an account
else {
$validatedData = $request->validate((new TwoFAccountStoreRequest)->rules());
$otp = $this->twofaccountService->getOTP($validatedData);
}
return response()->json($otp, 200);
}
/**
* A simple and light method to get the account count.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function count(Request $request)
{
return response()->json([ 'count' => TwoFAccount::count() ], 200);
}
/**
*
* Withdraw one or more accounts from their group
*
* @param \App\Http\Requests\TwoFAccountBatchRequest $request
* @return \Illuminate\Http\Response
*/
public function withdraw(TwoFAccountBatchRequest $request)
{
$validated = $request->validated();
if ($this->tooManyIds($validated['ids'])) {
return response()->json([
'message' => 'bad request',
'reason' => [__('errors.too_many_ids')]
], 400);
}
$this->twofaccountService->withdraw($validated['ids']);
return response()->json([ 'message' => 'accounts withdrawn' ], 200);
}
/**
* Remove the specified resource from storage.
*
* @param \App\TwoFAccount $twofaccount
* @return \Illuminate\Http\Response
*/
public function destroy(TwoFAccount $twofaccount)
{
$this->twofaccountService->delete($twofaccount->id);
return response()->json(null, 204);
}
/**
* Remove the specified resources from storage.
*
* @param \App\Http\Requests\TwoFAccountBatchRequest $request
* @return \Illuminate\Http\Response
*/
public function batchDestroy(TwoFAccountBatchRequest $request)
{
$validated = $request->validated();
if ($this->tooManyIds($validated['ids'])) {
return response()->json([
'message' => 'bad request',
'reason' => [__('errors.too_many_ids')]
], 400);
}
$this->twofaccountService->delete($validated['ids']);
return response()->json(null, 204);
}
/**
* Checks ids length
*
* @param string $ids comma-separated ids
* @return bool whether or not the number of ids is acceptable
*/
private function tooManyIds(string $ids) : bool
{
$arIds = explode(',', $ids, 100);
$nb = count($arIds);
return $nb > 99 ? true : false;
}
}