Update last of existing services to use repositories, includes unit tests
Also update PHPDocs on all the repository interfaces and classes to be correct.
This commit is contained in:
parent
50588a1f54
commit
0deb022093
21 changed files with 808 additions and 207 deletions
30
app/Contracts/Repository/ApiKeyRepositoryInterface.php
Normal file
30
app/Contracts/Repository/ApiKeyRepositoryInterface.php
Normal file
|
@ -0,0 +1,30 @@
|
|||
<?php
|
||||
/*
|
||||
* Pterodactyl - Panel
|
||||
* Copyright (c) 2015 - 2017 Dane Everitt <dane@daneeveritt.com>.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
namespace Pterodactyl\Contracts\Repository;
|
||||
|
||||
interface ApiKeyRepositoryInterface extends RepositoryInterface
|
||||
{
|
||||
//
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
<?php
|
||||
/*
|
||||
* Pterodactyl - Panel
|
||||
* Copyright (c) 2015 - 2017 Dane Everitt <dane@daneeveritt.com>.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
namespace Pterodactyl\Contracts\Repository;
|
||||
|
||||
interface ApiPermissionRepositoryInterface extends RepositoryInterface
|
||||
{
|
||||
//
|
||||
}
|
|
@ -26,5 +26,11 @@ namespace Pterodactyl\Contracts\Repository\Attributes;
|
|||
|
||||
interface SearchableInterface
|
||||
{
|
||||
/**
|
||||
* Filter results by search term.
|
||||
*
|
||||
* @param string $term
|
||||
* @return $this
|
||||
*/
|
||||
public function search($term);
|
||||
}
|
||||
|
|
|
@ -26,5 +26,14 @@ namespace Pterodactyl\Contracts\Repository;
|
|||
|
||||
interface DatabaseHostInterface extends RepositoryInterface
|
||||
{
|
||||
/**
|
||||
* Delete a database host from the DB if there are no databases using it.
|
||||
*
|
||||
* @param int $id
|
||||
* @return bool|null
|
||||
*
|
||||
* @throws \Pterodactyl\Exceptions\DisplayException
|
||||
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
|
||||
*/
|
||||
public function deleteIfNoDatabases($id);
|
||||
}
|
||||
|
|
|
@ -28,5 +28,14 @@ use Pterodactyl\Contracts\Repository\Attributes\SearchableInterface;
|
|||
|
||||
interface LocationRepositoryInterface extends RepositoryInterface, SearchableInterface
|
||||
{
|
||||
/**
|
||||
* Delete a location only if there are no nodes attached to it.
|
||||
*
|
||||
* @param $id
|
||||
* @return bool|mixed|null
|
||||
*
|
||||
* @throws \Pterodactyl\Exceptions\DisplayException
|
||||
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
|
||||
*/
|
||||
public function deleteIfNoNodes($id);
|
||||
}
|
||||
|
|
|
@ -26,25 +26,108 @@ namespace Pterodactyl\Contracts\Repository;
|
|||
|
||||
interface RepositoryInterface
|
||||
{
|
||||
/**
|
||||
* Return an identifier or Model object to be used by the repository.
|
||||
*
|
||||
* @return string|\Closure|object
|
||||
*/
|
||||
public function model();
|
||||
|
||||
/**
|
||||
* Return the model being used for this repository instance.
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function getModel();
|
||||
|
||||
/**
|
||||
* Returns an instance of a query builder.
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function getBuilder();
|
||||
|
||||
/**
|
||||
* Returns the colummns to be selected or returned by the query.
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function getColumns();
|
||||
|
||||
/**
|
||||
* An array of columns to filter the response by.
|
||||
*
|
||||
* @param array $columns
|
||||
* @return $this
|
||||
*/
|
||||
public function withColumns($columns = ['*']);
|
||||
|
||||
public function create($fields);
|
||||
/**
|
||||
* Disable returning a fresh model when data is inserted or updated.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function withoutFresh();
|
||||
|
||||
/**
|
||||
* Create a new model instance and persist it to the database.
|
||||
*
|
||||
* @param array $fields
|
||||
* @param bool $validate
|
||||
* @return mixed
|
||||
*
|
||||
* @throws \Pterodactyl\Exceptions\Model\DataValidationException
|
||||
*/
|
||||
public function create(array $fields, $validate = true);
|
||||
|
||||
/**
|
||||
* Delete a given record from the database.
|
||||
*
|
||||
* @param int $id
|
||||
* @return bool|null
|
||||
*/
|
||||
public function delete($id);
|
||||
|
||||
/**
|
||||
* Find a model that has the specific ID passed.
|
||||
*
|
||||
* @param int $id
|
||||
* @return mixed
|
||||
*
|
||||
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
|
||||
*/
|
||||
public function find($id);
|
||||
|
||||
public function findWhere($fields);
|
||||
/**
|
||||
* Find a model matching an array of where clauses.
|
||||
*
|
||||
* @param array $fields
|
||||
* @return mixed
|
||||
*
|
||||
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
|
||||
*/
|
||||
public function findWhere(array $fields);
|
||||
|
||||
public function update($id, $fields);
|
||||
/**
|
||||
* Update a given ID with the passed array of fields.
|
||||
*
|
||||
* @param int $id
|
||||
* @param array $fields
|
||||
* @param bool $validate
|
||||
* @param bool $force
|
||||
* @return mixed
|
||||
*
|
||||
* @throws \Pterodactyl\Exceptions\Model\DataValidationException
|
||||
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
|
||||
*/
|
||||
public function update($id, array $fields, $validate = true, $force = false);
|
||||
|
||||
public function massUpdate($fields);
|
||||
/**
|
||||
* Update multiple records matching the passed clauses.
|
||||
*
|
||||
* @param array $where
|
||||
* @param array $fields
|
||||
* @return mixed
|
||||
*/
|
||||
public function massUpdate(array $where, array $fields);
|
||||
}
|
||||
|
|
|
@ -28,7 +28,20 @@ use Pterodactyl\Contracts\Repository\Attributes\SearchableInterface;
|
|||
|
||||
interface UserRepositoryInterface extends RepositoryInterface, SearchableInterface
|
||||
{
|
||||
/**
|
||||
* Return all users with counts of servers and subusers of servers.
|
||||
*
|
||||
* @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
|
||||
*/
|
||||
public function getAllUsersWithCounts();
|
||||
|
||||
/**
|
||||
* Delete a user if they have no servers attached to their account.
|
||||
*
|
||||
* @param int $id
|
||||
* @return bool
|
||||
*
|
||||
* @throws \Pterodactyl\Exceptions\DisplayException
|
||||
*/
|
||||
public function deleteIfNoServers($id);
|
||||
}
|
||||
|
|
|
@ -36,7 +36,7 @@ class APIPermission extends Model implements ValidableContract
|
|||
/**
|
||||
* List of permissions available for the API.
|
||||
*/
|
||||
const PERMISSIONS = [
|
||||
const CONST_PERMISSIONS = [
|
||||
// Items within this block are available to non-adminitrative users.
|
||||
'_user' => [
|
||||
'server' => [
|
||||
|
|
|
@ -25,8 +25,12 @@
|
|||
namespace Pterodactyl\Providers;
|
||||
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
use Pterodactyl\Contracts\Repository\ApiKeyRepositoryInterface;
|
||||
use Pterodactyl\Contracts\Repository\ApiPermissionRepositoryInterface;
|
||||
use Pterodactyl\Contracts\Repository\DatabaseHostInterface;
|
||||
use Pterodactyl\Contracts\Repository\LocationRepositoryInterface;
|
||||
use Pterodactyl\Repositories\Eloquent\ApiKeyRepository;
|
||||
use Pterodactyl\Repositories\Eloquent\ApiPermissionRepository;
|
||||
use Pterodactyl\Repositories\Eloquent\DatabaseHostRepository;
|
||||
use Pterodactyl\Repositories\Eloquent\LocationRepository;
|
||||
use Pterodactyl\Repositories\Eloquent\UserRepository;
|
||||
|
@ -39,6 +43,8 @@ class RepositoryServiceProvider extends ServiceProvider
|
|||
*/
|
||||
public function register()
|
||||
{
|
||||
$this->app->bind(ApiKeyRepositoryInterface::class, ApiKeyRepository::class);
|
||||
$this->app->bind(ApiPermissionRepositoryInterface::class, ApiPermissionRepository::class);
|
||||
$this->app->bind(DatabaseHostInterface::class, DatabaseHostRepository::class);
|
||||
$this->app->bind(LocationRepositoryInterface::class, LocationRepository::class);
|
||||
$this->app->bind(UserRepositoryInterface::class, UserRepository::class);
|
||||
|
|
39
app/Repositories/Eloquent/ApiKeyRepository.php
Normal file
39
app/Repositories/Eloquent/ApiKeyRepository.php
Normal file
|
@ -0,0 +1,39 @@
|
|||
<?php
|
||||
/*
|
||||
* Pterodactyl - Panel
|
||||
* Copyright (c) 2015 - 2017 Dane Everitt <dane@daneeveritt.com>.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
namespace Pterodactyl\Repositories\Eloquent;
|
||||
|
||||
use Pterodactyl\Models\APIKey;
|
||||
use Pterodactyl\Contracts\Repository\ApiKeyRepositoryInterface;
|
||||
|
||||
class ApiKeyRepository extends EloquentRepository implements ApiKeyRepositoryInterface
|
||||
{
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function model()
|
||||
{
|
||||
return APIKey::class;
|
||||
}
|
||||
}
|
39
app/Repositories/Eloquent/ApiPermissionRepository.php
Normal file
39
app/Repositories/Eloquent/ApiPermissionRepository.php
Normal file
|
@ -0,0 +1,39 @@
|
|||
<?php
|
||||
/*
|
||||
* Pterodactyl - Panel
|
||||
* Copyright (c) 2015 - 2017 Dane Everitt <dane@daneeveritt.com>.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
namespace Pterodactyl\Repositories\Eloquent;
|
||||
|
||||
use Pterodactyl\Models\APIPermission;
|
||||
use Pterodactyl\Contracts\Repository\ApiPermissionRepositoryInterface;
|
||||
|
||||
class ApiPermissionRepository extends EloquentRepository implements ApiPermissionRepositoryInterface
|
||||
{
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function model()
|
||||
{
|
||||
return APIPermission::class;
|
||||
}
|
||||
}
|
|
@ -32,9 +32,7 @@ use Pterodactyl\Models\DatabaseHost;
|
|||
class DatabaseHostRepository extends EloquentRepository implements DatabaseHostInterface
|
||||
{
|
||||
/**
|
||||
* Setup the model to be used.
|
||||
*
|
||||
* @return string
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function model()
|
||||
{
|
||||
|
@ -42,13 +40,7 @@ class DatabaseHostRepository extends EloquentRepository implements DatabaseHostI
|
|||
}
|
||||
|
||||
/**
|
||||
* Delete a database host from the DB if there are no databases using it.
|
||||
*
|
||||
* @param int $id
|
||||
* @return bool|null
|
||||
*
|
||||
* @throws \Pterodactyl\Exceptions\DisplayException
|
||||
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function deleteIfNoDatabases($id)
|
||||
{
|
||||
|
|
|
@ -24,14 +24,15 @@
|
|||
|
||||
namespace Pterodactyl\Repositories\Eloquent;
|
||||
|
||||
use Pterodactyl\Exceptions\Model\DataValidationException;
|
||||
use Pterodactyl\Exceptions\Repository\RecordNotFoundException;
|
||||
use Pterodactyl\Repository\Repository;
|
||||
use Pterodactyl\Contracts\Repository\RepositoryInterface;
|
||||
use Pterodactyl\Exceptions\Model\DataValidationException;
|
||||
use Pterodactyl\Exceptions\Repository\RecordNotFoundException;
|
||||
|
||||
abstract class EloquentRepository extends Repository implements RepositoryInterface
|
||||
{
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
* @return \Illuminate\Database\Eloquent\Builder
|
||||
*/
|
||||
public function getBuilder()
|
||||
|
@ -40,14 +41,11 @@ abstract class EloquentRepository extends Repository implements RepositoryInterf
|
|||
}
|
||||
|
||||
/**
|
||||
* Create a new model instance and persist it to the database.
|
||||
* @param array $fields
|
||||
* @param bool $validate
|
||||
* @param bool $force
|
||||
* @return bool|\Illuminate\Database\Eloquent\Model
|
||||
* @throws \Pterodactyl\Exceptions\Model\DataValidationException
|
||||
* {@inheritdoc}
|
||||
* @param bool $force
|
||||
* @return \Illuminate\Database\Eloquent\Model|bool
|
||||
*/
|
||||
public function create($fields, $validate = true, $force = false)
|
||||
public function create(array $fields, $validate = true, $force = false)
|
||||
{
|
||||
$instance = $this->getBuilder()->newModelInstance();
|
||||
|
||||
|
@ -69,12 +67,8 @@ abstract class EloquentRepository extends Repository implements RepositoryInterf
|
|||
}
|
||||
|
||||
/**
|
||||
* Return a record from the database for a given ID.
|
||||
*
|
||||
* @param int $id
|
||||
* {@inheritdoc}
|
||||
* @return \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Model
|
||||
*
|
||||
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
|
||||
*/
|
||||
public function find($id)
|
||||
{
|
||||
|
@ -87,17 +81,16 @@ abstract class EloquentRepository extends Repository implements RepositoryInterf
|
|||
return $instance;
|
||||
}
|
||||
|
||||
public function findWhere($fields)
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function findWhere(array $fields)
|
||||
{
|
||||
// TODO: Implement findWhere() method.
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete a record from the DB given an ID.
|
||||
*
|
||||
* @param int $id
|
||||
* @param bool $destroy
|
||||
* @return bool|null
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function delete($id, $destroy = false)
|
||||
{
|
||||
|
@ -109,16 +102,9 @@ abstract class EloquentRepository extends Repository implements RepositoryInterf
|
|||
}
|
||||
|
||||
/**
|
||||
* @param int $id
|
||||
* @param array $fields
|
||||
* @param bool $validate
|
||||
* @param bool $force
|
||||
* @return mixed
|
||||
*
|
||||
* @throws \Pterodactyl\Exceptions\Model\DataValidationException
|
||||
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function update($id, $fields, $validate = true, $force = false)
|
||||
public function update($id, array $fields, $validate = true, $force = false)
|
||||
{
|
||||
$instance = $this->getBuilder()->where('id', $id)->first();
|
||||
|
||||
|
@ -143,7 +129,10 @@ abstract class EloquentRepository extends Repository implements RepositoryInterf
|
|||
return ($this->withFresh) ? $instance->fresh($this->getColumns()) : $saved;
|
||||
}
|
||||
|
||||
public function massUpdate($fields)
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function massUpdate(array $where, array $fields)
|
||||
{
|
||||
// TODO: Implement massUpdate() method.
|
||||
}
|
||||
|
|
|
@ -37,9 +37,7 @@ class LocationRepository extends EloquentRepository implements LocationRepositor
|
|||
protected $searchTerm;
|
||||
|
||||
/**
|
||||
* Setup model.
|
||||
*
|
||||
* @return string
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function model()
|
||||
{
|
||||
|
@ -47,10 +45,7 @@ class LocationRepository extends EloquentRepository implements LocationRepositor
|
|||
}
|
||||
|
||||
/**
|
||||
* Setup the model for search abilities.
|
||||
*
|
||||
* @param $term
|
||||
* @return $this
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function search($term)
|
||||
{
|
||||
|
@ -65,13 +60,7 @@ class LocationRepository extends EloquentRepository implements LocationRepositor
|
|||
}
|
||||
|
||||
/**
|
||||
* Delete a location only if there are no nodes attached to it.
|
||||
*
|
||||
* @param $id
|
||||
* @return bool|mixed|null
|
||||
*
|
||||
* @throws \Pterodactyl\Exceptions\DisplayException
|
||||
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function deleteIfNoNodes($id)
|
||||
{
|
||||
|
|
|
@ -56,11 +56,17 @@ class UserRepository extends EloquentRepository implements UserRepositoryInterfa
|
|||
$this->config = $config;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function model()
|
||||
{
|
||||
return User::class;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function search($term)
|
||||
{
|
||||
if (empty($term)) {
|
||||
|
@ -73,6 +79,9 @@ class UserRepository extends EloquentRepository implements UserRepositoryInterfa
|
|||
return $clone;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function getAllUsersWithCounts()
|
||||
{
|
||||
$users = $this->getBuilder()->withCount('servers', 'subuserOf');
|
||||
|
@ -87,12 +96,7 @@ class UserRepository extends EloquentRepository implements UserRepositoryInterfa
|
|||
}
|
||||
|
||||
/**
|
||||
* Delete a user if they have no servers attached to their account.
|
||||
*
|
||||
* @param int $id
|
||||
* @return bool
|
||||
*
|
||||
* @throws \Pterodactyl\Exceptions\DisplayException
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function deleteIfNoServers($id)
|
||||
{
|
||||
|
|
|
@ -24,48 +24,52 @@
|
|||
|
||||
namespace Pterodactyl\Services;
|
||||
|
||||
use Pterodactyl\Models\APIKey;
|
||||
use Illuminate\Database\Connection;
|
||||
use Illuminate\Database\ConnectionInterface;
|
||||
use Illuminate\Contracts\Encryption\Encrypter;
|
||||
use Pterodactyl\Exceptions\Model\DataValidationException;
|
||||
use Pterodactyl\Contracts\Repository\ApiKeyRepositoryInterface;
|
||||
|
||||
class ApiKeyService
|
||||
{
|
||||
const PUB_CRYPTO_BYTES = 8;
|
||||
const PRIV_CRYPTO_BYTES = 32;
|
||||
|
||||
/**
|
||||
* @var \Illuminate\Database\ConnectionInterface
|
||||
*/
|
||||
protected $database;
|
||||
|
||||
/**
|
||||
* @var \Illuminate\Contracts\Encryption\Encrypter
|
||||
*/
|
||||
protected $encrypter;
|
||||
|
||||
/**
|
||||
* @var \Pterodactyl\Models\APIKey
|
||||
*/
|
||||
protected $model;
|
||||
|
||||
/**
|
||||
* @var \Pterodactyl\Services\ApiPermissionService
|
||||
*/
|
||||
protected $permissionService;
|
||||
|
||||
/**
|
||||
* @var \Pterodactyl\Contracts\Repository\ApiKeyRepositoryInterface
|
||||
*/
|
||||
protected $repository;
|
||||
|
||||
/**
|
||||
* ApiKeyService constructor.
|
||||
*
|
||||
* @param \Pterodactyl\Models\APIKey $model
|
||||
* @param \Illuminate\Database\Connection $database
|
||||
* @param \Illuminate\Contracts\Encryption\Encrypter $encrypter
|
||||
* @param \Pterodactyl\Services\ApiPermissionService $permissionService
|
||||
* @param \Pterodactyl\Contracts\Repository\ApiKeyRepositoryInterface $repository
|
||||
* @param \Illuminate\Database\ConnectionInterface $database
|
||||
* @param \Illuminate\Contracts\Encryption\Encrypter $encrypter
|
||||
* @param \Pterodactyl\Services\ApiPermissionService $permissionService
|
||||
*/
|
||||
public function __construct(
|
||||
APIKey $model,
|
||||
Connection $database,
|
||||
ApiKeyRepositoryInterface $repository,
|
||||
ConnectionInterface $database,
|
||||
Encrypter $encrypter,
|
||||
ApiPermissionService $permissionService
|
||||
) {
|
||||
$this->repository = $repository;
|
||||
$this->database = $database;
|
||||
$this->encrypter = $encrypter;
|
||||
$this->model = $model;
|
||||
$this->permissionService = $permissionService;
|
||||
}
|
||||
|
||||
|
@ -88,16 +92,12 @@ class ApiKeyService
|
|||
// Start a Transaction
|
||||
$this->database->beginTransaction();
|
||||
|
||||
$instance = $this->model->newInstance($data);
|
||||
$instance->public = $publicKey;
|
||||
$instance->secret = $this->encrypter->encrypt($secretKey);
|
||||
$data = array_merge($data, [
|
||||
'public' => $publicKey,
|
||||
'secret' => $this->encrypter->encrypt($secretKey),
|
||||
]);
|
||||
|
||||
if (! $instance->save()) {
|
||||
$this->database->rollBack();
|
||||
throw new DataValidationException($instance->getValidator());
|
||||
}
|
||||
|
||||
$key = $instance->fresh();
|
||||
$instance = $this->repository->create($data, true, true);
|
||||
$nodes = $this->permissionService->getPermissions();
|
||||
|
||||
foreach ($permissions as $permission) {
|
||||
|
@ -111,7 +111,7 @@ class ApiKeyService
|
|||
continue;
|
||||
}
|
||||
|
||||
$this->permissionService->create($key->id, sprintf('user.%s', $permission));
|
||||
$this->permissionService->create($instance->id, sprintf('user.%s', $permission));
|
||||
}
|
||||
|
||||
foreach ($administrative as $permission) {
|
||||
|
@ -125,7 +125,7 @@ class ApiKeyService
|
|||
continue;
|
||||
}
|
||||
|
||||
$this->permissionService->create($key->id, $permission);
|
||||
$this->permissionService->create($instance->id, $permission);
|
||||
}
|
||||
|
||||
$this->database->commit();
|
||||
|
@ -136,18 +136,11 @@ class ApiKeyService
|
|||
/**
|
||||
* Delete the API key and associated permissions from the database.
|
||||
*
|
||||
* @param int|\Pterodactyl\Models\APIKey $key
|
||||
* @param int $id
|
||||
* @return bool|null
|
||||
*
|
||||
* @throws \Exception
|
||||
* @throws \Illuminate\Database\Eloquent\ModelNotFoundException
|
||||
*/
|
||||
public function revoke($key)
|
||||
public function revoke($id)
|
||||
{
|
||||
if (! $key instanceof APIKey) {
|
||||
$key = $this->model->findOrFail($key);
|
||||
}
|
||||
|
||||
return $key->delete();
|
||||
return $this->repository->delete($id);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,24 +24,23 @@
|
|||
|
||||
namespace Pterodactyl\Services;
|
||||
|
||||
use Pterodactyl\Models\APIPermission;
|
||||
use Pterodactyl\Exceptions\Model\DataValidationException;
|
||||
use Pterodactyl\Contracts\Repository\ApiPermissionRepositoryInterface;
|
||||
|
||||
class ApiPermissionService
|
||||
{
|
||||
/**
|
||||
* @var \Pterodactyl\Models\APIPermission
|
||||
* @var \Pterodactyl\Contracts\Repository\ApiPermissionRepositoryInterface
|
||||
*/
|
||||
protected $model;
|
||||
protected $repository;
|
||||
|
||||
/**
|
||||
* ApiPermissionService constructor.
|
||||
*
|
||||
* @param \Pterodactyl\Models\APIPermission $model
|
||||
* @param \Pterodactyl\Contracts\Repository\ApiPermissionRepositoryInterface $repository
|
||||
*/
|
||||
public function __construct(APIPermission $model)
|
||||
public function __construct(ApiPermissionRepositoryInterface $repository)
|
||||
{
|
||||
$this->model = $model;
|
||||
$this->repository = $repository;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -55,16 +54,11 @@ class ApiPermissionService
|
|||
*/
|
||||
public function create($key, $permission)
|
||||
{
|
||||
$instance = $this->model->newInstance([
|
||||
// @todo handle an array of permissions to do a mass assignment?
|
||||
return $this->repository->withoutFresh()->create([
|
||||
'key_id' => $key,
|
||||
'permission' => $permission,
|
||||
]);
|
||||
|
||||
if (! $instance->save()) {
|
||||
throw new DataValidationException($instance->getValidator());
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -74,6 +68,6 @@ class ApiPermissionService
|
|||
*/
|
||||
public function getPermissions()
|
||||
{
|
||||
return APIPermission::PERMISSIONS;
|
||||
return $this->repository->getModel()::CONST_PERMISSIONS;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -44,6 +44,7 @@
|
|||
"friendsofphp/php-cs-fixer": "1.*",
|
||||
"fzaninotto/faker": "~1.4",
|
||||
"mockery/mockery": "0.9.*",
|
||||
"php-mock/php-mock-phpunit": "^1.1",
|
||||
"phpunit/phpunit": "~5.7",
|
||||
"sllh/php-cs-fixer-styleci-bridge": "^2.1"
|
||||
},
|
||||
|
|
353
composer.lock
generated
353
composer.lock
generated
|
@ -4,7 +4,7 @@
|
|||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "d3edf73b6618705ee34a76fa0319f0de",
|
||||
"content-hash": "f1afab5cf73088c6034bfb2b13631600",
|
||||
"packages": [
|
||||
{
|
||||
"name": "aws/aws-sdk-php",
|
||||
|
@ -803,16 +803,16 @@
|
|||
},
|
||||
{
|
||||
"name": "erusev/parsedown",
|
||||
"version": "1.6.2",
|
||||
"version": "1.6.3",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/erusev/parsedown.git",
|
||||
"reference": "1bf24f7334fe16c88bf9d467863309ceaf285b01"
|
||||
"reference": "728952b90a333b5c6f77f06ea9422b94b585878d"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/erusev/parsedown/zipball/1bf24f7334fe16c88bf9d467863309ceaf285b01",
|
||||
"reference": "1bf24f7334fe16c88bf9d467863309ceaf285b01",
|
||||
"url": "https://api.github.com/repos/erusev/parsedown/zipball/728952b90a333b5c6f77f06ea9422b94b585878d",
|
||||
"reference": "728952b90a333b5c6f77f06ea9422b94b585878d",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
@ -841,7 +841,7 @@
|
|||
"markdown",
|
||||
"parser"
|
||||
],
|
||||
"time": "2017-03-29T16:04:15+00:00"
|
||||
"time": "2017-05-14T14:47:48+00:00"
|
||||
},
|
||||
{
|
||||
"name": "fideloper/proxy",
|
||||
|
@ -1989,16 +1989,16 @@
|
|||
},
|
||||
{
|
||||
"name": "nikic/php-parser",
|
||||
"version": "v3.0.5",
|
||||
"version": "v3.0.6",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/nikic/PHP-Parser.git",
|
||||
"reference": "2b9e2f71b722f7c53918ab0c25f7646c2013f17d"
|
||||
"reference": "0808939f81c1347a3c8a82a5925385a08074b0f1"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/2b9e2f71b722f7c53918ab0c25f7646c2013f17d",
|
||||
"reference": "2b9e2f71b722f7c53918ab0c25f7646c2013f17d",
|
||||
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/0808939f81c1347a3c8a82a5925385a08074b0f1",
|
||||
"reference": "0808939f81c1347a3c8a82a5925385a08074b0f1",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
@ -2036,7 +2036,7 @@
|
|||
"parser",
|
||||
"php"
|
||||
],
|
||||
"time": "2017-03-05T18:23:57+00:00"
|
||||
"time": "2017-06-28T20:53:48+00:00"
|
||||
},
|
||||
{
|
||||
"name": "paragonie/random_compat",
|
||||
|
@ -2346,16 +2346,16 @@
|
|||
},
|
||||
{
|
||||
"name": "psy/psysh",
|
||||
"version": "v0.8.8",
|
||||
"version": "v0.8.9",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/bobthecow/psysh.git",
|
||||
"reference": "fe65c30cbc55c71e61ba3a38b5a581149be31b8e"
|
||||
"reference": "58a31cc4404c8f632d8c557bc72056af2d3a83db"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/bobthecow/psysh/zipball/fe65c30cbc55c71e61ba3a38b5a581149be31b8e",
|
||||
"reference": "fe65c30cbc55c71e61ba3a38b5a581149be31b8e",
|
||||
"url": "https://api.github.com/repos/bobthecow/psysh/zipball/58a31cc4404c8f632d8c557bc72056af2d3a83db",
|
||||
"reference": "58a31cc4404c8f632d8c557bc72056af2d3a83db",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
@ -2415,7 +2415,7 @@
|
|||
"interactive",
|
||||
"shell"
|
||||
],
|
||||
"time": "2017-06-24T06:16:19+00:00"
|
||||
"time": "2017-07-06T14:53:52+00:00"
|
||||
},
|
||||
{
|
||||
"name": "ramsey/uuid",
|
||||
|
@ -2653,16 +2653,16 @@
|
|||
},
|
||||
{
|
||||
"name": "spatie/fractalistic",
|
||||
"version": "2.2.0",
|
||||
"version": "2.3.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/spatie/fractalistic.git",
|
||||
"reference": "8f00c666a8b8dfb06f79286f97255e6ab1c89639"
|
||||
"reference": "79a48d949bc053a1c60c934f727f5901bf35fa74"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/spatie/fractalistic/zipball/8f00c666a8b8dfb06f79286f97255e6ab1c89639",
|
||||
"reference": "8f00c666a8b8dfb06f79286f97255e6ab1c89639",
|
||||
"url": "https://api.github.com/repos/spatie/fractalistic/zipball/79a48d949bc053a1c60c934f727f5901bf35fa74",
|
||||
"reference": "79a48d949bc053a1c60c934f727f5901bf35fa74",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
@ -2700,7 +2700,7 @@
|
|||
"spatie",
|
||||
"transform"
|
||||
],
|
||||
"time": "2017-05-29T14:16:20+00:00"
|
||||
"time": "2017-07-03T08:20:31+00:00"
|
||||
},
|
||||
{
|
||||
"name": "spatie/laravel-fractal",
|
||||
|
@ -2816,16 +2816,16 @@
|
|||
},
|
||||
{
|
||||
"name": "symfony/console",
|
||||
"version": "v3.3.2",
|
||||
"version": "v3.3.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/console.git",
|
||||
"reference": "70d2a29b2911cbdc91a7e268046c395278238b2e"
|
||||
"reference": "a97e45d98c59510f085fa05225a1acb74dfe0546"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/console/zipball/70d2a29b2911cbdc91a7e268046c395278238b2e",
|
||||
"reference": "70d2a29b2911cbdc91a7e268046c395278238b2e",
|
||||
"url": "https://api.github.com/repos/symfony/console/zipball/a97e45d98c59510f085fa05225a1acb74dfe0546",
|
||||
"reference": "a97e45d98c59510f085fa05225a1acb74dfe0546",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
@ -2881,11 +2881,11 @@
|
|||
],
|
||||
"description": "Symfony Console Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2017-06-02T19:24:58+00:00"
|
||||
"time": "2017-07-03T13:19:36+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/css-selector",
|
||||
"version": "v3.3.2",
|
||||
"version": "v3.3.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/css-selector.git",
|
||||
|
@ -2938,16 +2938,16 @@
|
|||
},
|
||||
{
|
||||
"name": "symfony/debug",
|
||||
"version": "v3.3.2",
|
||||
"version": "v3.3.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/debug.git",
|
||||
"reference": "e9c50482841ef696e8fa1470d950a79c8921f45d"
|
||||
"reference": "63b85a968486d95ff9542228dc2e4247f16f9743"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/debug/zipball/e9c50482841ef696e8fa1470d950a79c8921f45d",
|
||||
"reference": "e9c50482841ef696e8fa1470d950a79c8921f45d",
|
||||
"url": "https://api.github.com/repos/symfony/debug/zipball/63b85a968486d95ff9542228dc2e4247f16f9743",
|
||||
"reference": "63b85a968486d95ff9542228dc2e4247f16f9743",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
@ -2990,20 +2990,20 @@
|
|||
],
|
||||
"description": "Symfony Debug Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2017-06-01T21:01:25+00:00"
|
||||
"time": "2017-07-05T13:02:37+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/event-dispatcher",
|
||||
"version": "v3.3.2",
|
||||
"version": "v3.3.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/event-dispatcher.git",
|
||||
"reference": "4054a102470665451108f9b59305c79176ef98f0"
|
||||
"reference": "67535f1e3fd662bdc68d7ba317c93eecd973617e"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/4054a102470665451108f9b59305c79176ef98f0",
|
||||
"reference": "4054a102470665451108f9b59305c79176ef98f0",
|
||||
"url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/67535f1e3fd662bdc68d7ba317c93eecd973617e",
|
||||
"reference": "67535f1e3fd662bdc68d7ba317c93eecd973617e",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
@ -3053,11 +3053,11 @@
|
|||
],
|
||||
"description": "Symfony EventDispatcher Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2017-06-04T18:15:29+00:00"
|
||||
"time": "2017-06-09T14:53:08+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/finder",
|
||||
"version": "v3.3.2",
|
||||
"version": "v3.3.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/finder.git",
|
||||
|
@ -3106,16 +3106,16 @@
|
|||
},
|
||||
{
|
||||
"name": "symfony/http-foundation",
|
||||
"version": "v3.3.2",
|
||||
"version": "v3.3.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/http-foundation.git",
|
||||
"reference": "80eb5a1f968448b77da9e8b2c0827f6e8d767846"
|
||||
"reference": "f347a5f561b03db95ed666959db42bbbf429b7e5"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/80eb5a1f968448b77da9e8b2c0827f6e8d767846",
|
||||
"reference": "80eb5a1f968448b77da9e8b2c0827f6e8d767846",
|
||||
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/f347a5f561b03db95ed666959db42bbbf429b7e5",
|
||||
"reference": "f347a5f561b03db95ed666959db42bbbf429b7e5",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
@ -3155,20 +3155,20 @@
|
|||
],
|
||||
"description": "Symfony HttpFoundation Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2017-06-05T13:06:51+00:00"
|
||||
"time": "2017-06-24T09:29:48+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/http-kernel",
|
||||
"version": "v3.3.2",
|
||||
"version": "v3.3.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/http-kernel.git",
|
||||
"reference": "be8280f7fa8e95b86514f1e1be997668a53b2888"
|
||||
"reference": "33f87c957122cfbd9d90de48698ee074b71106ea"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/be8280f7fa8e95b86514f1e1be997668a53b2888",
|
||||
"reference": "be8280f7fa8e95b86514f1e1be997668a53b2888",
|
||||
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/33f87c957122cfbd9d90de48698ee074b71106ea",
|
||||
"reference": "33f87c957122cfbd9d90de48698ee074b71106ea",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
@ -3241,7 +3241,7 @@
|
|||
],
|
||||
"description": "Symfony HttpKernel Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2017-06-06T03:59:58+00:00"
|
||||
"time": "2017-07-05T13:28:15+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-mbstring",
|
||||
|
@ -3412,16 +3412,16 @@
|
|||
},
|
||||
{
|
||||
"name": "symfony/process",
|
||||
"version": "v3.3.2",
|
||||
"version": "v3.3.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/process.git",
|
||||
"reference": "8e30690c67aafb6c7992d6d8eb0d707807dd3eaf"
|
||||
"reference": "5ab8949b682b1bf9d4511a228b5e045c96758c30"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/process/zipball/8e30690c67aafb6c7992d6d8eb0d707807dd3eaf",
|
||||
"reference": "8e30690c67aafb6c7992d6d8eb0d707807dd3eaf",
|
||||
"url": "https://api.github.com/repos/symfony/process/zipball/5ab8949b682b1bf9d4511a228b5e045c96758c30",
|
||||
"reference": "5ab8949b682b1bf9d4511a228b5e045c96758c30",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
@ -3457,20 +3457,20 @@
|
|||
],
|
||||
"description": "Symfony Process Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2017-05-22T12:32:03+00:00"
|
||||
"time": "2017-07-03T08:12:02+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/routing",
|
||||
"version": "v3.3.2",
|
||||
"version": "v3.3.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/routing.git",
|
||||
"reference": "39804eeafea5cca851946e1eed122eb94459fdb4"
|
||||
"reference": "dc70bbd0ca7b19259f63cdacc8af370bc32a4728"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/routing/zipball/39804eeafea5cca851946e1eed122eb94459fdb4",
|
||||
"reference": "39804eeafea5cca851946e1eed122eb94459fdb4",
|
||||
"url": "https://api.github.com/repos/symfony/routing/zipball/dc70bbd0ca7b19259f63cdacc8af370bc32a4728",
|
||||
"reference": "dc70bbd0ca7b19259f63cdacc8af370bc32a4728",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
@ -3535,20 +3535,20 @@
|
|||
"uri",
|
||||
"url"
|
||||
],
|
||||
"time": "2017-06-02T09:51:43+00:00"
|
||||
"time": "2017-06-24T09:29:48+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/translation",
|
||||
"version": "v3.3.2",
|
||||
"version": "v3.3.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/translation.git",
|
||||
"reference": "dc3b2a0c6cfff60327ba1c043a82092735397543"
|
||||
"reference": "35dd5fb003c90e8bd4d8cabdf94bf9c96d06fdc3"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/translation/zipball/dc3b2a0c6cfff60327ba1c043a82092735397543",
|
||||
"reference": "dc3b2a0c6cfff60327ba1c043a82092735397543",
|
||||
"url": "https://api.github.com/repos/symfony/translation/zipball/35dd5fb003c90e8bd4d8cabdf94bf9c96d06fdc3",
|
||||
"reference": "35dd5fb003c90e8bd4d8cabdf94bf9c96d06fdc3",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
@ -3600,20 +3600,20 @@
|
|||
],
|
||||
"description": "Symfony Translation Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2017-05-22T07:42:36+00:00"
|
||||
"time": "2017-06-24T16:45:30+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/var-dumper",
|
||||
"version": "v3.3.2",
|
||||
"version": "v3.3.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/var-dumper.git",
|
||||
"reference": "347c4247a3e40018810b476fcd5dec36d46d08dc"
|
||||
"reference": "9ee920bba1d2ce877496dcafca7cbffff4dbe08a"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/347c4247a3e40018810b476fcd5dec36d46d08dc",
|
||||
"reference": "347c4247a3e40018810b476fcd5dec36d46d08dc",
|
||||
"url": "https://api.github.com/repos/symfony/var-dumper/zipball/9ee920bba1d2ce877496dcafca7cbffff4dbe08a",
|
||||
"reference": "9ee920bba1d2ce877496dcafca7cbffff4dbe08a",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
@ -3668,7 +3668,7 @@
|
|||
"debug",
|
||||
"dump"
|
||||
],
|
||||
"time": "2017-06-02T09:10:29+00:00"
|
||||
"time": "2017-07-05T13:02:37+00:00"
|
||||
},
|
||||
{
|
||||
"name": "tijsverkoyen/css-to-inline-styles",
|
||||
|
@ -4362,6 +4362,175 @@
|
|||
],
|
||||
"time": "2017-04-12T18:52:22+00:00"
|
||||
},
|
||||
{
|
||||
"name": "php-mock/php-mock",
|
||||
"version": "1.0.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/php-mock/php-mock.git",
|
||||
"reference": "bfa2d17d64dbf129073a7ba2051a96ce52749570"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/php-mock/php-mock/zipball/bfa2d17d64dbf129073a7ba2051a96ce52749570",
|
||||
"reference": "bfa2d17d64dbf129073a7ba2051a96ce52749570",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.5",
|
||||
"phpunit/php-text-template": "^1"
|
||||
},
|
||||
"replace": {
|
||||
"malkusch/php-mock": "*"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^4|^5"
|
||||
},
|
||||
"suggest": {
|
||||
"php-mock/php-mock-mockery": "Allows using PHPMockery for Mockery integration",
|
||||
"php-mock/php-mock-phpunit": "Allows integration into PHPUnit testcase with the trait PHPMock."
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"phpmock\\": [
|
||||
"classes/",
|
||||
"tests/unit/"
|
||||
]
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"WTFPL"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Markus Malkusch",
|
||||
"email": "markus@malkusch.de",
|
||||
"homepage": "http://markus.malkusch.de",
|
||||
"role": "Developer"
|
||||
}
|
||||
],
|
||||
"description": "PHP-Mock can mock built-in PHP functions (e.g. time()). PHP-Mock relies on PHP's namespace fallback policy. No further extension is needed.",
|
||||
"homepage": "https://github.com/php-mock/php-mock",
|
||||
"keywords": [
|
||||
"BDD",
|
||||
"TDD",
|
||||
"function",
|
||||
"mock",
|
||||
"stub",
|
||||
"test",
|
||||
"test double"
|
||||
],
|
||||
"time": "2015-11-11T22:37:09+00:00"
|
||||
},
|
||||
{
|
||||
"name": "php-mock/php-mock-integration",
|
||||
"version": "1.0.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/php-mock/php-mock-integration.git",
|
||||
"reference": "e83fb65dd20cd3cf250d554cbd4682b96b684f4b"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/php-mock/php-mock-integration/zipball/e83fb65dd20cd3cf250d554cbd4682b96b684f4b",
|
||||
"reference": "e83fb65dd20cd3cf250d554cbd4682b96b684f4b",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.5",
|
||||
"php-mock/php-mock": "^1",
|
||||
"phpunit/php-text-template": "^1"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "^4|^5"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"phpmock\\integration\\": "classes/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"WTFPL"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Markus Malkusch",
|
||||
"email": "markus@malkusch.de",
|
||||
"homepage": "http://markus.malkusch.de",
|
||||
"role": "Developer"
|
||||
}
|
||||
],
|
||||
"description": "Integration package for PHP-Mock",
|
||||
"homepage": "https://github.com/php-mock/php-mock-integration",
|
||||
"keywords": [
|
||||
"BDD",
|
||||
"TDD",
|
||||
"function",
|
||||
"mock",
|
||||
"stub",
|
||||
"test",
|
||||
"test double"
|
||||
],
|
||||
"time": "2015-10-26T21:21:42+00:00"
|
||||
},
|
||||
{
|
||||
"name": "php-mock/php-mock-phpunit",
|
||||
"version": "1.1.2",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/php-mock/php-mock-phpunit.git",
|
||||
"reference": "359e3038c016cee4c8f8db6387bcab3fcdebada0"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/php-mock/php-mock-phpunit/zipball/359e3038c016cee4c8f8db6387bcab3fcdebada0",
|
||||
"reference": "359e3038c016cee4c8f8db6387bcab3fcdebada0",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.5",
|
||||
"php-mock/php-mock-integration": "^1",
|
||||
"phpunit/phpunit": "^4.0.0 || ^5.0.0"
|
||||
},
|
||||
"conflict": {
|
||||
"phpunit/phpunit-mock-objects": "3.2.0"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"phpmock\\phpunit\\": "classes/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"WTFPL"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Markus Malkusch",
|
||||
"email": "markus@malkusch.de",
|
||||
"homepage": "http://markus.malkusch.de",
|
||||
"role": "Developer"
|
||||
}
|
||||
],
|
||||
"description": "Mock built-in PHP functions (e.g. time()) with PHPUnit. This package relies on PHP's namespace fallback policy. No further extension is needed.",
|
||||
"homepage": "https://github.com/php-mock/php-mock-phpunit",
|
||||
"keywords": [
|
||||
"BDD",
|
||||
"TDD",
|
||||
"function",
|
||||
"mock",
|
||||
"phpunit",
|
||||
"stub",
|
||||
"test",
|
||||
"test double"
|
||||
],
|
||||
"time": "2016-06-15T23:36:13+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpdocumentor/reflection-common",
|
||||
"version": "1.0",
|
||||
|
@ -4904,16 +5073,16 @@
|
|||
},
|
||||
{
|
||||
"name": "phpunit/phpunit-mock-objects",
|
||||
"version": "3.4.3",
|
||||
"version": "3.4.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
|
||||
"reference": "3ab72b65b39b491e0c011e2e09bb2206c2aa8e24"
|
||||
"reference": "a23b761686d50a560cc56233b9ecf49597cc9118"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/3ab72b65b39b491e0c011e2e09bb2206c2aa8e24",
|
||||
"reference": "3ab72b65b39b491e0c011e2e09bb2206c2aa8e24",
|
||||
"url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/a23b761686d50a560cc56233b9ecf49597cc9118",
|
||||
"reference": "a23b761686d50a560cc56233b9ecf49597cc9118",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
@ -4959,7 +5128,7 @@
|
|||
"mock",
|
||||
"xunit"
|
||||
],
|
||||
"time": "2016-12-08T20:27:08+00:00"
|
||||
"time": "2017-06-30T09:13:00+00:00"
|
||||
},
|
||||
{
|
||||
"name": "sebastian/code-unit-reverse-lookup",
|
||||
|
@ -5586,7 +5755,7 @@
|
|||
},
|
||||
{
|
||||
"name": "symfony/class-loader",
|
||||
"version": "v3.3.2",
|
||||
"version": "v3.3.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/class-loader.git",
|
||||
|
@ -5642,16 +5811,16 @@
|
|||
},
|
||||
{
|
||||
"name": "symfony/config",
|
||||
"version": "v3.3.2",
|
||||
"version": "v3.3.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/config.git",
|
||||
"reference": "35716d4904e0506a7a5a9bcf23f854aeb5719bca"
|
||||
"reference": "a094618deb9a3fe1c3cf500a796e167d0495a274"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/config/zipball/35716d4904e0506a7a5a9bcf23f854aeb5719bca",
|
||||
"reference": "35716d4904e0506a7a5a9bcf23f854aeb5719bca",
|
||||
"url": "https://api.github.com/repos/symfony/config/zipball/a094618deb9a3fe1c3cf500a796e167d0495a274",
|
||||
"reference": "a094618deb9a3fe1c3cf500a796e167d0495a274",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
@ -5659,10 +5828,12 @@
|
|||
"symfony/filesystem": "~2.8|~3.0"
|
||||
},
|
||||
"conflict": {
|
||||
"symfony/dependency-injection": "<3.3"
|
||||
"symfony/dependency-injection": "<3.3",
|
||||
"symfony/finder": "<3.3"
|
||||
},
|
||||
"require-dev": {
|
||||
"symfony/dependency-injection": "~3.3",
|
||||
"symfony/finder": "~3.3",
|
||||
"symfony/yaml": "~3.0"
|
||||
},
|
||||
"suggest": {
|
||||
|
@ -5698,20 +5869,20 @@
|
|||
],
|
||||
"description": "Symfony Config Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2017-06-02T18:07:20+00:00"
|
||||
"time": "2017-06-16T12:40:34+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/filesystem",
|
||||
"version": "v3.3.2",
|
||||
"version": "v3.3.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/filesystem.git",
|
||||
"reference": "c709670bf64721202ddbe4162846f250735842c0"
|
||||
"reference": "311fa718389efbd8b627c272b9324a62437018cc"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/filesystem/zipball/c709670bf64721202ddbe4162846f250735842c0",
|
||||
"reference": "c709670bf64721202ddbe4162846f250735842c0",
|
||||
"url": "https://api.github.com/repos/symfony/filesystem/zipball/311fa718389efbd8b627c272b9324a62437018cc",
|
||||
"reference": "311fa718389efbd8b627c272b9324a62437018cc",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
@ -5747,11 +5918,11 @@
|
|||
],
|
||||
"description": "Symfony Filesystem Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2017-05-28T14:08:56+00:00"
|
||||
"time": "2017-06-24T09:29:48+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/stopwatch",
|
||||
"version": "v3.3.2",
|
||||
"version": "v3.3.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/stopwatch.git",
|
||||
|
@ -5800,16 +5971,16 @@
|
|||
},
|
||||
{
|
||||
"name": "symfony/yaml",
|
||||
"version": "v3.3.2",
|
||||
"version": "v3.3.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/yaml.git",
|
||||
"reference": "9752a30000a8ca9f4b34b5227d15d0101b96b063"
|
||||
"reference": "1f93a8d19b8241617f5074a123e282575b821df8"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/yaml/zipball/9752a30000a8ca9f4b34b5227d15d0101b96b063",
|
||||
"reference": "9752a30000a8ca9f4b34b5227d15d0101b96b063",
|
||||
"url": "https://api.github.com/repos/symfony/yaml/zipball/1f93a8d19b8241617f5074a123e282575b821df8",
|
||||
"reference": "1f93a8d19b8241617f5074a123e282575b821df8",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
@ -5851,7 +6022,7 @@
|
|||
],
|
||||
"description": "Symfony Yaml Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2017-06-02T22:05:06+00:00"
|
||||
"time": "2017-06-15T12:58:50+00:00"
|
||||
},
|
||||
{
|
||||
"name": "webmozart/assert",
|
||||
|
|
127
tests/Unit/Services/ApiKeyServiceTest.php
Normal file
127
tests/Unit/Services/ApiKeyServiceTest.php
Normal file
|
@ -0,0 +1,127 @@
|
|||
<?php
|
||||
/**
|
||||
* Pterodactyl - Panel
|
||||
* Copyright (c) 2015 - 2017 Dane Everitt <dane@daneeveritt.com>.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
namespace Tests\Unit\Services;
|
||||
|
||||
use Illuminate\Contracts\Encryption\Encrypter;
|
||||
use Illuminate\Database\ConnectionInterface;
|
||||
use Mockery as m;
|
||||
use phpmock\phpunit\PHPMock;
|
||||
use Pterodactyl\Contracts\Repository\ApiKeyRepositoryInterface;
|
||||
use Pterodactyl\Services\ApiKeyService;
|
||||
use Pterodactyl\Services\ApiPermissionService;
|
||||
use Tests\TestCase;
|
||||
|
||||
class ApiKeyServiceTest extends TestCase
|
||||
{
|
||||
use PHPMock;
|
||||
|
||||
/**
|
||||
* @var \Illuminate\Database\ConnectionInterface
|
||||
*/
|
||||
protected $database;
|
||||
|
||||
/**
|
||||
* @var \Illuminate\Contracts\Encryption\Encrypter
|
||||
*/
|
||||
protected $encrypter;
|
||||
|
||||
/**
|
||||
* @var \Pterodactyl\Services\ApiPermissionService
|
||||
*/
|
||||
protected $permissions;
|
||||
|
||||
/**
|
||||
* @var \Pterodactyl\Contracts\Repository\ApiKeyRepositoryInterface
|
||||
*/
|
||||
protected $repository;
|
||||
|
||||
/**
|
||||
* @var \Pterodactyl\Services\ApiKeyService
|
||||
*/
|
||||
protected $service;
|
||||
|
||||
public function setUp()
|
||||
{
|
||||
parent::setUp();
|
||||
|
||||
$this->database = m::mock(ConnectionInterface::class);
|
||||
$this->encrypter = m::mock(Encrypter::class);
|
||||
$this->permissions = m::mock(ApiPermissionService::class);
|
||||
$this->repository = m::mock(ApiKeyRepositoryInterface::class);
|
||||
|
||||
$this->service = new ApiKeyService(
|
||||
$this->repository, $this->database, $this->encrypter, $this->permissions
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that the service is able to create a keypair and assign the correct permissions.
|
||||
*/
|
||||
public function test_create_function()
|
||||
{
|
||||
$this->getFunctionMock('\\Pterodactyl\\Services', 'random_bytes')
|
||||
->expects($this->exactly(2))
|
||||
->willReturnCallback(function ($bytes) {
|
||||
return hex2bin(str_pad('', $bytes * 2, '0'));
|
||||
});
|
||||
|
||||
$this->database->shouldReceive('beginTransaction')->withNoArgs()->once()->andReturnNull();
|
||||
$this->encrypter->shouldReceive('encrypt')->with(str_pad('', 64, '0'))
|
||||
->once()->andReturn('encrypted-secret');
|
||||
|
||||
$this->repository->shouldReceive('create')->with([
|
||||
'test-data' => 'test',
|
||||
'public' => str_pad('', 16, '0'),
|
||||
'secret' => 'encrypted-secret',
|
||||
], true, true)->once()->andReturn((object) ['id' => 1]);
|
||||
|
||||
$this->permissions->shouldReceive('getPermissions')->withNoArgs()->once()->andReturn([
|
||||
'_user' => ['server' => ['list']],
|
||||
'server' => ['create'],
|
||||
]);
|
||||
|
||||
$this->permissions->shouldReceive('create')->with(1, 'user.server-list')->once()->andReturnNull();
|
||||
$this->permissions->shouldReceive('create')->with(1, 'server-create')->once()->andReturnNull();
|
||||
|
||||
$this->database->shouldReceive('commit')->withNoArgs()->once()->andReturnNull();
|
||||
|
||||
$response = $this->service->create(
|
||||
['test-data' => 'test'], ['invalid-node', 'server-list'], ['invalid-node', 'server-create']
|
||||
);
|
||||
|
||||
$this->assertNotEmpty($response);
|
||||
$this->assertEquals(str_pad('', 64, '0'), $response);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that an API key can be revoked.
|
||||
*/
|
||||
public function test_revoke_function()
|
||||
{
|
||||
$this->repository->shouldReceive('delete')->with(1)->once()->andReturn(true);
|
||||
|
||||
$this->assertTrue($this->service->revoke(1));
|
||||
}
|
||||
}
|
77
tests/Unit/Services/ApiPermissionServiceTest.php
Normal file
77
tests/Unit/Services/ApiPermissionServiceTest.php
Normal file
|
@ -0,0 +1,77 @@
|
|||
<?php
|
||||
/**
|
||||
* Pterodactyl - Panel
|
||||
* Copyright (c) 2015 - 2017 Dane Everitt <dane@daneeveritt.com>.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
namespace Tests\Unit\Services;
|
||||
|
||||
use Mockery as m;
|
||||
use Pterodactyl\Contracts\Repository\ApiPermissionRepositoryInterface;
|
||||
use Pterodactyl\Models\APIPermission;
|
||||
use Pterodactyl\Services\ApiPermissionService;
|
||||
use Tests\TestCase;
|
||||
|
||||
class ApiPermissionServiceTest extends TestCase
|
||||
{
|
||||
/**
|
||||
* @var \Pterodactyl\Contracts\Repository\ApiPermissionRepositoryInterface
|
||||
*/
|
||||
protected $repository;
|
||||
|
||||
/**
|
||||
* @var \Pterodactyl\Services\ApiPermissionService
|
||||
*/
|
||||
protected $service;
|
||||
|
||||
/**
|
||||
* Setup tests.
|
||||
*/
|
||||
public function setUp()
|
||||
{
|
||||
parent::setUp();
|
||||
|
||||
$this->repository = m::mock(ApiPermissionRepositoryInterface::class);
|
||||
$this->service = new ApiPermissionService($this->repository);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that a new API permission can be assigned to a key.
|
||||
*/
|
||||
public function test_create_function()
|
||||
{
|
||||
$this->repository->shouldReceive('withoutFresh')->withNoArgs()->once()->andReturnSelf()
|
||||
->shouldReceive('create')->with(['key_id' => 1, 'permission' => 'test-permission'])
|
||||
->once()->andReturn(true);
|
||||
|
||||
$this->assertTrue($this->service->create(1, 'test-permission'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that function returns an array of all the permissions available as defined on the model.
|
||||
*/
|
||||
public function test_get_permissions_function()
|
||||
{
|
||||
$this->repository->shouldReceive('getModel')->withNoArgs()->once()->andReturn(new APIPermission());
|
||||
|
||||
$this->assertEquals(APIPermission::CONST_PERMISSIONS, $this->service->getPermissions());
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue