Update: laravel 8 to 12, php 7.3 to php 8.3, Jenkinsfile, Unit/Feature testing, vapor, docker

This commit is contained in:
Dillon Ngo
2026-04-03 06:59:39 +08:00
parent 58de1017d7
commit b34b7c19d6
142 changed files with 3334 additions and 1101 deletions
@@ -4,6 +4,7 @@ namespace App\Classes\Modules\Accounts\Standards\Validators;
use App\Classes\General\Abstracts\AbstractValidation;
use App\Classes\Modules\Accounts\DataTransferObjects\UserObject;
use Illuminate\Validation\Rule;
class UserCreateValidation extends AbstractValidation
{
@@ -28,9 +29,9 @@ class UserCreateValidation extends AbstractValidation
protected function rules(): array
{
return [
'name' => 'required',
'email' => 'required|unique:users',
'password' => 'required',
'name' => 'required',
'email' => ['required', Rule::unique('users')],
'password' => 'required',
];
}
@@ -4,6 +4,7 @@ namespace App\Classes\Modules\Accounts\Standards\Validators;
use App\Classes\General\Abstracts\AbstractValidation;
use App\Classes\Modules\Accounts\DataTransferObjects\RegistrationObject;
use Illuminate\Validation\Rule;
class UserRegistrationValidation extends AbstractValidation
{
@@ -32,7 +33,7 @@ class UserRegistrationValidation extends AbstractValidation
{
return [
'name' => 'required',
'email' => 'required|email|max:255|unique:users,email',
'email' => ['required', 'email', 'max:255', Rule::unique('users', 'email')],
'password' => 'required|min:6|confirmed',
'type' => 'required',
'status' => 'required'
@@ -56,7 +56,7 @@ class UpdateCompanyLogic extends AbstractControllerLogic
*/
public function logic(Request $request) : JsonResponse
{
$object = new CompanyObject($request->input('name'), $request->input('reference'), $request->input('type'));
$object = new CompanyObject($request->input('name'), $request->input('reference'), $request->input('business_type'), $request->input('type'));
$this->canUpdateCompany->passes($object);
@@ -67,4 +67,4 @@ class UpdateCompanyLogic extends AbstractControllerLogic
return $this->resourceResponse(new CompanyResource($query));
}
}
}
@@ -7,6 +7,7 @@ use App\Classes\General\Interfaces\DataTransferObject;
use App\Classes\ValueObjects\Constants\FileType;
use Illuminate\Support\Str;
use Intervention\Image\ImageManager;
use Intervention\Image\Drivers\Gd\Driver;
class FileObject implements DataTransferObject
{
@@ -28,7 +29,13 @@ class FileObject implements DataTransferObject
*/
public function getData()
{
return in_array($this->getExtension(), ['pdf', 'excel', 'text']) ? $this->data : (new imageManager())->make($this->data);
// intervention/image v2: old
//return in_array($this->getExtension(), ['pdf', 'excel', 'text']) ? $this->data : (new imageManager())->make($this->data);
// intervention/image v3: new
return in_array($this->getExtension(), ['pdf', 'excel', 'text'])
? $this->data
: (new ImageManager(new Driver()))->read($this->data);
}
/**
@@ -53,7 +60,7 @@ class FileObject implements DataTransferObject
*/
public function getExtension(): string
{
if(array_key_exists($this->getMimeType(), FileType::EXTENSION)){
if (array_key_exists($this->getMimeType(), FileType::EXTENSION)) {
return FileType::EXTENSION[$this->getMimeType()];
}
@@ -66,9 +73,10 @@ class FileObject implements DataTransferObject
*/
public function getDecodedData(): string
{
// intervention/image v3: Use encode()->toDataUri() instead of encode('data-url')->encoded
return in_array($this->getExtension(), ['pdf', 'excel', 'text']) ?
base64_decode((explode('base64,', $this->getData()))[1]):
$this->getData()->encode('data-url')->encoded;
base64_decode((explode('base64,', $this->getData()))[1]) :
$this->getData()->encode()->toDataUri();
}
/**
@@ -32,7 +32,8 @@ class ConvertsBase64ToFile
* @return array
* @throws MalformedRequestException
*/
public function convert($files = []){
public function convert($files = [])
{
foreach ($files as $file) {
$object = new FileObject($file);
@@ -48,41 +49,47 @@ class ConvertsBase64ToFile
* @param FileObject $file
* @throws MalformedRequestException
*/
private function generatePDF(FileObject $file){
private function generatePDF(FileObject $file)
{
$filePath = $this->generateFile($file);
$this->updateFiles($file, [ 'original' => [ 'file' => $filePath ] ]);
$this->updateFiles($file, ['original' => ['file' => $filePath]]);
}
/**
* @param FileObject $file
* @throws MalformedRequestException
*/
private function generateImage(FileObject $file){
private function generateImage(FileObject $file)
{
$fileInfo = [];
foreach (['original' => null, 'large' => 800, 'medium' => 480, 'small' => 320] as $size => $value) {
$suffix = $size !== 'original' ? '_'.$size : '';
$suffix = $size !== 'original' ? '_' . $size : '';
if($size !== 'original') {
$thumbnail = $file->getData()->widen($value, function ($constraint) {
if ($size !== 'original') {
// intervention/image v2: old
// $thumbnail = $file->getData()->widen($value, function ($constraint) {
// $constraint->upsize();
// })->heighten($value, function ($constraint) {
// $constraint->upsize();
// });
// $file->setData($thumbnail->encode('data-url')->encoded);
$constraint->upsize();
})->heighten($value, function ($constraint) {
// intervention/image v3: Use scaleDown() instead of widen()/heighten()
// scaleDown() maintains aspect ratio and prevents upsizing by default
$thumbnail = $file->getData()->scaleDown(width: $value, height: $value);
$constraint->upsize();
});
$file->setData($thumbnail->encode('data-url')->encoded);
// intervention/image v3: Use encode()->toDataUri() instead of encode('data-url')->encoded
$file->setData($thumbnail->encode()->toDataUri());
}
$filePath = $this->generateFile($file, $suffix);
$fileInfo[] = [ $size => [ 'file' => $filePath, 'width' => $file->getData()->width(), 'height' => $file->getData()->height() ]];
$fileInfo[] = [$size => ['file' => $filePath, 'width' => $file->getData()->width(), 'height' => $file->getData()->height()]];
}
@@ -97,16 +104,16 @@ class ConvertsBase64ToFile
* @return string
* @throws MalformedRequestException
*/
private function generateFile(FileObject $file, string $suffix = '') {
private function generateFile(FileObject $file, string $suffix = '')
{
$filesystemDriver = Storage::getDefaultDriver();
if($filesystemDriver === 's3'){
$filePath = 'documents/'.$this->path.'/'.$file->getFileName().$suffix.'.'.$file->getExtension();
if ($filesystemDriver === 's3') {
$filePath = 'documents/' . $this->path . '/' . $file->getFileName() . $suffix . '.' . $file->getExtension();
Storage::put($filePath, $file->getDecodedData(), 's3');
return $filePath;
}
else{
$filePath = $this->path.'/'.$file->getFileName().$suffix.'.'.$file->getExtension();
} else {
$filePath = $this->path . '/' . $file->getFileName() . $suffix . '.' . $file->getExtension();
Storage::disk('documents')->put($filePath, $file->getDecodedData());
return $filePath;
}
@@ -117,10 +124,11 @@ class ConvertsBase64ToFile
* @param array $fileInfo
* @throws MalformedRequestException
*/
private function updateFiles(FileObject $file, array $fileInfo){
private function updateFiles(FileObject $file, array $fileInfo)
{
$this->filesInfo[] = json_encode([
'path' => $this->path,
'filename' => $file->getFileName().'.'.$file->getExtension(),
'filename' => $file->getFileName() . '.' . $file->getExtension(),
'mime_type' => $file->getMimeType(),
'extension' => $file->getExtension(),
'file_info' => $fileInfo
@@ -19,14 +19,19 @@ class CreatesFiles extends AbstractUpdateRelationshipRecord
{
$models = [];
// foreach ($object->getFiles() as $file) {
// $model = new File(['file' => $file]);
// $models[] = $this->handler($document->files(), $model);
// }
foreach ($object->getFiles() as $file) {
$model = new File(['file' => $file]);
$fileData = is_string($file) ? json_decode($file, true) : $file;
$model = new File(['file' => $fileData]);
$models[] = $this->handler($document->files(), $model);
}
return $models;
}
}
@@ -20,7 +20,7 @@ class CreatesConstant extends AbstractUpdateRelationshipRecord
$model = new SegmentConstant();
$model->name = $object->getName();
$model->reference = $object->getReference();
$model->detail = json_encode($object->getDetail());
$model->detail = $object->getDetail();
return $this->handler($segment->constants(), $model);
}
@@ -19,7 +19,7 @@ class UpdatesConstant extends AbstractUpdateRecord
{
$model->name = $object->getName();
$model->reference = $object->getReference();
$model->detail = json_encode($object->getDetail());
$model->detail = $object->getDetail();
return $this->handler($model);
}
@@ -6,6 +6,7 @@ use App\Classes\General\Abstracts\AbstractRule;
use App\Classes\Modules\Segments\DataTransferObjects\SegmentObject;
use App\Classes\Modules\Segments\Standards\Validators\SegmentValidation;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
class CanCreateSegment extends AbstractRule
{
@@ -28,7 +29,10 @@ class CanCreateSegment extends AbstractRule
protected function authorized($object): bool
{
// TODO Set Authorization rules
if (!Auth::user()->can('add segment')) {
/** @var \App\Models\User $user */
$user = Auth::user();
if (!$user->can('add segment')) {
return false;
}
@@ -53,4 +57,4 @@ class CanCreateSegment extends AbstractRule
{
return true;
}
}
}
@@ -139,8 +139,7 @@ class CreateInvoiceTransactionV2Processor
->complete()
->first();
if(!$purchaseOrder){
//was use for $generateEInvoiceRefund true
if(!$purchaseOrder && $generateEInvoiceRefund){
$purchaseOrder = $booking->transactions()
->where('type', TransactionType::PURCHASE_ORDER)
->where('status', ApprovalStatus::PENDING_SUBMISSION)