Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F117885938
D5640.1775355512.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Authored By
Unknown
Size
40 KB
Referenced Files
None
Subscribers
None
D5640.1775355512.diff
View Options
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
Details
Attached
Mime Type
text/plain
Expires
Sun, Apr 5, 2:18 AM (12 h, 26 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
18739482
Default Alt Text
D5640.1775355512.diff (40 KB)
Attached To
Mode
D5640: API documentation for controllers based on the RelationController
Attached
Detach File
Event Timeline