/home/ivoiecob/email.hirewise-va.com/vendor/afterlogic/dav/lib/DAV/FS/S3/PropertyStorageTrait.php
<?php
/**
 * This code is licensed under AGPLv3 license or Afterlogic Software License
 * if commercial version of the product was purchased.
 * For full statements of the licenses see LICENSE-AFTERLOGIC and LICENSE-AGPL3 files.
 */

namespace Afterlogic\DAV\FS\S3;

/**
 * @license https://www.gnu.org/licenses/agpl-3.0.html AGPL-3.0
 * @license https://afterlogic.com/products/common-licensing Afterlogic Software License
 * @copyright Copyright (c) 2019, Afterlogic Corp.
 */
trait PropertyStorageTrait
{
    protected $cache = [];

    public function getResourceRawData($path)
    {
        if (!isset($this->cache[$path])) {
            $data = [];
            $oObject = false;
            try {
                $oObject = $this->client->getObject(
                    [
                        'Bucket' => $this->bucket,
                        'Key' =>  \ltrim($path, '/')
                    ]
                );
            } catch (\Exception $oEx) {}
            if ($oObject) {
                $mFileData = (string) $oObject['Body'];
                $data = unserialize($mFileData);
            }
            $this->cache[$path] = $data;
        }
        return $this->cache[$path];
    }

    /**
     * Returns all the stored resource information
     *
     * @return array
     */
    public function getResourceData()
    {
        $data = $this->getResourceRawData($this->getResourceInfoPath());
        if (!isset($data[$this->getName()])) {
            $data[$this->getName()] = ['properties' => []];
        }

        $data = $data[$this->getName()];
        if (!isset($data['properties'])) {
            $data['properties'] = [];
        }

        if (!isset($data['properties']['ExtendedProps'])) {
            $aMetadata = $this->getMetadata();
            if (isset($aMetadata[\strtolower('ExtendedProps')])) {
                $data['properties']['ExtendedProps'] = \json_decode($aMetadata[\strtolower('ExtendedProps')], true);
            }
        }
        return $data;
    }

    /**
     * Updates the resource information
     *
     * @param array $newData
     * @return void
     */
    public function putResourceData(array $newData)
    {
        $path = $this->getResourceInfoPath();
        $data = $this->getResourceRawData($path);
        $data[$this->getName()] = $newData;

        $rData = fopen('php://memory', 'r+');
        fwrite($rData, \serialize($data));
        rewind($rData);

        // Prepare the upload parameters.
        $uploader = new \Aws\S3\MultipartUploader($this->client, $rData, [
            'Bucket' => $this->bucket,
            'Key'    => $path
        ]);

        // Perform the upload.
        try {
            $uploader->upload();
            $this->cache[$path] = $data;
            return true;
        } catch (\Aws\Exception\MultipartUploadException $e) {
            return false;
        }
    }

    /**
     * @return bool
     */
    public function deleteResourceData()
    {
        $path = $this->getResourceInfoPath();
        $data = $this->getResourceRawData($path);

        // Unserializing and checking if the resource file contains data for this file
        if (isset($data[$this->getName()])) {
            unset($data[$this->getName()]);
        }

        $rData = fopen('php://memory', 'r+');
        fwrite($rData, \serialize($data));
        rewind($rData);

        // Prepare the upload parameters.
        $uploader = new \Aws\S3\MultipartUploader($this->client, $rData, [
            'Bucket' => $this->bucket,
            'Key'    => $path
        ]);

        // Perform the upload.
        try {
            $uploader->upload();
            $this->cache[$path] = $data;
            return true;
        } catch (\Aws\Exception\MultipartUploadException $e) {
            return false;
        }

        return true;
    }

    public function getMetadata()
    {
        $aMetadata = [];

        $bucket = $this->bucket;
        $key = $this->getPathForS3($this->getPath());
        if ($this->client->doesObjectExist($bucket, $key)) {
            $oObject = $this->client->HeadObject([
                'Bucket' => $bucket,
                'Key' => $key
            ]);
            if ($oObject) {
                $aMetadata = $oObject->get('Metadata');
            }
        }

        return $aMetadata;
    }

    public function putResourceRawData($path, array $aData)
    {
        $data = $this->getResourceRawData($path);
        foreach ($aData as $name => $newData) {
            $data[$name] = $newData;
        }

        $rData = fopen('php://memory', 'r+');
        fwrite($rData, \serialize($data));
        rewind($rData);

        // Prepare the upload parameters.
        $uploader = new \Aws\S3\MultipartUploader($this->client, $rData, [
            'Bucket' => $this->bucket,
            'Key'    => $path
        ]);

        // Perform the upload.
        try {
            $uploader->upload();
            $this->cache[$path] = $data;
            return true;
        } catch (\Aws\Exception\MultipartUploadException $e) {
            return false;
        }
    }
}