- add CV management
This commit is contained in:
parent
9518d6a811
commit
390c5b8087
@ -28,13 +28,15 @@ class CreateCV extends Command
|
||||
|
||||
CV::query()
|
||||
->create([
|
||||
// 'slug' => Str::ra,
|
||||
'token' => Str::random(50),
|
||||
'recipient' => $recipient,
|
||||
'email' => $email,
|
||||
'phone-number' => $phone,
|
||||
'phone_number' => $phone,
|
||||
'locations' => $locations,
|
||||
]);
|
||||
|
||||
$this->info('Created!');
|
||||
|
||||
return CommandAlias::SUCCESS;
|
||||
}
|
||||
}
|
||||
|
35
app/Console/Commands/ListCV.php
Normal file
35
app/Console/Commands/ListCV.php
Normal file
@ -0,0 +1,35 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use App\Http\Resources\CVResource;
|
||||
use App\Models\CV;
|
||||
use Illuminate\Console\Command;
|
||||
|
||||
class ListCV extends Command
|
||||
{
|
||||
protected $signature = 'cv:list';
|
||||
|
||||
protected $description = 'List of CV';
|
||||
|
||||
public function handle(): int
|
||||
{
|
||||
$cvList = CV::all();
|
||||
|
||||
/** @var CV $cv */
|
||||
foreach ($cvList as $cv) {
|
||||
$resource = new CVResource($cv);
|
||||
$this->line('ID: '. $resource->id);
|
||||
$this->line('Token: '. $resource->token);
|
||||
$this->line('Company: '. $resource->recipient);
|
||||
$this->line('Phone: '. $resource->formattedPhoneNumber .', '. $resource->PhoneNumber);
|
||||
$this->line('Locations: '. implode(' / ', $resource->locations));
|
||||
$this->line('Views: '. $resource->views);
|
||||
$this->line('');
|
||||
}
|
||||
|
||||
return Command::SUCCESS;
|
||||
}
|
||||
}
|
67
app/Console/Commands/UpdateCV.php
Normal file
67
app/Console/Commands/UpdateCV.php
Normal file
@ -0,0 +1,67 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use Illuminate\Console\Command;
|
||||
use App\Models\CV;
|
||||
|
||||
class UpdateCV extends Command
|
||||
{
|
||||
protected $signature = 'cv:update
|
||||
{id : ID CV element}
|
||||
{--company= : Company name}
|
||||
{--phone= : Phone number}
|
||||
{--begin-location : Add begin}
|
||||
{--add-location=* : Add locations}
|
||||
{--remove-location=* : Remove lcoations}';
|
||||
|
||||
protected $description = 'Update CV element';
|
||||
|
||||
public function handle(): int
|
||||
{
|
||||
if (! ($id = $this->argument('id')) || $id <= 0) {
|
||||
$this->error('Incorrect id');
|
||||
return Command::FAILURE;
|
||||
}
|
||||
|
||||
$cv = CV::find($id);
|
||||
|
||||
if ($company = $this->option('company')) {
|
||||
$cv->recipient = $company;
|
||||
}
|
||||
if ($phone = $this->option('phone')) {
|
||||
$cv->phone_number = $phone;
|
||||
}
|
||||
if (count($addLocations = $this->option('remove-location')) > 0) {
|
||||
$locations = $cv->locations;
|
||||
$locations = array_diff($locations, $addLocations);
|
||||
$cv->locations = $locations;
|
||||
}
|
||||
if (count($addLocations = $this->option('add-location')) > 0) {
|
||||
$locations = $cv->locations;
|
||||
|
||||
$clearLocations = [];
|
||||
foreach ($addLocations as $location) {
|
||||
if (in_array($location, $locations)) {
|
||||
$this->warn('"'. $location .'" exists! This value was not added.');
|
||||
$clearLocations[] = $location;
|
||||
}
|
||||
}
|
||||
$addLocations = array_diff($addLocations, $clearLocations);
|
||||
|
||||
if ($this->option('begin-location'))
|
||||
$locations = array_merge($addLocations, $locations);
|
||||
else
|
||||
$locations = array_merge($locations, $addLocations);
|
||||
$cv->locations = $locations;
|
||||
}
|
||||
|
||||
$cv->save();
|
||||
|
||||
$this->info('Updated!');
|
||||
|
||||
return Command::SUCCESS;
|
||||
}
|
||||
}
|
20
app/Http/Controllers/Api/CVController.php
Normal file
20
app/Http/Controllers/Api/CVController.php
Normal file
@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Http\Controllers\Api;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Resources\CVResource;
|
||||
use App\Models\CV;
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
|
||||
class CVController extends Controller
|
||||
{
|
||||
public function show(CV $cv): JsonResource
|
||||
{
|
||||
$cv->update(['views' => $cv->views+=1]);
|
||||
|
||||
return new CVResource($cv);
|
||||
}
|
||||
}
|
22
app/Http/Resources/CVResource.php
Normal file
22
app/Http/Resources/CVResource.php
Normal file
@ -0,0 +1,22 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Http\Resources;
|
||||
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
|
||||
class CVResource extends JsonResource
|
||||
{
|
||||
public static $wrap = null;
|
||||
|
||||
public function toArray($request): array
|
||||
{
|
||||
return [
|
||||
'token' => $this->token,
|
||||
'email' => $this->email,
|
||||
'phoneNumber' => $this->phoneNumber,
|
||||
'formattedPhoneNumber' => $this->formattedPhoneNumber,
|
||||
];
|
||||
}
|
||||
}
|
@ -4,11 +4,13 @@ declare(strict_types=1);
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Casts\Attribute;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
/**
|
||||
* @property int $id
|
||||
* @property string $token
|
||||
* @property string $recipient
|
||||
* @property string $email
|
||||
* @property string $phoneNumber
|
||||
@ -25,4 +27,23 @@ class CV extends Model
|
||||
'locations' => 'array',
|
||||
'views' => 'integer',
|
||||
];
|
||||
|
||||
protected function phoneNumber(): Attribute
|
||||
{
|
||||
return Attribute::make(
|
||||
get: fn (mixed $value): ?string => str_replace(' ', '', $value ?? ''),
|
||||
);
|
||||
}
|
||||
|
||||
protected function formattedPhoneNumber(): Attribute
|
||||
{
|
||||
return Attribute::make(
|
||||
get: fn (mixed $value, array $attributes): ?string => $attributes['phone_number'] ?? '',
|
||||
);
|
||||
}
|
||||
|
||||
public function getRouteKeyName(): string
|
||||
{
|
||||
return 'token';
|
||||
}
|
||||
}
|
||||
|
@ -12,9 +12,10 @@ return new class extends Migration
|
||||
{
|
||||
Schema::create('cvs', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->string('token', 50);
|
||||
$table->string('recipient', 255);
|
||||
$table->string('email', 255);
|
||||
$table->string('phone-number', 15);
|
||||
$table->string('phone_number', 15);
|
||||
$table->json('locations');
|
||||
$table->integer('views')->nullable()->default(0);
|
||||
$table->timestamps();
|
||||
|
@ -17,3 +17,5 @@ Route::get('projects', 'ProjectController@index');
|
||||
Route::prefix('project')->group(function() {
|
||||
Route::get('{project}', 'ProjectController@show');
|
||||
});
|
||||
|
||||
Route::get('cv/{cv}', 'CVController@show');
|
||||
|
Loading…
x
Reference in New Issue
Block a user