From 161e0f616581c59e2d684d00e9d9df52e1c7e2d8 Mon Sep 17 00:00:00 2001
From: Dane Everitt <dane@daneeveritt.com>
Date: Thu, 5 Sep 2019 20:33:27 -0700
Subject: [PATCH] Deprecate old way of using repositories for daemon things

---
 .../Server/BulkReinstallActionCommand.php     |  8 +-
 .../Commands/Server/RebuildServerCommand.php  |  8 +-
 .../Daemon/BaseRepositoryInterface.php        |  3 +
 .../Daemon/CommandRepositoryInterface.php     |  3 +
 .../ConfigurationRepositoryInterface.php      |  3 +
 .../Daemon/FileRepositoryInterface.php        |  3 +
 .../Daemon/PowerRepositoryInterface.php       |  3 +
 .../Daemon/ServerRepositoryInterface.php      |  3 +
 .../Servers/ResourceUtilizationController.php |  8 +-
 app/Providers/RepositoryServiceProvider.php   | 18 ++--
 .../Wings/BaseWingsRepository.php             | 33 -------
 .../Wings/DaemonCommandRepository.php         |  7 ++
 .../Wings/DaemonConfigurationRepository.php   |  7 ++
 ...epository.php => DaemonFileRepository.php} | 33 +++++--
 .../Wings/DaemonPowerRepository.php           |  7 ++
 app/Repositories/Wings/DaemonRepository.php   | 88 +++++++++++++++++++
 ...ository.php => DaemonServerRepository.php} |  8 +-
 17 files changed, 178 insertions(+), 65 deletions(-)
 delete mode 100644 app/Repositories/Wings/BaseWingsRepository.php
 create mode 100644 app/Repositories/Wings/DaemonCommandRepository.php
 create mode 100644 app/Repositories/Wings/DaemonConfigurationRepository.php
 rename app/Repositories/Wings/{FileRepository.php => DaemonFileRepository.php} (82%)
 create mode 100644 app/Repositories/Wings/DaemonPowerRepository.php
 create mode 100644 app/Repositories/Wings/DaemonRepository.php
 rename app/Repositories/Wings/{WingsServerRepository.php => DaemonServerRepository.php} (74%)

diff --git a/app/Console/Commands/Server/BulkReinstallActionCommand.php b/app/Console/Commands/Server/BulkReinstallActionCommand.php
index b6cc5ede..deb33a5b 100644
--- a/app/Console/Commands/Server/BulkReinstallActionCommand.php
+++ b/app/Console/Commands/Server/BulkReinstallActionCommand.php
@@ -12,7 +12,7 @@ namespace Pterodactyl\Console\Commands\Server;
 use Webmozart\Assert\Assert;
 use Illuminate\Console\Command;
 use GuzzleHttp\Exception\RequestException;
-use Pterodactyl\Repositories\Wings\WingsServerRepository;
+use Pterodactyl\Repositories\Wings\DaemonServerRepository;
 use Pterodactyl\Contracts\Repository\ServerRepositoryInterface;
 use Pterodactyl\Services\Servers\ServerConfigurationStructureService;
 
@@ -34,7 +34,7 @@ class BulkReinstallActionCommand extends Command
     protected $description = 'Reinstall a single server, all servers on a node, or all servers on the panel.';
 
     /**
-     * @var \Pterodactyl\Repositories\Wings\WingsServerRepository
+     * @var \Pterodactyl\Repositories\Wings\DaemonServerRepository
      */
     protected $repository;
 
