namespaces refactoring part 2

This commit is contained in:
Peter Papp
2021-07-18 18:05:33 +02:00
parent 8f77a497b5
commit 54dc57fcbf
107 changed files with 310 additions and 279 deletions
@@ -0,0 +1,140 @@
<?php
namespace Domain\Localization\Controllers;
use Illuminate\Http\Response;
use Domain\Settings\Models\Setting;
use App\Http\Controllers\Controller;
use Domain\Localization\Models\Language;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Contracts\Routing\ResponseFactory;
use Domain\Localization\Resources\LanguageResource;
use Domain\Localization\Requests\UpdateStringRequest;
use Domain\Localization\Resources\LanguageCollection;
use Domain\Localization\Requests\CreateLanguageRequest;
use Domain\Localization\Requests\UpdateLanguageRequest;
class LanguageController extends Controller
{
/**
* Get all languages for admin translate
*
* @return array|Application|ResponseFactory|Response
*/
public function get_languages()
{
return response(
new LanguageCollection(Language::sortable(['created_at', 'DESC'])->get()),
200
);
}
/**
* Get all language strings for admin translate
*
* @param Language $language
*/
public function get_language(Language $language)
{
return response(
new LanguageResource($language),
200
);
}
/**
* Create new language
*
* @param CreateLanguageRequest $request
* @return string
*/
public function create_language(CreateLanguageRequest $request)
{
// Abort in demo mode
abort_if(is_demo(), 204, 'Done.');
$language = Language::create([
'name' => $request->input('name'),
'locale' => $request->input('locale'),
]);
return response(
new LanguageResource($language),
201
);
}
/**
* Update language
*
* @param UpdateLanguageRequest $request
* @param Language $language
*/
public function update_language(UpdateLanguageRequest $request, Language $language)
{
// Abort in demo mode
abort_if(is_demo(), 204, 'Done.');
$language->update(make_single_input($request));
return response(
new LanguageResource($language),
201
);
}
/**
* Update string for language
*
* @param UpdateStringRequest $request
* @param Language $language
* @return Application|ResponseFactory|Response
*/
public function update_string(UpdateStringRequest $request, Language $language)
{
// Abort in demo mode
abort_if(is_demo(), 204, 'Done.');
$language
->languageTranslations()
->where('key', $request->name)
->update([
'value' => $request->value,
]);
cache()->forget("language-translations-{$language->locale}");
return response(
'Done',
204
);
}
/**
* Delete the language with all children strings
* @param Language $language
* @return Response
*/
public function delete_language(Language $language): Response
{
// Abort in demo mode
abort_if(is_demo(), 204, 'Done.');
if ($language->locale === 'en') {
return response("Sorry, you can't delete default language.", 401);
}
// If user try to delete language used as default,
// then set en language as default
if ($language->locale === get_setting('language')) {
Setting::whereName('language')->first()
->update(['value' => 'en']);
}
$language->delete();
return response(
'Done',
204
);
}
}
@@ -0,0 +1,62 @@
<?php
namespace Domain\Localization\Models;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\DB;
use Kyslik\ColumnSortable\Sortable;
use Illuminate\Database\Eloquent\Model;
use Domain\Localization\Services\LanguageService;
/**
* @method static whereLocale(string $param)
*/
class Language extends Model
{
use Sortable;
public $sortable = [
'created_at',
];
protected $guarded = [
'id',
];
protected $keyType = 'string';
protected $primaryKey = 'id';
public $incrementing = false;
public function languageTranslations()
{
return $this->hasMany(LanguageTranslation::class, 'lang', 'locale');
}
protected static function boot()
{
parent::boot();
static::creating(function ($language) {
$language->id = Str::uuid();
resolve(LanguageService::class)
->create_default_language_translations(
get_setting('license') ?? 'extended',
$language->locale
);
});
static::updating(function ($language) {
cache()->forget("language-translations-$language->locale");
});
static::deleting(function ($language) {
DB::table('language_translations')
->whereLang($language->locale)
->delete();
cache()->forget("language-translations-$language->locale");
});
}
}
@@ -0,0 +1,20 @@
<?php
namespace Domain\Localization\Models;
use Illuminate\Database\Eloquent\Model;
/**
* @method static whereLang(string $string)
*/
class LanguageTranslation extends Model
{
public $timestamps = false;
public $primaryKey = null;
public $incrementing = false;
protected $fillable = [
'value',
];
}
@@ -0,0 +1,30 @@
<?php
namespace Domain\Localization\Requests;
use Illuminate\Foundation\Http\FormRequest;
class CreateLanguageRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'name' => 'required|string',
'locale' => 'required|string',
];
}
}
@@ -0,0 +1,30 @@
<?php
namespace Domain\Localization\Requests;
use Illuminate\Foundation\Http\FormRequest;
class UpdateLanguageRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'name' => 'required|string',
'value' => 'required|string',
];
}
}
@@ -0,0 +1,30 @@
<?php
namespace Domain\Localization\Requests;
use Illuminate\Foundation\Http\FormRequest;
class UpdateStringRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'name' => 'required|string',
'value' => 'required|string',
];
}
}
@@ -0,0 +1,31 @@
<?php
namespace Domain\Localization\Resources;
use Domain\Localization\Models\Language;
use Illuminate\Http\Resources\Json\ResourceCollection;
class LanguageCollection extends ResourceCollection
{
public $collects = LanguageResource::class;
/**
* Transform the resource collection into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
$current_language = Language::with('languageTranslations')
->whereLocale(get_setting('language') ?? 'en')
->first();
return [
'data' => $this->collection,
'meta' => [
'current_language' => new LanguageResource($current_language),
'reference_translations' => get_default_language_translations(),
],
];
}
}
@@ -0,0 +1,30 @@
<?php
namespace Domain\Localization\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class LanguageResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'data' => [
'id' => $this->id,
'type' => 'languages',
'attributes' => [
'name' => $this->name,
'locale' => $this->locale,
'translations' => map_language_translations($this->languageTranslations),
'updated_at' => $this->updated_at,
'created_at' => $this->created_at,
],
],
];
}
}
@@ -0,0 +1,100 @@
<?php
namespace Domain\Localization\Services;
use DB;
use Domain\Localization\Models\Language;
use Domain\Localization\Models\LanguageTranslation;
class LanguageService
{
/**
* @param $license
* @param $locale
*/
public function create_default_language_translations($license, $locale)
{
$translations = [
'extended' => collect([
config('language-translations.extended'),
config('language-translations.regular'),
config('custom-language-translations'),
])->collapse(),
'regular' => collect([
config('language-translations.regular'),
config('custom-language-translations'),
])->collapse(),
];
$translations = $translations[strtolower($license)]
->map(function ($value, $key) use ($locale) {
return [
'lang' => $locale,
'value' => $value,
'key' => $key,
];
})->toArray();
$chunks = array_chunk($translations, 100);
foreach ($chunks as $chunk) {
DB::table('language_translations')
->insert($chunk);
}
}
/**
* Find newly added translations in default language
* translations file and insert it into database
*/
public function upgrade_language_translations()
{
// Get all app locales
$locales = Language::all()
->pluck('locale');
// Get default translations
$translations = LanguageTranslation::whereLang('en')
->get();
$default_translations = [
'extended' => collect([
config('language-translations.extended'),
config('language-translations.regular'),
config('custom-language-translations'),
])->collapse(),
'regular' => collect([
config('language-translations.regular'),
config('custom-language-translations'),
])->collapse(),
];
$license = strtolower(get_setting('license'));
// Find new translations in default translations
$newbies = $default_translations[$license]
->diffKeys(map_language_translations($translations));
// Store new translations for every language
$locales->each(function ($locale) use ($newbies) {
$translations = $newbies
->map(function ($value, $key) use ($locale) {
return [
'lang' => $locale,
'value' => $value,
'key' => $key,
];
})->toArray();
$chunks = array_chunk($translations, 100);
foreach ($chunks as $chunk) {
// Store translations into database
DB::table('language_translations')
->insert($chunk);
}
// Flush cache
cache()->forget("language-translations-$locale");
});
}
}