Skip to content

Commit dd17733

Browse files
authored
Feature company api (#75)
* Ajout de la base de donnees pour le monde * 🗃️ creation des tables pour les entreprises * 🚧 wip * Mis a jour de la table entreprise et ajout de l'api de listing des entreprises * 👽 Ajout du filtre sur l'API des entreprises * ♻️ Refcatoring code * ✅ wip units tests * 🚧 wip * ✅ Update failed tests to warn status * ♻️ refactoring migration * 👽 Ajout de l'api de creation d'entreprise
1 parent 594733f commit dd17733

File tree

83 files changed

+5775
-354
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

83 files changed

+5775
-354
lines changed

app/Enums/EnterpriseSize.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace App\Enums;
6+
7+
use BenSampo\Enum\Enum;
8+
9+
final class EnterpriseSize extends Enum
10+
{
11+
const SEED = '1-10';
12+
13+
const SMALL = '11-50';
14+
15+
const MEDIUM = '51-200';
16+
17+
const LARGE = '201-500';
18+
19+
const VERY_LARGE = '501-1000';
20+
21+
const ENTERPRISE = '1001-5000';
22+
23+
const LARGE_ENTERPRISE = '5000+';
24+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
namespace App\Filters\Enterprise;
4+
5+
use App\Filters\AbstractFilters;
6+
7+
class EnterpriseFilters extends AbstractFilters
8+
{
9+
/**
10+
* Registered filters to operate upon.
11+
*
12+
* @var array
13+
*/
14+
protected array $filters = [
15+
16+
];
17+
}

app/Http/Controllers/Api/Auth/LoginController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public function login(LoginRequest $request): JsonResponse
2727
'password' => $request->input('password'),
2828
];
2929

30-
if (empty($user) || !Auth::attempt($sanitized)) {
30+
if (empty($user) || ! Auth::attempt($sanitized)) {
3131
throw ValidationException::withMessages([
3232
'email' => 'Les informations d\'identification fournies sont incorrectes.',
3333
]);

app/Http/Controllers/Api/Auth/RegisterController.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ public function register(RegisterRequest $request): JsonResponse
3030
//TODO: Send new company registration notification on Slack
3131
event(new ApiRegistered($user));
3232

33-
return response()->json(array_merge(
33+
return response()->json(
34+
array_merge(
3435
['message' => 'Votre compte a été créé avec succès. Un e-mail de vérification vous a été envoyé.'],
3536
$this->userMetaData($user)
3637
)

app/Http/Controllers/Api/Auth/VerifyEmailController.php

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
namespace App\Http\Controllers\Api\Auth;
44

55
use App\Http\Controllers\Controller;
6-
use Illuminate\Http\JsonResponse;
7-
use Illuminate\Http\Request;
6+
use App\Models\User;
87
use Illuminate\Auth\Events\Verified;
8+
use Illuminate\Http\JsonResponse;
99
use Illuminate\Http\RedirectResponse;
10-
use App\Models\User;
10+
use Illuminate\Http\Request;
1111

1212
class VerifyEmailController extends Controller
1313
{
@@ -17,14 +17,14 @@ public function verify(Request $request): RedirectResponse
1717
$user = User::find($request->route('id'));
1818

1919
if ($user->hasVerifiedEmail()) {
20-
return redirect(config('lcm.spa_url') . '/email/verify/already');
20+
return redirect(config('lcm.spa_url').'/email/verify/already');
2121
}
2222

2323
if ($user->markEmailAsVerified()) {
2424
event(new Verified($user));
2525
}
2626

27-
return redirect(config('lcm.spa_url') . '/email/verify/success');
27+
return redirect(config('lcm.spa_url').'/email/verify/success');
2828
}
2929

3030
public function resend(Request $request): JsonResponse
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Api\Enterprise;
4+
5+
use App\Http\Controllers\Controller;
6+
use App\Http\Resources\EnterpriseResource;
7+
use App\Http\Resources\EnterpriseResourceCollection;
8+
use App\Models\Enterprise;
9+
use Illuminate\Http\Request;
10+
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
11+
12+
class PublicController extends Controller
13+
{
14+
public function featured(): AnonymousResourceCollection
15+
{
16+
$enterprises = Enterprise::query()
17+
->scopes('featured')
18+
->limit(6)
19+
->get();
20+
21+
return EnterpriseResource::collection($enterprises);
22+
}
23+
24+
public function paginate(Request $request): EnterpriseResourceCollection
25+
{
26+
$filters = $request->query();
27+
28+
$enterprises = Enterprise::query()
29+
->filters($request)
30+
->latest()
31+
->paginate($request->query('per_page', 12));
32+
33+
return new EnterpriseResourceCollection($enterprises, $filters);
34+
}
35+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
3+
namespace App\Http\Controllers\Api\Enterprise;
4+
5+
use App\Http\Controllers\Controller;
6+
use App\Http\Requests\Api\Enterprise\RegisterRequest;
7+
use App\Http\Resources\AuthenticateUserResource;
8+
use App\Http\Resources\EnterpriseResource;
9+
use App\Models\Enterprise;
10+
use App\Models\User;
11+
use Illuminate\Http\JsonResponse;
12+
13+
class RegisterController extends Controller
14+
{
15+
public function __invoke(RegisterRequest $request): JsonResponse
16+
{
17+
/** @var User $owner */
18+
$owner = $request->user();
19+
20+
if ($owner->hasEnterprise()) {
21+
return response()->json([
22+
'error' => 'Ce compte possède déjà une entreprise associée.',
23+
]);
24+
}
25+
26+
$enterprise = Enterprise::query()->create([
27+
'name' => $request->input('name'),
28+
'slug' => $request->input('name'),
29+
'website' => $request->input('website'),
30+
'user_id' => $request->input('user_id'),
31+
'is_public' => false,
32+
]);
33+
34+
return response()->json([
35+
'user' => new AuthenticateUserResource($owner),
36+
'enterprise' => new EnterpriseResource($enterprise),
37+
]);
38+
}
39+
}

app/Http/Controllers/Api/User/ProfileController.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
use App\Http\Resources\AuthenticateUserResource;
77
use App\Models\User;
88
use Illuminate\Http\JsonResponse;
9-
use Illuminate\Http\Request;
109

1110
class ProfileController extends Controller
1211
{

app/Http/Controllers/HomeController.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
use App\Models\Thread;
99
use GuzzleHttp\Client;
1010
use GuzzleHttp\Exception\GuzzleException;
11-
use Illuminate\Database\Eloquent\Builder;
1211
use Illuminate\Http\Request;
1312
use Illuminate\Support\Facades\Cache;
1413

@@ -57,8 +56,8 @@ public function index()
5756
->withUrl();
5857

5958
return view('home', compact(
60-
'latestArticles',
61-
'latestThreads',
59+
'latestArticles',
60+
'latestThreads',
6261
'latestDiscussions',
6362
'plans'
6463
));

app/Http/Livewire/Discussions/Create.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,9 @@ public function store()
4848

4949
givePoint(new DiscussionCreated($discussion));
5050

51-
Auth::user()->notify(new PostDiscussionToTelegram($discussion));
51+
if (app()->environment('production')) {
52+
Auth::user()->notify(new PostDiscussionToTelegram($discussion));
53+
}
5254

5355
$this->redirectRoute('discussions.show', $discussion);
5456
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
namespace App\Http\Requests\Api\Enterprise;
4+
5+
use Illuminate\Foundation\Http\FormRequest;
6+
7+
class RegisterRequest extends FormRequest
8+
{
9+
/**
10+
* Determine if the user is authorized to make this request.
11+
*
12+
* @return bool
13+
*/
14+
public function authorize(): bool
15+
{
16+
return auth()->user()->isEnterprise();
17+
}
18+
19+
/**
20+
* Get the validation rules that apply to the request.
21+
*
22+
* @return array<string, mixed>
23+
*/
24+
public function rules(): array
25+
{
26+
$regex = '/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/';
27+
28+
return [
29+
'name' => 'required',
30+
'website' => 'required|unique:enterprises,website|regex:'.$regex,
31+
'user_id' => 'required',
32+
];
33+
}
34+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
namespace App\Http\Resources;
4+
5+
use Illuminate\Http\Resources\Json\JsonResource;
6+
7+
class DateTimeResource extends JsonResource
8+
{
9+
/**
10+
* Transform the resource into an array.
11+
*
12+
* @param \Illuminate\Http\Request $request
13+
*/
14+
public function toArray($request): array
15+
{
16+
return [
17+
'human' => $this->diffForHumans(),
18+
'dateTime' => $this->toDateTimeString(),
19+
];
20+
}
21+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
3+
namespace App\Http\Resources;
4+
5+
use App\Models\IdeHelperEnterprise;
6+
use Illuminate\Http\Resources\Json\JsonResource;
7+
8+
/**
9+
* @mixin IdeHelperEnterprise
10+
*/
11+
class EnterpriseResource extends JsonResource
12+
{
13+
public function toArray($request): array
14+
{
15+
return [
16+
'id' => $this->id,
17+
'name' => $this->name,
18+
'slug' => $this->slug,
19+
'website' => $this->website,
20+
'description' => $this->description,
21+
'about' => $this->about,
22+
'foundedIn' => $this->founded_in,
23+
'ceo' => $this->ceo,
24+
'isCertified' => $this->is_certified,
25+
'isFeatured' => $this->is_featured,
26+
'isPublic' => $this->is_public,
27+
'size' => $this->size,
28+
'settings' => $this->settings,
29+
'images' => [
30+
'logo' => $this->getFirstMediaUrl('logo'),
31+
'cover' => $this->getFirstMediaUrl('avatar'),
32+
],
33+
'owner' => UserResource::make($this->owner),
34+
'createdAt' => DateTimeResource::make($this->created_at),
35+
'updatedAt' => DateTimeResource::make($this->updated_at),
36+
];
37+
}
38+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
namespace App\Http\Resources;
4+
5+
class EnterpriseResourceCollection extends PaginationResourceCollection
6+
{
7+
public function toArray($request): array
8+
{
9+
return [
10+
'data' => $this->collection->transform(fn ($enterprise) => new EnterpriseResource($enterprise)),
11+
'pagination' => $this->pagination,
12+
'filters' => $this->filters,
13+
];
14+
}
15+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
namespace App\Http\Resources;
4+
5+
use Illuminate\Http\Resources\Json\ResourceCollection;
6+
7+
class PaginationResourceCollection extends ResourceCollection
8+
{
9+
public function __construct($resource, public $filters = [])
10+
{
11+
$this->pagination = [
12+
'total' => $resource->total(),
13+
'perPage' => $resource->perPage(),
14+
'currentPage' => $resource->currentPage(),
15+
'nextPage' => $resource->nextPageUrl(),
16+
'prevPage' => $resource->previousPageUrl(),
17+
'firstPage' => $resource->url(1),
18+
'lastPage' => $resource->url($resource->lastPage()),
19+
'from' => $resource->firstItem(),
20+
'to' => $resource->lastItem(),
21+
'totalPages' => $resource->lastPage(),
22+
];
23+
24+
$resource = $resource->getCollection();
25+
26+
parent::__construct($resource);
27+
}
28+
}

app/Listeners/SendCompanyEmailVerificationNotification.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
namespace App\Listeners;
44

55
use App\Events\ApiRegistered;
6-
use App\Models\User;
76
use Illuminate\Contracts\Queue\ShouldQueue;
87
use Illuminate\Queue\InteractsWithQueue;
98

0 commit comments

Comments
 (0)