@@ -48,12 +48,12 @@ class BulkReinstallActionCommand extends Command
     /**
      * BulkReinstallActionCommand constructor.
      *
-     * @param \Pterodactyl\Repositories\Wings\WingsServerRepository             $daemonRepository
+     * @param \Pterodactyl\Repositories\Wings\DaemonServerRepository            $daemonRepository
      * @param \Pterodactyl\Services\Servers\ServerConfigurationStructureService $configurationStructureService
      * @param \Pterodactyl\Contracts\Repository\ServerRepositoryInterface       $repository
      */
     public function __construct(
-        WingsServerRepository $daemonRepository,
+        DaemonServerRepository $daemonRepository,
         ServerConfigurationStructureService $configurationStructureService,
         ServerRepositoryInterface $repository
     ) {
diff --git a/app/Console/Commands/Server/RebuildServerCommand.php b/app/Console/Commands/Server/RebuildServerCommand.php
index bbc16e7c..d86c4402 100644
--- a/app/Console/Commands/Server/RebuildServerCommand.php
+++ b/app/Console/Commands/Server/RebuildServerCommand.php
@@ -12,7 +12,7 @@ namespace Pterodactyl\Console\Commands\Server;
 use Webmozart\Assert\Assert;
 use Illuminate\Console\Command;
 use GuzzleHttp\Exception\RequestException;
-use Pterodactyl\Repositories\Wings\WingsServerRepository;
+use Pterodactyl\Repositories\Wings\DaemonServerRepository;
 use Pterodactyl\Contracts\Repository\ServerRepositoryInterface;
 use Pterodactyl\Services\Servers\ServerConfigurationStructureService;
 
@@ -24,7 +24,7 @@ class RebuildServerCommand extends Command
     protected $configurationStructureService;
 
     /**
-     * @var \Pterodactyl\Repositories\Wings\WingsServerRepository
+     * @var \Pterodactyl\Repositories\Wings\DaemonServerRepository
      */
     protected $daemonRepository;
 
@@ -48,12 +48,12 @@ class RebuildServerCommand extends Command
     /**
      * RebuildServerCommand constructor.
      *
-     * @param \Pterodactyl\Repositories\Wings\WingsServerRepository             $daemonRepository
+     * @param \Pterodactyl\Repositories\Wings\DaemonServerRepository            $daemonRepository
      * @param \Pterodactyl\Services\Servers\ServerConfigurationStructureService $configurationStructureService
      * @param \Pterodactyl\Contracts\Repository\ServerRepositoryInterface       $repository
      */
     public function __construct(
-        WingsServerRepository $daemonRepository,
+        DaemonServerRepository $daemonRepository,
         ServerConfigurationStructureService $configurationStructureService,
         ServerRepositoryInterface $repository
     ) {
diff --git a/app/Contracts/Repository/Daemon/BaseRepositoryInterface.php b/app/Contracts/Repository/Daemon/BaseRepositoryInterface.php
index b34c7420..791dcc81 100644
--- a/app/Contracts/Repository/Daemon/BaseRepositoryInterface.php
+++ b/app/Contracts/Repository/Daemon/BaseRepositoryInterface.php
@@ -6,6 +6,9 @@ use GuzzleHttp\Client;
 use Pterodactyl\Models\Node;
 use Pterodactyl\Models\Server;
 
+/**
+ * @deprecated
+ */
 interface BaseRepositoryInterface
 {
     /**
diff --git a/app/Contracts/Repository/Daemon/CommandRepositoryInterface.php b/app/Contracts/Repository/Daemon/CommandRepositoryInterface.php
index ff6c33cc..057fd4ba 100644
--- a/app/Contracts/Repository/Daemon/CommandRepositoryInterface.php
+++ b/app/Contracts/Repository/Daemon/CommandRepositoryInterface.php
@@ -4,6 +4,9 @@ namespace Pterodactyl\Contracts\Repository\Daemon;
 
 use Psr\Http\Message\ResponseInterface;
 
+/**
+ * @deprecated
+ */
 interface CommandRepositoryInterface extends BaseRepositoryInterface
 {
     /**
diff --git a/app/Contracts/Repository/Daemon/ConfigurationRepositoryInterface.php b/app/Contracts/Repository/Daemon/ConfigurationRepositoryInterface.php
index 2b8bceda..0e3d8114 100644
--- a/app/Contracts/Repository/Daemon/ConfigurationRepositoryInterface.php
+++ b/app/Contracts/Repository/Daemon/ConfigurationRepositoryInterface.php
@@ -4,6 +4,9 @@ namespace Pterodactyl\Contracts\Repository\Daemon;
 
 use Psr\Http\Message\ResponseInterface;
 
+/**
+ * @deprecated
+ */
 interface ConfigurationRepositoryInterface extends BaseRepositoryInterface
 {
     /**
diff --git a/app/Contracts/Repository/Daemon/FileRepositoryInterface.php b/app/Contracts/Repository/Daemon/FileRepositoryInterface.php
index 0124fad3..c70fb859 100644
--- a/app/Contracts/Repository/Daemon/FileRepositoryInterface.php
+++ b/app/Contracts/Repository/Daemon/FileRepositoryInterface.php
@@ -5,6 +5,9 @@ namespace Pterodactyl\Contracts\Repository\Daemon;
 use stdClass;
 use Psr\Http\Message\ResponseInterface;
 
+/**
+ * @deprecated
+ */
 interface FileRepositoryInterface extends BaseRepositoryInterface
 {
     /**
diff --git a/app/Contracts/Repository/Daemon/PowerRepositoryInterface.php b/app/Contracts/Repository/Daemon/PowerRepositoryInterface.php
index 6b621043..3d4eef04 100644
--- a/app/Contracts/Repository/Daemon/PowerRepositoryInterface.php
+++ b/app/Contracts/Repository/Daemon/PowerRepositoryInterface.php
@@ -4,6 +4,9 @@ namespace Pterodactyl\Contracts\Repository\Daemon;
 
 use Psr\Http\Message\ResponseInterface;
 
+/**
+ * @deprecated
+ */
 interface PowerRepositoryInterface extends BaseRepositoryInterface
 {
     const SIGNAL_START = 'start';
diff --git a/app/Contracts/Repository/Daemon/ServerRepositoryInterface.php b/app/Contracts/Repository/Daemon/ServerRepositoryInterface.php
index d640c1c0..8a6837bf 100644
--- a/app/Contracts/Repository/Daemon/ServerRepositoryInterface.php
+++ b/app/Contracts/Repository/Daemon/ServerRepositoryInterface.php
@@ -4,6 +4,9 @@ namespace Pterodactyl\Contracts\Repository\Daemon;
 
 use Psr\Http\Message\ResponseInterface;
 
+/**
+ * @deprecated
+ */
 interface ServerRepositoryInterface extends BaseRepositoryInterface
 {
     /**
diff --git a/app/Http/Controllers/Api/Client/Servers/ResourceUtilizationController.php b/app/Http/Controllers/Api/Client/Servers/ResourceUtilizationController.php
index 0c7c7b02..c4f3f901 100644
--- a/app/Http/Controllers/Api/Client/Servers/ResourceUtilizationController.php
+++ b/app/Http/Controllers/Api/Client/Servers/ResourceUtilizationController.php
@@ -3,24 +3,24 @@
 namespace Pterodactyl\Http\Controllers\Api\Client\Servers;
 
 use Pterodactyl\Models\Server;
-use Pterodactyl\Repositories\Wings\WingsServerRepository;
 use Pterodactyl\Transformers\Api\Client\StatsTransformer;
+use Pterodactyl\Repositories\Wings\DaemonServerRepository;
 use Pterodactyl\Http\Controllers\Api\Client\ClientApiController;
 use Pterodactyl\Http\Requests\Api\Client\Servers\GetServerRequest;
 
 class ResourceUtilizationController extends ClientApiController
 {
     /**
-     * @var \Pterodactyl\Repositories\Wings\WingsServerRepository
+     * @var \Pterodactyl\Repositories\Wings\DaemonServerRepository
      */
     private $repository;
 
     /**
      * ResourceUtilizationController constructor.
      *
-     * @param \Pterodactyl\Repositories\Wings\WingsServerRepository $repository
+     * @param \Pterodactyl\Repositories\Wings\DaemonServerRepository $repository
      */
-    public function __construct(WingsServerRepository $repository)
+    public function __construct(DaemonServerRepository $repository)
     {
         parent::__construct();
 
diff --git a/app/Providers/RepositoryServiceProvider.php b/app/Providers/RepositoryServiceProvider.php
index 85d779af..99fccf82 100644
--- a/app/Providers/RepositoryServiceProvider.php
+++ b/app/Providers/RepositoryServiceProvider.php
@@ -3,28 +3,27 @@
 namespace Pterodactyl\Providers;
 
 use Illuminate\Support\ServiceProvider;
-use Pterodactyl\Repositories\Wings\FileRepository;
-use Pterodactyl\Repositories\Daemon\PowerRepository;
 use Pterodactyl\Repositories\Eloquent\EggRepository;
 use Pterodactyl\Repositories\Eloquent\NestRepository;
 use Pterodactyl\Repositories\Eloquent\NodeRepository;
 use Pterodactyl\Repositories\Eloquent\PackRepository;
 use Pterodactyl\Repositories\Eloquent\TaskRepository;
 use Pterodactyl\Repositories\Eloquent\UserRepository;
-use Pterodactyl\Repositories\Daemon\CommandRepository;
 use Pterodactyl\Repositories\Eloquent\ApiKeyRepository;
 use Pterodactyl\Repositories\Eloquent\ServerRepository;
 use Pterodactyl\Repositories\Eloquent\SessionRepository;
 use Pterodactyl\Repositories\Eloquent\SubuserRepository;
+use Pterodactyl\Repositories\Wings\DaemonFileRepository;
 use Pterodactyl\Repositories\Eloquent\DatabaseRepository;
 use Pterodactyl\Repositories\Eloquent\LocationRepository;
 use Pterodactyl\Repositories\Eloquent\ScheduleRepository;
 use Pterodactyl\Repositories\Eloquent\SettingsRepository;
+use Pterodactyl\Repositories\Wings\DaemonPowerRepository;
 use Pterodactyl\Repositories\Eloquent\DaemonKeyRepository;
 use Pterodactyl\Repositories\Eloquent\AllocationRepository;
 use Pterodactyl\Repositories\Eloquent\PermissionRepository;
+use Pterodactyl\Repositories\Wings\DaemonCommandRepository;
 use Pterodactyl\Contracts\Repository\EggRepositoryInterface;
-use Pterodactyl\Repositories\Daemon\ConfigurationRepository;
 use Pterodactyl\Repositories\Eloquent\EggVariableRepository;
 use Pterodactyl\Contracts\Repository\NestRepositoryInterface;
 use Pterodactyl\Contracts\Repository\NodeRepositoryInterface;
@@ -41,6 +40,7 @@ use Pterodactyl\Contracts\Repository\DatabaseRepositoryInterface;
 use Pterodactyl\Contracts\Repository\LocationRepositoryInterface;
 use Pterodactyl\Contracts\Repository\ScheduleRepositoryInterface;
 use Pterodactyl\Contracts\Repository\SettingsRepositoryInterface;
+use Pterodactyl\Repositories\Wings\DaemonConfigurationRepository;
 use Pterodactyl\Contracts\Repository\DaemonKeyRepositoryInterface;
 use Pterodactyl\Contracts\Repository\AllocationRepositoryInterface;
 use Pterodactyl\Contracts\Repository\PermissionRepositoryInterface;
@@ -51,7 +51,7 @@ use Pterodactyl\Contracts\Repository\DatabaseHostRepositoryInterface;
 use Pterodactyl\Contracts\Repository\Daemon\CommandRepositoryInterface;
 use Pterodactyl\Contracts\Repository\ServerVariableRepositoryInterface;
 use Pterodactyl\Contracts\Repository\Daemon\ConfigurationRepositoryInterface;
-use Pterodactyl\Repositories\Wings\WingsServerRepository as DaemonServerRepository;
+use Pterodactyl\Repositories\Wings\DaemonServerRepository as DaemonServerRepository;
 use Pterodactyl\Contracts\Repository\Daemon\ServerRepositoryInterface as DaemonServerRepositoryInterface;
 
 class RepositoryServiceProvider extends ServiceProvider
@@ -84,10 +84,10 @@ class RepositoryServiceProvider extends ServiceProvider
         $this->app->bind(UserRepositoryInterface::class, UserRepository::class);
 
         // Daemon Repositories
-        $this->app->bind(ConfigurationRepositoryInterface::class, ConfigurationRepository::class);
-        $this->app->bind(CommandRepositoryInterface::class, CommandRepository::class);
+        $this->app->bind(ConfigurationRepositoryInterface::class, DaemonConfigurationRepository::class);
+        $this->app->bind(CommandRepositoryInterface::class, DaemonCommandRepository::class);
         $this->app->bind(DaemonServerRepositoryInterface::class, DaemonServerRepository::class);
-        $this->app->bind(FileRepositoryInterface::class, FileRepository::class);
-        $this->app->bind(PowerRepositoryInterface::class, PowerRepository::class);
+        $this->app->bind(FileRepositoryInterface::class, DaemonFileRepository::class);
+        $this->app->bind(PowerRepositoryInterface::class, DaemonPowerRepository::class);
     }
 }
diff --git a/app/Repositories/Wings/BaseWingsRepository.php b/app/Repositories/Wings/BaseWingsRepository.php
deleted file mode 100644
index b22f8f8d..00000000
--- a/app/Repositories/Wings/BaseWingsRepository.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-namespace Pterodactyl\Repositories\Wings;
-
-use GuzzleHttp\Client;
-use Pterodactyl\Repositories\Daemon\BaseRepository;
-use Pterodactyl\Contracts\Repository\Daemon\BaseRepositoryInterface;
-
-abstract class BaseWingsRepository extends BaseRepository implements BaseRepositoryInterface
-{
-    /**
-     * Return an instance of the Guzzle HTTP Client to be used for requests.
-     *
-     * @param array $headers
-     * @return \GuzzleHttp\Client
-     */
-    public function getHttpClient(array $headers = []): Client
-    {
-        // We're just going to extend the parent client here since that logic is already quite
-        // sound and does everything we need it to aside from provide the correct base URL
-        // and authentication headers.
-        $client = parent::getHttpClient($headers);
-
-        return new Client(array_merge($client->getConfig(), [
-            'base_uri' => $this->getNode()->getConnectionAddress(),
-            'headers' => [
-                'Authorization' => 'Bearer ' . ($this->getToken() ?? $this->getNode()->daemonSecret),
-                'Accept' => 'application/json',
-                'Content-Type' => 'application/json',
-            ],
-        ]));
-    }
-}
diff --git a/app/Repositories/Wings/DaemonCommandRepository.php b/app/Repositories/Wings/DaemonCommandRepository.php
new file mode 100644
index 00000000..4a067e92
--- /dev/null
+++ b/app/Repositories/Wings/DaemonCommandRepository.php
@@ -0,0 +1,7 @@
+<?php
+
+namespace Pterodactyl\Repositories\Wings;
+
+class DaemonCommandRepository extends DaemonRepository
+{
+}
diff --git a/app/Repositories/Wings/DaemonConfigurationRepository.php b/app/Repositories/Wings/DaemonConfigurationRepository.php
new file mode 100644
index 00000000..6d598220
--- /dev/null
+++ b/app/Repositories/Wings/DaemonConfigurationRepository.php
@@ -0,0 +1,7 @@
+<?php
+
+namespace Pterodactyl\Repositories\Wings;
+
+class DaemonConfigurationRepository extends DaemonRepository
+{
+}
diff --git a/app/Repositories/Wings/FileRepository.php b/app/Repositories/Wings/DaemonFileRepository.php
similarity index 82%
rename from app/Repositories/Wings/FileRepository.php
rename to app/Repositories/Wings/DaemonFileRepository.php
index 5b0a8dab..3c362667 100644
--- a/app/Repositories/Wings/FileRepository.php
+++ b/app/Repositories/Wings/DaemonFileRepository.php
@@ -4,11 +4,12 @@ namespace Pterodactyl\Repositories\Wings;
 
 use stdClass;
 use Exception;
+use Webmozart\Assert\Assert;
+use Pterodactyl\Models\Server;
 use Psr\Http\Message\ResponseInterface;
 use Pterodactyl\Exceptions\Http\Server\FileSizeTooLargeException;
-use Pterodactyl\Contracts\Repository\Daemon\FileRepositoryInterface;
 
-class FileRepository extends BaseWingsRepository implements FileRepositoryInterface
+class DaemonFileRepository extends DaemonRepository
 {
     /**
      * Return stat information for a given file.
@@ -36,8 +37,10 @@ class FileRepository extends BaseWingsRepository implements FileRepositoryInterf
      */
     public function getContent(string $path, int $notLargerThan = null): string
     {
+        Assert::isInstanceOf(Server::class, $this->server);
+
         $response = $this->getHttpClient()->get(
-            sprintf('/api/servers/%s/files/contents', $this->getServer()->uuid),
+            sprintf('/api/servers/%s/files/contents', $this->server->uuid),
             [
                 'query' => ['file' => $path],
             ]
@@ -66,8 +69,10 @@ class FileRepository extends BaseWingsRepository implements FileRepositoryInterf
      */
     public function putContent(string $path, string $content): ResponseInterface
     {
+        Assert::isInstanceOf(Server::class, $this->server);
+
         return $this->getHttpClient()->post(
-            sprintf('/api/servers/%s/files/write', $this->getServer()->uuid),
+            sprintf('/api/servers/%s/files/write', $this->server->uuid),
             [
                 'query' => ['file' => $path],
                 'body' => $content,
@@ -85,8 +90,10 @@ class FileRepository extends BaseWingsRepository implements FileRepositoryInterf
      */
     public function getDirectory(string $path): array
     {
+        Assert::isInstanceOf(Server::class, $this->server);
+
         $response = $this->getHttpClient()->get(
-            sprintf('/api/servers/%s/files/list-directory', $this->getServer()->uuid),
+            sprintf('/api/servers/%s/files/list-directory', $this->server->uuid),
             [
                 'query' => ['directory' => $path],
             ]
@@ -104,8 +111,10 @@ class FileRepository extends BaseWingsRepository implements FileRepositoryInterf
      */
     public function createDirectory(string $name, string $path): ResponseInterface
     {
+        Assert::isInstanceOf(Server::class, $this->server);
+
         return $this->getHttpClient()->post(
-            sprintf('/api/servers/%s/files/create-directory', $this->getServer()->uuid),
+            sprintf('/api/servers/%s/files/create-directory', $this->server->uuid),
             [
                 'json' => [
                     'name' => $name,
@@ -124,8 +133,10 @@ class FileRepository extends BaseWingsRepository implements FileRepositoryInterf
      */
     public function renameFile(string $from, string $to): ResponseInterface
     {
+        Assert::isInstanceOf(Server::class, $this->server);
+
         return $this->getHttpClient()->put(
-            sprintf('/api/servers/%s/files/rename', $this->getServer()->uuid),
+            sprintf('/api/servers/%s/files/rename', $this->server->uuid),
             [
                 'json' => [
                     'rename_from' => $from,
@@ -143,8 +154,10 @@ class FileRepository extends BaseWingsRepository implements FileRepositoryInterf
      */
     public function copyFile(string $location): ResponseInterface
     {
+        Assert::isInstanceOf(Server::class, $this->server);
+
         return $this->getHttpClient()->post(
-            sprintf('/api/servers/%s/files/copy', $this->getServer()->uuid),
+            sprintf('/api/servers/%s/files/copy', $this->server->uuid),
             [
                 'json' => [
                     'location' => $location,
@@ -161,8 +174,10 @@ class FileRepository extends BaseWingsRepository implements FileRepositoryInterf
      */
     public function deleteFile(string $location): ResponseInterface
     {
+        Assert::isInstanceOf(Server::class, $this->server);
+
         return $this->getHttpClient()->post(
-            sprintf('/api/servers/%s/files/delete', $this->getServer()->uuid),
+            sprintf('/api/servers/%s/files/delete', $this->server->uuid),
             [
                 'json' => [
                     'location' => $location,
diff --git a/app/Repositories/Wings/DaemonPowerRepository.php b/app/Repositories/Wings/DaemonPowerRepository.php
new file mode 100644
index 00000000..a2e13b47
--- /dev/null
+++ b/app/Repositories/Wings/DaemonPowerRepository.php
@@ -0,0 +1,7 @@
+<?php
+
+namespace Pterodactyl\Repositories\Wings;
+
+class DaemonPowerRepository extends DaemonRepository
+{
+}
diff --git a/app/Repositories/Wings/DaemonRepository.php b/app/Repositories/Wings/DaemonRepository.php
new file mode 100644
index 00000000..435bcc51
--- /dev/null
+++ b/app/Repositories/Wings/DaemonRepository.php
@@ -0,0 +1,88 @@
+<?php
+
+namespace Pterodactyl\Repositories\Wings;
+
+use GuzzleHttp\Client;
+use Pterodactyl\Models\Node;
+use Webmozart\Assert\Assert;
+use Pterodactyl\Models\Server;
+use Illuminate\Contracts\Foundation\Application;
+
+abstract class DaemonRepository
+{
+    /**
+     * @var \Illuminate\Contracts\Foundation\Application
+     */
+    protected $app;
+
+    /**
+     * @var \Pterodactyl\Models\Server|null
+     */
+    protected $server;
+
+    /**
+     * @var \Pterodactyl\Models\Node|null
+     */
+    protected $node;
+
+    /**
+     * BaseWingsRepository constructor.
+     *
+     * @param \Illuminate\Contracts\Foundation\Application $application
+     */
+    public function __construct(Application $application)
+    {
+        $this->app = $application;
+    }
+
+    /**
+     * Set the server model this request is stemming from.
+     *
+     * @param \Pterodactyl\Models\Server $server
+     * @return $this
+     */
+    public function setServer(Server $server)
+    {
+        $this->server = $server;
+
+        $this->setNode($this->server->node);
+
+        return $this;
+    }
+
+    /**
+     * Set the node model this request is stemming from.
+     *
+     * @param \Pterodactyl\Models\Node $node
+     * @return $this
+     */
+    public function setNode(Node $node)
+    {
+        $this->node = $node;
+
+        return $this;
+    }
+
+    /**
+     * Return an instance of the Guzzle HTTP Client to be used for requests.
+     *
+     * @param array $headers
+     * @return \GuzzleHttp\Client
+     */
+    public function getHttpClient(array $headers = []): Client
+    {
+        Assert::isInstanceOf(Node::class, $this->node);
+
+        return new Client([
+            'verify' => $this->app->environment('production'),
+            'base_uri' => $this->node->getConnectionAddress(),
+            'timeout' => config('pterodactyl.guzzle.timeout'),
+            'connect_timeout' => config('pterodactyl.guzzle.connect_timeout'),
+            'headers' => array_merge($headers, [
+                'Authorization' => 'Bearer ' . $this->node->daemonSecret,
+                'Accept' => 'application/json',
+                'Content-Type' => 'application/json',
+            ]),
+        ]);
+    }
+}
diff --git a/app/Repositories/Wings/WingsServerRepository.php b/app/Repositories/Wings/DaemonServerRepository.php
similarity index 74%
rename from app/Repositories/Wings/WingsServerRepository.php
rename to app/Repositories/Wings/DaemonServerRepository.php
index 512a050f..49cf9f29 100644
--- a/app/Repositories/Wings/WingsServerRepository.php
+++ b/app/Repositories/Wings/DaemonServerRepository.php
@@ -2,10 +2,12 @@
 
 namespace Pterodactyl\Repositories\Wings;
 
+use Webmozart\Assert\Assert;
+use Pterodactyl\Models\Server;
 use GuzzleHttp\Exception\TransferException;
 use Pterodactyl\Exceptions\Http\Connection\DaemonConnectionException;
 
-class WingsServerRepository extends BaseWingsRepository
+class DaemonServerRepository extends DaemonRepository
 {
     /**
      * Returns details about a server from the Daemon instance.
@@ -15,9 +17,11 @@ class WingsServerRepository extends BaseWingsRepository
      */
     public function getDetails(): array
     {
+        Assert::isInstanceOf(Server::class, $this->server);
+
         try {
             $response = $this->getHttpClient()->get(
-                sprintf('/api/servers/%s', $this->getServer()->uuid)
+                sprintf('/api/servers/%s', $this->server->uuid)
             );
         } catch (TransferException $exception) {
             throw new DaemonConnectionException($exception);