Skip to content

Commit

Permalink
Move date handling to connection
Browse files Browse the repository at this point in the history
  • Loading branch information
kyoungportable committed Sep 7, 2023
1 parent a7edaf8 commit 3db47a1
Show file tree
Hide file tree
Showing 4 changed files with 136 additions and 77 deletions.
15 changes: 15 additions & 0 deletions src/Eloquent/Builder.php
Original file line number Diff line number Diff line change
Expand Up @@ -88,4 +88,19 @@ public function getConnection()
{
return $this->query->getConnection();
}

/**
* Get the hydrated models without eager loading.
*
* @param array|string $columns
* @return \Illuminate\Database\Eloquent\Model[]|static[]
*/
public function getModels($columns = ['*'])
{
$data = $this->query->get($columns)->all();

return $this->model->hydrate(
$data
)->all();
}
}
107 changes: 104 additions & 3 deletions src/Eloquent/Connection.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
use Portable\EloquentZoho\Exceptions\ConfigurationException;
use Portable\EloquentZoho\ZohoClient;
use Illuminate\Http\Client\Response;
use Illuminate\Support\Carbon;
use Illuminate\Support\Collection;
use Portable\EloquentZoho\Casts\ZohoInteger;
use Portable\EloquentZoho\Exceptions\NotConnectedException;
use Portable\EloquentZoho\TokenStorage;

Expand All @@ -19,6 +22,10 @@ class Connection extends DatabaseConnection
*/
protected ?ZohoClient $client = null;

protected Collection $views;
protected Collection $folders;
protected array $schemas;

protected string $folderName;

public function __construct(protected array $zConfig)
Expand All @@ -30,12 +37,17 @@ public function __construct(protected array $zConfig)
}
}

$this->views = collect();
$this->folders = collect();
$this->schemas = [];

$this->folderName = $zConfig['prefix'];
$this->useDefaultPostProcessor();
$this->useDefaultQueryGrammar();
$this->useDefaultSchemaGrammar();
}


