Push initial implementations of new repository structure

This breaks almost the entire panel, do not pull this branch in this state.

Mostly just moved old repository files to a new folder without updating anything else in order to start doing new things. Structure is not finalized.
This commit is contained in:
Dane Everitt 2017-06-10 22:28:44 -05:00
parent 65957e7ea5
commit 5c2b9deb09
No known key found for this signature in database
GPG key ID: EEA66103B3D71F53
39 changed files with 1083 additions and 166 deletions

View file

@ -0,0 +1,78 @@
<?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\User;
use Illuminate\Contracts\Auth\Guard;
use Pterodactyl\Repositories\Repository;
use Pterodactyl\Exceptions\DisplayException;
use Pterodactyl\Contracts\Repositories\UserInterface;
class UserRepository extends Repository implements UserInterface
{
/**
* Dependencies to automatically inject into the repository.
*
* @var array
*/
protected $inject = [
'guard' => Guard::class,
];
/**
* Return the model to be used for the repository.
*
* @return string
*/
public function model()
{
return User::class;
}
/**
* {@inheritdoc}
*/
public function search($term)
{
$this->model->search($term);
return $this;
}
public function delete($id)
{
$user = $this->model->withCount('servers')->find($id);
if ($this->guard->user() && $this->guard->user()->id === $user->id) {
throw new DisplayException('You cannot delete your own account.');
}
if ($user->server_count > 0) {
throw new DisplayException('Cannot delete an account that has active servers attached to it.');
}
return $user->delete();
}
}

View file

