Files
WooCow/includes/class-woocow-api.php
Malin 8644282ecb fix: correct mailbox endpoint path and quota field name
- get_domain_mailboxes: was POST /api/v1/get/mailboxes/{domain},
  correct path is GET /api/v1/get/mailbox/all/{domain}
- Quota percentage field is percent_in_use, not quota_used_in_percent

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-27 08:18:08 +01:00

165 lines
6.5 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* Mailcow API client.
* Wraps all HTTP calls to a single Mailcow server instance.
*/
defined( 'ABSPATH' ) || exit;
class WooCow_API {
private string $base_url;
private string $api_key;
private int $timeout = 20;
public function __construct( string $url, string $api_key ) {
$this->base_url = rtrim( $url, '/' );
$this->api_key = $api_key;
}
// ── Core HTTP ────────────────────────────────────────────────────────────
private function request( string $method, string $endpoint, array $body = [] ): array {
$args = [
'method' => strtoupper( $method ),
'timeout' => $this->timeout,
'sslverify' => apply_filters( 'woocow_sslverify', true ),
'headers' => [
'X-API-Key' => $this->api_key,
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
];
if ( ! empty( $body ) ) {
$args['body'] = wp_json_encode( $body );
}
$response = wp_remote_request( $this->base_url . $endpoint, $args );
if ( is_wp_error( $response ) ) {
return [ 'success' => false, 'error' => $response->get_error_message() ];
}
$code = wp_remote_retrieve_response_code( $response );
$raw = wp_remote_retrieve_body( $response );
$data = json_decode( $raw, true );
if ( $code === 401 ) {
return [ 'success' => false, 'error' => 'Authentication failed check your API key.' ];
}
return [
'success' => ( $code >= 200 && $code < 300 ),
'data' => $data,
'code' => $code,
];
}
// ── Health / Version ─────────────────────────────────────────────────────
public function test_connection(): array {
return $this->request( 'GET', '/api/v1/get/status/version' );
}
// ── Domains ──────────────────────────────────────────────────────────────
public function get_domains(): array {
return $this->request( 'GET', '/api/v1/get/domain/all' );
}
public function get_domain( string $domain ): array {
return $this->request( 'GET', '/api/v1/get/domain/' . rawurlencode( $domain ) );
}
public function create_domain( array $data ): array {
return $this->request( 'POST', '/api/v1/add/domain', $data );
}
public function edit_domain( array $items, array $attr ): array {
return $this->request( 'POST', '/api/v1/edit/domain', [ 'items' => $items, 'attr' => $attr ] );
}
public function delete_domain( string $domain ): array {
return $this->request( 'POST', '/api/v1/delete/domain', [ 'items' => [ $domain ] ] );
}
// ── Mailboxes ────────────────────────────────────────────────────────────
public function get_all_mailboxes(): array {
return $this->request( 'GET', '/api/v1/get/mailbox/all' );
}
public function get_mailbox( string $email ): array {
return $this->request( 'GET', '/api/v1/get/mailbox/' . rawurlencode( $email ) );
}
public function get_domain_mailboxes( string $domain ): array {
return $this->request( 'GET', '/api/v1/get/mailbox/all/' . rawurlencode( $domain ) );
}
public function create_mailbox( array $data ): array {
return $this->request( 'POST', '/api/v1/add/mailbox', $data );
}
public function edit_mailbox( array $items, array $attr ): array {
return $this->request( 'POST', '/api/v1/edit/mailbox', [ 'items' => $items, 'attr' => $attr ] );
}
public function delete_mailbox( string $email ): array {
return $this->request( 'POST', '/api/v1/delete/mailbox', [ 'items' => [ $email ] ] );
}
// ── Aliases ──────────────────────────────────────────────────────────────
public function get_all_aliases(): array {
return $this->request( 'GET', '/api/v1/get/alias/all' );
}
public function get_alias( int $id ): array {
return $this->request( 'GET', '/api/v1/get/alias/' . $id );
}
public function create_alias( array $data ): array {
return $this->request( 'POST', '/api/v1/add/alias', $data );
}
public function edit_alias( array $items, array $attr ): array {
return $this->request( 'POST', '/api/v1/edit/alias', [ 'items' => $items, 'attr' => $attr ] );
}
public function delete_alias( int $id ): array {
return $this->request( 'POST', '/api/v1/delete/alias', [ 'items' => [ $id ] ] );
}
// ── Domain Admins ────────────────────────────────────────────────────────
public function get_domain_admins(): array {
return $this->request( 'GET', '/api/v1/get/domain-admin/all' );
}
public function create_domain_admin( array $data ): array {
return $this->request( 'POST', '/api/v1/add/domain-admin', $data );
}
public function delete_domain_admin( string $username ): array {
return $this->request( 'POST', '/api/v1/delete/domain-admin', [ 'items' => [ $username ] ] );
}
// ── Helpers ──────────────────────────────────────────────────────────────
public function get_webmail_url(): string {
return $this->base_url . '/SOGo';
}
public function get_base_url(): string {
return $this->base_url;
}
// ── Static factory ───────────────────────────────────────────────────────
/** Build API instance from a server DB row. */
public static function from_server( object $server ): self {
return new self( $server->url, $server->api_key );
}
}