bluefyn-international/ShipEngine

View on GitHub
src/Traits/Warehouse.php

Summary

Maintainability
A
35 mins
Test Coverage
<?php

namespace BluefynInternational\ShipEngine\Traits;

use BluefynInternational\ShipEngine\DTO\Warehouse as WarehouseDTO;
use BluefynInternational\ShipEngine\ShipEngineClient;
use BluefynInternational\ShipEngine\ShipEngineConfig;
use GuzzleHttp\Exception\GuzzleException;
use Spatie\DataTransferObject\Exceptions\UnknownProperties;

trait Warehouse
{
    use BaseCalls;

    /**
     * @see https://shipengine.github.io/shipengine-openapi/#operation/list_warehouses
     *
     * @throws GuzzleException|UnknownProperties
     */
    public function listWarehouse(
        array|ShipEngineConfig|null $config = null,
    ) : array {
        return $this->retrieveList(
            'warehouses',
            [],
            $this->config->merge($config),
            'warehouses',
            WarehouseDTO::class,
        );
    }

    /**
     * @see https://shipengine.github.io/shipengine-openapi/#operation/create_warehouse
     *
     * @throws GuzzleException|UnknownProperties
     */
    public function createWarehouse(
        string $name,
        array $origin_address,
        array $return_address = [],
        array|ShipEngineConfig|null $config = null,
    ) : array|WarehouseDTO {
        $config = $this->config->merge($config);
        $payload = [
            'name' => $name,
            'origin_address' => $origin_address,
        ];
        if ($return_address) {
            $payload['return_address'] = $return_address;
        }

        $response = ShipEngineClient::post(
            'warehouses',
            $config,
            $payload,
        );

        if ($config->asObject) {
            return new WarehouseDTO($response);
        }

        return $response;
    }

    /**
     * @see https://shipengine.github.io/shipengine-openapi/#operation/get_warehouse_by_id
     *
     * @throws GuzzleException|UnknownProperties
     */
    public function getWarehouseById(
        string $warehouse_id,
        array|ShipEngineConfig|null $config = null,
    ) : array|WarehouseDTO {
        $config = $this->config->merge($config);

        $response = ShipEngineClient::get(
            "warehouses/{$warehouse_id}",
            $config,
        );

        if ($config->asObject) {
            return new WarehouseDTO($response);
        }

        return $response;
    }

    /**
     * @see https://shipengine.github.io/shipengine-openapi/#operation/update_warehouse
     *
     * @throws GuzzleException
     */
    public function updateWarehouseById(
        string $warehouse_id,
        string $name,
        array $origin_address,
        array $return_address = [],
        array|ShipEngineConfig|null $config = null,
    ) : array|null {
        $payload = [
            'name' => $name,
            'origin_address' => $origin_address,
        ];
        if ($return_address) {
            $payload['return_address'] = $return_address;
        }

        return ShipEngineClient::put(
            "warehouses/{$warehouse_id}",
            $this->config->merge($config),
            $payload,
        );
    }

    /**
     * @see https://shipengine.github.io/shipengine-openapi/#operation/create_warehouse
     *
     * @throws GuzzleException
     */
    public function deleteWarehouseById(
        string $warehouse_id,
        array|ShipEngineConfig|null $config = null,
    ) : array|null {
        return ShipEngineClient::delete(
            "warehouses/{$warehouse_id}",
            $this->config->merge($config),
        );
    }
}