feat: Implement admin role and permission management, employee management APIs, and user profile extensions.
This commit is contained in:
@@ -0,0 +1,170 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Api\Admin\Employee;
|
||||||
|
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use App\Http\Requests\EmployeeRequest;
|
||||||
|
use App\Repositories\Employee\EmployeeRepositoryInterface;
|
||||||
|
use Illuminate\Http\JsonResponse;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
use Illuminate\Support\Facades\Hash;
|
||||||
|
use Spatie\Permission\Models\Role;
|
||||||
|
|
||||||
|
class EmployeeController extends Controller
|
||||||
|
{
|
||||||
|
public function __construct(
|
||||||
|
private readonly EmployeeRepositoryInterface $employeeRepository
|
||||||
|
) {}
|
||||||
|
|
||||||
|
public function index(Request $request): JsonResponse
|
||||||
|
{
|
||||||
|
$employees = $this->employeeRepository->filter($request->all());
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'error' => false,
|
||||||
|
'data' => $employees,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function store(EmployeeRequest $request): JsonResponse
|
||||||
|
{
|
||||||
|
$request->validated();
|
||||||
|
|
||||||
|
try {
|
||||||
|
DB::beginTransaction();
|
||||||
|
|
||||||
|
$employee = $this->employeeRepository->create([
|
||||||
|
'firstname' => $request->firstname,
|
||||||
|
'lastname' => $request->lastname,
|
||||||
|
'username' => $request->username,
|
||||||
|
'email' => $request->email,
|
||||||
|
'phone' => $request->phone,
|
||||||
|
'birthday' => $request->birthday,
|
||||||
|
'address' => $request->address,
|
||||||
|
'password' => Hash::make($request->password),
|
||||||
|
]);
|
||||||
|
|
||||||
|
$employee->syncRoles([$request->role]);
|
||||||
|
|
||||||
|
DB::commit();
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'error' => false,
|
||||||
|
'message' => 'Employee created successfully',
|
||||||
|
'data' => $employee->load('roles'),
|
||||||
|
], 201);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
DB::rollBack();
|
||||||
|
return response()->json([
|
||||||
|
'error' => true,
|
||||||
|
'message' => $e->getMessage(),
|
||||||
|
], 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function show(int $id): JsonResponse
|
||||||
|
{
|
||||||
|
$employee = $this->employeeRepository->find($id);
|
||||||
|
|
||||||
|
if (!$employee) {
|
||||||
|
return response()->json([
|
||||||
|
'error' => true,
|
||||||
|
'message' => "Can't find employee by ID #" . $id,
|
||||||
|
], 404);
|
||||||
|
}
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'error' => false,
|
||||||
|
'data' => $employee->load('roles'),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function update(int $id, EmployeeRequest $request): JsonResponse
|
||||||
|
{
|
||||||
|
$employee = $this->employeeRepository->find($id);
|
||||||
|
|
||||||
|
if (!$employee) {
|
||||||
|
return response()->json([
|
||||||
|
'error' => true,
|
||||||
|
'message' => "Can't find employee by ID #" . $id,
|
||||||
|
], 404);
|
||||||
|
}
|
||||||
|
|
||||||
|
$request->validated();
|
||||||
|
|
||||||
|
try {
|
||||||
|
DB::beginTransaction();
|
||||||
|
|
||||||
|
$data = [
|
||||||
|
'firstname' => $request->firstname,
|
||||||
|
'lastname' => $request->lastname,
|
||||||
|
'username' => $request->username,
|
||||||
|
'email' => $request->email,
|
||||||
|
'phone' => $request->phone,
|
||||||
|
'birthday' => $request->birthday,
|
||||||
|
'address' => $request->address,
|
||||||
|
];
|
||||||
|
|
||||||
|
if ($request->filled('password')) {
|
||||||
|
$data['password'] = Hash::make($request->password);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->employeeRepository->update($id, $data);
|
||||||
|
$employee->syncRoles([$request->role]);
|
||||||
|
|
||||||
|
DB::commit();
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'error' => false,
|
||||||
|
'message' => 'Employee updated successfully',
|
||||||
|
'data' => $this->employeeRepository->find($id)->load('roles'),
|
||||||
|
]);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
DB::rollBack();
|
||||||
|
return response()->json([
|
||||||
|
'error' => true,
|
||||||
|
'message' => $e->getMessage(),
|
||||||
|
], 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function destroy(int $id): JsonResponse
|
||||||
|
{
|
||||||
|
$employee = $this->employeeRepository->find($id);
|
||||||
|
|
||||||
|
if (!$employee) {
|
||||||
|
return response()->json([
|
||||||
|
'error' => true,
|
||||||
|
'message' => "Can't find employee by ID #" . $id,
|
||||||
|
], 404);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
DB::beginTransaction();
|
||||||
|
$this->employeeRepository->delete($id);
|
||||||
|
DB::commit();
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'error' => false,
|
||||||
|
'message' => 'Employee deleted successfully',
|
||||||
|
]);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
DB::rollBack();
|
||||||
|
return response()->json([
|
||||||
|
'error' => true,
|
||||||
|
'message' => $e->getMessage(),
|
||||||
|
], 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function roles(): JsonResponse
|
||||||
|
{
|
||||||
|
$roles = Role::where('guard_name', 'admin')->get(['id', 'name']);
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'error' => false,
|
||||||
|
'data' => $roles,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,266 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Api\Admin\Role;
|
||||||
|
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use Illuminate\Http\JsonResponse;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
use Spatie\Permission\Models\Permission;
|
||||||
|
use Spatie\Permission\Models\Role;
|
||||||
|
|
||||||
|
class RolePermissionController extends Controller
|
||||||
|
{
|
||||||
|
private function ensureFullAdmin(): bool
|
||||||
|
{
|
||||||
|
$user = auth('admin')->user();
|
||||||
|
return $user && $user->hasRole('Full Administrator');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GET /v1/administrator/role-permissions
|
||||||
|
* Danh sách tất cả roles (trừ Full Administrator) kèm permissions hiện tại
|
||||||
|
*/
|
||||||
|
public function index(): JsonResponse
|
||||||
|
{
|
||||||
|
if (!$this->ensureFullAdmin()) {
|
||||||
|
return response()->json(['error' => true, 'message' => 'Bạn không có quyền truy cập'], 403);
|
||||||
|
}
|
||||||
|
|
||||||
|
$roles = Role::where('guard_name', 'admin')
|
||||||
|
->where('name', '!=', 'Full Administrator')
|
||||||
|
->with('permissions')
|
||||||
|
->get()
|
||||||
|
->map(fn ($role) => [
|
||||||
|
'id' => $role->id,
|
||||||
|
'name' => $role->name,
|
||||||
|
'permissions' => $role->permissions->pluck('name')->values(),
|
||||||
|
]);
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'error' => false,
|
||||||
|
'data' => $roles,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GET /v1/administrator/role-permissions/all-permissions
|
||||||
|
* Tất cả permissions nhóm theo module
|
||||||
|
*/
|
||||||
|
public function allPermissions(): JsonResponse
|
||||||
|
{
|
||||||
|
if (!$this->ensureFullAdmin()) {
|
||||||
|
return response()->json(['error' => true, 'message' => 'Bạn không có quyền truy cập'], 403);
|
||||||
|
}
|
||||||
|
|
||||||
|
$grouped = Permission::where('guard_name', 'admin')
|
||||||
|
->orderBy('id')
|
||||||
|
->get(['id', 'name'])
|
||||||
|
->groupBy(function ($p) {
|
||||||
|
// Format: module.action (e.g., product-service.view, customer.manager)
|
||||||
|
$parts = explode('.', $p->name);
|
||||||
|
return $parts[0] ?? $p->name;
|
||||||
|
})
|
||||||
|
->map(function ($group, $module) {
|
||||||
|
return [
|
||||||
|
'module' => $module,
|
||||||
|
'permissions' => $group->map(fn ($p) => [
|
||||||
|
'id' => $p->id,
|
||||||
|
'name' => $p->name,
|
||||||
|
'action' => explode('.', $p->name)[1] ?? $p->name,
|
||||||
|
])->values(),
|
||||||
|
];
|
||||||
|
})
|
||||||
|
->values();
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'error' => false,
|
||||||
|
'data' => $grouped,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GET /v1/administrator/role-permissions/mine
|
||||||
|
* Trả về permissions hiệu lực của user đang đăng nhập (qua role của họ).
|
||||||
|
* Accessible bởi mọi admin đã xác thực — không yêu cầu Full Administrator.
|
||||||
|
*/
|
||||||
|
public function mine(): JsonResponse
|
||||||
|
{
|
||||||
|
$user = auth('admin')->user();
|
||||||
|
if (!$user) {
|
||||||
|
return response()->json(['error' => true, 'message' => 'Unauthorized'], 401);
|
||||||
|
}
|
||||||
|
|
||||||
|
$isFullAdmin = $user->hasRole('Full Administrator', 'admin');
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'error' => false,
|
||||||
|
'data' => [
|
||||||
|
'isFullAdmin' => $isFullAdmin,
|
||||||
|
'permissions' => $isFullAdmin
|
||||||
|
? ['*']
|
||||||
|
: $user->getAllPermissions()->pluck('name')->toArray(),
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* POST /v1/administrator/role-permissions/permissions
|
||||||
|
* Tạo một nhóm permissions mới theo module (chỉ Full Administrator)
|
||||||
|
*/
|
||||||
|
public function createPermissionGroup(Request $request): JsonResponse
|
||||||
|
{
|
||||||
|
if (!$this->ensureFullAdmin()) {
|
||||||
|
return response()->json(['error' => true, 'message' => 'Bạn không có quyền truy cập'], 403);
|
||||||
|
}
|
||||||
|
|
||||||
|
$module = trim($request->input('module', ''));
|
||||||
|
$actions = $request->input('actions', ['view', 'create', 'edit', 'destroy', 'manager']);
|
||||||
|
|
||||||
|
if (!$module) {
|
||||||
|
return response()->json(['error' => true, 'message' => 'Tên module không được trống'], 422);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Kiểm tra module đã tồn tại chưa
|
||||||
|
$existing = Permission::where('guard_name', 'admin')
|
||||||
|
->where('name', 'like', $module . '.%')
|
||||||
|
->exists();
|
||||||
|
|
||||||
|
if ($existing) {
|
||||||
|
return response()->json(['error' => true, 'message' => "Module \"{$module}\" đã tồn tại"], 422);
|
||||||
|
}
|
||||||
|
|
||||||
|
$created = [];
|
||||||
|
foreach ($actions as $action) {
|
||||||
|
$name = $module . '.' . $action;
|
||||||
|
$perm = Permission::firstOrCreate([
|
||||||
|
'name' => $name,
|
||||||
|
'guard_name' => 'admin',
|
||||||
|
]);
|
||||||
|
$created[] = [
|
||||||
|
'id' => $perm->id,
|
||||||
|
'name' => $perm->name,
|
||||||
|
'action' => $action,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Full Administrator tự động được cấp permissions mới
|
||||||
|
$fullAdmin = Role::where('name', 'Full Administrator')
|
||||||
|
->where('guard_name', 'admin')
|
||||||
|
->first();
|
||||||
|
if ($fullAdmin) {
|
||||||
|
$fullAdmin->givePermissionTo(array_column($created, 'name'));
|
||||||
|
}
|
||||||
|
|
||||||
|
app()[\Spatie\Permission\PermissionRegistrar::class]->forgetCachedPermissions();
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'error' => false,
|
||||||
|
'data' => [
|
||||||
|
'module' => $module,
|
||||||
|
'permissions' => $created,
|
||||||
|
],
|
||||||
|
], 201);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* DELETE /v1/administrator/role-permissions/permissions/group/{module}
|
||||||
|
* Xóa toàn bộ permissions của một module (chỉ Full Administrator)
|
||||||
|
*/
|
||||||
|
public function deletePermissionGroup(string $module): JsonResponse
|
||||||
|
{
|
||||||
|
if (!$this->ensureFullAdmin()) {
|
||||||
|
return response()->json(['error' => true, 'message' => 'Bạn không có quyền truy cập'], 403);
|
||||||
|
}
|
||||||
|
|
||||||
|
$deleted = Permission::where('guard_name', 'admin')
|
||||||
|
->where('name', 'like', $module . '.%')
|
||||||
|
->get();
|
||||||
|
|
||||||
|
if ($deleted->isEmpty()) {
|
||||||
|
return response()->json(['error' => true, 'message' => 'Không tìm thấy nhóm quyền'], 404);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($deleted as $perm) {
|
||||||
|
$perm->delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
app()[\Spatie\Permission\PermissionRegistrar::class]->forgetCachedPermissions();
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'error' => false,
|
||||||
|
'message' => "Đã xóa nhóm quyền \"{$module}\"",
|
||||||
|
'data' => ['module' => $module, 'deleted' => $deleted->count()],
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PATCH /v1/administrator/role-permissions/permissions/{id}
|
||||||
|
* Đổi tên một permission (chỉ Full Administrator)
|
||||||
|
*/
|
||||||
|
public function renamePermission(int $id, Request $request): JsonResponse
|
||||||
|
{
|
||||||
|
if (!$this->ensureFullAdmin()) {
|
||||||
|
return response()->json(['error' => true, 'message' => 'Bạn không có quyền truy cập'], 403);
|
||||||
|
}
|
||||||
|
|
||||||
|
$permission = Permission::where('guard_name', 'admin')->find($id);
|
||||||
|
if (!$permission) {
|
||||||
|
return response()->json(['error' => true, 'message' => 'Không tìm thấy permission'], 404);
|
||||||
|
}
|
||||||
|
|
||||||
|
$newName = trim($request->input('name', ''));
|
||||||
|
if (!$newName) {
|
||||||
|
return response()->json(['error' => true, 'message' => 'Tên permission không được trống'], 422);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Permission::where('guard_name', 'admin')->where('name', $newName)->where('id', '!=', $id)->exists()) {
|
||||||
|
return response()->json(['error' => true, 'message' => 'Tên permission đã tồn tại'], 422);
|
||||||
|
}
|
||||||
|
|
||||||
|
$permission->update(['name' => $newName]);
|
||||||
|
app()[\Spatie\Permission\PermissionRegistrar::class]->forgetCachedPermissions();
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'error' => false,
|
||||||
|
'data' => ['id' => $permission->id, 'name' => $permission->name],
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PUT /v1/administrator/role-permissions/{roleId}
|
||||||
|
* Sync permissions cho một role
|
||||||
|
*/
|
||||||
|
public function update(int $roleId, Request $request): JsonResponse
|
||||||
|
{
|
||||||
|
if (!$this->ensureFullAdmin()) {
|
||||||
|
return response()->json(['error' => true, 'message' => 'Bạn không có quyền truy cập'], 403);
|
||||||
|
}
|
||||||
|
|
||||||
|
$role = Role::where('guard_name', 'admin')
|
||||||
|
->where('name', '!=', 'Full Administrator')
|
||||||
|
->find($roleId);
|
||||||
|
|
||||||
|
if (!$role) {
|
||||||
|
return response()->json([
|
||||||
|
'error' => true,
|
||||||
|
'message' => 'Không tìm thấy vai trò',
|
||||||
|
], 404);
|
||||||
|
}
|
||||||
|
|
||||||
|
$permissions = $request->input('permissions', []);
|
||||||
|
$role->syncPermissions($permissions);
|
||||||
|
|
||||||
|
// Xóa cache để /mine endpoint trả về permissions mới nhất
|
||||||
|
app()[\Spatie\Permission\PermissionRegistrar::class]->forgetCachedPermissions();
|
||||||
|
|
||||||
|
return response()->json([
|
||||||
|
'error' => false,
|
||||||
|
'message' => "Đã cập nhật quyền cho vai trò \"{$role->name}\"",
|
||||||
|
'data' => [
|
||||||
|
'id' => $role->id,
|
||||||
|
'name' => $role->name,
|
||||||
|
'permissions' => $role->permissions()->pluck('name')->values(),
|
||||||
|
],
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -70,5 +70,6 @@ class Kernel extends HttpKernel
|
|||||||
'Staff' => \App\Http\Middleware\StaffCheck::class,
|
'Staff' => \App\Http\Middleware\StaffCheck::class,
|
||||||
'json.response' => \App\Http\Middleware\ForceJsonResponse::class,
|
'json.response' => \App\Http\Middleware\ForceJsonResponse::class,
|
||||||
'api.auth' => \App\Http\Middleware\ApiAuthCheck::class,
|
'api.auth' => \App\Http\Middleware\ApiAuthCheck::class,
|
||||||
|
'perm' => \App\Http\Middleware\CheckPermission::class,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Middleware;
|
||||||
|
|
||||||
|
use Closure;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
|
class CheckPermission
|
||||||
|
{
|
||||||
|
public function handle(Request $request, Closure $next, string $permission): mixed
|
||||||
|
{
|
||||||
|
$user = auth('admin')->user();
|
||||||
|
|
||||||
|
if (!$user) {
|
||||||
|
return response()->json([
|
||||||
|
'error' => true,
|
||||||
|
'message' => 'Vui lòng đăng nhập để thực hiện!',
|
||||||
|
], 401);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Full Administrator luôn có tất cả quyền
|
||||||
|
if ($user->hasRole('Full Administrator')) {
|
||||||
|
return $next($request);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$user->hasPermissionTo($permission)) {
|
||||||
|
return response()->json([
|
||||||
|
'error' => true,
|
||||||
|
'message' => "Bạn không có quyền: \"{$permission}\".",
|
||||||
|
], 403);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $next($request);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Requests;
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
use Illuminate\Validation\Rule;
|
||||||
|
|
||||||
|
class EmployeeRequest extends FormRequest
|
||||||
|
{
|
||||||
|
public function authorize(): bool
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function rules(): array
|
||||||
|
{
|
||||||
|
$employeeId = $this->route('id');
|
||||||
|
|
||||||
|
$rules = [
|
||||||
|
'firstname' => 'required|string|max:255',
|
||||||
|
'lastname' => 'required|string|max:255',
|
||||||
|
'username' => ['required', 'string', 'max:255', Rule::unique('user', 'username')->ignore($employeeId)],
|
||||||
|
'email' => ['required', 'email', 'max:255', Rule::unique('user', 'email')->ignore($employeeId)],
|
||||||
|
'role' => ['required', Rule::in(['Administrator', 'Sale', 'IT', 'Customer Service', 'Marketing'])],
|
||||||
|
'phone' => 'nullable|string|max:20',
|
||||||
|
'birthday' => 'nullable|date',
|
||||||
|
'address' => 'nullable|string|max:500',
|
||||||
|
];
|
||||||
|
|
||||||
|
if ($this->isMethod('POST')) {
|
||||||
|
$rules['password'] = 'required|string|min:8|confirmed';
|
||||||
|
} else {
|
||||||
|
$rules['password'] = 'nullable|string|min:8|confirmed';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $rules;
|
||||||
|
}
|
||||||
|
}
|
||||||
+6
-1
@@ -14,6 +14,8 @@ class User extends Authenticatable implements JWTSubject
|
|||||||
use HasRoles;
|
use HasRoles;
|
||||||
|
|
||||||
protected $table = 'user';
|
protected $table = 'user';
|
||||||
|
|
||||||
|
protected $guard_name = 'admin';
|
||||||
/**
|
/**
|
||||||
* The attributes that are mass assignable.
|
* The attributes that are mass assignable.
|
||||||
*
|
*
|
||||||
@@ -25,7 +27,10 @@ class User extends Authenticatable implements JWTSubject
|
|||||||
'lastname',
|
'lastname',
|
||||||
'username',
|
'username',
|
||||||
'email',
|
'email',
|
||||||
'email_verified_at'
|
'email_verified_at',
|
||||||
|
'birthday',
|
||||||
|
'address',
|
||||||
|
'phone',
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -53,6 +53,10 @@ class AppServiceProvider extends ServiceProvider
|
|||||||
\App\Repositories\Admin\Product\AdminProductRepositoryInterface::class,
|
\App\Repositories\Admin\Product\AdminProductRepositoryInterface::class,
|
||||||
\App\Repositories\Admin\Product\AdminProductRepository::class
|
\App\Repositories\Admin\Product\AdminProductRepository::class
|
||||||
);
|
);
|
||||||
|
$this->app->bind(
|
||||||
|
\App\Repositories\Employee\EmployeeRepositoryInterface::class,
|
||||||
|
\App\Repositories\Employee\EmployeeRepository::class
|
||||||
|
);
|
||||||
|
|
||||||
if (File::exists(base_path('app/Http/Helpers/function_helper.php'))) {
|
if (File::exists(base_path('app/Http/Helpers/function_helper.php'))) {
|
||||||
File::requireOnce(base_path('app/Http/Helpers/function_helper.php'));
|
File::requireOnce(base_path('app/Http/Helpers/function_helper.php'));
|
||||||
|
|||||||
@@ -0,0 +1,37 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Repositories\Employee;
|
||||||
|
|
||||||
|
use App\Models\User;
|
||||||
|
use App\Repositories\BaseRepository;
|
||||||
|
|
||||||
|
class EmployeeRepository extends BaseRepository implements EmployeeRepositoryInterface
|
||||||
|
{
|
||||||
|
public function getModel(): string
|
||||||
|
{
|
||||||
|
return User::class;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function filter(array $data): mixed
|
||||||
|
{
|
||||||
|
$query = $this->model->with('roles');
|
||||||
|
|
||||||
|
if (!empty($data['search'])) {
|
||||||
|
$search = $data['search'];
|
||||||
|
$query->where(function ($q) use ($search) {
|
||||||
|
$q->where('firstname', 'like', "%{$search}%")
|
||||||
|
->orWhere('lastname', 'like', "%{$search}%")
|
||||||
|
->orWhere('username', 'like', "%{$search}%")
|
||||||
|
->orWhere('email', 'like', "%{$search}%");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($data['role'])) {
|
||||||
|
$query->whereHas('roles', fn($q) => $q->where('name', $data['role']));
|
||||||
|
}
|
||||||
|
|
||||||
|
$perPage = $data['per_page'] ?? 15;
|
||||||
|
|
||||||
|
return $query->orderBy('id', 'desc')->paginate($perPage);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Repositories\Employee;
|
||||||
|
|
||||||
|
use App\Repositories\BaseRepositoryInterface;
|
||||||
|
|
||||||
|
interface EmployeeRepositoryInterface extends BaseRepositoryInterface
|
||||||
|
{
|
||||||
|
public function filter(array $data): mixed;
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
Schema::table('user', function (Blueprint $table) {
|
||||||
|
$table->date('birthday')->nullable()->after('email');
|
||||||
|
$table->string('address')->nullable()->after('birthday');
|
||||||
|
$table->string('phone', 20)->nullable()->after('address');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::table('user', function (Blueprint $table) {
|
||||||
|
$table->dropColumn(['birthday', 'address', 'phone']);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -0,0 +1,94 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Database\Seeders;
|
||||||
|
|
||||||
|
use Illuminate\Database\Seeder;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
use Spatie\Permission\Models\Permission;
|
||||||
|
use Spatie\Permission\Models\Role;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sửa guard_name từ 'admins' → 'admin' cho tất cả roles & permissions.
|
||||||
|
* Chạy 1 lần: php artisan db:seed --class=FixRoleGuardSeeder
|
||||||
|
*/
|
||||||
|
class FixRoleGuardSeeder extends Seeder
|
||||||
|
{
|
||||||
|
public function run(): void
|
||||||
|
{
|
||||||
|
app()[\Spatie\Permission\PermissionRegistrar::class]->forgetCachedPermissions();
|
||||||
|
|
||||||
|
// Cập nhật permissions
|
||||||
|
DB::table('permissions')
|
||||||
|
->where('guard_name', 'admins')
|
||||||
|
->update(['guard_name' => 'admin']);
|
||||||
|
|
||||||
|
// Cập nhật roles
|
||||||
|
DB::table('roles')
|
||||||
|
->where('guard_name', 'admins')
|
||||||
|
->update(['guard_name' => 'admin']);
|
||||||
|
|
||||||
|
$this->command->info('✅ Đã cập nhật guard_name: admins → admin cho ' .
|
||||||
|
Role::where('guard_name', 'admin')->count() . ' roles, ' .
|
||||||
|
Permission::where('guard_name', 'admin')->count() . ' permissions.');
|
||||||
|
|
||||||
|
// Đảm bảo 6 roles tồn tại với guard admin
|
||||||
|
$roles = [
|
||||||
|
'Full Administrator',
|
||||||
|
'Administrator',
|
||||||
|
'Sale',
|
||||||
|
'IT',
|
||||||
|
'Customer Service',
|
||||||
|
'Marketing',
|
||||||
|
];
|
||||||
|
|
||||||
|
foreach ($roles as $name) {
|
||||||
|
Role::firstOrCreate([
|
||||||
|
'name' => $name,
|
||||||
|
'guard_name' => 'admin',
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Full Administrator luôn có tất cả permissions
|
||||||
|
$fullAdmin = Role::where('name', 'Full Administrator')
|
||||||
|
->where('guard_name', 'admin')
|
||||||
|
->first();
|
||||||
|
|
||||||
|
if ($fullAdmin) {
|
||||||
|
$fullAdmin->syncPermissions(
|
||||||
|
Permission::where('guard_name', 'admin')->get()
|
||||||
|
);
|
||||||
|
$this->command->info('✅ Full Administrator đã được cấp tất cả quyền.');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Administrator được cấp một số quyền cơ bản
|
||||||
|
$admin = Role::where('name', 'Administrator')
|
||||||
|
->where('guard_name', 'admin')
|
||||||
|
->first();
|
||||||
|
|
||||||
|
if ($admin) {
|
||||||
|
$adminPermissions = [
|
||||||
|
'customer.view',
|
||||||
|
'customer.create',
|
||||||
|
'customer.edit',
|
||||||
|
'customer.manager',
|
||||||
|
'product-service.view',
|
||||||
|
'product-service.create',
|
||||||
|
'product-service.edit',
|
||||||
|
'product-service.manager',
|
||||||
|
'order.view',
|
||||||
|
'order.create',
|
||||||
|
'order.edit',
|
||||||
|
'order.manager',
|
||||||
|
'administrator.view',
|
||||||
|
'administrator.manager',
|
||||||
|
];
|
||||||
|
$perms = Permission::whereIn('name', $adminPermissions)
|
||||||
|
->where('guard_name', 'admin')
|
||||||
|
->get();
|
||||||
|
$admin->syncPermissions($perms);
|
||||||
|
$this->command->info('✅ Administrator đã được cấp quyền: ' . implode(', ', $adminPermissions));
|
||||||
|
}
|
||||||
|
|
||||||
|
app()[\Spatie\Permission\PermissionRegistrar::class]->forgetCachedPermissions();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,22 +2,27 @@
|
|||||||
|
|
||||||
namespace Database\Seeders;
|
namespace Database\Seeders;
|
||||||
|
|
||||||
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
|
|
||||||
use Illuminate\Database\Seeder;
|
use Illuminate\Database\Seeder;
|
||||||
use Spatie\Permission\Models\Role;
|
use Spatie\Permission\Models\Role;
|
||||||
|
|
||||||
class RoleSeeder extends Seeder
|
class RoleSeeder extends Seeder
|
||||||
{
|
{
|
||||||
/**
|
public function run(): void
|
||||||
* Run the database seeds.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function run()
|
|
||||||
{
|
{
|
||||||
Role::create([
|
$roles = [
|
||||||
'name' => 'Full Administrator',
|
'Full Administrator',
|
||||||
'guard_name' => 'admins'
|
'Administrator',
|
||||||
]);
|
'Sale',
|
||||||
|
'IT',
|
||||||
|
'Customer Service',
|
||||||
|
'Marketing',
|
||||||
|
];
|
||||||
|
|
||||||
|
foreach ($roles as $name) {
|
||||||
|
Role::firstOrCreate([
|
||||||
|
'name' => $name,
|
||||||
|
'guard_name' => 'admin',
|
||||||
|
]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,135 +2,158 @@
|
|||||||
|
|
||||||
namespace Database\Seeders;
|
namespace Database\Seeders;
|
||||||
|
|
||||||
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
|
|
||||||
use Illuminate\Database\Seeder;
|
use Illuminate\Database\Seeder;
|
||||||
use Spatie\Permission\Models\Permission;
|
use Spatie\Permission\Models\Permission;
|
||||||
use Spatie\Permission\Models\Role;
|
use Spatie\Permission\Models\Role;
|
||||||
|
|
||||||
|
|
||||||
class RolesAndPermissions extends Seeder
|
class RolesAndPermissions extends Seeder
|
||||||
{
|
{
|
||||||
/**
|
public function run(): void
|
||||||
* Run the database seeds.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
public function run()
|
|
||||||
{
|
{
|
||||||
// Reset cached roles and permissions
|
// Reset cached roles and permissions
|
||||||
app()[\Spatie\Permission\PermissionRegistrar::class]->forgetCachedPermissions();
|
app()[\Spatie\Permission\PermissionRegistrar::class]->forgetCachedPermissions();
|
||||||
|
|
||||||
// create client permissions
|
$permissions = [
|
||||||
Permission::create(['name' => 'manager customer']);
|
// Khách hàng
|
||||||
Permission::create(['name' => 'add customer']);
|
'customer.view',
|
||||||
Permission::create(['name' => 'edit customer']);
|
'customer.create',
|
||||||
Permission::create(['name' => 'delete customer']);
|
'customer.edit',
|
||||||
|
'customer.destroy',
|
||||||
|
'customer.manager',
|
||||||
|
|
||||||
// create admin permissions
|
// Nhân sự
|
||||||
Permission::create(['name' => 'manager administrator']);
|
'administrator.view',
|
||||||
Permission::create(['name' => 'add administrator']);
|
'administrator.create',
|
||||||
Permission::create(['name' => 'edit administrator']);
|
'administrator.edit',
|
||||||
Permission::create(['name' => 'delete administrator']);
|
'administrator.destroy',
|
||||||
|
'administrator.manager',
|
||||||
|
|
||||||
// create product permissions
|
// Sản phẩm / Dịch vụ
|
||||||
Permission::create(['name' => 'manager product']);
|
'product-service.view',
|
||||||
Permission::create(['name' => 'add product']);
|
'product-service.create',
|
||||||
Permission::create(['name' => 'edit product']);
|
'product-service.edit',
|
||||||
Permission::create(['name' => 'delete product']);
|
'product-service.destroy',
|
||||||
|
'product-service.manager',
|
||||||
|
|
||||||
// create order permissions
|
// Đơn hàng
|
||||||
Permission::create(['name' => 'manager order']);
|
'order.view',
|
||||||
Permission::create(['name' => 'add order']);
|
'order.create',
|
||||||
Permission::create(['name' => 'edit order']);
|
'order.edit',
|
||||||
Permission::create(['name' => 'delete order']);
|
'order.destroy',
|
||||||
|
'order.manager',
|
||||||
|
|
||||||
// create invoice permissions
|
// Hóa đơn
|
||||||
Permission::create(['name' => 'manager invoice']);
|
'invoice.view',
|
||||||
Permission::create(['name' => 'add invoice']);
|
'invoice.create',
|
||||||
Permission::create(['name' => 'edit invoice']);
|
'invoice.edit',
|
||||||
Permission::create(['name' => 'delete invoice']);
|
'invoice.destroy',
|
||||||
|
'invoice.manager',
|
||||||
|
|
||||||
// Create Coupon Permissions
|
// Mã giảm giá
|
||||||
Permission::create(['name' => 'manager coupon']);
|
'coupon.view',
|
||||||
Permission::create(['name' => 'add coupon']);
|
'coupon.create',
|
||||||
Permission::create(['name' => 'edit coupon']);
|
'coupon.edit',
|
||||||
Permission::create(['name' => 'delete coupon']);
|
'coupon.destroy',
|
||||||
|
'coupon.manager',
|
||||||
|
|
||||||
// Create post Permissions
|
// Bài viết
|
||||||
Permission::create(['name' => 'manager post']);
|
'post.view',
|
||||||
Permission::create(['name' => 'add post']);
|
'post.create',
|
||||||
Permission::create(['name' => 'edit post']);
|
'post.edit',
|
||||||
Permission::create(['name' => 'delete post']);
|
'post.destroy',
|
||||||
|
'post.manager',
|
||||||
|
|
||||||
// Create support Permissions
|
// Hỗ trợ
|
||||||
Permission::create(['name' => 'manager support']);
|
'support.view',
|
||||||
Permission::create(['name' => 'add support']);
|
'support.create',
|
||||||
Permission::create(['name' => 'edit support']);
|
'support.edit',
|
||||||
Permission::create(['name' => 'delete support']);
|
'support.destroy',
|
||||||
|
'support.manager',
|
||||||
|
|
||||||
// Create Payment Permissions
|
// Thanh toán
|
||||||
Permission::create(['name' => 'manager payment']);
|
'payment.view',
|
||||||
Permission::create(['name' => 'add payment']);
|
'payment.create',
|
||||||
Permission::create(['name' => 'edit payment']);
|
'payment.edit',
|
||||||
Permission::create(['name' => 'delete payment']);
|
'payment.destroy',
|
||||||
|
'payment.manager',
|
||||||
|
|
||||||
// create module dns permissions
|
// Module DNS
|
||||||
Permission::create(['name' => 'manager module dns']);
|
'module-dns.view',
|
||||||
Permission::create(['name' => 'add module dns']);
|
'module-dns.create',
|
||||||
Permission::create(['name' => 'edit module dns']);
|
'module-dns.edit',
|
||||||
Permission::create(['name' => 'delete module dns']);
|
'module-dns.destroy',
|
||||||
|
'module-dns.manager',
|
||||||
|
|
||||||
// create module hosting permissions
|
// Module Hosting
|
||||||
Permission::create(['name' => 'manager module hosting']);
|
'module-hosting.view',
|
||||||
Permission::create(['name' => 'add module hosting']);
|
'module-hosting.create',
|
||||||
Permission::create(['name' => 'edit module hosting']);
|
'module-hosting.edit',
|
||||||
Permission::create(['name' => 'delete module hosting']);
|
'module-hosting.destroy',
|
||||||
|
'module-hosting.manager',
|
||||||
|
|
||||||
// create module vcenter permissions
|
// Module vCenter
|
||||||
Permission::create(['name' => 'manager module vcenter']);
|
'module-vcenter.view',
|
||||||
Permission::create(['name' => 'add module vcenter']);
|
'module-vcenter.create',
|
||||||
Permission::create(['name' => 'edit module vcenter']);
|
'module-vcenter.edit',
|
||||||
Permission::create(['name' => 'delete module vcenter']);
|
'module-vcenter.destroy',
|
||||||
|
'module-vcenter.manager',
|
||||||
|
|
||||||
// create module ippool permissions
|
// IP Pool
|
||||||
Permission::create(['name' => 'manager module ippool']);
|
'module-ippool.view',
|
||||||
Permission::create(['name' => 'add module ippool']);
|
'module-ippool.create',
|
||||||
Permission::create(['name' => 'edit module ippool']);
|
'module-ippool.edit',
|
||||||
Permission::create(['name' => 'delete module ippool']);
|
'module-ippool.destroy',
|
||||||
|
'module-ippool.manager',
|
||||||
|
|
||||||
// create package permissions
|
// Gói dịch vụ
|
||||||
Permission::create(['name' => 'manager package module']);
|
'package-module.view',
|
||||||
Permission::create(['name' => 'add package module']);
|
'package-module.create',
|
||||||
Permission::create(['name' => 'edit package module']);
|
'package-module.edit',
|
||||||
Permission::create(['name' => 'delete package module']);
|
'package-module.destroy',
|
||||||
|
'package-module.manager',
|
||||||
|
|
||||||
// create email template permissions
|
// Email Template
|
||||||
Permission::create(['name' => 'manager email template']);
|
'email-template.view',
|
||||||
Permission::create(['name' => 'add email template']);
|
'email-template.create',
|
||||||
Permission::create(['name' => 'edit email template']);
|
'email-template.edit',
|
||||||
Permission::create(['name' => 'delete email template']);
|
'email-template.destroy',
|
||||||
|
'email-template.manager',
|
||||||
|
|
||||||
// create setting permissions
|
// Cài đặt
|
||||||
Permission::create(['name' => 'manager setting']);
|
'setting.manager',
|
||||||
Permission::create(['name' => 'manager smtp']);
|
'smtp.manager',
|
||||||
Permission::create(['name' => 'manager auto banking']);
|
'auto-banking.manager',
|
||||||
Permission::create(['name' => 'manager system log']);
|
'system-log.manager',
|
||||||
|
|
||||||
// create role permissions
|
// Vai trò & Phân quyền
|
||||||
Permission::create(['name' => 'manager role']);
|
'role.view',
|
||||||
Permission::create(['name' => 'add role']);
|
'role.create',
|
||||||
Permission::create(['name' => 'edit role']);
|
'role.edit',
|
||||||
Permission::create(['name' => 'delete role']);
|
'role.destroy',
|
||||||
|
'role.manager',
|
||||||
|
|
||||||
|
// Menu
|
||||||
|
'menu.view',
|
||||||
|
'menu.create',
|
||||||
|
'menu.edit',
|
||||||
|
'menu.destroy',
|
||||||
|
'menu.manager',
|
||||||
|
];
|
||||||
|
|
||||||
// Create Menu Permissions
|
foreach ($permissions as $name) {
|
||||||
Permission::create(['name' => 'manager menu']);
|
Permission::firstOrCreate([
|
||||||
Permission::create(['name' => 'add menu']);
|
'name' => $name,
|
||||||
Permission::create(['name' => 'edit menu']);
|
'guard_name' => 'admin',
|
||||||
Permission::create(['name' => 'delete menu']);
|
]);
|
||||||
// this can be done as separate statements
|
}
|
||||||
$role = Role::find(1);
|
|
||||||
|
|
||||||
$role->givePermissionTo(Permission::all());
|
// Full Administrator nhận tất cả quyền
|
||||||
|
$fullAdmin = Role::where('name', 'Full Administrator')
|
||||||
|
->where('guard_name', 'admin')
|
||||||
|
->first();
|
||||||
|
|
||||||
|
if ($fullAdmin) {
|
||||||
|
$fullAdmin->syncPermissions(Permission::where('guard_name', 'admin')->get());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+99
-74
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
use App\Http\Controllers\Api\Admin\Auth\AuthController;
|
use App\Http\Controllers\Api\Admin\Auth\AuthController;
|
||||||
use App\Http\Controllers\Api\Admin\Customer\CustomerController;
|
use App\Http\Controllers\Api\Admin\Customer\CustomerController;
|
||||||
|
use App\Http\Controllers\Api\Admin\Employee\EmployeeController;
|
||||||
|
use App\Http\Controllers\Api\Admin\Role\RolePermissionController;
|
||||||
use App\Http\Controllers\Api\Admin\Invoice\InvoiceController;
|
use App\Http\Controllers\Api\Admin\Invoice\InvoiceController;
|
||||||
use App\Http\Controllers\Api\Admin\Order\OrderController;
|
use App\Http\Controllers\Api\Admin\Order\OrderController;
|
||||||
use App\Http\Controllers\Api\Admin\Payment\PaymentController;
|
use App\Http\Controllers\Api\Admin\Payment\PaymentController;
|
||||||
@@ -38,105 +40,128 @@ Route::prefix('v1')
|
|||||||
Route::post('refresh', [AuthController::class, 'refresh']);
|
Route::post('refresh', [AuthController::class, 'refresh']);
|
||||||
Route::get('me', [AuthController::class, 'me']);
|
Route::get('me', [AuthController::class, 'me']);
|
||||||
|
|
||||||
// Customers
|
// Role Permissions
|
||||||
|
Route::prefix('role-permissions')->group(function () {
|
||||||
|
// Accessible bởi mọi admin — trả về permissions hiệu lực của user hiện tại
|
||||||
|
Route::get('mine', [RolePermissionController::class, 'mine']);
|
||||||
|
// Các endpoint sau chỉ dành cho Full Administrator (kiểm tra trong controller)
|
||||||
|
Route::get('/', [RolePermissionController::class, 'index']);
|
||||||
|
Route::get('all-permissions', [RolePermissionController::class, 'allPermissions']);
|
||||||
|
Route::post('permissions', [RolePermissionController::class, 'createPermissionGroup']);
|
||||||
|
Route::delete('permissions/group/{module}', [RolePermissionController::class, 'deletePermissionGroup']);
|
||||||
|
Route::patch('permissions/{id}', [RolePermissionController::class, 'renamePermission']);
|
||||||
|
Route::put('{roleId}', [RolePermissionController::class, 'update']);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Employees (module: administrator)
|
||||||
|
Route::prefix('employees')->group(function () {
|
||||||
|
Route::get('roles', [EmployeeController::class, 'roles'])->middleware('perm:administrator.view');
|
||||||
|
Route::get('/', [EmployeeController::class, 'index'])->middleware('perm:administrator.view');
|
||||||
|
Route::post('/', [EmployeeController::class, 'store'])->middleware('perm:administrator.create');
|
||||||
|
Route::get('{id}', [EmployeeController::class, 'show'])->middleware('perm:administrator.view');
|
||||||
|
Route::put('{id}', [EmployeeController::class, 'update'])->middleware('perm:administrator.edit');
|
||||||
|
Route::delete('{id}', [EmployeeController::class, 'destroy'])->middleware('perm:administrator.destroy');
|
||||||
|
});
|
||||||
|
|
||||||
|
// Customers (module: customer)
|
||||||
Route::prefix('customers')->group(function () {
|
Route::prefix('customers')->group(function () {
|
||||||
Route::get('/', [CustomerController::class, 'index']);
|
Route::get('trash', [CustomerController::class, 'trash'])->middleware('perm:customer.view');
|
||||||
Route::get('/datatable', [CustomerController::class, 'datatable']);
|
Route::get('/', [CustomerController::class, 'index'])->middleware('perm:customer.view');
|
||||||
Route::post('/', [CustomerController::class, 'store']);
|
Route::get('/datatable', [CustomerController::class, 'datatable'])->middleware('perm:customer.view');
|
||||||
Route::get('{id}', [CustomerController::class, 'show']);
|
Route::post('/', [CustomerController::class, 'store'])->middleware('perm:customer.create');
|
||||||
Route::put('{id}', [CustomerController::class, 'update']);
|
Route::get('{id}', [CustomerController::class, 'show'])->middleware('perm:customer.view');
|
||||||
Route::delete('{id}', [CustomerController::class, 'destroy']);
|
Route::put('{id}', [CustomerController::class, 'update'])->middleware('perm:customer.edit');
|
||||||
Route::post('{id}/reset-password', [CustomerController::class, 'resetPassword']);
|
Route::delete('{id}', [CustomerController::class, 'destroy'])->middleware('perm:customer.destroy');
|
||||||
Route::post('{id}/add-credit', [CustomerController::class, 'addCredit']);
|
Route::post('{id}/reset-password', [CustomerController::class, 'resetPassword'])->middleware('perm:customer.edit');
|
||||||
Route::get('{id}/products', [CustomerController::class, 'getProducts']);
|
Route::post('{id}/add-credit', [CustomerController::class, 'addCredit'])->middleware('perm:customer.edit');
|
||||||
Route::get('{id}/invoices', [CustomerController::class, 'getInvoices']);
|
Route::get('{id}/products', [CustomerController::class, 'getProducts'])->middleware('perm:customer.view');
|
||||||
Route::get('{id}/transactions', [CustomerController::class, 'getTransactions']);
|
Route::get('{id}/invoices', [CustomerController::class, 'getInvoices'])->middleware('perm:customer.view');
|
||||||
Route::get('{id}/domains', [CustomerController::class, 'getDomains']);
|
Route::get('{id}/transactions', [CustomerController::class, 'getTransactions'])->middleware('perm:customer.view');
|
||||||
Route::get('trash', [CustomerController::class, 'trash']);
|
Route::get('{id}/domains', [CustomerController::class, 'getDomains'])->middleware('perm:customer.view');
|
||||||
Route::post('{id}/restore', [CustomerController::class, 'restore']);
|
Route::post('{id}/restore', [CustomerController::class, 'restore'])->middleware('perm:customer.edit');
|
||||||
Route::delete('{id}/force', [CustomerController::class, 'forceDelete']);
|
Route::delete('{id}/force', [CustomerController::class, 'forceDelete'])->middleware('perm:customer.destroy');
|
||||||
});
|
});
|
||||||
|
|
||||||
// Products
|
// Products (module: product-service)
|
||||||
Route::prefix('products')->group(function () {
|
Route::prefix('products')->group(function () {
|
||||||
Route::get('/', [ProductController::class, 'index']);
|
Route::get('export', [ProductController::class, 'export'])->middleware('perm:product-service.manager');
|
||||||
Route::post('/', [ProductController::class, 'store']);
|
Route::get('/', [ProductController::class, 'index'])->middleware('perm:product-service.view');
|
||||||
Route::get('{id}', [ProductController::class, 'show']);
|
Route::post('/', [ProductController::class, 'store'])->middleware('perm:product-service.create');
|
||||||
Route::put('{id}', [ProductController::class, 'update']);
|
Route::post('import', [ProductController::class, 'import'])->middleware('perm:product-service.create');
|
||||||
Route::delete('{id}', [ProductController::class, 'destroy']);
|
Route::get('{id}', [ProductController::class, 'show'])->middleware('perm:product-service.view');
|
||||||
Route::post('{id}/duplicate', [ProductController::class, 'duplicate']);
|
Route::put('{id}', [ProductController::class, 'update'])->middleware('perm:product-service.edit');
|
||||||
Route::post('import', [ProductController::class, 'import']);
|
Route::delete('{id}', [ProductController::class, 'destroy'])->middleware('perm:product-service.destroy');
|
||||||
Route::get('export', [ProductController::class, 'export']);
|
Route::post('{id}/duplicate', [ProductController::class, 'duplicate'])->middleware('perm:product-service.create');
|
||||||
});
|
});
|
||||||
|
|
||||||
// Product Categories (Groups)
|
// Product Categories / Groups (module: product-service)
|
||||||
Route::prefix('product-categories')->group(function () {
|
Route::prefix('product-categories')->group(function () {
|
||||||
Route::get('/', [ProductCategoryController::class, 'index']);
|
Route::get('/', [ProductCategoryController::class, 'index'])->middleware('perm:product-service.view');
|
||||||
Route::post('/', [ProductCategoryController::class, 'store']);
|
Route::post('/', [ProductCategoryController::class, 'store'])->middleware('perm:product-service.create');
|
||||||
Route::get('{id}', [ProductCategoryController::class, 'show']);
|
Route::get('{id}', [ProductCategoryController::class, 'show'])->middleware('perm:product-service.view');
|
||||||
Route::put('{id}', [ProductCategoryController::class, 'update']);
|
Route::put('{id}', [ProductCategoryController::class, 'update'])->middleware('perm:product-service.edit');
|
||||||
Route::delete('{id}', [ProductCategoryController::class, 'destroy']);
|
Route::delete('{id}', [ProductCategoryController::class, 'destroy'])->middleware('perm:product-service.destroy');
|
||||||
});
|
});
|
||||||
|
|
||||||
// Orders
|
// Orders (module: order)
|
||||||
Route::prefix('orders')->group(function () {
|
Route::prefix('orders')->group(function () {
|
||||||
Route::get('/', [OrderController::class, 'index']);
|
Route::get('/', [OrderController::class, 'index'])->middleware('perm:order.view');
|
||||||
Route::get('/datatable', [OrderController::class, 'datatable']);
|
Route::get('/datatable', [OrderController::class, 'datatable'])->middleware('perm:order.view');
|
||||||
Route::post('/', [OrderController::class, 'store']);
|
Route::post('/', [OrderController::class, 'store'])->middleware('perm:order.create');
|
||||||
Route::get('{id}', [OrderController::class, 'show']);
|
Route::get('{id}', [OrderController::class, 'show'])->middleware('perm:order.view');
|
||||||
Route::put('{id}', [OrderController::class, 'update']);
|
Route::put('{id}', [OrderController::class, 'update'])->middleware('perm:order.edit');
|
||||||
Route::delete('{id}', [OrderController::class, 'destroy']);
|
Route::delete('{id}', [OrderController::class, 'destroy'])->middleware('perm:order.destroy');
|
||||||
Route::post('{id}/accept', [OrderController::class, 'accept']);
|
Route::post('{id}/accept', [OrderController::class, 'accept'])->middleware('perm:order.edit');
|
||||||
Route::post('{id}/cancel', [OrderController::class, 'cancel']);
|
Route::post('{id}/cancel', [OrderController::class, 'cancel'])->middleware('perm:order.edit');
|
||||||
});
|
});
|
||||||
|
|
||||||
// Invoices
|
// Invoices (module: invoice)
|
||||||
Route::prefix('invoices')->group(function () {
|
Route::prefix('invoices')->group(function () {
|
||||||
Route::get('/', [InvoiceController::class, 'index']);
|
Route::get('/', [InvoiceController::class, 'index'])->middleware('perm:invoice.view');
|
||||||
Route::get('/datatable', [InvoiceController::class, 'datatable']);
|
Route::get('/datatable', [InvoiceController::class, 'datatable'])->middleware('perm:invoice.view');
|
||||||
Route::post('/', [InvoiceController::class, 'store']);
|
Route::post('/', [InvoiceController::class, 'store'])->middleware('perm:invoice.create');
|
||||||
Route::get('{id}', [InvoiceController::class, 'show']);
|
Route::get('{id}', [InvoiceController::class, 'show'])->middleware('perm:invoice.view');
|
||||||
Route::put('{id}', [InvoiceController::class, 'update']);
|
Route::put('{id}', [InvoiceController::class, 'update'])->middleware('perm:invoice.edit');
|
||||||
Route::delete('{id}', [InvoiceController::class, 'destroy']);
|
Route::delete('{id}', [InvoiceController::class, 'destroy'])->middleware('perm:invoice.destroy');
|
||||||
Route::post('{id}/paid', [InvoiceController::class, 'markAsPaid']);
|
Route::post('{id}/paid', [InvoiceController::class, 'markAsPaid'])->middleware('perm:invoice.edit');
|
||||||
Route::post('{id}/cancel', [InvoiceController::class, 'cancel']);
|
Route::post('{id}/cancel', [InvoiceController::class, 'cancel'])->middleware('perm:invoice.edit');
|
||||||
});
|
});
|
||||||
|
|
||||||
// Payments
|
// Payments (module: payment)
|
||||||
Route::prefix('payments')->group(function () {
|
Route::prefix('payments')->group(function () {
|
||||||
Route::get('/', [PaymentController::class, 'index']);
|
Route::get('/', [PaymentController::class, 'index'])->middleware('perm:payment.view');
|
||||||
Route::post('/', [PaymentController::class, 'store']);
|
Route::post('/', [PaymentController::class, 'store'])->middleware('perm:payment.create');
|
||||||
Route::get('{id}', [PaymentController::class, 'show']);
|
Route::get('{id}', [PaymentController::class, 'show'])->middleware('perm:payment.view');
|
||||||
Route::put('{id}', [PaymentController::class, 'update']);
|
Route::put('{id}', [PaymentController::class, 'update'])->middleware('perm:payment.edit');
|
||||||
Route::delete('{id}', [PaymentController::class, 'destroy']);
|
Route::delete('{id}', [PaymentController::class, 'destroy'])->middleware('perm:payment.destroy');
|
||||||
});
|
});
|
||||||
|
|
||||||
// VPS
|
// VPS (module: module-vcenter)
|
||||||
Route::prefix('vps')->group(function () {
|
Route::prefix('vps')->group(function () {
|
||||||
Route::get('/', [VPSController::class, 'index']);
|
Route::get('/', [VPSController::class, 'index'])->middleware('perm:module-vcenter.view');
|
||||||
Route::get('{id}', [VPSController::class, 'show']);
|
Route::get('{id}', [VPSController::class, 'show'])->middleware('perm:module-vcenter.view');
|
||||||
Route::put('{id}', [VPSController::class, 'update']);
|
Route::put('{id}', [VPSController::class, 'update'])->middleware('perm:module-vcenter.edit');
|
||||||
Route::post('{id}/power-on', [VPSController::class, 'powerOn']);
|
Route::post('{id}/power-on', [VPSController::class, 'powerOn'])->middleware('perm:module-vcenter.edit');
|
||||||
Route::post('{id}/power-off', [VPSController::class, 'powerOff']);
|
Route::post('{id}/power-off', [VPSController::class, 'powerOff'])->middleware('perm:module-vcenter.edit');
|
||||||
Route::post('{id}/restart', [VPSController::class, 'restart']);
|
Route::post('{id}/restart', [VPSController::class, 'restart'])->middleware('perm:module-vcenter.edit');
|
||||||
Route::get('{id}/console-ticket', [VPSController::class, 'getConsoleTicket']);
|
Route::get('{id}/console-ticket', [VPSController::class, 'getConsoleTicket'])->middleware('perm:module-vcenter.view');
|
||||||
});
|
});
|
||||||
|
|
||||||
// vCenter
|
// vCenter (module: module-vcenter)
|
||||||
Route::prefix('vcenter')->group(function () {
|
Route::prefix('vcenter')->group(function () {
|
||||||
Route::get('tree', [VCenterController::class, 'tree']);
|
Route::get('tree', [VCenterController::class, 'tree'])->middleware('perm:module-vcenter.view');
|
||||||
Route::get('console-ticket', [VCenterController::class, 'consoleTicket']);
|
Route::get('console-ticket', [VCenterController::class, 'consoleTicket'])->middleware('perm:module-vcenter.view');
|
||||||
Route::post('/', [VCenterController::class, 'store']);
|
Route::post('/', [VCenterController::class, 'store'])->middleware('perm:module-vcenter.create');
|
||||||
Route::post('sync', [VCenterController::class, 'sync']);
|
Route::post('sync', [VCenterController::class, 'sync'])->middleware('perm:module-vcenter.edit');
|
||||||
Route::put('node/{type}/{id}', [VCenterController::class, 'updateNode']);
|
Route::put('node/{type}/{id}', [VCenterController::class, 'updateNode'])->middleware('perm:module-vcenter.edit');
|
||||||
Route::delete('node/{type}/{id}', [VCenterController::class, 'destroyNode']);
|
Route::delete('node/{type}/{id}', [VCenterController::class, 'destroyNode'])->middleware('perm:module-vcenter.destroy');
|
||||||
});
|
});
|
||||||
|
|
||||||
// vCenter Manager Power Operations
|
// vCenter Manager Power Operations (module: module-vcenter)
|
||||||
Route::prefix('vcenter-manager')->group(function () {
|
Route::prefix('vcenter-manager')->group(function () {
|
||||||
Route::post('vm/power-on', [App\Http\Controllers\admin\VCenterManagerController::class, 'powerOn']);
|
Route::post('vm/power-on', [App\Http\Controllers\admin\VCenterManagerController::class, 'powerOn'])->middleware('perm:module-vcenter.edit');
|
||||||
Route::post('vm/power-off', [App\Http\Controllers\admin\VCenterManagerController::class, 'powerOff']);
|
Route::post('vm/power-off', [App\Http\Controllers\admin\VCenterManagerController::class, 'powerOff'])->middleware('perm:module-vcenter.edit');
|
||||||
Route::get('vms/powered-off', [App\Http\Controllers\admin\VCenterManagerController::class, 'getPoweredOffVms']);
|
Route::get('vms/powered-off', [App\Http\Controllers\admin\VCenterManagerController::class, 'getPoweredOffVms'])->middleware('perm:module-vcenter.view');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user