Page MenuHomePhorge

D5640.1774884784.diff
No OneTemporary

Authored By
Unknown
Size
40 KB
Referenced Files
None
Subscribers
None

D5640.1774884784.diff

diff --git a/src/app/Http/Controllers/API/V4/Admin/DomainsController.php b/src/app/Http/Controllers/API/V4/Admin/DomainsController.php
--- a/src/app/Http/Controllers/API/V4/Admin/DomainsController.php
+++ b/src/app/Http/Controllers/API/V4/Admin/DomainsController.php
@@ -4,6 +4,7 @@
use App\Domain;
use App\EventLog;
+use App\Http\Resources\DomainResource;
use App\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
@@ -49,15 +50,10 @@
}
}
- // Process the result
- $result = $result->map(
- function ($domain) {
- return $this->objectToClient($domain);
- }
- );
-
$result = [
- 'list' => $result,
+ // List of domains
+ 'list' => DomainResource::collection($result),
+ // @var int Number of entries in the list
'count' => count($result),
'message' => self::trans('app.search-foundxdomains', ['x' => count($result)]),
];
diff --git a/src/app/Http/Controllers/API/V4/Admin/GroupsController.php b/src/app/Http/Controllers/API/V4/Admin/GroupsController.php
--- a/src/app/Http/Controllers/API/V4/Admin/GroupsController.php
+++ b/src/app/Http/Controllers/API/V4/Admin/GroupsController.php
@@ -4,6 +4,7 @@
use App\EventLog;
use App\Group;
+use App\Http\Resources\GroupResource;
use App\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
@@ -30,15 +31,8 @@
}
}
- // Process the result
- $result = $result->map(
- function ($group) {
- return $this->objectToClient($group);
- }
- );
-
$result = [
- 'list' => $result,
+ 'list' => GroupResource::collection($result),
'count' => count($result),
'message' => self::trans('app.search-foundxdistlists', ['x' => count($result)]),
];
diff --git a/src/app/Http/Controllers/API/V4/Admin/ResourcesController.php b/src/app/Http/Controllers/API/V4/Admin/ResourcesController.php
--- a/src/app/Http/Controllers/API/V4/Admin/ResourcesController.php
+++ b/src/app/Http/Controllers/API/V4/Admin/ResourcesController.php
@@ -2,6 +2,7 @@
namespace App\Http\Controllers\API\V4\Admin;
+use App\Http\Resources\ResourceResource;
use App\Resource;
use App\User;
use Illuminate\Http\JsonResponse;
@@ -28,15 +29,8 @@
}
}
- // Process the result
- $result = $result->map(
- function ($resource) {
- return $this->objectToClient($resource);
- }
- );
-
$result = [
- 'list' => $result,
+ 'list' => ResourceResource::collection($result),
'count' => count($result),
'message' => self::trans('app.search-foundxresources', ['x' => count($result)]),
];
diff --git a/src/app/Http/Controllers/API/V4/Admin/SharedFoldersController.php b/src/app/Http/Controllers/API/V4/Admin/SharedFoldersController.php
--- a/src/app/Http/Controllers/API/V4/Admin/SharedFoldersController.php
+++ b/src/app/Http/Controllers/API/V4/Admin/SharedFoldersController.php
@@ -2,6 +2,7 @@
namespace App\Http\Controllers\API\V4\Admin;
+use App\Http\Resources\SharedFolderResource;
use App\SharedFolder;
use App\User;
use Illuminate\Http\JsonResponse;
@@ -28,15 +29,8 @@
}
}
- // Process the result
- $result = $result->map(
- function ($folder) {
- return $this->objectToClient($folder);
- }
- );
-
$result = [
- 'list' => $result,
+ 'list' => SharedFolderResource::collection($result),
'count' => count($result),
'message' => self::trans('app.search-foundxshared-folders', ['x' => count($result)]),
];
diff --git a/src/app/Http/Controllers/API/V4/DomainsController.php b/src/app/Http/Controllers/API/V4/DomainsController.php
--- a/src/app/Http/Controllers/API/V4/DomainsController.php
+++ b/src/app/Http/Controllers/API/V4/DomainsController.php
@@ -4,6 +4,8 @@
use App\Domain;
use App\Http\Controllers\RelationController;
+use App\Http\Resources\DomainInfoResource;
+use App\Http\Resources\DomainResource;
use App\Jobs\Domain\CreateJob;
use App\Package;
use App\Rules\UserEmailDomain;
@@ -56,6 +58,7 @@
return response()->json([
'status' => 'success',
+ // @var array Domain status information
'statusInfo' => self::statusInfo($domain),
'message' => self::trans('app.domain-confirm-success'),
]);
@@ -92,6 +95,52 @@
]);
}
+ /**
+ * List domains.
+ *
+ * The domain entitlements billed to the current user wallet(s)
+ */
+ public function index(): JsonResponse
+ {
+ $user = $this->guard()->user();
+
+ $result = $user->domains(true, false)->orderBy('namespace')->get();
+
+ // TODO: Searching and paging
+
+ return response()->json([
+ 'status' => 'success',
+ // @var string Response message
+ 'message' => self::trans("app.search-foundx{$this->label}s", ['x' => count($result)]),
+ // List of domains
+ 'list' => DomainResource::collection($result),
+ // @var int Number of entries in the list
+ 'count' => count($result),
+ // @var bool Indicates that there are more entries available
+ 'hasMore' => false,
+ ]);
+ }
+
+ /**
+ * Domain information.
+ *
+ * @param string $id Domain identifier
+ */
+ public function show($id): JsonResponse
+ {
+ $domain = Domain::find($id);
+
+ if (!$this->checkTenant($domain)) {
+ return $this->errorResponse(404);
+ }
+
+ if (!$this->guard()->user()->canRead($domain)) {
+ return $this->errorResponse(403);
+ }
+
+ return (new DomainInfoResource($domain))->response();
+ }
+
/**
* Create a domain.
*/
@@ -168,97 +217,6 @@
]);
}
- /**
- * Domain information.
- *
- * @param string $id Domain identifier
- */
- public function show($id): JsonResponse
- {
- $domain = Domain::find($id);
-
- if (!$this->checkTenant($domain)) {
- return $this->errorResponse(404);
- }
-
- if (!$this->guard()->user()->canRead($domain)) {
- return $this->errorResponse(403);
- }
-
- $response = $this->objectToClient($domain, true);
-
- // Add hash information to the response
- $response['hash_text'] = $domain->hash(Domain::HASH_TEXT);
- $response['hash_cname'] = $domain->hash(Domain::HASH_CNAME);
- $response['hash_code'] = $domain->hash(Domain::HASH_CODE);
-
- // Add DNS/MX configuration for the domain
- $response['dns'] = self::getDNSConfig($domain);
- $response['mx'] = self::getMXConfig($domain->namespace);
-
- // Domain configuration, e.g. spf whitelist
- $response['config'] = $domain->getConfig();
-
- // Status info
- $response['statusInfo'] = self::statusInfo($domain);
-
- // Entitlements/Wallet info
- SkusController::objectEntitlements($domain, $response);
-
- return response()->json($response);
- }
-
- /**
- * Provide DNS MX information to configure specified domain for
- */
- protected static function getMXConfig(string $namespace): array
- {
- $entries = [];
-
- // copy MX entries from an existing domain
- if ($master = \config('dns.copyfrom')) {
- // TODO: cache this lookup
- foreach ((array) dns_get_record($master, \DNS_MX) as $entry) {
- $entries[] = sprintf(
- "@\t%s\t%s\tMX\t%d %s.",
- \config('dns.ttl', $entry['ttl']),
- $entry['class'],
- $entry['pri'],
- $entry['target']
- );
- }
- } elseif ($static = \config('dns.static')) {
- $entries[] = strtr($static, ['\n' => "\n", '%s' => $namespace]);
- }
-
- // display SPF settings
- if ($spf = \config('dns.spf')) {
- $entries[] = ';';
- foreach (['TXT', 'SPF'] as $type) {
- $entries[] = sprintf(
- "@\t%s\tIN\t%s\t\"%s\"",
- \config('dns.ttl'),
- $type,
- $spf
- );
- }
- }
-
- return $entries;
- }
-
- /**
- * Provide sample DNS config for domain confirmation
- */
- protected static function getDNSConfig(Domain $domain): array
- {
- $hash_txt = $domain->hash(Domain::HASH_TEXT);
-
- return [
- "{$domain->namespace}. TXT \"{$hash_txt}\"",
- ];
- }
-
/**
* Domain status (extended) information.
*
diff --git a/src/app/Http/Controllers/API/V4/GroupsController.php b/src/app/Http/Controllers/API/V4/GroupsController.php
--- a/src/app/Http/Controllers/API/V4/GroupsController.php
+++ b/src/app/Http/Controllers/API/V4/GroupsController.php
@@ -5,6 +5,8 @@
use App\Domain;
use App\Group;
use App\Http\Controllers\RelationController;
+use App\Http\Resources\GroupInfoResource;
+use App\Http\Resources\GroupResource;
use App\Jobs\Group\CreateJob;
use App\Rules\ExternalEmail;
use App\Rules\GroupName;
@@ -39,22 +41,49 @@
protected $deleteBeforeCreate;
/**
- * Prepare a resource object for the UI.
+ * List groups.
*
- * @param object $object An object
- * @param bool $full Include all object properties
+ * The group entitlements billed to the current user wallet(s)
+ */
+ public function index(): JsonResponse
+ {
+ $user = $this->guard()->user();
+
+ $result = $user->groups()->orderBy('name')->orderBy('email')->get();
+
+ // TODO: Searching and paging
+
+ return response()->json([
+ 'status' => 'success',
+ // @var string Response message
+ 'message' => self::trans("app.search-foundxdistlists", ['x' => count($result)]),
+ // List of groups
+ 'list' => GroupResource::collection($result),
+ // @var int Number of entries in the list
+ 'count' => count($result),
+ // @var bool Indicates that there are more entries available
+ 'hasMore' => false,
+ ]);
+ }
+
+ /**
+ * Group information.
*
- * @return array Object information
+ * @param string $id Group identifier
*/
- protected function objectToClient($object, bool $full = false): array
+ public function show($id): JsonResponse
{
- $result = parent::objectToCLient($object, $full);
+ $group = Group::find($id);
- if ($full) {
- $result['members'] = $object->getAddresses();
+ if (!$this->checkTenant($group)) {
+ return $this->errorResponse(404);
}
- return $result;
+ if (!$this->guard()->user()->canRead($group)) {
+ return $this->errorResponse(403);
+ }
+
+ return (new GroupInfoResource($group))->response();
}
/**
@@ -76,7 +105,7 @@
}
/**
- * Create a new group record.
+ * Create a group.
*/
#[BodyParameter('name', description: 'Group name', type: 'string', required: true)]
#[BodyParameter('email', description: 'Group email address', type: 'string', required: true)]
@@ -132,7 +161,7 @@
}
if (!empty($errors)) {
- return response()->json(['status' => 'error', 'errors' => $errors], 422);
+ return response()->json(['status' => 'error', 'errors' => /* @var array */ $errors], 422);
}
DB::beginTransaction();
diff --git a/src/app/Http/Controllers/API/V4/Reseller/DomainsController.php b/src/app/Http/Controllers/API/V4/Reseller/DomainsController.php
--- a/src/app/Http/Controllers/API/V4/Reseller/DomainsController.php
+++ b/src/app/Http/Controllers/API/V4/Reseller/DomainsController.php
@@ -3,6 +3,7 @@
namespace App\Http\Controllers\API\V4\Reseller;
use App\Domain;
+use App\Http\Resources\DomainResource;
use App\User;
use Illuminate\Http\JsonResponse;
@@ -36,15 +37,10 @@
}
}
- // Process the result
- $result = $result->map(
- function ($domain) {
- return $this->objectToClient($domain);
- }
- );
-
$result = [
- 'list' => $result,
+ // List of domains
+ 'list' => DomainResource::collection($result),
+ // @var int Number of entries in the list
'count' => count($result),
'message' => self::trans('app.search-foundxdomains', ['x' => count($result)]),
];
diff --git a/src/app/Http/Controllers/API/V4/Reseller/GroupsController.php b/src/app/Http/Controllers/API/V4/Reseller/GroupsController.php
--- a/src/app/Http/Controllers/API/V4/Reseller/GroupsController.php
+++ b/src/app/Http/Controllers/API/V4/Reseller/GroupsController.php
@@ -3,6 +3,7 @@
namespace App\Http\Controllers\API\V4\Reseller;
use App\Group;
+use App\Http\Resources\GroupResource;
use App\User;
use Illuminate\Http\JsonResponse;
@@ -27,15 +28,8 @@
}
}
- // Process the result
- $result = $result->map(
- function ($group) {
- return $this->objectToClient($group);
- }
- );
-
$result = [
- 'list' => $result,
+ 'list' => GroupResource::collection($result),
'count' => count($result),
'message' => self::trans('app.search-foundxdistlists', ['x' => count($result)]),
];
diff --git a/src/app/Http/Controllers/API/V4/Reseller/ResourcesController.php b/src/app/Http/Controllers/API/V4/Reseller/ResourcesController.php
--- a/src/app/Http/Controllers/API/V4/Reseller/ResourcesController.php
+++ b/src/app/Http/Controllers/API/V4/Reseller/ResourcesController.php
@@ -2,6 +2,7 @@
namespace App\Http\Controllers\API\V4\Reseller;
+use App\Http\Resources\ResourceResource;
use App\Resource;
use App\User;
use Illuminate\Http\JsonResponse;
@@ -27,15 +28,8 @@
}
}
- // Process the result
- $result = $result->map(
- function ($resource) {
- return $this->objectToClient($resource);
- }
- );
-
$result = [
- 'list' => $result,
+ 'list' => ResourceResource::collection($result),
'count' => count($result),
'message' => self::trans('app.search-foundxresources', ['x' => count($result)]),
];
diff --git a/src/app/Http/Controllers/API/V4/Reseller/SharedFoldersController.php b/src/app/Http/Controllers/API/V4/Reseller/SharedFoldersController.php
--- a/src/app/Http/Controllers/API/V4/Reseller/SharedFoldersController.php
+++ b/src/app/Http/Controllers/API/V4/Reseller/SharedFoldersController.php
@@ -2,6 +2,7 @@
namespace App\Http\Controllers\API\V4\Reseller;
+use App\Http\Resources\SharedFolderResource;
use App\SharedFolder;
use App\User;
use Illuminate\Http\JsonResponse;
@@ -27,15 +28,8 @@
}
}
- // Process the result
- $result = $result->map(
- function ($folder) {
- return $this->objectToClient($folder);
- }
- );
-
$result = [
- 'list' => $result,
+ 'list' => SharedFolderResource::collection($result),
'count' => count($result),
'message' => self::trans('app.search-foundxsharedfolders', ['x' => count($result)]),
];
diff --git a/src/app/Http/Controllers/API/V4/ResourcesController.php b/src/app/Http/Controllers/API/V4/ResourcesController.php
--- a/src/app/Http/Controllers/API/V4/ResourcesController.php
+++ b/src/app/Http/Controllers/API/V4/ResourcesController.php
@@ -3,9 +3,12 @@
namespace App\Http\Controllers\API\V4;
use App\Http\Controllers\RelationController;
+use App\Http\Resources\ResourceInfoResource;
+use App\Http\Resources\ResourceResource;
use App\Jobs\Resource\CreateJob;
use App\Resource;
use App\Rules\ResourceName;
+use Dedoc\Scramble\Attributes\BodyParameter;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
@@ -25,6 +28,52 @@
/** @var array Common object properties in the API response */
protected $objectProps = ['email', 'name'];
+ /**
+ * List resources.
+ *
+ * The resource entitlements billed to the current user wallet(s)
+ */
+ public function index(): JsonResponse
+ {
+ $user = $this->guard()->user();
+
+ $result = $user->resources()->orderBy('name')->get();
+
+ // TODO: Searching and paging
+
+ return response()->json([
+ 'status' => 'success',
+ // @var string Response message
+ 'message' => self::trans("app.search-foundxresources", ['x' => count($result)]),
+ // List of resources
+ 'list' => ResourceResource::collection($result),
+ // @var int Number of entries in the list
+ 'count' => count($result),
+ // @var bool Indicates that there are more entries available
+ 'hasMore' => false,
+ ]);
+ }
+
+ /**
+ * Resource information.
+ *
+ * @param string $id Resource identifier
+ */
+ public function show($id): JsonResponse
+ {
+ $resource = Resource::find($id);
+
+ if (!$this->checkTenant($resource)) {
+ return $this->errorResponse(404);
+ }
+
+ if (!$this->guard()->user()->canRead($resource)) {
+ return $this->errorResponse(403);
+ }
+
+ return (new ResourceInfoResource($resource))->response();
+ }
+
/**
* Resource status (extended) information
*
@@ -49,6 +98,7 @@
*
* @param Request $request the API request
*/
+ #[BodyParameter('domain', description: 'Domain namespace', type: 'string', required: true)]
public function store(Request $request): JsonResponse
{
$current_user = $this->guard()->user();
@@ -96,6 +146,7 @@
* @param Request $request the API request
* @param string $id Resource identifier
*/
+ #[BodyParameter('name', description: 'Resource name', type: 'string')]
public function update(Request $request, $id): JsonResponse
{
$resource = Resource::find($id);
diff --git a/src/app/Http/Controllers/API/V4/SharedFoldersController.php b/src/app/Http/Controllers/API/V4/SharedFoldersController.php
--- a/src/app/Http/Controllers/API/V4/SharedFoldersController.php
+++ b/src/app/Http/Controllers/API/V4/SharedFoldersController.php
@@ -3,11 +3,14 @@
namespace App\Http\Controllers\API\V4;
use App\Http\Controllers\RelationController;
+use App\Http\Resources\SharedFolderInfoResource;
+use App\Http\Resources\SharedFolderResource;
use App\Jobs\SharedFolder\CreateJob;
use App\Rules\SharedFolderName;
use App\Rules\SharedFolderType;
use App\SharedFolder;
use App\User;
+use Dedoc\Scramble\Attributes\BodyParameter;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
@@ -28,6 +31,52 @@
/** @var array Common object properties in the API response */
protected $objectProps = ['email', 'name', 'type'];
+ /**
+ * List shared folders.
+ *
+ * The shared folder entitlements billed to the current user wallet(s)
+ */
+ public function index(): JsonResponse
+ {
+ $user = $this->guard()->user();
+
+ $result = $user->sharedFolders()->orderBy('name')->get();
+
+ // TODO: Searching and paging
+
+ return response()->json([
+ 'status' => 'success',
+ // @var string Response message
+ 'message' => self::trans("app.search-foundxshared-folders", ['x' => count($result)]),
+ // List of shared folders
+ 'list' => SharedFolderResource::collection($result),
+ // @var int Number of entries in the list
+ 'count' => count($result),
+ // @var bool Indicates that there are more entries available
+ 'hasMore' => false,
+ ]);
+ }
+
+ /**
+ * Shared folder information.
+ *
+ * @param string $id Shared folder identifier
+ */
+ public function show($id): JsonResponse
+ {
+ $folder = SharedFolder::find($id);
+
+ if (!$this->checkTenant($folder)) {
+ return $this->errorResponse(404);
+ }
+
+ if (!$this->guard()->user()->canRead($folder)) {
+ return $this->errorResponse(403);
+ }
+
+ return (new SharedFolderInfoResource($folder))->response();
+ }
+
/**
* SharedFolder status (extended) information
*
@@ -48,8 +97,11 @@
}
/**
- * Create a new shared folder record.
+ * Create a shared folder.
*/
+ #[BodyParameter('domain', description: 'Domain namespace', type: 'string', required: true)]
+ #[BodyParameter('name', description: 'Folder name', type: 'string', required: true)]
+ #[BodyParameter('type', description: 'Folder type', type: 'string', required: true)]
public function store(Request $request): JsonResponse
{
$current_user = $this->guard()->user();
@@ -59,8 +111,8 @@
return $this->errorResponse(403);
}
- if ($error_response = $this->validateFolderRequest($request, null, $wallet->owner)) {
- return $error_response;
+ if ($errors = $this->validateFolderRequest($request, null, $wallet->owner)) {
+ return response()->json(['status' => 'error', 'errors' => /* @var array */ $errors], 422);
}
DB::beginTransaction();
@@ -92,6 +144,8 @@
* @param Request $request the API request
* @param string $id Shared folder identifier
*/
+ #[BodyParameter('name', description: 'Folder name', type: 'string')]
+ #[BodyParameter('aliases', description: 'Folder email aliases', type: 'array<string>')]
public function update(Request $request, $id): JsonResponse
{
$folder = SharedFolder::find($id);
@@ -106,8 +160,8 @@
return $this->errorResponse(403);
}
- if ($error_response = $this->validateFolderRequest($request, $folder, $folder->walletOwner())) {
- return $error_response;
+ if ($errors = $this->validateFolderRequest($request, $folder, $folder->walletOwner())) {
+ return response()->json(['status' => 'error', 'errors' => /* @var array */ $errors], 422);
}
$name = $request->input('name');
@@ -171,9 +225,9 @@
* @param SharedFolder|null $folder Shared folder
* @param User|null $owner Account owner
*
- * @return JsonResponse|null The error response on error
+ * @return ?array List of validation errors if any
*/
- protected function validateFolderRequest(Request $request, $folder, $owner)
+ protected function validateFolderRequest(Request $request, $folder, $owner): ?array
{
$errors = [];
@@ -233,11 +287,7 @@
$request->aliases = $aliases;
}
- if (!empty($errors)) {
- return response()->json(['status' => 'error', 'errors' => $errors], 422);
- }
-
- return null;
+ return !empty($errors) ? $errors : null;
}
/**
diff --git a/src/app/Http/Controllers/API/V4/SkusController.php b/src/app/Http/Controllers/API/V4/SkusController.php
--- a/src/app/Http/Controllers/API/V4/SkusController.php
+++ b/src/app/Http/Controllers/API/V4/SkusController.php
@@ -104,7 +104,7 @@
* @param object $object User/Domain/etc object
* @param array $response The response to put the data into
*/
- public static function objectEntitlements($object, &$response = []): void
+ public static function objectEntitlements($object, &$response = []): array
{
// Object's entitlements information
$response['skus'] = Entitlement::objectEntitlementsSummary($object);
@@ -117,6 +117,8 @@
$response['wallet']['discount_description'] = $wallet->discount->description;
}
}
+
+ return $response;
}
/**
diff --git a/src/app/Http/Controllers/RelationController.php b/src/app/Http/Controllers/RelationController.php
--- a/src/app/Http/Controllers/RelationController.php
+++ b/src/app/Http/Controllers/RelationController.php
@@ -96,11 +96,9 @@
}
// TODO: Search and paging
-
- $result = $query->get()
- ->map(function ($resource) {
- return $this->objectToClient($resource);
- });
+ $result = $query->get()->map(function ($resource) {
+ return $this->objectToClient($resource);
+ });
$result = [
'status' => 'success',
@@ -360,29 +358,11 @@
$response = $this->objectToClient($resource, true);
- if (!empty($statusInfo = $this->statusInfo($resource))) {
- $response['statusInfo'] = $statusInfo;
- }
-
- // Resource configuration, e.g. sender_policy, invitation_policy, acl
- if (method_exists($resource, 'getConfig')) {
- $response['config'] = $resource->getConfig();
- }
-
- if (method_exists($resource, 'aliases')) {
- $response['aliases'] = $resource->aliases()->pluck('alias')->all();
- }
-
- // Entitlements/Wallet info
- if (method_exists($resource, 'wallet')) {
- API\V4\SkusController::objectEntitlements($resource, $response);
- }
-
return response()->json($response);
}
/**
- * Get a list of SKUs available to the resource.
+ * Get list of SKUs available to the resource.
*
* @param int $id Resource identifier
*/
diff --git a/src/app/Http/Resources/DomainInfoResource.php b/src/app/Http/Resources/DomainInfoResource.php
new file mode 100644
--- /dev/null
+++ b/src/app/Http/Resources/DomainInfoResource.php
@@ -0,0 +1,106 @@
+<?php
+
+namespace App\Http\Resources;
+
+use App\Domain;
+use App\Http\Controllers\API\V4\DomainsController;
+use App\Http\Controllers\API\V4\SkusController;
+use Illuminate\Http\Request;
+
+/**
+ * Domain information response
+ */
+class DomainInfoResource extends DomainResource
+{
+ /**
+ * Transform the resource into an array.
+ */
+ public function toArray(Request $request): array
+ {
+ return [
+ $this->merge(parent::toArray($request)),
+
+ // @var int Domain status
+ 'status' => $this->resource->status,
+ // Domain creation date-time
+ 'created_at' => (string) $this->resource->created_at,
+ // Domain modification date-time
+ 'updated_at' => (string) $this->resource->updated_at,
+ // @var string|null Domain deletion date-time
+ 'deleted_at' => (string) $this->resource->deleted_at,
+
+ // Domain DNS hash
+ 'hash_text' => $this->resource->hash(Domain::HASH_TEXT),
+ // Domain DNS hash
+ 'hash_cname' => $this->resource->hash(Domain::HASH_CNAME),
+ // Domain DNS hash
+ 'hash_code' => $this->resource->hash(Domain::HASH_CODE),
+
+ // DNS configuration for the domain
+ 'dns' => self::getDNSConfig($this->resource),
+ // MX configuration for the domain
+ 'mx' => self::getMXConfig($this->resource),
+
+ // @var array<string, mixed> Domain configuration
+ 'config' => $this->resource->getConfig(),
+
+ // @var array Extended status/permissions information
+ 'statusInfo' => DomainsController::statusInfo($this->resource),
+
+ // Entitlements/Wallet information
+ $this->merge(SkusController::objectEntitlements($this->resource)),
+ ];
+ }
+
+ /**
+ * Provide DNS MX information to configure specified domain for
+ */
+ protected static function getMXConfig(Domain $domain): array
+ {
+ $namespace = $domain->namespace;
+ $entries = [];
+
+ // copy MX entries from an existing domain
+ if ($master = \config('dns.copyfrom')) {
+ // TODO: cache this lookup
+ foreach ((array) dns_get_record($master, \DNS_MX) as $entry) {
+ $entries[] = sprintf(
+ "@\t%s\t%s\tMX\t%d %s.",
+ \config('dns.ttl', $entry['ttl']),
+ $entry['class'],
+ $entry['pri'],
+ $entry['target']
+ );
+ }
+ } elseif ($static = \config('dns.static')) {
+ $entries[] = strtr($static, ['\n' => "\n", '%s' => $namespace]);
+ }
+
+ // display SPF settings
+ if ($spf = \config('dns.spf')) {
+ $entries[] = ';';
+ foreach (['TXT', 'SPF'] as $type) {
+ $entries[] = sprintf(
+ "@\t%s\tIN\t%s\t\"%s\"",
+ \config('dns.ttl'),
+ $type,
+ $spf
+ );
+ }
+ }
+
+ return $entries;
+ }
+
+ /**
+ * Provide sample DNS config for domain confirmation
+ */
+ protected static function getDNSConfig(Domain $domain): array
+ {
+ $hash_txt = $domain->hash(Domain::HASH_TEXT);
+
+ return [
+ "{$domain->namespace}. TXT \"{$hash_txt}\"",
+ ];
+ }
+}
diff --git a/src/app/Http/Resources/DomainResource.php b/src/app/Http/Resources/DomainResource.php
new file mode 100644
--- /dev/null
+++ b/src/app/Http/Resources/DomainResource.php
@@ -0,0 +1,50 @@
+<?php
+
+namespace App\Http\Resources;
+
+use App\Domain;
+use App\Http\Controllers\RelationController;
+use Illuminate\Http\Request;
+use Illuminate\Http\Resources\Json\JsonResource;
+
+/**
+ * Domain response
+ *
+ * @mixin Domain
+ */
+class DomainResource extends JsonResource
+{
+ /**
+ * Transform the resource into an array.
+ */
+ public function toArray(Request $request): array
+ {
+ $state = RelationController::objectState($this->resource);
+
+ return [
+ // Domain identifier
+ 'id' => $this->resource->id,
+ // Domain namespace
+ 'namespace' => $this->resource->namespace,
+ // Domain type
+ 'type' => $this->resource->type,
+
+ // @var bool Is domain active?
+ 'isActive' => $state['isActive'] ?? false,
+ // @var bool Is domain deleted?
+ 'isDeleted' => $state['isDeleted'] ?? false,
+ // @var bool Readiness state
+ 'isReady' => $state['isReady'],
+ // @var bool IMAP readiness state
+ 'isImapReady' => $state['isImapReady'] ?? false,
+ // @var bool LDAP readiness state
+ 'isLdapReady' => $this->when(isset($state['isLdapReady']), $state['isLdapReady'] ?? false),
+ // @var bool Is domain suspended?
+ 'isSuspended' => $state['isSuspended'] ?? false,
+ // @var bool Is domain confirmed?
+ 'isConfirmed' => $state['isConfirmed'] ?? false,
+ // @var bool Is domain verified?
+ 'isVerified' => $state['isVerified'] ?? false,
+ ];
+ }
+}
diff --git a/src/app/Http/Resources/GroupInfoResource.php b/src/app/Http/Resources/GroupInfoResource.php
new file mode 100644
--- /dev/null
+++ b/src/app/Http/Resources/GroupInfoResource.php
@@ -0,0 +1,45 @@
+<?php
+
+namespace App\Http\Resources;
+
+use App\Group;
+use App\Http\Controllers\API\V4\GroupsController;
+use App\Http\Controllers\API\V4\SkusController;
+use Illuminate\Http\Request;
+
+/**
+ * Group information response
+ */
+class GroupInfoResource extends GroupResource
+{
+ /**
+ * Transform the resource into an array.
+ */
+ public function toArray(Request $request): array
+ {
+ return [
+ $this->merge(parent::toArray($request)),
+
+ // @var int Group status
+ 'status' => $this->resource->status,
+ // Group creation date-time
+ 'created_at' => (string) $this->resource->created_at,
+ // Group modification date-time
+ 'updated_at' => (string) $this->resource->updated_at,
+ // @var string|null Group deletion date-time
+ 'deleted_at' => (string) $this->resource->deleted_at,
+
+ // @var array<string, mixed> Group configuration, e.g. spf whitelist
+ 'config' => $this->resource->getConfig(),
+
+ // @var array<string> List of group members (email addresses)
+ 'members' => $this->resource->getAddresses(),
+
+ // @var array Extended status/permissions information
+ 'statusInfo' => GroupsController::statusInfo($this->resource),
+
+ // Entitlements/Wallet information
+ $this->merge(SkusController::objectEntitlements($this->resource)),
+ ];
+ }
+}
diff --git a/src/app/Http/Resources/GroupResource.php b/src/app/Http/Resources/GroupResource.php
new file mode 100644
--- /dev/null
+++ b/src/app/Http/Resources/GroupResource.php
@@ -0,0 +1,46 @@
+<?php
+
+namespace App\Http\Resources;
+
+use App\Group;
+use App\Http\Controllers\RelationController;
+use Illuminate\Http\Request;
+use Illuminate\Http\Resources\Json\JsonResource;
+
+/**
+ * Group response
+ *
+ * @mixin Group
+ */
+class GroupResource extends JsonResource
+{
+ /**
+ * Transform the resource into an array.
+ */
+ public function toArray(Request $request): array
+ {
+ $state = RelationController::objectState($this->resource);
+
+ return [
+ // @var int Group identifier
+ 'id' => $this->resource->id,
+ // Group email address
+ 'email' => $this->resource->email,
+ // Group name
+ 'name' => $this->resource->name,
+
+ // @var bool Is group active?
+ 'isActive' => $state['isActive'] ?? false,
+ // @var bool Is group deleted?
+ 'isDeleted' => $state['isDeleted'] ?? false,
+ // @var bool Readiness state
+ 'isReady' => $state['isReady'],
+ // @var bool IMAP readiness state
+ 'isImapReady' => $state['isImapReady'] ?? false,
+ // @var bool LDAP readiness state
+ 'isLdapReady' => $this->when(isset($state['isLdapReady']), $state['isLdapReady'] ?? false),
+ // @var bool Is group suspended?
+ 'isSuspended' => $state['isSuspended'] ?? false,
+ ];
+ }
+}
diff --git a/src/app/Http/Resources/ResourceInfoResource.php b/src/app/Http/Resources/ResourceInfoResource.php
new file mode 100644
--- /dev/null
+++ b/src/app/Http/Resources/ResourceInfoResource.php
@@ -0,0 +1,42 @@
+<?php
+
+namespace App\Http\Resources;
+
+use App\Http\Controllers\API\V4\ResourcesController;
+use App\Http\Controllers\API\V4\SkusController;
+use App\Resource;
+use Illuminate\Http\Request;
+
+/**
+ * Resource information response
+ */
+class ResourceInfoResource extends GroupResource
+{
+ /**
+ * Transform the resource into an array.
+ */
+ public function toArray(Request $request): array
+ {
+ return [
+ $this->merge(parent::toArray($request)),
+
+ // @var int Resource status
+ 'status' => $this->resource->status,
+ // Resource creation date-time
+ 'created_at' => (string) $this->resource->created_at,
+ // Resource modification date-time
+ 'updated_at' => (string) $this->resource->updated_at,
+ // @var string|null Resource deletion date-time
+ 'deleted_at' => (string) $this->resource->deleted_at,
+
+ // @var array<string, mixed> Resource configuration
+ 'config' => $this->resource->getConfig(),
+
+ // @var array Extended status/permissions information
+ 'statusInfo' => ResourcesController::statusInfo($this->resource),
+
+ // Entitlements/Wallet information
+ $this->merge(SkusController::objectEntitlements($this->resource)),
+ ];
+ }
+}
diff --git a/src/app/Http/Resources/ResourceResource.php b/src/app/Http/Resources/ResourceResource.php
new file mode 100644
--- /dev/null
+++ b/src/app/Http/Resources/ResourceResource.php
@@ -0,0 +1,46 @@
+<?php
+
+namespace App\Http\Resources;
+
+use App\Http\Controllers\RelationController;
+use App\Resource;
+use Illuminate\Http\Request;
+use Illuminate\Http\Resources\Json\JsonResource;
+
+/**
+ * Resource response
+ *
+ * @mixin Resource
+ */
+class ResourceResource extends JsonResource
+{
+ /**
+ * Transform the resource into an array.
+ */
+ public function toArray(Request $request): array
+ {
+ $state = RelationController::objectState($this->resource);
+
+ return [
+ // @var int Resource identifier
+ 'id' => $this->resource->id,
+ // Resource email address
+ 'email' => $this->resource->email,
+ // Resource name
+ 'name' => $this->resource->name,
+
+ // @var bool Is resource active?
+ 'isActive' => $state['isActive'] ?? false,
+ // @var bool Is resource deleted?
+ 'isDeleted' => $state['isDeleted'] ?? false,
+ // @var bool Readiness state
+ 'isReady' => $state['isReady'],
+ // @var bool IMAP readiness state
+ 'isImapReady' => $state['isImapReady'] ?? false,
+ // @var bool LDAP readiness state
+ 'isLdapReady' => $this->when(isset($state['isLdapReady']), $state['isLdapReady'] ?? false),
+ // @var bool Is resource suspended?
+ // 'isSuspended' => $state['isSuspended'] ?? false,
+ ];
+ }
+}
diff --git a/src/app/Http/Resources/SharedFolderInfoResource.php b/src/app/Http/Resources/SharedFolderInfoResource.php
new file mode 100644
--- /dev/null
+++ b/src/app/Http/Resources/SharedFolderInfoResource.php
@@ -0,0 +1,44 @@
+<?php
+
+namespace App\Http\Resources;
+
+use App\Http\Controllers\API\V4\SharedFoldersController;
+use App\Http\Controllers\API\V4\SkusController;
+use Illuminate\Http\Request;
+
+/**
+ * Shared folder information response
+ */
+class SharedFolderInfoResource extends SharedFolderResource
+{
+ /**
+ * Transform the resource into an array.
+ */
+ public function toArray(Request $request): array
+ {
+ return [
+ $this->merge(parent::toArray($request)),
+
+ // @var int Folder status
+ 'status' => $this->resource->status,
+ // Folder creation date-time
+ 'created_at' => (string) $this->resource->created_at,
+ // Folder modification date-time
+ 'updated_at' => (string) $this->resource->updated_at,
+ // @var string|null Folder deletion date-time
+ 'deleted_at' => (string) $this->resource->deleted_at,
+
+ // @var array Folder aliases (email addresses)
+ 'aliases' => $this->resource->aliases()->pluck('alias')->all(),
+
+ // @var array<string, mixed> Folder configuration
+ 'config' => $this->resource->getConfig(),
+
+ // @var array Extended status/permissions information
+ 'statusInfo' => SharedFoldersController::statusInfo($this->resource),
+
+ // Entitlements/Wallet information
+ $this->merge(SkusController::objectEntitlements($this->resource)),
+ ];
+ }
+}
diff --git a/src/app/Http/Resources/SharedFolderResource.php b/src/app/Http/Resources/SharedFolderResource.php
new file mode 100644
--- /dev/null
+++ b/src/app/Http/Resources/SharedFolderResource.php
@@ -0,0 +1,48 @@
+<?php
+
+namespace App\Http\Resources;
+
+use App\Http\Controllers\RelationController;
+use App\SharedFolder;
+use Illuminate\Http\Request;
+use Illuminate\Http\Resources\Json\JsonResource;
+
+/**
+ * Shared folder response
+ *
+ * @mixin SharedFolder
+ */
+class SharedFolderResource extends JsonResource
+{
+ /**
+ * Transform the resource into an array.
+ */
+ public function toArray(Request $request): array
+ {
+ $state = RelationController::objectState($this->resource);
+
+ return [
+ // @var int Folder identifier
+ 'id' => $this->resource->id,
+ // Folder email address
+ 'email' => $this->resource->email,
+ // Folder name
+ 'name' => $this->resource->name,
+ // Folder type
+ 'type' => $this->resource->type,
+
+ // @var bool Is folder active?
+ 'isActive' => $state['isActive'] ?? false,
+ // @var bool Is folder deleted?
+ 'isDeleted' => $state['isDeleted'] ?? false,
+ // @var bool Readiness state
+ 'isReady' => $state['isReady'],
+ // @var bool IMAP readiness state
+ 'isImapReady' => $state['isImapReady'] ?? false,
+ // @var bool LDAP readiness state
+ 'isLdapReady' => $this->when(isset($state['isLdapReady']), $state['isLdapReady'] ?? false),
+ // @var bool Is folder suspended?
+ // 'isSuspended' => $state['isSuspended'] ?? false,
+ ];
+ }
+}

File Metadata

Mime Type
text/plain
Expires
Mon, Mar 30, 3:33 PM (4 d, 12 h ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
18739482
Default Alt Text
D5640.1774884784.diff (40 KB)

Event Timeline