Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 25 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -359,6 +359,31 @@ if ($capabilities !== null) {
}
```

### Quotas (RFC 9425)

```php
use JmapClient\Requests\Quota\QuotaGet;

if ($client->sessionCapable('quota')) {
$account = $client->sessionAccountDefault('quota');
$request = new QuotaGet($account->id());

foreach ($client->perform([$request])->first()->objects() as $quota) {
echo sprintf(
"%s: %d of %d %s used\n",
$quota->name(),
$quota->used(),
$quota->hardLimit(),
$quota->resource(),
);
}
}
```

The quota extension also supports `QuotaChanges`, `QuotaQuery`, and
`QuotaQueryChanges`. Query filters cover `name`, `scope`, `resource`, and
`type`; sorting is available for `name` and `used`.

### Session Information

```php
Expand Down
18 changes: 18 additions & 0 deletions lib/Requests/Quota/QuotaChanges.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

declare(strict_types=1);

/**
* SPDX-FileCopyrightText: 2026 Sebastian Krupinski <krupinski01@gmail.com>
* SPDX-License-Identifier: AGPL-3.0-only
*/

namespace JmapClient\Requests\Quota;

use JmapClient\Requests\RequestChanges;

class QuotaChanges extends RequestChanges
{
protected string $_space = 'urn:ietf:params:jmap:quota';
protected string $_class = 'Quota';
}
43 changes: 43 additions & 0 deletions lib/Requests/Quota/QuotaFilter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
<?php

declare(strict_types=1);

/**
* SPDX-FileCopyrightText: 2026 Sebastian Krupinski <krupinski01@gmail.com>
* SPDX-License-Identifier: AGPL-3.0-only
*/

namespace JmapClient\Requests\Quota;

use JmapClient\Requests\RequestFilter;

class QuotaFilter extends RequestFilter
{
public function name(string $value): static
{
$this->condition('name', $value);

return $this;
}

public function scope(string $value): static
{
$this->condition('scope', $value);

return $this;
}

public function resource(string $value): static
{
$this->condition('resourceType', $value);

return $this;
}

public function type(string $value): static
{
$this->condition('type', $value);

return $this;
}
}
18 changes: 18 additions & 0 deletions lib/Requests/Quota/QuotaGet.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
<?php

declare(strict_types=1);

/**
* SPDX-FileCopyrightText: 2026 Sebastian Krupinski <krupinski01@gmail.com>
* SPDX-License-Identifier: AGPL-3.0-only
*/

namespace JmapClient\Requests\Quota;

use JmapClient\Requests\RequestGet;

class QuotaGet extends RequestGet
{
protected string $_space = 'urn:ietf:params:jmap:quota';
protected string $_class = 'Quota';
}
30 changes: 30 additions & 0 deletions lib/Requests/Quota/QuotaQuery.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php

declare(strict_types=1);

/**
* SPDX-FileCopyrightText: 2026 Sebastian Krupinski <krupinski01@gmail.com>
* SPDX-License-Identifier: AGPL-3.0-only
*/

namespace JmapClient\Requests\Quota;

use JmapClient\Requests\RequestQuery;

class QuotaQuery extends RequestQuery
{
protected string $_space = 'urn:ietf:params:jmap:quota';
protected string $_class = 'Quota';
protected string $_filterClass = QuotaFilter::class;
protected string $_sortClass = QuotaSort::class;

public function filter(): QuotaFilter
{
return parent::filter();
}

public function sort(): QuotaSort
{
return parent::sort();
}
}
30 changes: 30 additions & 0 deletions lib/Requests/Quota/QuotaQueryChanges.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<?php

declare(strict_types=1);

/**
* SPDX-FileCopyrightText: 2026 Sebastian Krupinski <krupinski01@gmail.com>
* SPDX-License-Identifier: AGPL-3.0-only
*/

namespace JmapClient\Requests\Quota;

use JmapClient\Requests\RequestQueryChanges;

class QuotaQueryChanges extends RequestQueryChanges
{
protected string $_space = 'urn:ietf:params:jmap:quota';
protected string $_class = 'Quota';
protected string $_filterClass = QuotaFilter::class;
protected string $_sortClass = QuotaSort::class;

public function filter(): QuotaFilter
{
return parent::filter();
}

public function sort(): QuotaSort
{
return parent::sort();
}
}
29 changes: 29 additions & 0 deletions lib/Requests/Quota/QuotaSort.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

declare(strict_types=1);

/**
* SPDX-FileCopyrightText: 2026 Sebastian Krupinski <krupinski01@gmail.com>
* SPDX-License-Identifier: AGPL-3.0-only
*/

namespace JmapClient\Requests\Quota;

