Skip to content

Commit

Permalink
Merge pull request #1296 from Shadow243/fix-jmap-quota
Browse files Browse the repository at this point in the history
fix(other): jmap quota display
  • Loading branch information
kroky authored Dec 17, 2024
2 parents 22d542e + f48362c commit b05c1d7
Showing 1 changed file with 96 additions and 2 deletions.
98 changes: 96 additions & 2 deletions modules/imap/hm-jmap.php
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,8 @@ class Hm_JMAP {
);
private $default_caps = array(
'urn:ietf:params:jmap:core',
'urn:ietf:params:jmap:mail'
'urn:ietf:params:jmap:mail',
'urn:ietf:params:jmap:quota'
);

public $selected_mailbox;
Expand Down Expand Up @@ -376,6 +377,99 @@ public function get_folder_list_by_level($level=false) {
return $this->parse_folder_list_by_level($level);
}

/**
* Use the JMAP Quota/get method to fetch quota information for a specific quota root.
*
* This method sends a request to the JMAP server to retrieve quota information
* for a specified quota root (e.g., a specific folder like INBOX or Sent).
* The response is parsed to extract details about the quota, including the used space and hard limit.
*
* @param array $quota_root from get_quota_root
* @return array list of quota details
*/
public function get_quota($quota_root='') {
if (!is_array($this->session)) {
throw new Exception("Not authenticated. Please authenticate first.");
}
$quotas = array();
$methods = [
[
"Quota/get",
[
"accountId"=> (string)$this->account_id,
"name" => $this->session['username'],
"ids" => [$quota_root]
],
"0"
]
];
$response = $this->send_command($this->session['apiUrl'], $methods, 'POST');
if (!empty($response["methodResponses"][0][1]["list"])) {
$quota = $response["methodResponses"][0][1]["list"][0];
if (isset($quota['used']) && isset($quota['hardLimit'])) {
$quotas[] = [
'name' => $quota['id'],
'max' => floatval($quota['hardLimit']),
'current' => floatval($quota['used']),
];
}
}


foreach($quota_root as $key => $value) {
$quotas[$key] = $value;
}
return $quotas;
}

/**
* Use the JMAP Quota/get method to fetch quota root information for all available quotas.
*
* This method sends a request to the JMAP server to retrieve quota information
* for all quotas associated with the account. The response is parsed to extract details about each quota,
* including the used space and hard limit.
*
* @param string $mailbox The mailbox identifier for which the quota information is being fetched.
* @return array An array of quota details
*/
public function get_quota_root($mailbox) {
if (!is_array($this->session)) {
throw new Exception("Not authenticated. Please authenticate first.");
}
$quotas = array();
$methods = [
[
"Quota/get",
[
"accountId"=> (string)$this->account_id,
"name" => $this->session['username'],
"ids" => null,
"scope" => "folder",
"folder" => $mailbox
],
"0"
]
];
$response = $this->send_command($this->session['apiUrl'], $methods, 'POST');
if (!empty($response["methodResponses"][0][1]["list"])) {
$quotasRes = $response["methodResponses"][0][1]["list"];
foreach($quotasRes as $quota) {
if (isset($quota['used']) && isset($quota['hardLimit'])) {
$quotas[] = [
'name' => $quota['id'],
'max' => floatval($quota['hardLimit']),
'current' => floatval($quota['used']),
];
}
}
}

return $quotas;
}

public function get_capability() {
//TODO: Implement
}
/**
* Return cached data
* @return array
Expand Down Expand Up @@ -452,7 +546,7 @@ public function get_folder_list() {
$methods = array(array(
'Mailbox/get',
array(
'accountId' => $this->account_id,
'accountId' => (string)$this->account_id,
'ids' => NULL
),
'fl'
Expand Down

0 comments on commit b05c1d7

Please sign in to comment.