@ -26,12 +26,67 @@ namespace Pterodactyl\Repositories;
use DB;
use Validator;
use InvalidArgumentException;
use Pterodactyl\Models\ServiceOption;
use Pterodactyl\Exceptions\DisplayException;
use Pterodactyl\Exceptions\DisplayValidationException;
class OptionRepository
{
/**
* Store the requested service option.
*
* @var \Pterodactyl\Models\ServiceOption
*/
protected $model;
/**
* OptionRepository constructor.
*
* @param null|int|\Pterodactyl\Models\ServiceOption $option
*/
public function __construct($option = null)
{
if (is_null($option)) {
return;
}
if ($option instanceof ServiceOption) {
$this->model = $option;
} else {
if (! is_numeric($option)) {
throw new InvalidArgumentException(
sprintf('Variable passed to constructor must be integer or instance of \Pterodactyl\Models\ServiceOption.')
);
}
$this->model = ServiceOption::findOrFail($option);
}
}
/**
* Return the eloquent model for the given repository.
*
* @return null|\Pterodactyl\Models\ServiceOption
*/
public function getModel()
{
return $this->model;
}
/**
* Update the currently assigned model by re-initalizing the class.
*
* @param null|int|\Pterodactyl\Models\ServiceOption $option
* @return $this
*/
public function setModel($option)
{
self::__construct($option);
return $this;
}
/**
* Creates a new service option on the system.
*
@ -67,7 +122,7 @@ class OptionRepository
}
}
return ServiceOption::create($data);
return $this->setModel(ServiceOption::create($data))->getModel();
}
/**
@ -76,13 +131,15 @@ class OptionRepository
* @param int $id
* @return void
*
* @throws \Exception
* @throws \Pterodactyl\Exceptions\DisplayException
* @throws \Throwable
*/
public function delete($id)
{
$option = ServiceOption::with('variables')->withCount('servers')->findOrFail($id);
$this->model->load('variables', 'servers');
if ($option->servers_count > 0) {
if ($this->model->servers->count() > 0) {
throw new DisplayException('You cannot delete a service option that has servers associated with it.');
}
@ -158,32 +215,19 @@ class OptionRepository
/**
* Updates a service option's scripts in the database.
*
* @param int $id
* @param array $data
* @return \Pterodactyl\Models\ServiceOption
*
* @throws \Pterodactyl\Exceptions\DisplayException
* @throws \Pterodactyl\Exceptions\DisplayValidationException
*/
public function scripts($id, array $data)
public function scripts(array $data)
{
$option = ServiceOption::findOrFail($id);
$data['script_install'] = empty($data['script_install']) ? null : $data['script_install'];
$validator = Validator::make($data, [
'script_install' => 'sometimes|nullable|string',
'script_is_privileged' => 'sometimes|required|boolean',
'script_entry' => 'sometimes|required|string',
'script_container' => 'sometimes|required|string',
'copy_script_from' => 'sometimes|nullable|numeric',
]);
if (isset($data['copy_script_from']) && ! empty($data['copy_script_from'])) {
$select = ServiceOption::whereNull('copy_script_from')->where([
['id', $data['copy_script_from']],
['service_id', $option->service_id],
])->first();
$select = ServiceOption::whereNull('copy_script_from')
->where('id', $data['copy_script_from'])
->where('service_id', $this->model->service_id)
->first();
if (! $select) {
throw new DisplayException('The service option selected to copy a script from either does not exist, or is copying from a higher level.');
@ -192,12 +236,6 @@ class OptionRepository
$data['copy_script_from'] = null;
}
if ($validator->fails()) {
throw new DisplayValidationException(json_encode($validator->errors()));
}
$option->fill($data)->save();
return $option;
$this->model->fill($data)->save();
}
}

View file

@ -79,7 +79,7 @@ class SubuserRepository
$user = User::where('email', $data['email'])->first();
if (! $user) {
try {
$repo = new UserRepository;
$repo = new oldUserRepository;
$user = $repo->create([
'email' => $data['email'],
'username' => str_random(8),

View file

@ -43,7 +43,7 @@ use Pterodactyl\Services\DeploymentService;
use Pterodactyl\Exceptions\DisplayException;
use Pterodactyl\Exceptions\DisplayValidationException;
class ServerRepository
class old_ServerRepository
{
/**
* An array of daemon permission to assign to this server.

View file

@ -35,7 +35,7 @@ use Pterodactyl\Services\UuidService;
use Pterodactyl\Exceptions\DisplayException;
use Pterodactyl\Exceptions\DisplayValidationException;
class UserRepository
class old_UserRepository
{
/**
* Creates a user on the panel. Returns the created user's ID.

View file

@ -0,0 +1,229 @@
<?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;
use Illuminate\Container\Container;
use Illuminate\Database\Eloquent\Model;
use Pterodactyl\Contracts\Repositories\RepositoryInterface;
use Pterodactyl\Exceptions\Repository\RepositoryException;
abstract class Repository implements RepositoryInterface
{
const RULE_UPDATED = 'updated';
const RULE_CREATED = 'created';
/**
* @var \Illuminate\Container\Container
*/
protected $container;
/**
* Array of classes to inject automatically into the container.
*
* @var array
*/
protected $inject = [];
/**
* @var \Illuminate\Database\Eloquent\Model
*/
protected $model;
/**
* Array of validation rules that can be accessed from this repository.
*
* @var array
*/
protected $rules = [];
/**
* {@inheritdoc}
*/
public function __construct(Container $container)
{
$this->container = $container;
foreach ($this->inject as $key => $value) {
if (isset($this->{$key})) {
throw new \Exception('Cannot override a defined object in this class.');
}
$this->{$key} = $this->container->make($value);
}
$this->makeModel();
}
/**
* {@inheritdoc}
*/
abstract public function model();
/**
* {@inheritdoc}
*/
public function getModel()
{
return $this->model;
}
/**
* {@inheritdoc}
*/
public function makeModel()
{
$model = $this->container->make($this->model());
if (! $model instanceof Model) {
throw new RepositoryException(
"Class {$this->model()} must be an instance of \\Illuminate\\Database\\Eloquent\\Model"
);
}
return $this->model = $model->newQuery();
}
/**
* {@inheritdoc}
*/
public function getRules()
{
return $this->rules;
}
/**
* {@inheritdoc}
*/
public function getUpdateRules()
{
if (array_key_exists(self::RULE_UPDATED, $this->rules)) {
return $this->rules[self::RULE_UPDATED];
}
return [];
}
/**
* {@inheritdoc}
*/
public function getCreateRules()
{
if (array_key_exists(self::RULE_CREATED, $this->rules)) {
return $this->rules[self::RULE_CREATED];
}
return [];
}
/**
* {@inheritdoc}
*/
public function with(...$params)
{
$this->model = $this->model->with($params);
return $this;
}
/**
* {@inheritdoc}
*/
public function withCount(...$params)
{
$this->model = $this->model->withCount($params);
return $this;
}
/**
* {@inheritdoc}
*/
public function all(array $columns = ['*'])
{
return $this->model->get($columns);
}
/**
* {@inheritdoc}
*/
public function paginate($limit = 15, array $columns = ['*'])
{
return $this->model->paginate($limit, $columns);
}
/**
* {@inheritdoc}
*/
public function create(array $data)
{
return $this->model->create($data);
}
/**
* {@inheritdoc}
*/
public function update($attributes, array $data)
{
// If only a number is passed, we assume it is an ID
// for the specific model at hand.
if (is_numeric($attributes)) {
$attributes = [['id', '=', $attributes]];
}
return $this->model->where($attributes)->get()->each->update($data);
}
/**
* {@inheritdoc}
*/
public function delete($id)
{
return $this->model->find($id)->delete();
}
/**
* {@inheritdoc}
*/
public function destroy($id)
{
return $this->model->find($id)->forceDelete();
}
/**
* {@inheritdoc}
*/
public function find($id, array $columns = ['*'])
{
return $this->model->find($id, $columns);
}
/**
* {@inheritdoc}
*/
public function findBy(array $attributes, array $columns = ['*'])
{
return $this->model->where($attributes)->first($columns);
}
}