# Product Modular x Chatroom
- Chatroom 模板GitLab [http://192.168.1.151:8765/chat-room-modular](http://192.168.1.151:8765/chat-room-modular)
- (Test) Product Modular x Chatroom 測試專案
- 專案路徑: [http://192.168.1.151:8765/test/test-backend/-/tree/yan-backend](http://192.168.1.151:8765/test/test-backend/-/tree/yan-backend)
- <span style="color:red">綠色的部分為新增的code,紅色則是移除的code。</span>
## 套件安裝:
- [JWT](https://github.com/PHP-Open-Source-Saver/jwt-auth)
- [model with uuid](https://github.com/goldspecdigital/laravel-eloquent-uuid)
## 調整清單:
### Database:
- 刪除:
- 新增:
- [alter users add column group_id](#Alter_users_add_column_group_id)
- [rename users to admins](#Rename_users_to_admins)
- [chatroom_chatrooms_table](#Chatroom_chatrooms)
- [chatroom_chat_logs_table](#Chatroom_chat_logs)
- [chatroom_contact_messages_table](#Chatroom_contact_messages)
- [chatroom_question_answers_table](#Chatroom_question_answers)
- [chatroom_groups_table](#Chatroom_groups)
- [chatroom_clients_table](#Chatroom_clients)
- [chatroom_admin_groups](#Chatroom_admin_group)
### Models:
- 刪除:
- User
- 新增:
- [Admin](#Admin)
- [ChatLog](#ChatLog)
- [Chatroom](#Chatroom)
- [Client](#Client)
- [ContactMessage](#ContactMessage)
- [Group](#Group)
- [QuestionAnswer](#QuestionAnswer)
### Config:
- 修改:
- [auth.php](#auth)
- [chatroom](#chatroom)
### Routes:
- 新增:
- [api-admin.php](#API_admin)
- [api.php](#API)
### Controller:
- 修改:
- [app/Http/Controllers/Api/Admin/AccountController.php](#Admin_AccountController)
- [app/Http/Controllers/Api/Admin/AuthenticatedSessionController.php](#Admin_AuthenticatedSessionController)
- [app/Http/Controllers/Api/Admin/ChatLogController.php](#Admin_ChatLogController)
- [app/Http/Controllers/Api/Admin/ContactMessageController.php](#Admin_ContactMessageController)
- [app/Http/Controllers/Api/Admin/GroupController.php](#Admin_GroupController)
- [app/Http/Controllers/Api/Admin/QuestionAnswerController.php](#Admin_QuestionAnswerController)
- [app/Http/Controllers/Api/Client/ClientController.php](#ClientController)
- [app/Http/Controllers/Api/Client/ContactMessageController.php](#ContactMessageController)
- [app/Http/Controllers/Api/LocaleController.php](#LocaleController)
### Commands:
- 新增:
- admin commands - [Create admin cmd](#Create_admin_cmd)
### Export:
- 新增:
- [Chat_logs_export](#Chat_logs_export)
- [Contact_message_export](#Contact_message_export)
### Mail:
- 新增:
- [ContactMessage](#Contact_message)
### Views:
- 新增:
- [ContactMessageView](#ContactMessageView)
- [ResetPasswordView](#ResetPasswordView)
---
## Database:
### Alter_users_add_column_group_id
> users table 新增欄位
> code 路徑: [http://192.168.1.151:8765/test/test-backend/-/commit/759c5b95910f0273b709bc8bc7f83a1b4a383d1a#eba36d33efe24d9c9e7e8b75b2b42f02bc5c7467](http://192.168.1.151:8765/test/test-backend/-/commit/759c5b95910f0273b709bc8bc7f83a1b4a383d1a#eba36d33efe24d9c9e7e8b75b2b42f02bc5c7467)
### Rename_users_to_admins
> 將 users table 重新命名為 admins
> code 路徑: [http://192.168.1.151:8765/test/test-backend/-/blob/yan-backend/database/migrations/2022_12_20_083421_rename_table_users_to_admins.php](http://192.168.1.151:8765/test/test-backend/-/blob/yan-backend/database/migrations/2022_12_20_083421_rename_table_users_to_admins.php)
### Chatroom_chatrooms
> 新增聊天室房間table
> code 路徑: [http://192.168.1.151:8765/test/test-backend/-/commit/759c5b95910f0273b709bc8bc7f83a1b4a383d1a#824b8d2038c5f93f0876e6e1e5abbbf82c809ec0](http://192.168.1.151:8765/test/test-backend/-/commit/759c5b95910f0273b709bc8bc7f83a1b4a383d1a#824b8d2038c5f93f0876e6e1e5abbbf82c809ec0)
### Chatroom_chat_logs
> 聊天室聊天記錄table
> code 路徑:[http://192.168.1.151:8765/test/test-backend/-/commit/759c5b95910f0273b709bc8bc7f83a1b4a383d1a#b3d2606dd993689944724b615724879599ea6baa](http://192.168.1.151:8765/test/test-backend/-/commit/759c5b95910f0273b709bc8bc7f83a1b4a383d1a#b3d2606dd993689944724b615724879599ea6baa)
### Chatroom_contact_messages
> 聊天室留言table
> code 路徑:[http://192.168.1.151:8765/test/test-backend/-/commit/759c5b95910f0273b709bc8bc7f83a1b4a383d1a#a7169472cf90421870f26bda8c9ac10aff720c9d](http://192.168.1.151:8765/test/test-backend/-/commit/759c5b95910f0273b709bc8bc7f83a1b4a383d1a#a7169472cf90421870f26bda8c9ac10aff720c9d)
### Chatroom_question_answers
> 聊天室問答table
> code 路徑:[http://192.168.1.151:8765/test/test-backend/-/commit/759c5b95910f0273b709bc8bc7f83a1b4a383d1a#7e688276d12b3e13d33de06a3d398e5cac6134ba](http://192.168.1.151:8765/test/test-backend/-/commit/759c5b95910f0273b709bc8bc7f83a1b4a383d1a#7e688276d12b3e13d33de06a3d398e5cac6134ba)
### Chatroom_groups
> 聊天室頻道table
> code 路徑:[http://192.168.1.151:8765/test/test-backend/-/commit/759c5b95910f0273b709bc8bc7f83a1b4a383d1a#0b73550a9aac7ac321264c9271644a08e8ba11cb](http://192.168.1.151:8765/test/test-backend/-/commit/759c5b95910f0273b709bc8bc7f83a1b4a383d1a#0b73550a9aac7ac321264c9271644a08e8ba11cb)
### Chatroom_clients
> 聊天室前台使用者table
> code 路徑:[http://192.168.1.151:8765/test/test-backend/-/commit/759c5b95910f0273b709bc8bc7f83a1b4a383d1a#52ec2621754dffccf10b766b312a66db2cf7f663](http://192.168.1.151:8765/test/test-backend/-/commit/759c5b95910f0273b709bc8bc7f83a1b4a383d1a#52ec2621754dffccf10b766b312a66db2cf7f663)
### Chatroom_admin_group
> 聊天室管理員頻道認領table
> code 路徑:[http://192.168.1.151:8765/test/test-backend/-/commit/759c5b95910f0273b709bc8bc7f83a1b4a383d1a#5b9a6c0d2d56c8fe92d412e9250962981d64c317](http://192.168.1.151:8765/test/test-backend/-/commit/759c5b95910f0273b709bc8bc7f83a1b4a383d1a#5b9a6c0d2d56c8fe92d412e9250962981d64c317)
---
## Models:
### Admin
> 刪除 User.php 替換為 Admin.php
<pre><code><span style="color:green">
<?php
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
use PHPOpenSourceSaver\JWTAuth\Contracts\JWTSubject;
class Admin extends Authenticatable implements JWTSubject
{
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'admins';
use HasApiTokens, Notifiable;
/**
* role:
* 1. 王一管理者
* 2. 客戶主要管理者
* 4. 客戶次要管理者
*/
static $role = [
'supervisor' => 1,
'client_admin' => 2,
'client_sub_admin' => 4,
'chat' => 8,
];
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
'name',
'email',
'password',
];
/**
* The attributes that should be hidden for serialization.
*
* @var array<int, string>
*/
protected $hidden = [
'password',
'remember_token',
'two_factor_recovery_codes',
'two_factor_secret',
'email_verified_at',
'status', // 目前沒有用處 Jacky 2022-11-15
];
/**
* The attributes that should be cast.
*
* @var array<string, string>
*/
protected $casts = [
'email_verified_at' => 'datetime',
];
function scopeIsSupervisor()
{
return ($this->role == 1);
}
/**
* Chatroom
*/
public function groups()
{
return $this->belongsToMany(Group::class, 'chatroom_admin_group', 'admin_id', 'group_id');
}
public function scopeChat($query)
{
// return $query->whereRaw('(role & 2) = 2')->orWhereRaw('(role & 1) = 1');
return $query->whereRaw('(role & 1) = 1');
}
/**
* JWT
*/
public function getJWTIdentifier()
{
return $this->getkey();
}
public function getJWTCustomClaims()
{
return [
'type' => 2
];
}
}
</span></code></pre>
### ChatLog:
> 聊天記錄
- code path: app/Models/ChatLog.php
- [http://192.168.1.151:8765/test/test-backend/-/commit/339ea59efa3c9a7505c92e2677614081d4ff7caa#f356a84962c8a90ea1f78d974e79b43f4b5a1411](http://192.168.1.151:8765/test/test-backend/-/commit/339ea59efa3c9a7505c92e2677614081d4ff7caa#f356a84962c8a90ea1f78d974e79b43f4b5a1411)
### Chatroom:
- code path: app/Models/Chatroom.php
- [http://192.168.1.151:8765/test/test-backend/-/commit/339ea59efa3c9a7505c92e2677614081d4ff7caa#bde9c40c3fb4880c181a226b69d1e1d09ac7b65a](http://192.168.1.151:8765/test/test-backend/-/commit/339ea59efa3c9a7505c92e2677614081d4ff7caa#bde9c40c3fb4880c181a226b69d1e1d09ac7b65a)
### Client:
> 前台使用者
- code path: app/Models/Client.php
- [http://192.168.1.151:8765/test/test-backend/-/commit/339ea59efa3c9a7505c92e2677614081d4ff7caa#7dec208e02520693ead0041fd6dc2de10e8f8441](http://192.168.1.151:8765/test/test-backend/-/commit/339ea59efa3c9a7505c92e2677614081d4ff7caa#7dec208e02520693ead0041fd6dc2de10e8f8441)
### ContactMessage:
> 前台使用者留言
- code path: app/Models/ContactMessage.php
- [http://192.168.1.151:8765/test/test-backend/-/commit/339ea59efa3c9a7505c92e2677614081d4ff7caa#60b85836b768cd15d7b43acee6d8a1fc5413a38c](http://192.168.1.151:8765/test/test-backend/-/commit/339ea59efa3c9a7505c92e2677614081d4ff7caa#60b85836b768cd15d7b43acee6d8a1fc5413a38c)
### Group:
> 聊天室頻道
- code path: app/Models/Group.php
- [http://192.168.1.151:8765/test/test-backend/-/commit/339ea59efa3c9a7505c92e2677614081d4ff7caa#41b0edf0bffb33bab4bd1060e995856c16139ce4](http://192.168.1.151:8765/test/test-backend/-/commit/339ea59efa3c9a7505c92e2677614081d4ff7caa#41b0edf0bffb33bab4bd1060e995856c16139ce4)
### QuestionAnswer:
> 聊天室問答
- code path: app/Models/QuestionAnswer.php
- [http://192.168.1.151:8765/test/test-backend/-/commit/339ea59efa3c9a7505c92e2677614081d4ff7caa#df33d3770dd4f0051734dbdb755636d138fb3ae0](http://192.168.1.151:8765/test/test-backend/-/commit/339ea59efa3c9a7505c92e2677614081d4ff7caa#df33d3770dd4f0051734dbdb755636d138fb3ae0)
---
## Commands:
### Create_admin_cmd
> 避免由程式碼寫入帳密,而改由開發者用命令列自行輸入。
新增路徑: <span style="color:blue">app/Console/Commands/CreateAdmin.php</span>
<pre><code><span style="color:green">
<?php
namespace App\Console\Commands;
use App\Models\Admin;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Hash;
class CreateAdmin extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'admin:create';
/**
* The console command description.
*
* @var string
*/
protected $description = 'create admin account';
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
$name = $this->ask('What is your name?');
$email = $this->ask('What is your account and email ?');
if (Admin::where('email', $email)->first()) {
$this->error('Email is already exist!');
return;
}
while (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$email = $this->ask('Illegal email, please enter again');
}
$password = $this->secret('What is your password?');
while(!preg_match('/^(?=.*\d)(?=.*[a-zA-Z])[\da-zA-Z\W]{8,20}$/', $password)) {
$password = $this->secret('Password format is incorrect. 8-20 characters, including at least one number and one letter.');
}
$password_confirmed = $this->secret('Enter your password again:');
if ($password != $password_confirmed) {
$this->error('Password and confirm password does not match!');
return;
}
try {
$now = date('Y-m-d H:i:s');
$user = new Admin();
$user->name = $name;
$user->email = $email;
$user->role = Admin::$role['supervisor'];
$user->password = Hash::make($password);
$user->save();
} catch (\Exception $err) {
$this->error($err->getMessage());
return;
}
$this->info('Created admin success!');
return;
}
}
</span></code></pre>
---
## Config:
### auth
> Websocket 使用 JWT 進行驗證,因此 admin 及 client 登入都需要取得 JWT token。
<pre><code>
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
<span style="color:green">'chatroom_admin' => [
'driver' => 'jwt',
'provider' => 'chatroom_admins',
],
'chatroom_client' => [
'driver' => 'jwt',
'provider' => 'chatroom_clients',
]</span>
],
'providers' => [
'users' => [
'driver' => 'eloquent',
<span style="color:red">'model' => App\Models\User::class,</span>
<span style="color:green">'model' => App\Models\Admin::class,</span>
],
<span style="color:green">'chatroom_admins' => [
'driver' => 'eloquent',
'model' => App\Models\Admin::class,
],
'chatroom_clients' => [
'driver' => 'eloquent',
'model' => App\Models\Client::class,
],</span>
// 'users' => [
// 'driver' => 'database',
// 'table' => 'users',
// ],
],
</code></pre>
### chatroom
> 有分企業板及主辦單位版
<pre>
---
## Routes:
### API_admin
> 新增聊天室路由
- <span style="color:red">綠色的部分為新增的code,紅色則是移除的code。
- code 路徑:routes/api-admin.php
- [http://192.168.1.151:8765/test/test-backend/-/commit/483ba47128c1981e48cdfff55ae0aebdea7154b7#8ef23a56158eacad326c2cf73d9294ed3ddd6f98](http://192.168.1.151:8765/test/test-backend/-/commit/483ba47128c1981e48cdfff55ae0aebdea7154b7#8ef23a56158eacad326c2cf73d9294ed3ddd6f98)
use App\Http\Controllers\Api\Admin\SceneProjectController;
use App\Http\Controllers\Api\Admin\AccountController;
use App\Http\Controllers\Api\Admin\BannerWallController;
<span style="color:green">use App\Http\Controllers\Api\Admin\ChatLogController;</span>
// use App\Http\Controllers\Api\Admin\CollisionController;
use App\Http\Controllers\Api\Admin\ContactInformationController;
use App\Http\Controllers\Api\Admin\ContactInformationModifyController;
<span style="color:green">use App\Http\Controllers\Api\Admin\ContactMessageController;</span>
// use App\Http\Controllers\Api\Admin\CubeController;
use App\Http\Controllers\Api\Admin\GlobalSettingController;
use App\Http\Controllers\Api\Admin\LocaleController;
use App\Http\Controllers\Api\Admin\UserController;
use App\Http\Controllers\Api\Admin\VideoWallController;
use Illuminate\Support\Facades\Route;
<span style="color:green">use App\Http\Controllers\Api\Admin\GroupController;
use App\Http\Controllers\Api\Admin\QuestionAnswerController;
use App\Http\Controllers\Api\Admin\AuthenticatedSessionController;
// Sanctum + JWT admin login
Route::group(['middleware' => config('fortify.middleware', ['web'])], function () {
$limiter = config('fortify.limiters.login');
Route::post('admin/login', [AuthenticatedSessionController::class, 'store'])->middleware(array_filter([
'guest:'.config('fortify.guard'),
$limiter ? 'throttle:'.$limiter : null,
]))->name('api.admin.login');
Route::post('admin/logout', [AuthenticatedSessionController::class, 'destroy'])
->name('api.admin.logout');
});</span>
Route::middleware('auth:sanctum')->group(function () {
Route::prefix('admin')->name('api.admin.')->group(function () {
Route::resource('/scene-pro', SceneProController::class)->except(['create', 'edit']);
// 刪除 cube image
Route::delete('/scene-pro/{scene_pro}/cube', [SceneProController::class, 'destroyCubeImage'])->name('scene-pro.cube.destroy');
<span style="color:green">/**
* 聊天室管理
*/
Route::put('group/sort', [GroupController::class, 'sorting']);
Route::resource('group',GroupController::class)->except(['edit']);
Route::put('group/{group}/set-status',[GroupController::class,'setStatus']);
Route::middleware('auth:chatroom_admin')->group(function () {
/**
* 聊天室問答 v
*/
Route::get('question-answer/{group}',[QuestionAnswerController::class, 'index']);
Route::post('question-answer',[QuestionAnswerController::class, 'store']);
Route::put('question-answer/{questionAnswer}',[QuestionAnswerController::class, 'update']);
Route::delete('question-answer/{questionAnswer}',[QuestionAnswerController::class, 'destroy']);
Route::put('question-answer/{group}/sort',[QuestionAnswerController::class, 'sorting']);
/**
* 聊天記錄
*/
Route::get('chat-logs',[ChatLogController::class,'index']);
Route::get('chat-logs/{group}/{client}',[ChatLogController::class,'show']);
Route::delete('chat-logs/{group}/{client}',[ChatLogController::class,'destroy']);
Route::get('chat-logs/{group}/{client}/export',[ChatLogController::class,'export']);
/**
* 留言紀錄 v
*/
Route::get('contact-message',[ContactMessageController::class, 'index']);
Route::get('contact-message/{group}/{client}',[ContactMessageController::class, 'show']);
Route::get('contact-message/{group}/{client}/export',[ContactMessageController::class, 'export']);
Route::put('contact-message/{contactMessage}/read', [ContactMessageController::class, 'read']);
Route::put('contact-message/{contactMessage}/resolve', [ContactMessageController::class, 'resolve']);
});</span>
});
});
});
</code></pre>
### API
> 新增聊天室前台 API
- code 路徑:routes/api.php
- [http://192.168.1.151:8765/test/test-backend/-/commit/35444c0f628723b0362d5ed3a0b422b8bddd86c6#b337d07ab0e7d54bf5547a0321a43ecafbd73ec1](http://192.168.1.151:8765/test/test-backend/-/commit/35444c0f628723b0362d5ed3a0b422b8bddd86c6#b337d07ab0e7d54bf5547a0321a43ecafbd73ec1)
<pre><code>
<?php
use App\Http\Controllers\Api\ApiController;
<span style="color:green">use App\Http\Controllers\Api\Client\ClientController;
use App\Http\Controllers\Api\ContactMessageController;</span>
use App\Models\ContactInformation;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
<span style="color:green">use App\Http\Controllers\Api\ProfileController;</span>
include_once(base_path('routes/api-admin.php'));
// Route::get('/locale', [ApiController::class, 'locale']);
// Route::middleware('auth:sanctum')->group(function () {
// });
Route::name('api.')->group(function () {
Route::get('/global-setting', [ApiController::class, 'globalSetting'])->name('global-setting');
Route::middleware('locale-check')->group(function () {
*/
Route::get('/seo', [ApiController::class, 'seo'])->name('seo');
Route::get('/scene-project/{scene_project}/scene', [ApiController::class, 'sceneProjectScene'])->name('scene-project.scene');
<span style="color:green">/**
* Client 前台註冊/登入
*/
Route::post('login',[ClientController::class,'register_or_login'])->name('client');
/**
* 參展商基本資料
*/
Route::get('profile', [ProfileController::class, 'index'])->name('profile');
// /**
// * 得到現在開放什麼語系
// */
// Route::get('locale',[LocaleController::class,'index'])->name('locale');
/**
* 離線留言功能
*/
Route::post('contact-message',[ContactMessageController::class, 'store'])->name('contact-message');
});</span>
</code></pre>
---
## Controller:
### Admin_AccountController
> 將原本的 role 判斷改為讀取 admin model 中的 static 參數。
- <span style="color:red">綠色的部分為新增的code,紅色則是移除的code。</span>
<pre><code>
use App\Models\Admin;
{
use ApiResponseTrait;
<span style="color:green">
/**
* @var int $supervisor 王一管理者
* @var int $client_admin 客戶主要管理者
* @var int $client_sub_admin 客戶次要管理者
*/
private $supervisor;
private $client_admin;
private $client_sub_admin;
private $chat;
</span>
function __construct()
{
$this->middleware(function ($request, $next) {
<span style="color:red">
if (!in_array($request->user()->role, [1, 2])) {
return $this->apiResponse(null, 403, 'Permission denied', 403);
}
return $next($request);</span>
<span style="color:green">
$this->supervisor = User::$role['supervisor'];
$this->client_admin = User::$role['client_admin'];
$this->client_sub_admin = User::$role['client_sub_admin'];
$this->chat = Admin::$role['chat'];
if (!in_array($request->user()->role, [$this->supervisor, $this->client_admin, $this->chat])) {
return $this->apiResponse(null, 403, 'Permission denied', 403);
}
return $next($request);</span>
});
}
public function index()
{
<span style="color:red">switch (request()->user()->role) {
case 1:
case $this->supervisor:
$users = User::get();
break;
case 2:
$users = User::whereIn('role', [2, 3])->get();
case $this->client_admin:
$users = User::whereIn('role', [$this->client_admin, $this->client_sub_admin])->get();
break;
}
// $users = User::where('email', '<>', 'info@kingone-design.com')->get();</span>
<span style="color:green">switch (request()->user()->role) {
case $this->supervisor:
$users = User::get();
break;
case $this->client_admin:
$users = User::whereIn('role', [$this->client_admin, $this->client_sub_admin])->get();
break;
}</span>
$this->purify($users, ['created_at', 'updated_at', 'id']);
return $this->apiResponse($users);
}
<span style="color:red"></span>
public function store(Request $request)
{
$request->validate([
'name' => 'required',
'email' => 'required|email|unique:users,email',
<span style="color:red">'password' => 'required|min:4',
'password_confirmation' => 'required|same:password|min:4',
'role' => 'numeric|in:1,2,3',</span>
<span style="color:green">'password' => 'required|regex:/^(?=.*\d)(?=.*[a-zA-Z])[\da-zA-Z\W]{8,20}$/',
'password_confirmation' => 'required|same:password',
'role' => 'numeric|in:1,2,4,8',</span>
]);
$user = new User();
switch ($request->user()->role) {
<span style="color:red">case 1:
if (!in_array($request->role, [1, 2])) {
return $this->apiResponse(null, 422, 'User role is invalid.', 422);
}
$user->role = $request->role;
break;
case 2:
$user->role = 3;
break;</span>
<span style="color:green">case $this->supervisor:
if (!in_array($request->role, [$this->supervisor, $this->client_admin, $this->chat])) {
return $this->apiResponse(null, 422, 'User role is invalid.', 422);
}
$user->role = $request->role;
break;
case $this->client_admin:
$user->role = $this->client_sub_admin;
break;</span>
}
$user->name = $request->name;
$user->email = $request->email;
$user->password = Hash::make($request->password);
$user->save();
return $this->index();
}
public function destroy(Request $request)
{
$request->validate([
'email' => 'required|email',
]);
<span style="color:red">if ($request->email == 'info@kingone-design.com') {
return $this->apiResponse(null, 403, 'Access Denied!!', 403);
}
if(!$user = User::where('email', $request->email)->first()) {
return $this->apiResponse(null, 422, 'User does not exist.', 422);
}
if ($request->user()->role == 2 && $user->role !== 3) {
return $this->apiResponse(null, 403, 'Access Denied!!', 403);
}</span>
<span style="color:green">if(!$user = Admin::where('email', $request->email)->first()) {
return $this->apiResponse(null, 422, 'User does not exist.', 422);
}
if ($user->role == $this->supervisor && Admin::where('role', $this->supervisor)->count() == 1) {
return $this->apiResponse(null, 403, 'Must remain one supervisor!!', 403);
}
if ($request->user()->role == $this->client_admin && $user->role !== $this->client_sub_admin) {
return $this->apiResponse(null, 403, 'Access Denied!!', 403);
}
</span>
$user->delete();
if ($request->email == $request->user()->email) {
Auth::guard('web')->logout();
return $this->apiResponse(null, 401, 'You have been logout.', 401);
} else {
return $this->index();
}
}
</code></pre>
### Admin_AuthenticatedSessionController
> 改寫 Fourtify 登入function
- code 路徑:app/Http/Controllers/Api/Admin/AuthenticatedSessionController.php
- [http://192.168.1.151:8765/test/test-backend/-/commit/483ba47128c1981e48cdfff55ae0aebdea7154b7#eeba4528bb5ed7977a0c084433334b149d152200](http://192.168.1.151:8765/test/test-backend/-/commit/483ba47128c1981e48cdfff55ae0aebdea7154b7#eeba4528bb5ed7977a0c084433334b149d152200)
### Admin_ChatLogController
> sqs
- code path: app/Http/Controllers/Api/Admin/ChatLogController.php
- [http://192.168.1.151:8765/test/test-backend/-/blob/yan-backend/app/Http/Controllers/Api/Admin/ChatLogController.php](http://192.168.1.151:8765/test/test-backend/-/blob/yan-backend/app/Http/Controllers/Api/Admin/ChatLogController.php)
### Admin_ContactMessageController
> 聊天室小編不在線上前台使用者留言API
- code path: app/Http/Controllers/Api/Admin/ContactMessageController.php
- [http://192.168.1.151:8765/test/test-backend/-/blob/yan-backend/app/Http/Controllers/Api/Admin/ContactMessageController.php](http://192.168.1.151:8765/test/test-backend/-/blob/yan-backend/app/Http/Controllers/Api/Admin/ContactMessageController.php)
### Admin_GroupController
> 頻道
- code path: app/Http/Controllers/Api/Admin/GroupController.php
- [http://192.168.1.151:8765/test/test-backend/-/blob/yan-backend/app/Http/Controllers/Api/Admin/GroupController.php](http://192.168.1.151:8765/test/test-backend/-/blob/yan-backend/app/Http/Controllers/Api/Admin/GroupController.php)
### Admin_QuestionAnswerController
> 問答
- code path: app/Http/Controllers/Api/Admin/QuestionAnswerController.php
- [http://192.168.1.151:8765/test/test-backend/-/blob/yan-backend/app/Http/Controllers/Api/Admin/QuestionAnswerController.php](http://192.168.1.151:8765/test/test-backend/-/blob/yan-backend/app/Http/Controllers/Api/Admin/QuestionAnswerController.php)
### ClientController
> 前台訪客
- code path: app/Http/Controllers/Api/Client/ClientController.php
- [http://192.168.1.151:8765/test/test-backend/-/commit/339ea59efa3c9a7505c92e2677614081d4ff7caa#b868f17cc77d38d328d70b8ba37b46bb25e83935](http://192.168.1.151:8765/test/test-backend/-/commit/339ea59efa3c9a7505c92e2677614081d4ff7caa#b868f17cc77d38d328d70b8ba37b46bb25e83935)
### ContactMessageController
> 沒有小編在線上的留言 API
- code path: app/Http/Controllers/Api/ContactMessageController.php
- [http://192.168.1.151:8765/test/test-backend/-/commit/339ea59efa3c9a7505c92e2677614081d4ff7caa#776310415b1b9360f3a7953b187578903140b5c7](http://192.168.1.151:8765/test/test-backend/-/commit/339ea59efa3c9a7505c92e2677614081d4ff7caa#776310415b1b9360f3a7953b187578903140b5c7)
### LocaleController
> 語系
- code path: app/Http/Controllers/Api/Admin/
- [http://192.168.1.151:8765/test/test-backend/-/commit/339ea59efa3c9a7505c92e2677614081d4ff7caa#6234346fa4f45089b9fd494cd7a6a6c56986f641](http://192.168.1.151:8765/test/test-backend/-/commit/339ea59efa3c9a7505c92e2677614081d4ff7caa#6234346fa4f45089b9fd494cd7a6a6c56986f641)
- code path: app/Http/Controllers/Api/Admin/
- []()
---
## Export:
### Chat_logs_export
> 聊天記錄匯出
- code path: app/Exports/ChatLogsExport.php
- [http://192.168.1.151:8765/test/test-backend/-/commit/339ea59efa3c9a7505c92e2677614081d4ff7caa#4f88cfc89b43f2da7ccd624262015d3f5c768974](http://192.168.1.151:8765/test/test-backend/-/commit/339ea59efa3c9a7505c92e2677614081d4ff7caa#4f88cfc89b43f2da7ccd624262015d3f5c768974)
### Contact_message_export
> 留言紀錄匯出
- code path: app/Exports/ContactMessageExport.php
- [http://192.168.1.151:8765/test/test-backend/-/commit/339ea59efa3c9a7505c92e2677614081d4ff7caa#e6841a459d07c265e30f2cf2395e08be5e38fa83](http://192.168.1.151:8765/test/test-backend/-/commit/339ea59efa3c9a7505c92e2677614081d4ff7caa#e6841a459d07c265e30f2cf2395e08be5e38fa83)
## Mail:
### Contact_message
- code path: app/Mail/ContactMessage.php
- [http://192.168.1.151:8765/test/test-backend/-/commit/339ea59efa3c9a7505c92e2677614081d4ff7caa#c5030c5992fd72cee17d37166f7392ac532fe358](http://192.168.1.151:8765/test/test-backend/-/commit/339ea59efa3c9a7505c92e2677614081d4ff7caa#c5030c5992fd72cee17d37166f7392ac532fe358)
## View:
### ContactMessageView
- code path: resources/views/mails/contactMessage.blade.pug
- [http://192.168.1.151:8765/test/test-backend/-/commit/5c115edb2fbe98a6b57ad9a6863b9b5a5481eb5d#3025c7e73adca322ed30b2a5419c54e304e205a5](http://192.168.1.151:8765/test/test-backend/-/commit/5c115edb2fbe98a6b57ad9a6863b9b5a5481eb5d#3025c7e73adca322ed30b2a5419c54e304e205a5)
### ResetPasswordView
- code path: resources/views/mails/resetPassword.blade.pug
- [http://192.168.1.151:8765/test/test-backend/-/commit/5c115edb2fbe98a6b57ad9a6863b9b5a5481eb5d#78ae6776c253e306354172afc13eb6c117e7d53d](http://192.168.1.151:8765/test/test-backend/-/commit/5c115edb2fbe98a6b57ad9a6863b9b5a5481eb5d#78ae6776c253e306354172afc13eb6c117e7d53d)