Browse Source

注册公司、公司审核、公司及用户限制中间件

langshi 8 months ago
parent
commit
ec612abbdb

+ 38 - 26
app/Http/Controllers/API/CompanyController.php

@@ -9,6 +9,14 @@
 namespace App\Http\Controllers\API;
 
 
+use App\Mail\CompanyAction;
+use App\Models\CaptchaMail;
+use App\Models\Enums\FileObjectType;
+use App\Services\Notification\ActionEmail\ActionEmailService;
+use Illuminate\Mail\Mailable;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Hash;
+use Illuminate\Support\Facades\Mail;
 use function App\Http\Controllers\badRequest;
 use App\Http\Controllers\Controller;
 
@@ -85,10 +93,10 @@ class CompanyController extends Controller
     }
 
     //注册用户时注册公司
-    public function registerStore(FileAssociationService $service,CreateOrUpdateRequest $request)
+    public function registerCompany(FileAssociationService $service,CreateOrUpdateRequest $request)
     {
         $company = new Company();
-        
+
         $service->check(
           $request->get("file_ids",[]),
           FileObjectType::COMPANY,
@@ -104,38 +112,42 @@ class CompanyController extends Controller
         $service->association($company->id);
 
 
-        return $this->success([
-            'data' => [
-                'company_id' => $company->id,
-            ]
-        ]);
+        return $this->created();
     }
 
     //公司审核
     public function action(ActionRequest $request){
-        $companys = Company::query()->whereIn('id',$request->get('ids'))->get();
-        foreach ($companys as $company){
-            if($company->review_status===CompanyReviewStatus::APPROVED->value){
-                badRequest(sprintf("Company ID: %s,has been approved", $company->id));
-            }
-            $status=$request->get('status');
-            $expDate=$request->get('exp_data');
-            match($status) {
-                1 =>$this->approved($company,$expDate),
-                default => $company->review_status=CompanyReviewStatus::REJECTED,
-            };
-            $company->save();
+        $company = Company::findOrFail($request->id);
+        $status=$request->get('status');
+        $expDate=$request->get('exp_data');
+        $user = new User();
+        //通过审核->改变公司状态->设置公司过期时间->最后生成默认账户
+        DB::transaction(function () use($status,$expDate,$company,$user){
+        if ($status == 1){
+            //1.改变公司状态->设置公司过期时间
+            $company->review_status=CompanyReviewStatus::APPROVED;
+            $company->exp_date = $expDate === null ? Carbon::now()->addYear()->toDateString():$expDate;
+            //2.生成默认账户
+            $user->name='admin_'.$company->name;
+            $user->email=$company->email;
+            $user->username=$company->email;
+            $user->company_id=$company->id;
+            $user->password=Hash::make('admin@#123');
+            //TODO 此处给的默认角色为硬编码,暂未设置默认角色为哪个
+            $user->role_id=6;
+            $user->syncRoles(6);
+            $user->save();
+        }else{
+            $company->review_status=CompanyReviewStatus::REJECTED;
         }
-
+        //公司保存
+        $company->save();
+        });
+        //发送邮件到公司账户
+        Mail::to($company->email)->send(new CompanyAction($company,$user));
         return $this->noContent();
     }
 
-    protected function approved(Company $company,$expDate = null): void
-    {
-        $company->review_status=CompanyReviewStatus::APPROVED;
-        $expDate=$expDate===null?Carbon::now()->addYear()->toDateString():$expDate;
-        $company->exp_date=$expDate;
-    }
 
 
 

+ 2 - 0
app/Http/Kernel.php

@@ -2,6 +2,7 @@
 
 namespace App\Http;
 
+use App\Http\Middleware\AccountLimit;
 use App\Http\Middleware\CheckPermission;
 use App\Http\Middleware\SuperAdmin;
 use Illuminate\Foundation\Http\Kernel as HttpKernel;
@@ -68,5 +69,6 @@ class Kernel extends HttpKernel
         'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
         'permission' => CheckPermission::class,
         'role.super-admin' => SuperAdmin::class,
+        'account.limit' => AccountLimit::class,
     ];
 }

+ 28 - 0
app/Http/Middleware/AccountLimit.php

@@ -0,0 +1,28 @@
+<?php
+
+namespace App\Http\Middleware;
+
+use App\Models\Enums\CompanyReviewStatus;
+use Closure;
+use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Auth;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\Exception\HttpException;
+
+class AccountLimit
+{
+    /**
+     * Handle an incoming request.
+     *
+     * @param  \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response)  $next
+     */
+    public function handle(Request $request, Closure $next): Response
+    {
+
+        if (Auth::user()->company->review_status == CompanyReviewStatus::APPROVED->value && Auth::user()->status ==1) {
+            return $next($request);
+        }
+
+        throw new HttpException(403, "Sorry, the account's authorization expires or is denied");
+    }
+}

