diff --git a/README.md b/README.md index 9df77cd..cc17d0a 100644 --- a/README.md +++ b/README.md @@ -77,7 +77,15 @@ $connect->setSynchronized([ ]); ``` -Your entities must use `HasConnectSync` trait. This trait allows you to customize the syncing behavior. +Your models must use `HasConnectSync` trait. This trait allows you to customize the syncing behavior. + +You also need to add this column to your synced tables: + +``` +$table->unsignedBigInteger('connect_resource_id')->unique(); +``` + +_You can customize this column name and the syncing behavior in your model. Take a look at `HasConnectSync`._ Finally, use this command to sync everything: diff --git a/src/Connect.php b/src/Connect.php index 714fc05..5d225c6 100644 --- a/src/Connect.php +++ b/src/Connect.php @@ -22,6 +22,14 @@ class Connect 'UserTeam' ]; + protected static $foreignKeys = [ + 'role_id' => 'Role', + 'company_id' => 'Company', + 'team_id' => 'Team', + 'user_id' => 'User', + 'user_teams_id' => 'UserTeam' + ]; + protected $app; protected $synchronized = []; @@ -177,16 +185,22 @@ class Connect $model_data = $this->getUserData($connect_data['access_token']); $model = config('bconnect.model'); - $user = $model::where('email', $model_data['email'])->first() ?? new $model; - $user->fill($model_data); + if (in_array($model, $this->synchronized)) { + $user = $model::findConnectResource($model_data['id']) ?? new $model; + } + else { + $user = $model::where('email', $model_data['email'])->first() ?? new $model; + } + + $user->fill($model_data); // TODO if (in_array($model, $this->synchronized)) - $user->id = $model_data['id']; + $user->{$model::$connectColumnId} = $model_data['id']; $user->save(); if (in_array($model, $this->synchronized)) - $user = $model::findOrFail($model_data['id']); + $user = $model::findConnectResource($model_data['id']); $this->updateUserConnectData($user, $connect_data); @@ -320,6 +334,8 @@ class Connect $data = $data['connectResourceData']; } + $data = $this->convertForeignKeys($data); + $model::$method($data['id'], $data); return true; @@ -362,7 +378,7 @@ class Connect foreach ($model::all() as $item) { - if (!in_array(intval($item->id), $identifiers)) + if (!in_array(intval($item->{$model::$connectColumnId}), $identifiers)) $model::onConnectResourceDoesNotExist($item); } } @@ -377,9 +393,11 @@ class Connect } $model = $this->synchronized[$resourceType]; - $item = $model::find($resourceId); + $item = $model::findConnectResource($resourceId); $method = $this->getEventMethod($item ? 'updated' : 'created'); - $model::$method($resourceId, $resourceData); + + $data = $this->convertForeignKeys($resourceData); + $model::$method($resourceId, $data); } // Routing @@ -428,4 +446,20 @@ class Connect { return config('bconnect.url') ?? 'https://connect.bluesquare.io'; } + + protected function convertForeignKeys($data) + { + foreach (self::$foreignKeys as $key => $resourceType) + { + if (!array_key_exists($key, $data)) continue; + + $model = $this->resolveResourceModel($resourceType); + if (!in_array(HasConnectSync::class, class_uses($model))) continue; + + $record = $model::findConnectResource($data[$key]); + $data[$key] = $record ? $record->id : null; + } + + return $data; + } } diff --git a/src/Traits/HasConnectSync.php b/src/Traits/HasConnectSync.php index 519033a..5279d7d 100644 --- a/src/Traits/HasConnectSync.php +++ b/src/Traits/HasConnectSync.php @@ -10,32 +10,34 @@ trait HasConnectSync public static $connectResource; + public static $connectColumnId = 'connect_resource_id'; + + public static function findConnectResource($id) + { + return self::query()->where(self::$connectColumnId, $id)->first(); + } + public static function onConnectResourceCreated($id, $data) { - $record = new self; - $record->fill($data); - $record->id = $id; - $record->save(); - return true; + $record = self::findConnectResource($id) ?? new self; + $record->fill($data); // TODO + $record->{self::$connectColumnId} = $id; + return $record->save(); } public static function onConnectResourceUpdated($id, $data) { - $record = self::find($id) ?? new self; - $record->fill($data); - $record->id = $id; - $record->save(); - return true; + return self::onConnectResourceCreated($id, $data); } - public static function onConnectResourceDeleted($id, $data) + public static function onConnectResourceDeleted($id, $data = null) { - $record = self::find($id); - return $record ? $record->delete() : false; + $record = self::findConnectResource($id); + return $record ? $record->forceDelete() : false; } public static function onConnectResourceDoesNotExist($record) { - return $record->delete(); + return $record->forceDelete(); } }