Compare commits
No commits in common. '35761327f9af3ab4cd57e9b1bb34daf256c2d2ee' and 'ddc63103317fbaa5bd35dba1d010bfc2be2e7900' have entirely different histories.
35761327f9
...
ddc6310331
@ -1,27 +0,0 @@ |
|||||||
<?php |
|
||||||
|
|
||||||
namespace App\Enums; |
|
||||||
|
|
||||||
use App\Services\Chunkers\JsonChunker; |
|
||||||
use App\Services\Converters\JsonToDatabaseConverter; |
|
||||||
|
|
||||||
enum FileFormatEnum: string |
|
||||||
{ |
|
||||||
case JSON = 'json'; |
|
||||||
|
|
||||||
public function chunker(string $uuid, string $path): \Generator |
|
||||||
{ |
|
||||||
$chunker = match ($this) { |
|
||||||
self::JSON => new JsonChunker |
|
||||||
}; |
|
||||||
|
|
||||||
return $chunker->handle($uuid, $path); |
|
||||||
} |
|
||||||
|
|
||||||
public function converter() |
|
||||||
{ |
|
||||||
return match($this){ |
|
||||||
self::JSON => new JsonToDatabaseConverter |
|
||||||
}; |
|
||||||
} |
|
||||||
} |
|
||||||
@ -1,33 +0,0 @@ |
|||||||
<?php |
|
||||||
|
|
||||||
namespace App\Http\Controllers\V1; |
|
||||||
|
|
||||||
use App\Enums\FileFormatEnum; |
|
||||||
use App\Http\Controllers\Controller; |
|
||||||
use App\Jobs\ChunkFile; |
|
||||||
use Illuminate\Http\Request; |
|
||||||
use Illuminate\Support\Facades\Redis; |
|
||||||
use Illuminate\Support\Facades\Storage; |
|
||||||
use Illuminate\Support\Str; |
|
||||||
|
|
||||||
class ConvertController extends Controller |
|
||||||
{ |
|
||||||
public function convert(FileFormatEnum $format, Request $request) |
|
||||||
{ |
|
||||||
Storage::put( |
|
||||||
$request->file('file')->getClientOriginalName(), |
|
||||||
$request->file('file')->getContent(), |
|
||||||
); |
|
||||||
|
|
||||||
ChunkFile::dispatch( |
|
||||||
Str::uuid(), |
|
||||||
$request->file('file')->getClientOriginalName(), |
|
||||||
$format |
|
||||||
); |
|
||||||
|
|
||||||
return response([ |
|
||||||
'msg' => 'done', |
|
||||||
'success' => true |
|
||||||
]); |
|
||||||
} |
|
||||||
} |
|
||||||
@ -1,8 +0,0 @@ |
|||||||
<?php |
|
||||||
|
|
||||||
namespace App\Interfaces; |
|
||||||
|
|
||||||
interface ChunkerInterface |
|
||||||
{ |
|
||||||
public function handle(string $uuid, string $path): \Generator; |
|
||||||
} |
|
||||||
@ -1,48 +0,0 @@ |
|||||||
<?php |
|
||||||
|
|
||||||
namespace App\Jobs; |
|
||||||
|
|
||||||
use App\Enums\FileFormatEnum; |
|
||||||
use Illuminate\Bus\Queueable; |
|
||||||
use Illuminate\Contracts\Queue\ShouldBeUnique; |
|
||||||
use Illuminate\Contracts\Queue\ShouldQueue; |
|
||||||
use Illuminate\Foundation\Bus\Dispatchable; |
|
||||||
use Illuminate\Queue\InteractsWithQueue; |
|
||||||
use Illuminate\Queue\SerializesModels; |
|
||||||
use Illuminate\Support\Facades\Redis; |
|
||||||
use Illuminate\Support\Facades\Storage; |
|
||||||
|
|
||||||
class ChunkFile implements ShouldQueue |
|
||||||
{ |
|
||||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; |
|
||||||
|
|
||||||
/** |
|
||||||
* Create a new job instance. |
|
||||||
* |
|
||||||
* @return void |
|
||||||
*/ |
|
||||||
public function __construct( |
|
||||||
public string $uuid, |
|
||||||
public string $path, |
|
||||||
public FileFormatEnum $format |
|
||||||
) |
|
||||||
{ |
|
||||||
// |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Execute the job. |
|
||||||
* |
|
||||||
* @return void |
|
||||||
*/ |
|
||||||
public function handle() |
|
||||||
{ |
|
||||||
$chunks = $this->format->chunker($this->uuid, $this->path); |
|
||||||
foreach ($chunks as $key => $chunk) { |
|
||||||
StoreChunk::dispatch($chunk); |
|
||||||
Redis::set($this->uuid . ":latest", $key); |
|
||||||
} |
|
||||||
Storage::delete($this->path); |
|
||||||
Redis::del($this->uuid . ":latest"); |
|
||||||
} |
|
||||||
} |
|
||||||
@ -1,76 +0,0 @@ |
|||||||
<?php |
|
||||||
|
|
||||||
namespace App\Jobs; |
|
||||||
|
|
||||||
use App\Models\User; |
|
||||||
use App\Pipes\StoreChunk\AgeFilterPipe; |
|
||||||
use App\Pipes\StoreChunk\CreditCardFilter; |
|
||||||
use Illuminate\Bus\Queueable; |
|
||||||
use Illuminate\Contracts\Queue\ShouldBeUnique; |
|
||||||
use Illuminate\Contracts\Queue\ShouldQueue; |
|
||||||
use Illuminate\Foundation\Bus\Dispatchable; |
|
||||||
use Illuminate\Pipeline\Pipeline; |
|
||||||
use Illuminate\Queue\InteractsWithQueue; |
|
||||||
use Illuminate\Queue\SerializesModels; |
|
||||||
use Illuminate\Support\Carbon; |
|
||||||
use Illuminate\Support\Collection; |
|
||||||
|
|
||||||
class StoreChunk implements ShouldQueue |
|
||||||
{ |
|
||||||
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; |
|
||||||
|
|
||||||
public Collection $chunk; |
|
||||||
|
|
||||||
/** |
|
||||||
* Create a new job instance. |
|
||||||
* |
|
||||||
* @return void |
|
||||||
*/ |
|
||||||
public function __construct( |
|
||||||
array $chunk |
|
||||||
) |
|
||||||
{ |
|
||||||
$this->chunk = collect($chunk); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Execute the job. |
|
||||||
* |
|
||||||
* @return void |
|
||||||
*/ |
|
||||||
public function handle() |
|
||||||
{ |
|
||||||
$chunk = (new Pipeline(app())) |
|
||||||
->through([ |
|
||||||
AgeFilterPipe::class, |
|
||||||
CreditCardFilter::class, |
|
||||||
]) |
|
||||||
->send($this->changeDateOfBirthToCarbon()) |
|
||||||
->thenReturn(); |
|
||||||
|
|
||||||
User::insert( |
|
||||||
$this->prepare($chunk)->toArray() |
|
||||||
); |
|
||||||
} |
|
||||||
|
|
||||||
protected function changeDateOfBirthToCarbon() |
|
||||||
{ |
|
||||||
return $this->chunk->map(function ($item) { |
|
||||||
if (!strpos($item['date_of_birth'], '/')) { |
|
||||||
$item['date_of_birth'] = Carbon::create($item['date_of_birth']); |
|
||||||
} else { |
|
||||||
$item['date_of_birth'] = Carbon::createFromFormat('d/m/Y', $item['date_of_birth']); |
|
||||||
} |
|
||||||
|
|
||||||
return $item; |
|
||||||
}); |
|
||||||
} |
|
||||||
|
|
||||||
protected function prepare($chunk) |
|
||||||
{ |
|
||||||
return $chunk->map(function ($item) { |
|
||||||
$item['credit_card'] = json_encode($item['credit_card']); |
|
||||||
return $item; |
|
||||||
}); |
|
||||||
} |
|
||||||
} |
|
||||||
@ -1,24 +0,0 @@ |
|||||||
<?php |
|
||||||
|
|
||||||
namespace App\Pipes\StoreChunk; |
|
||||||
|
|
||||||
use Illuminate\Support\Carbon; |
|
||||||
use Illuminate\Support\Collection; |
|
||||||
|
|
||||||
class AgeFilterPipe |
|
||||||
{ |
|
||||||
/** |
|
||||||
* @param Collection $chunk |
|
||||||
* @param \Closure $next |
|
||||||
* @return mixed |
|
||||||
*/ |
|
||||||
public function handle($chunk, \Closure $next) |
|
||||||
{ |
|
||||||
$chunk = $chunk->filter(function ($item) { |
|
||||||
$age = $item['date_of_birth']->age; |
|
||||||
return 18 <= $age && $age <= 65; |
|
||||||
}); |
|
||||||
|
|
||||||
return $next($chunk); |
|
||||||
} |
|
||||||
} |
|
||||||
@ -1,20 +0,0 @@ |
|||||||
<?php |
|
||||||
|
|
||||||
namespace App\Pipes\StoreChunk; |
|
||||||
|
|
||||||
use Illuminate\Support\Collection; |
|
||||||
|
|
||||||
class CreditCardFilter |
|
||||||
{ |
|
||||||
/** |
|
||||||
* @param Collection $chunk |
|
||||||
* @param \Closure $next |
|
||||||
* @return mixed |
|
||||||
*/ |
|
||||||
public function handle($chunk, \Closure $next) |
|
||||||
{ |
|
||||||
// filter based on credit card number |
|
||||||
|
|
||||||
return $next($chunk); |
|
||||||
} |
|
||||||
} |
|
||||||
@ -1,42 +0,0 @@ |
|||||||
<?php |
|
||||||
|
|
||||||
namespace App\Providers; |
|
||||||
|
|
||||||
use Illuminate\Support\Facades\Gate; |
|
||||||
use Laravel\Horizon\Horizon; |
|
||||||
use Laravel\Horizon\HorizonApplicationServiceProvider; |
|
||||||
|
|
||||||
class HorizonServiceProvider extends HorizonApplicationServiceProvider |
|
||||||
{ |
|
||||||
/** |
|
||||||
* Bootstrap any application services. |
|
||||||
* |
|
||||||
* @return void |
|
||||||
*/ |
|
||||||
public function boot() |
|
||||||
{ |
|
||||||
parent::boot(); |
|
||||||
|
|
||||||
// Horizon::routeSmsNotificationsTo('15556667777'); |
|
||||||
// Horizon::routeMailNotificationsTo('example@example.com'); |
|
||||||
// Horizon::routeSlackNotificationsTo('slack-webhook-url', '#channel'); |
|
||||||
|
|
||||||
// Horizon::night(); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* Register the Horizon gate. |
|
||||||
* |
|
||||||
* This gate determines who can access Horizon in non-local environments. |
|
||||||
* |
|
||||||
* @return void |
|
||||||
*/ |
|
||||||
protected function gate() |
|
||||||
{ |
|
||||||
Gate::define('viewHorizon', function ($user) { |
|
||||||
return in_array($user->email, [ |
|
||||||
// |
|
||||||
]); |
|
||||||
}); |
|
||||||
} |
|
||||||
} |
|
||||||
@ -1,46 +0,0 @@ |
|||||||
<?php |
|
||||||
|
|
||||||
namespace App\Services\Chunkers; |
|
||||||
|
|
||||||
use App\Interfaces\ChunkerInterface; |
|
||||||
use App\Services\Decoder\JsonDecoder; |
|
||||||
use Illuminate\Support\Facades\Redis; |
|
||||||
use Illuminate\Support\Facades\Storage; |
|
||||||
use JsonMachine\Exception\InvalidArgumentException; |
|
||||||
use JsonMachine\Items; |
|
||||||
use JsonMachine\JsonDecoder\ExtJsonDecoder; |
|
||||||
|
|
||||||
class JsonChunker implements ChunkerInterface |
|
||||||
{ |
|
||||||
/** |
|
||||||
* @throws InvalidArgumentException |
|
||||||
*/ |
|
||||||
public function handle(string $uuid, string $path): \Generator |
|
||||||
{ |
|
||||||
$chunk = []; |
|
||||||
|
|
||||||
$latest = Redis::get($uuid . ":latest") ?? 0; |
|
||||||
|
|
||||||
foreach (Items::fromFile(Storage::path($path), ['decoder' => new ExtJsonDecoder(true)]) as $key => $value) { |
|
||||||
if ($key < $latest) { |
|
||||||
continue; |
|
||||||
} |
|
||||||
|
|
||||||
// for cut off test you have to uncomment below codes |
|
||||||
// if($key == 900){ |
|
||||||
// throw new \Exception('cut off'); |
|
||||||
// } |
|
||||||
|
|
||||||
$chunk[] = $value; |
|
||||||
|
|
||||||
if (count($chunk) == 500) { |
|
||||||
yield $key => $chunk; |
|
||||||
$chunk = []; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
if (count($chunk) > 0) { |
|
||||||
yield $key => $chunk; |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
@ -1,197 +0,0 @@ |
|||||||
<?php |
|
||||||
|
|
||||||
use Illuminate\Support\Str; |
|
||||||
|
|
||||||
return [ |
|
||||||
|
|
||||||
/* |
|
||||||
|-------------------------------------------------------------------------- |
|
||||||
| Horizon Domain |
|
||||||
|-------------------------------------------------------------------------- |
|
||||||
| |
|
||||||
| This is the subdomain where Horizon will be accessible from. If this |
|
||||||
| setting is null, Horizon will reside under the same domain as the |
|
||||||
| application. Otherwise, this value will serve as the subdomain. |
|
||||||
| |
|
||||||
*/ |
|
||||||
|
|
||||||
'domain' => env('HORIZON_DOMAIN'), |
|
||||||
|
|
||||||
/* |
|
||||||
|-------------------------------------------------------------------------- |
|
||||||
| Horizon Path |
|
||||||
|-------------------------------------------------------------------------- |
|
||||||
| |
|
||||||
| This is the URI path where Horizon will be accessible from. Feel free |
|
||||||
| to change this path to anything you like. Note that the URI will not |
|
||||||
| affect the paths of its internal API that aren't exposed to users. |
|
||||||
| |
|
||||||
*/ |
|
||||||
|
|
||||||
'path' => env('HORIZON_PATH', 'horizon'), |
|
||||||
|
|
||||||
/* |
|
||||||
|-------------------------------------------------------------------------- |
|
||||||
| Horizon Redis Connection |
|
||||||
|-------------------------------------------------------------------------- |
|
||||||
| |
|
||||||
| This is the name of the Redis connection where Horizon will store the |
|
||||||
| meta information required for it to function. It includes the list |
|
||||||
| of supervisors, failed jobs, job metrics, and other information. |
|
||||||
| |
|
||||||
*/ |
|
||||||
|
|
||||||
'use' => 'default', |
|
||||||
|
|
||||||
/* |
|
||||||
|-------------------------------------------------------------------------- |
|
||||||
| Horizon Redis Prefix |
|
||||||
|-------------------------------------------------------------------------- |
|
||||||
| |
|
||||||
| This prefix will be used when storing all Horizon data in Redis. You |
|
||||||
| may modify the prefix when you are running multiple installations |
|
||||||
| of Horizon on the same server so that they don't have problems. |
|
||||||
| |
|
||||||
*/ |
|
||||||
|
|
||||||
'prefix' => env( |
|
||||||
'HORIZON_PREFIX', |
|
||||||
Str::slug(env('APP_NAME', 'laravel'), '_').'_horizon:' |
|
||||||
), |
|
||||||
|
|
||||||
/* |
|
||||||
|-------------------------------------------------------------------------- |
|
||||||
| Horizon Route Middleware |
|
||||||
|-------------------------------------------------------------------------- |
|
||||||
| |
|
||||||
| These middleware will get attached onto each Horizon route, giving you |
|
||||||
| the chance to add your own middleware to this list or change any of |
|
||||||
| the existing middleware. Or, you can simply stick with this list. |
|
||||||
| |
|
||||||
*/ |
|
||||||
|
|
||||||
'middleware' => ['web'], |
|
||||||
|
|
||||||
/* |
|
||||||
|-------------------------------------------------------------------------- |
|
||||||
| Queue Wait Time Thresholds |
|
||||||
|-------------------------------------------------------------------------- |
|
||||||
| |
|
||||||
| This option allows you to configure when the LongWaitDetected event |
|
||||||
| will be fired. Every connection / queue combination may have its |
|
||||||
| own, unique threshold (in seconds) before this event is fired. |
|
||||||
| |
|
||||||
*/ |
|
||||||
|
|
||||||
'waits' => [ |
|
||||||
'redis:default' => 60, |
|
||||||
], |
|
||||||
|
|
||||||
/* |
|
||||||
|-------------------------------------------------------------------------- |
|
||||||
| Job Trimming Times |
|
||||||
|-------------------------------------------------------------------------- |
|
||||||
| |
|
||||||
| Here you can configure for how long (in minutes) you desire Horizon to |
|
||||||
| persist the recent and failed jobs. Typically, recent jobs are kept |
|
||||||
| for one hour while all failed jobs are stored for an entire week. |
|
||||||
| |
|
||||||
*/ |
|
||||||
|
|
||||||
'trim' => [ |
|
||||||
'recent' => 60, |
|
||||||
'pending' => 60, |
|
||||||
'completed' => 60, |
|
||||||
'recent_failed' => 10080, |
|
||||||
'failed' => 10080, |
|
||||||
'monitored' => 10080, |
|
||||||
], |
|
||||||
|
|
||||||
/* |
|
||||||
|-------------------------------------------------------------------------- |
|
||||||
| Metrics |
|
||||||
|-------------------------------------------------------------------------- |
|
||||||
| |
|
||||||
| Here you can configure how many snapshots should be kept to display in |
|
||||||
| the metrics graph. This will get used in combination with Horizon's |
|
||||||
| `horizon:snapshot` schedule to define how long to retain metrics. |
|
||||||
| |
|
||||||
*/ |
|
||||||
|
|
||||||
'metrics' => [ |
|
||||||
'trim_snapshots' => [ |
|
||||||
'job' => 24, |
|
||||||
'queue' => 24, |
|
||||||
], |
|
||||||
], |
|
||||||
|
|
||||||
/* |
|
||||||
|-------------------------------------------------------------------------- |
|
||||||
| Fast Termination |
|
||||||
|-------------------------------------------------------------------------- |
|
||||||
| |
|
||||||
| When this option is enabled, Horizon's "terminate" command will not |
|
||||||
| wait on all of the workers to terminate unless the --wait option |
|
||||||
| is provided. Fast termination can shorten deployment delay by |
|
||||||
| allowing a new instance of Horizon to start while the last |
|
||||||
| instance will continue to terminate each of its workers. |
|
||||||
| |
|
||||||
*/ |
|
||||||
|
|
||||||
'fast_termination' => false, |
|
||||||
|
|
||||||
/* |
|
||||||
|-------------------------------------------------------------------------- |
|
||||||
| Memory Limit (MB) |
|
||||||
|-------------------------------------------------------------------------- |
|
||||||
| |
|
||||||
| This value describes the maximum amount of memory the Horizon master |
|
||||||
| supervisor may consume before it is terminated and restarted. For |
|
||||||
| configuring these limits on your workers, see the next section. |
|
||||||
| |
|
||||||
*/ |
|
||||||
|
|
||||||
'memory_limit' => 64, |
|
||||||
|
|
||||||
/* |
|
||||||
|-------------------------------------------------------------------------- |
|
||||||
| Queue Worker Configuration |
|
||||||
|-------------------------------------------------------------------------- |
|
||||||
| |
|
||||||
| Here you may define the queue worker settings used by your application |
|
||||||
| in all environments. These supervisors and settings handle all your |
|
||||||
| queued jobs and will be provisioned by Horizon during deployment. |
|
||||||
| |
|
||||||
*/ |
|
||||||
|
|
||||||
'defaults' => [ |
|
||||||
'supervisor-1' => [ |
|
||||||
'connection' => 'redis', |
|
||||||
'queue' => ['default'], |
|
||||||
'balance' => 'auto', |
|
||||||
'maxProcesses' => 1, |
|
||||||
'maxTime' => 0, |
|
||||||
'maxJobs' => 0, |
|
||||||
'memory' => 128, |
|
||||||
'tries' => 1, |
|
||||||
'timeout' => 60, |
|
||||||
'nice' => 0, |
|
||||||
], |
|
||||||
], |
|
||||||
|
|
||||||
'environments' => [ |
|
||||||
'production' => [ |
|
||||||
'supervisor-1' => [ |
|
||||||
'maxProcesses' => 10, |
|
||||||
'balanceMaxShift' => 1, |
|
||||||
'balanceCooldown' => 3, |
|
||||||
], |
|
||||||
], |
|
||||||
|
|
||||||
'local' => [ |
|
||||||
'supervisor-1' => [ |
|
||||||
'maxProcesses' => 3, |
|
||||||
], |
|
||||||
], |
|
||||||
], |
|
||||||
]; |
|
||||||
@ -0,0 +1,32 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration; |
||||||
|
use Illuminate\Database\Schema\Blueprint; |
||||||
|
use Illuminate\Support\Facades\Schema; |
||||||
|
|
||||||
|
return new class extends Migration |
||||||
|
{ |
||||||
|
/** |
||||||
|
* Run the migrations. |
||||||
|
* |
||||||
|
* @return void |
||||||
|
*/ |
||||||
|
public function up() |
||||||
|
{ |
||||||
|
Schema::create('password_resets', function (Blueprint $table) { |
||||||
|
$table->string('email')->index(); |
||||||
|
$table->string('token'); |
||||||
|
$table->timestamp('created_at')->nullable(); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Reverse the migrations. |
||||||
|
* |
||||||
|
* @return void |
||||||
|
*/ |
||||||
|
public function down() |
||||||
|
{ |
||||||
|
Schema::dropIfExists('password_resets'); |
||||||
|
} |
||||||
|
}; |
||||||
@ -0,0 +1,37 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration; |
||||||
|
use Illuminate\Database\Schema\Blueprint; |
||||||
|
use Illuminate\Support\Facades\Schema; |
||||||
|
|
||||||
|
return new class extends Migration |
||||||
|
{ |
||||||
|
/** |
||||||
|
* Run the migrations. |
||||||
|
* |
||||||
|
* @return void |
||||||
|
*/ |
||||||
|
public function up() |
||||||
|
{ |
||||||
|
Schema::create('personal_access_tokens', function (Blueprint $table) { |
||||||
|
$table->id(); |
||||||
|
$table->morphs('tokenable'); |
||||||
|
$table->string('name'); |
||||||
|
$table->string('token', 64)->unique(); |
||||||
|
$table->text('abilities')->nullable(); |
||||||
|
$table->timestamp('last_used_at')->nullable(); |
||||||
|
$table->timestamp('expires_at')->nullable(); |
||||||
|
$table->timestamps(); |
||||||
|
}); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Reverse the migrations. |
||||||
|
* |
||||||
|
* @return void |
||||||
|
*/ |
||||||
|
public function down() |
||||||
|
{ |
||||||
|
Schema::dropIfExists('personal_access_tokens'); |
||||||
|
} |
||||||
|
}; |
||||||
@ -1,3 +0,0 @@ |
|||||||
create database testing; |
|
||||||
GRANT ALL ON `testing`.* TO 'sail'@'%'; |
|
||||||
FLUSH PRIVILEGES; |
|
||||||
@ -0,0 +1,19 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
use Illuminate\Http\Request; |
||||||
|
use Illuminate\Support\Facades\Route; |
||||||
|
|
||||||
|
/* |
||||||
|
|-------------------------------------------------------------------------- |
||||||
|
| API Routes |
||||||
|
|-------------------------------------------------------------------------- |
||||||
|
| |
||||||
|
| Here is where you can register API routes for your application. These |
||||||
|
| routes are loaded by the RouteServiceProvider within a group which |
||||||
|
| is assigned the "api" middleware group. Enjoy building your API! |
||||||
|
| |
||||||
|
*/ |
||||||
|
|
||||||
|
Route::middleware('auth:sanctum')->get('/user', function (Request $request) { |
||||||
|
return $request->user(); |
||||||
|
}); |
||||||
@ -1,10 +0,0 @@ |
|||||||
<?php |
|
||||||
|
|
||||||
use Illuminate\Support\Facades\Route; |
|
||||||
|
|
||||||
Route::prefix('convert')->group(function () { |
|
||||||
Route::post('{format}', [ |
|
||||||
\App\Http\Controllers\V1\ConvertController::class, |
|
||||||
'convert' |
|
||||||
]); |
|
||||||
}); |
|
||||||
@ -1,40 +0,0 @@ |
|||||||
<?php |
|
||||||
|
|
||||||
namespace Tests\Feature\Upload; |
|
||||||
|
|
||||||
use App\Jobs\ChunkFile; |
|
||||||
use Illuminate\Foundation\Testing\RefreshDatabase; |
|
||||||
use Illuminate\Foundation\Testing\WithFaker; |
|
||||||
use Illuminate\Http\Testing\File; |
|
||||||
use Illuminate\Support\Facades\Bus; |
|
||||||
use Illuminate\Support\Facades\Storage; |
|
||||||
use Tests\TestCase; |
|
||||||
|
|
||||||
class ConvertJsonTest extends TestCase |
|
||||||
{ |
|
||||||
/** |
|
||||||
* upload json file. |
|
||||||
* |
|
||||||
* @return void |
|
||||||
* @group convert |
|
||||||
*/ |
|
||||||
public function test_example() |
|
||||||
{ |
|
||||||
$content = file_get_contents(base_path('/tests/Storage/ConvertJsonTest.json')); |
|
||||||
$file = File::createWithContent( |
|
||||||
'test.json', |
|
||||||
$content |
|
||||||
); |
|
||||||
|
|
||||||
Bus::fake(); |
|
||||||
Storage::fake(); |
|
||||||
|
|
||||||
$this->post('/api/v1/convert/json', [ |
|
||||||
'file' => $file |
|
||||||
]) |
|
||||||
->assertSuccessful(); |
|
||||||
|
|
||||||
Storage::assertExists($file->name); |
|
||||||
Bus::assertDispatched(ChunkFile::class, 1); |
|
||||||
} |
|
||||||
} |
|
||||||
@ -1,98 +0,0 @@ |
|||||||
[ |
|
||||||
{ |
|
||||||
"name": "Mrs. Daphney Borer1", |
|
||||||
"address": "57465 Kelton Trace Suite 676 49508-4359 Lake Iliana", |
|
||||||
"checked": false, |
|
||||||
"description": "Quae quia at quae aut quaerat dolore consectetur. Quaerat saepe perferendis incidunt sapiente optio reiciendis. Rerum inventore et adipisci dolores possimus est voluptas qui.<br>Quis harum reiciendis ipsum. Aliquam quam commodi repellat occaecati. Aut et quam vel cumque eaque est.", |
|
||||||
"interest": "leverage cross-media communities", |
|
||||||
"date_of_birth": "1974-06-30T15:41:42+00:00", |
|
||||||
"email": "flatley.laurie@damore.com", |
|
||||||
"account": "2454926431051", |
|
||||||
"credit_card": { |
|
||||||
"type": "Visa", |
|
||||||
"number": "4532623545165", |
|
||||||
"name": "Grace Kilback", |
|
||||||
"expirationDate": "02\/18" |
|
||||||
} |
|
||||||
}, |
|
||||||
{ |
|
||||||
"name": "Mrs. Daphney Borer2", |
|
||||||
"address": "57465 Kelton Trace Suite 676 49508-4359 Lake Iliana", |
|
||||||
"checked": false, |
|
||||||
"description": "Quae quia at quae aut quaerat dolore consectetur. Quaerat saepe perferendis incidunt sapiente optio reiciendis. Rerum inventore et adipisci dolores possimus est voluptas qui.<br>Quis harum reiciendis ipsum. Aliquam quam commodi repellat occaecati. Aut et quam vel cumque eaque est.", |
|
||||||
"interest": "leverage cross-media communities", |
|
||||||
"date_of_birth": "1974-06-30T15:41:42+00:00", |
|
||||||
"email": "flatley.laurie@damore.com", |
|
||||||
"account": "2454926431051", |
|
||||||
"credit_card": { |
|
||||||
"type": "Visa", |
|
||||||
"number": "4532623545165", |
|
||||||
"name": "Grace Kilback", |
|
||||||
"expirationDate": "02\/18" |
|
||||||
} |
|
||||||
}, |
|
||||||
{ |
|
||||||
"name": "Mrs. Daphney Borer3", |
|
||||||
"address": "57465 Kelton Trace Suite 676 49508-4359 Lake Iliana", |
|
||||||
"checked": false, |
|
||||||
"description": "Quae quia at quae aut quaerat dolore consectetur. Quaerat saepe perferendis incidunt sapiente optio reiciendis. Rerum inventore et adipisci dolores possimus est voluptas qui.<br>Quis harum reiciendis ipsum. Aliquam quam commodi repellat occaecati. Aut et quam vel cumque eaque est.", |
|
||||||
"interest": "leverage cross-media communities", |
|
||||||
"date_of_birth": "1974-06-30T15:41:42+00:00", |
|
||||||
"email": "flatley.laurie@damore.com", |
|
||||||
"account": "2454926431051", |
|
||||||
"credit_card": { |
|
||||||
"type": "Visa", |
|
||||||
"number": "4532623545165", |
|
||||||
"name": "Grace Kilback", |
|
||||||
"expirationDate": "02\/18" |
|
||||||
} |
|
||||||
}, |
|
||||||
{ |
|
||||||
"name": "Mrs. Daphney Borer4", |
|
||||||
"address": "57465 Kelton Trace Suite 676 49508-4359 Lake Iliana", |
|
||||||
"checked": false, |
|
||||||
"description": "Quae quia at quae aut quaerat dolore consectetur. Quaerat saepe perferendis incidunt sapiente optio reiciendis. Rerum inventore et adipisci dolores possimus est voluptas qui.<br>Quis harum reiciendis ipsum. Aliquam quam commodi repellat occaecati. Aut et quam vel cumque eaque est.", |
|
||||||
"interest": "leverage cross-media communities", |
|
||||||
"date_of_birth": "1974-06-30T15:41:42+00:00", |
|
||||||
"email": "flatley.laurie@damore.com", |
|
||||||
"account": "2454926431051", |
|
||||||
"credit_card": { |
|
||||||
"type": "Visa", |
|
||||||
"number": "4532623545165", |
|
||||||
"name": "Grace Kilback", |
|
||||||
"expirationDate": "02\/18" |
|
||||||
} |
|
||||||
}, |
|
||||||
{ |
|
||||||
"name": "Mrs. Daphney Borer5", |
|
||||||
"address": "57465 Kelton Trace Suite 676 49508-4359 Lake Iliana", |
|
||||||
"checked": false, |
|
||||||
"description": "Quae quia at quae aut quaerat dolore consectetur. Quaerat saepe perferendis incidunt sapiente optio reiciendis. Rerum inventore et adipisci dolores possimus est voluptas qui.<br>Quis harum reiciendis ipsum. Aliquam quam commodi repellat occaecati. Aut et quam vel cumque eaque est.", |
|
||||||
"interest": "leverage cross-media communities", |
|
||||||
"date_of_birth": "1974-06-30T15:41:42+00:00", |
|
||||||
"email": "flatley.laurie@damore.com", |
|
||||||
"account": "2454926431051", |
|
||||||
"credit_card": { |
|
||||||
"type": "Visa", |
|
||||||
"number": "4532623545165", |
|
||||||
"name": "Grace Kilback", |
|
||||||
"expirationDate": "02\/18" |
|
||||||
} |
|
||||||
}, |
|
||||||
{ |
|
||||||
"name": "Mrs. Daphney Borer6", |
|
||||||
"address": "57465 Kelton Trace Suite 676 49508-4359 Lake Iliana", |
|
||||||
"checked": false, |
|
||||||
"description": "Quae quia at quae aut quaerat dolore consectetur. Quaerat saepe perferendis incidunt sapiente optio reiciendis. Rerum inventore et adipisci dolores possimus est voluptas qui.<br>Quis harum reiciendis ipsum. Aliquam quam commodi repellat occaecati. Aut et quam vel cumque eaque est.", |
|
||||||
"interest": "leverage cross-media communities", |
|
||||||
"date_of_birth": "1974-06-30T15:41:42+00:00", |
|
||||||
"email": "flatley.laurie@damore.com", |
|
||||||
"account": "2454926431051", |
|
||||||
"credit_card": { |
|
||||||
"type": "Visa", |
|
||||||
"number": "4532623545165", |
|
||||||
"name": "Grace Kilback", |
|
||||||
"expirationDate": "02\/18" |
|
||||||
} |
|
||||||
} |
|
||||||
] |
|
||||||
@ -1,39 +0,0 @@ |
|||||||
<?php |
|
||||||
|
|
||||||
namespace Tests\Unit\Jobs; |
|
||||||
|
|
||||||
use App\Enums\FileFormatEnum; |
|
||||||
use App\Jobs\ChunkFile; |
|
||||||
use App\Jobs\StoreChunk; |
|
||||||
use Illuminate\Support\Facades\Queue; |
|
||||||
use Illuminate\Support\Facades\Storage; |
|
||||||
use Illuminate\Support\Str; |
|
||||||
use Tests\TestCase; |
|
||||||
use Illuminate\Support\Facades\Bus; |
|
||||||
|
|
||||||
class ChunkFileTest extends TestCase |
|
||||||
{ |
|
||||||
/** |
|
||||||
* A basic unit test example. |
|
||||||
* |
|
||||||
* @return void |
|
||||||
* @group convert |
|
||||||
*/ |
|
||||||
public function test_chunk_json_file() |
|
||||||
{ |
|
||||||
Bus::fake(); |
|
||||||
|
|
||||||
$path = base_path('/tests/Storage/ConvertJsonTest.json'); |
|
||||||
|
|
||||||
Storage::shouldReceive('path')->andReturn($path); |
|
||||||
Storage::shouldReceive('delete')->andReturnTrue(); |
|
||||||
|
|
||||||
(new ChunkFile( |
|
||||||
Str::uuid(), |
|
||||||
$path, |
|
||||||
FileFormatEnum::JSON |
|
||||||
))->handle(); |
|
||||||
|
|
||||||
Bus::assertDispatched(StoreChunk::class, 1); |
|
||||||
} |
|
||||||
} |
|
||||||
@ -1,38 +0,0 @@ |
|||||||
<?php |
|
||||||
|
|
||||||
namespace Tests\Unit\Jobs; |
|
||||||
|
|
||||||
use App\Jobs\StoreChunk; |
|
||||||
use App\Models\User; |
|
||||||
use Illuminate\Database\Eloquent\Factories\Sequence; |
|
||||||
use Tests\TestCase; |
|
||||||
|
|
||||||
class StoreChunkTest extends TestCase |
|
||||||
{ |
|
||||||
/** |
|
||||||
* A basic unit test example. |
|
||||||
* |
|
||||||
* @return void |
|
||||||
* @group convert2 |
|
||||||
*/ |
|
||||||
public function test_store_chunk() |
|
||||||
{ |
|
||||||
(new StoreChunk( |
|
||||||
User::factory()->count(99)->state( |
|
||||||
new Sequence( |
|
||||||
[ |
|
||||||
'date_of_birth' => fake()->dateTimeBetween('-70 years', '-66 years'), |
|
||||||
], |
|
||||||
[ |
|
||||||
'date_of_birth' => fake()->dateTimeBetween('-65 years', '-18 years'), |
|
||||||
], |
|
||||||
[ |
|
||||||
'date_of_birth' => fake()->dateTimeBetween('-18 years', 'now'), |
|
||||||
] |
|
||||||
) |
|
||||||
)->make()->toArray() |
|
||||||
))->handle(); |
|
||||||
|
|
||||||
$this->assertDatabaseCount('users', 33); |
|
||||||
} |
|
||||||
} |
|
||||||
Loading…
Reference in new issue