+ 1 - 3
app/Http/Middleware/CheckPermission.php

@@ -29,9 +29,7 @@ class CheckPermission
 
             throw UnauthorizedException::forPermissions([$permission]);
         }
-        if (Auth::user()->company->review_status !== CompanyReviewStatus::APPROVED) {
-            abort(403,"Sorry, the company's authorization expires or is denied");
-        }
+
 
         return $next($request);
     }

+ 2 - 2
app/Http/Requests/API/Company/ActionRequest.php

@@ -26,8 +26,8 @@ class ActionRequest  extends FormRequest
     public function rules(): array
     {
         return [
-            "status" => "required|in:1,2",
-            "ids" => "required|array",
+            "status" => "required|in:1,0",
+            "id" => "required",
         ];
     }
 

+ 1 - 0
app/Http/Requests/API/Company/CreateOrUpdateRequest.php

@@ -29,6 +29,7 @@ class CreateOrUpdateRequest extends FormRequest
     {
         return [
             'name' => 'required|unique:company,name,NULL,id,deleted_at,NULL',
+            'email' => 'required'
         ];
     }
 

+ 66 - 0
app/Mail/CompanyAction.php

@@ -0,0 +1,66 @@
+<?php
+
+namespace App\Mail;
+
+use App\Models\Company;
+use App\Models\Enums\ObjectAction;
+use App\Models\Task;
+use App\Models\User;
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Mail\Mailable;
+use Illuminate\Mail\Mailables\Content;
+use Illuminate\Mail\Mailables\Envelope;
+use Illuminate\Queue\SerializesModels;
+
+class CompanyAction extends Mailable
+{
+    use Queueable, SerializesModels;
+
+    private $company;
+    private $user;
+
+    /**
+     * Create a new message instance.
+     */
+    public function __construct(Company $company,User $user)
+    {
+        $this->company = $company;
+        $this->user = $user;
+    }
+
+    /**
+     * Get the message envelope.
+     */
+    public function envelope(): Envelope
+    {
+        return new Envelope(
+            subject: 'Notification of the results of the company you applied for on this system.',
+        );
+    }
+
+    /**
+     * Get the message content definition.
+     */
+    public function content(): Content
+    {
+        return new Content(
+            //view: 'view.name',
+            markdown: 'emails.actions.company',
+            with: [
+                'company' =>$this->company,
+                'user' =>$this->user
+            ]
+        );
+    }
+
+    /**
+     * Get the attachments for the message.
+     *
+     * @return array<int, \Illuminate\Mail\Mailables\Attachment>
+     */
+    public function attachments(): array
+    {
+        return [];
+    }
+}

+ 24 - 0
resources/views/emails/actions/company.blade.php

@@ -0,0 +1,24 @@
+
+<x-mail::message>
+# Company Name: {{ $company->name }}
+
+## Status: {{$company->review_status}}
+
+## Note:
+
+    @if($company->review_status->value === "approved")
+
+###   Congratulations! The company you applied for has passed the background review.This audit is valid until :{{$company->exp_date}}<br>Initialize the account information as follows:<br><br>name:     {{$user->name}} <br>username:    {{$user->username}} <br>password:    admin@#123<br>
+
+    @else
+
+    Your company application was not approved.
+
+    @endif
+
+Thanks,<br>
+[Go to login]({{config('app.url')}})<br>
+From {{ config('app.name') }}
+
+</x-mail::message>
+

+ 3 - 2
routes/api.php

@@ -17,7 +17,7 @@ use App\Http\Controllers\API;
 
 Route::post("/login", [API\AuthController::class, "login"]);
 Route::post("register/company-user", [API\UserController::class, "registerCompanyUser"]);
-Route::post("register/company", [API\CompanyController::class, "registerStore"]);
+Route::post("register/company", [API\CompanyController::class, "registerCompany"]);
 Route::post("company-file-upload", [API\FileController::class, "upload"]);
 //暂时为免登录
 Route::get("file/download/{uuid}/share-file", [API\FileController::class, "downloadShareFile"])
@@ -26,7 +26,7 @@ Route::get("file/download/{uuid}/share-file", [API\FileController::class, "downl
 
 
 
-Route::middleware(['auth:sanctum'])->group(function () {
+Route::middleware(['auth:sanctum','account.limit'])->group(function () {
     Route::post("/logout", [API\AuthController::class, "logout"]);
     Route::get("user/details", [API\UserController::class, 'details'])->name("user.details");
 
@@ -56,6 +56,7 @@ Route::middleware(['auth:sanctum'])->group(function () {
         Route::get("role/{role}/menus", [API\RoleController::class, "menus"])->name("role.menus");
 //        Route::patch("user/userInfo/{user_id}",[API\UserController::class, 'updateUserInfo'])->name('user.updateUserInfo');
 
+        Route::post("company/action",[API\CompanyController::class,"action"])->name("company.action");
 
 
     });