use JmapClient\Requests\RequestSort;

class QuotaSort extends RequestSort
{
public function name(bool $value = true): static
{
$this->condition('name', $value);

return $this;
}

public function used(bool $value = true): static
{
$this->condition('used', $value);

return $this;
}
}
20 changes: 20 additions & 0 deletions lib/Responses/Quota/QuotaChanges.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php

declare(strict_types=1);

/**
* SPDX-FileCopyrightText: 2026 Sebastian Krupinski <krupinski01@gmail.com>
* SPDX-License-Identifier: AGPL-3.0-only
*/

namespace JmapClient\Responses\Quota;

use JmapClient\Responses\ResponseChanges;

class QuotaChanges extends ResponseChanges
{
public function updatedProperties(): array|null
{
return $this->_response[self::RESPONSE_OBJECT]['updatedProperties'] ?? null;
}
}
16 changes: 16 additions & 0 deletions lib/Responses/Quota/QuotaGet.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php

declare(strict_types=1);

/**
* SPDX-FileCopyrightText: 2026 Sebastian Krupinski <krupinski01@gmail.com>
* SPDX-License-Identifier: AGPL-3.0-only
*/

namespace JmapClient\Responses\Quota;

use JmapClient\Responses\ResponseGet;

class QuotaGet extends ResponseGet
{
}
65 changes: 65 additions & 0 deletions lib/Responses/Quota/QuotaParameters.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
<?php

declare(strict_types=1);

/**
* SPDX-FileCopyrightText: 2026 Sebastian Krupinski <krupinski01@gmail.com>
* SPDX-License-Identifier: AGPL-3.0-only
*/

namespace JmapClient\Responses\Quota;

use JmapClient\Responses\ResponseParameters;

class QuotaParameters extends ResponseParameters
{
public function id(): string|null
{
return $this->parameter('id');
}

public function resource(): string|null
{
return $this->parameter('resourceType');
}

public function used(): int|null
{
return $this->parameter('used');
}

public function warnLimit(): int|null
{
return $this->parameter('warnLimit');
}

public function softLimit(): int|null
{
return $this->parameter('softLimit');
}

public function hardLimit(): int|null
{
return $this->parameter('hardLimit');
}

public function scope(): string|null
{
return $this->parameter('scope');
}

public function name(): string|null
{
return $this->parameter('name');
}

public function types(): array|null
{
return $this->parameter('types');
}

public function description(): string|null
{
return $this->parameter('description');
}
}
16 changes: 16 additions & 0 deletions lib/Responses/Quota/QuotaQuery.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php

declare(strict_types=1);

/**
* SPDX-FileCopyrightText: 2026 Sebastian Krupinski <krupinski01@gmail.com>
* SPDX-License-Identifier: AGPL-3.0-only
*/

namespace JmapClient\Responses\Quota;

use JmapClient\Responses\ResponseQuery;

class QuotaQuery extends ResponseQuery
{
}
16 changes: 16 additions & 0 deletions lib/Responses/Quota/QuotaQueryChanges.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php

declare(strict_types=1);

/**
* SPDX-FileCopyrightText: 2026 Sebastian Krupinski <krupinski01@gmail.com>
* SPDX-License-Identifier: AGPL-3.0-only
*/

namespace JmapClient\Responses\Quota;

use JmapClient\Responses\ResponseQueryChanges;

class QuotaQueryChanges extends ResponseQueryChanges
{
}
6 changes: 6 additions & 0 deletions lib/Responses/ResponseClasses.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ class ResponseClasses
'AddressBook' => 'JmapClient\Responses\Contacts\AddressBookParameters',
'ContactCard' => 'JmapClient\Responses\Contacts\ContactParameters',
'FileNode' => 'JmapClient\Responses\Files\NodeParameters',
'Quota' => 'JmapClient\Responses\Quota\QuotaParameters',
];

private static array $commands = [
Expand Down Expand Up @@ -100,6 +101,11 @@ class ResponseClasses
'FileNode/changes' => 'JmapClient\Responses\Files\NodeChanges',
'FileNode/query' => 'JmapClient\Responses\Files\NodeQuery',
'FileNode/queryChanges' => 'JmapClient\Responses\Files\NodeQueryChanges',
// Quota
'Quota/get' => 'JmapClient\Responses\Quota\QuotaGet',
'Quota/changes' => 'JmapClient\Responses\Quota\QuotaChanges',
'Quota/query' => 'JmapClient\Responses\Quota\QuotaQuery',
'Quota/queryChanges' => 'JmapClient\Responses\Quota\QuotaQueryChanges',
];

public static function listCommand(): array
Expand Down
Loading
Loading