add: full multi-tenancy control

This commit is contained in:
Cauê Faleiros
2026-02-02 15:31:15 -03:00
commit c6ec92802b
1711 changed files with 258106 additions and 0 deletions

View File

@@ -0,0 +1,234 @@
<?php
namespace Webkul\Core\Repositories;
use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
use Webkul\Core\Contracts\CoreConfig;
use Webkul\Core\Eloquent\Repository;
class CoreConfigRepository extends Repository
{
/**
* Specify model class name.
*/
public function model(): string
{
return CoreConfig::class;
}
/**
* Get the configuration title.
*/
protected function getTranslatedTitle(mixed $configuration): string
{
if (
method_exists($configuration, 'getTitle')
&& ! is_null($configuration->getTitle())
) {
return trans($configuration->getTitle());
}
if (
method_exists($configuration, 'getName')
&& ! is_null($configuration->getName())
) {
return trans($configuration->getName());
}
return '';
}
/**
* Get children and fields.
*/
protected function getChildrenAndFields(mixed $configuration, string $searchTerm, array $path, array &$results): void
{
if (
method_exists($configuration, 'getChildren')
|| method_exists($configuration, 'getFields')
) {
$children = $configuration->haveChildren()
? $configuration->getChildren()
: $configuration->getFields();
$tempPath = array_merge($path, [[
'key' => $configuration->getKey() ?? null,
'title' => $this->getTranslatedTitle($configuration),
]]);
$results = array_merge($results, $this->search($children, $searchTerm, $tempPath));
}
}
/**
* Search configuration.
*
* @param array $items
*/
public function search(Collection $items, string $searchTerm, array $path = []): array
{
$results = [];
foreach ($items as $configuration) {
$title = $this->getTranslatedTitle($configuration);
if (
stripos($title, $searchTerm) !== false
&& count($path)
) {
$queryParam = $path[1]['key'] ?? $configuration->getKey();
$results[] = [
'title' => implode(' > ', [...Arr::pluck($path, 'title'), $title]),
'url' => route('admin.configuration.index', Str::replace('.', '/', $queryParam)),
];
}
$this->getChildrenAndFields($configuration, $searchTerm, $path, $results);
}
return $results;
}
/**
* Create core configuration.
*/
public function create(array $data): void
{
unset($data['_token']);
$preparedData = [];
foreach ($data as $method => $fieldData) {
$recursiveData = $this->recursiveArray($fieldData, $method);
foreach ($recursiveData as $fieldName => $value) {
if (
is_array($value)
&& isset($value['delete'])
) {
$coreConfigValues = $this->model->where('code', $fieldName)->get();
if ($coreConfigValues->isNotEmpty()) {
foreach ($coreConfigValues as $coreConfig) {
if (! empty($coreConfig['value'])) {
Storage::delete($coreConfig['value']);
}
parent::delete($coreConfig['id']);
}
}
continue;
}
}
foreach ($recursiveData as $fieldName => $value) {
if (is_array($value)) {
foreach ($value as $key => $val) {
$fieldNameWithKey = $fieldName.'.'.$key;
$coreConfigValues = $this->model->where('code', $fieldNameWithKey)->get();
if (request()->hasFile($fieldNameWithKey)) {
$val = request()->file($fieldNameWithKey)->store('configuration');
}
if ($coreConfigValues->isNotEmpty()) {
foreach ($coreConfigValues as $coreConfig) {
if (request()->hasFile($fieldNameWithKey)) {
Storage::delete($coreConfig['value']);
}
parent::update(['code' => $fieldNameWithKey, 'value' => $val], $coreConfig->id);
}
} else {
parent::create(['code' => $fieldNameWithKey, 'value' => $val]);
}
}
} else {
if (request()->hasFile($fieldName)) {
$value = request()->file($fieldName)->store('configuration');
}
$preparedData[] = [
'code' => $fieldName,
'value' => $value,
];
}
}
}
if (! empty($preparedData)) {
foreach ($preparedData as $dataItem) {
$coreConfigValues = $this->model->where('code', $dataItem['code'])->get();
if ($coreConfigValues->isNotEmpty()) {
foreach ($coreConfigValues as $coreConfig) {
parent::update($dataItem, $coreConfig->id);
}
} else {
parent::create($dataItem);
}
}
}
Event::dispatch('core.configuration.save.after');
}
/**
* Recursive array.
*/
public function recursiveArray(array $formData, string $method): array
{
static $data = [];
static $recursiveArrayData = [];
foreach ($formData as $form => $formValue) {
$value = $method.'.'.$form;
if (is_array($formValue)) {
$dim = $this->countDim($formValue);
if ($dim > 1) {
$this->recursiveArray($formValue, $value);
} elseif ($dim == 1) {
$data[$value] = $formValue;
}
}
}
foreach ($data as $key => $value) {
$field = core()->getConfigField($key);
if ($field) {
$recursiveArrayData[$key] = $value;
} else {
foreach ($value as $key1 => $val) {
$recursiveArrayData[$key.'.'.$key1] = $val;
}
}
}
return $recursiveArrayData;
}
/**
* Return dimension of the array.
*/
public function countDim(array|string $array): int
{
if (is_array(reset($array))) {
$return = $this->countDim(reset($array)) + 1;
} else {
$return = 1;
}
return $return;
}
}

View File

@@ -0,0 +1,21 @@
<?php
namespace Webkul\Core\Repositories;
use Prettus\Repository\Traits\CacheableRepository;
use Webkul\Core\Eloquent\Repository;
class CountryRepository extends Repository
{
use CacheableRepository;
/**
* Specify Model class name
*
* @return mixed
*/
public function model()
{
return 'Webkul\Core\Contracts\Country';
}
}

View File

@@ -0,0 +1,21 @@
<?php
namespace Webkul\Core\Repositories;
use Prettus\Repository\Traits\CacheableRepository;
use Webkul\Core\Eloquent\Repository;
class CountryStateRepository extends Repository
{
use CacheableRepository;
/**
* Specify Model class name
*
* @return mixed
*/
public function model()
{
return 'Webkul\Core\Contracts\CountryState';
}
}