public function setAuthToken(?string $token): void
{
$this->getClient()->setAuthToken($token);
Expand Down Expand Up @@ -94,11 +106,35 @@ public function hasTable(string $table): bool

public function zohoSelect(string $fromTable, string $query): array
{
$data = $this->getClient()->exportTable($fromTable, $query);
$tableSchema = $this->getSchema($fromTable);
$dateColumns = $tableSchema['columnList']
->where('dataTypeName', 'Date')
->pluck('dateFormat', 'columnName')
->toArray();
$numberColumns = $tableSchema['columnList']
->whereIn('dataTypeName', ['Auto Number','Number'])
->pluck('columnName')->toArray();

$response = $this->getClient()->exportTable($fromTable, $query)['response'];
$data = $response['result']['rows'];


$rows = [];
foreach ($data['response']['result']['rows'] as $row) {
$rows[] = array_combine($data['response']['result']['column_order'], $row);
foreach ($data as $row) {
$row = array_combine($response['result']['column_order'], $row);
foreach ($dateColumns as $dateColumn => $dateFormat) {
if (isset($row[$dateColumn]) && strlen($row[$dateColumn])) {
$row[$dateColumn] = Carbon::createFromFormat($dateFormat, $row[$dateColumn])->format('Y-m-d H:i:s');
}
}

foreach ($numberColumns as $numberColumn) {
if (isset($row[$numberColumn]) && strlen($row[$numberColumn])) {
$row[$numberColumn] = (int) Str::replace(',', '', $row[$numberColumn]);
}
}

$rows[] = $row;
}

return $rows;
Expand Down Expand Up @@ -218,4 +254,69 @@ protected function getClient(): ZohoClient

return $this->client;
}

public function getFolderId()
{
return $this->getFolders()->where('folderName', $this->folderName)->first();
}

public function getFolders()
{
if (count($this->folders)==0) {
$response = $this->getClient()->getFolderList();
if ($response->successful()) {
$this->folders = collect($response->json()['response']['result']);
}
}
return $this->folders;
}

public function getViews()
{
if (count($this->views)==0) {
$response = $this->getClient()->getViewList();
if ($response->successful()) {
$this->views = collect($response->json()['response']['result']);
}
}
return $this->views;
}

public function getSchema($name)
{
if (isset($this->schemas[$name])) {
return $this->schemas[$name];
} else {
$response = $this->getClient()->getViewInfo($name);
if ($response->successful()) {
$schema = $response->json()['response']['result']['viewInfo'];
foreach ($schema['columnList'] as $key => $item) {
if (isset($item['dateFormat'])) {
$item['dateFormat'] = $this->parseZohoDateFormat($item['dateFormat']);
}
$schema['columnList'][$key] = $item;
}

$schema['columnList'] = collect($schema['columnList']);

$this->schemas[$name] = $schema;
} else {
throw new \Exception("Unable to get schema");
}
}
return $schema;
}

protected function parseZohoDateFormat($format)
{
$format = str_replace('dd', 'd', $format);
$format = str_replace('MMM', 'M', $format);
$format = str_replace('yyyy', 'Y', $format);

$format = str_replace('HH', 'H', $format);
$format = str_replace('mm', 'i', $format);
$format = str_replace('ss', 's', $format);

return $format;
}
}
74 changes: 0 additions & 74 deletions src/Eloquent/ZohoModel.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,7 @@

namespace Portable\EloquentZoho\Eloquent;

use Carbon\CarbonInterface;
use DateTimeInterface;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Date;
use Portable\EloquentZoho\Casts\ZohoInteger;

abstract class ZohoModel extends Model
{
Expand All @@ -19,12 +14,6 @@ abstract class ZohoModel extends Model

abstract public static function arrayFromLocal(Model $local): array;

public function __construct(array $attributes = [])
{
parent::__construct($attributes);
$this->casts = array_merge($this->casts, ['id' => ZohoInteger::class]);
}

/**
* Get the current connection name for the model.
*
Expand All @@ -34,67 +23,4 @@ public function getConnectionName()
{
return $this->connection ?? config('zoho.connection', 'zoho');
}

/**
* Create a new model instance that is existing.
*
* @param array $attributes
* @param string|null $connection
* @return static
*/
public function newFromBuilder($attributes = [], $connection = null)
{
$model = $this->newInstance($attributes, true);

$model->setConnection($connection ?: $this->getConnectionName());

$model->fireModelEvent('retrieved', false);

return $model;
}

/**
* Return a timestamp as DateTime object.
* Overriden because Zoho is weird
*
* @param mixed $value
* @return \Illuminate\Support\Carbon
*/
protected function asDateTime($value)
{
// If this value is already a Carbon instance, we shall just return it as is.
// This prevents us having to re-instantiate a Carbon instance when we know
// it already is one, which wouldn't be fulfilled by the DateTime check.
if ($value instanceof CarbonInterface) {
return Date::instance($value);
}

// If the value is already a DateTime instance, we will just skip the rest of
// these checks since they will be a waste of time, and hinder performance
// when checking the field. We will just return the DateTime right away.
if ($value instanceof DateTimeInterface) {
return Date::parse(
$value->format('Y-m-d H:i:s.u'),
$value->getTimezone()
);
}

// If this value is an integer, we will assume it is a UNIX timestamp's value
// and format a Carbon object from this timestamp. This allows flexibility
// when defining your date fields as they might be UNIX timestamps here.
if (is_numeric($value)) {
return Date::createFromTimestamp($value);
}

// If the value is in simply year, month, day format, we will instantiate the
// Carbon instances from that format. Again, this provides for simple date
// fields on the database, while still supporting Carbonized conversion.
if ($this->isStandardDateFormat($value)) {
return Date::instance(Carbon::createFromFormat('Y-m-d', $value)->startOfDay());
}

$format = 'd M, Y H:i:s';

return Date::createFromFormat($format, $value);
}
}
17 changes: 17 additions & 0 deletions src/ZohoClient.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,23 @@ public function __construct(
]);
}

public function getFolderList(): Response
{
$response = $this->post('?ZOHO_ACTION=FOLDERLIST');
return $response;
}

public function getViewList(): Response
{
$response = $this->post('?ZOHO_ACTION=VIEWLIST');
return $response;
}

public function getViewInfo(string $table): Response
{
$response = $this->post($table . '?ZOHO_ACTION=VIEWMETADATA');
return $response;
}
/*
* Determine if the service has enough configuration data to run correctly
*/
Expand Down

0 comments on commit 3db47a1

Please sign in to comment.