Add getInfo endpoint to AdminController and update admin-info component

This commit is contained in:
Matteo Gheza 2024-01-11 19:42:39 +01:00
parent 61ee7a7b05
commit b66d08b568
5 changed files with 92 additions and 16 deletions

View File

@ -7,8 +7,22 @@ use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Str;
use App\Models\User;
use App\Models\Role;
use App\Models\Permission;
class AdminController extends Controller
{
public function getInfo() {
if(!request()->user()->hasPermission("admin-info-read")) abort(401);
return response()->json([
'users' => User::select('id', 'name', 'surname', 'last_access', 'created_at')
->orderBy('last_access', 'desc')
->get()
]);
}
public function getDBData() {
if(!request()->user()->hasPermission("admin-maintenance-read")) abort(401);
@ -120,8 +134,8 @@ class AdminController extends Controller
public function getPermissionsAndRoles() {
if(!request()->user()->hasPermission("admin-roles-read")) abort(401);
return response()->json([
'permissions' => \App\Models\Permission::orderBy('name')->get(),
'roles' => \App\Models\Role::with('permissions:id,name')->get()
'permissions' => Permission::orderBy('name')->get(),
'roles' => Role::with('permissions:id,name')->get()
]);
}
@ -136,7 +150,7 @@ class AdminController extends Controller
$roles = $request->input('changes');
foreach($roles as $role) {
$roleModel = \App\Models\Role::find($role['roleId']);
$roleModel = Role::find($role['roleId']);
//If the role already has the permission, remove it, otherwise add it
if($roleModel->permissions()->where('id', $role['permissionId'])->exists()) {
$roleModel->permissions()->detach([$role['permissionId']]);

View File

@ -92,6 +92,8 @@ Route::middleware('auth:sanctum')->group( function () {
Route::post('/logout', [AuthController::class, 'logout']);
Route::get('/admin/info', [AdminController::class, 'getInfo']);
Route::get('/admin/db', [AdminController::class, 'getDBData']);
Route::post('/admin/runMigrations', [AdminController::class, 'runMigrations']);
Route::post('/admin/runSeeding', [AdminController::class, 'runSeeding']);

View File

@ -1 +1,25 @@
Info
<div class="col-8 mx-auto table-responsive-md">
<table class="table table-bordered text-center">
<thead>
<tr>
<th>{{ 'name'|translate|ftitlecase }}</th>
<th>{{ 'edit_user.last_access'|translate }}</th>
<th>{{ 'edit_user.creation_date'|translate }}</th>
<th *ngIf="auth.profile.can('users-update')">{{ 'edit'|translate|ftitlecase }}</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let user of info.users">
<td>
<i *ngIf="auth.profile.can('users-impersonate') && user.id !== auth.profile.id" class="fa fa-user me-2" (click)="onUserImpersonate(user.id)"></i>
<div (click)="onMoreDetails(user.id)" class="d-inline">
{{ user.surname }} {{ user.name }}
</div>
</td>
<td>{{ user.last_access | date:'dd/MM/YYYY, HH:mm' }}</td>
<td>{{ user.created_at | date:'dd/MM/YYYY, HH:mm' }}</td>
<td *ngIf="auth.profile.can('users-update')" (click)="editUser(user.id)"><i class="fa fa-edit"></i></td>
</tr>
</tbody>
</table>
</div>

View File

@ -1,6 +1,10 @@
import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { TranslateService } from '@ngx-translate/core';
import { ApiClientService } from 'src/app/_services/api-client.service';
import { AuthService } from 'src/app/_services/auth.service';
import { ModalUserInfoComponent } from '../../../_components/modal-user-info/modal-user-info.component';
import { BsModalService } from 'ngx-bootstrap/modal';
import Swal from 'sweetalert2';
@Component({
@ -9,11 +13,54 @@ import Swal from 'sweetalert2';
styleUrls: ['./admin-info.component.scss']
})
export class AdminInfoComponent implements OnInit {
info: any;
constructor(
private translateService: TranslateService,
private api: ApiClientService
private api: ApiClientService,
public auth: AuthService,
private router: Router,
private modalService: BsModalService
) { }
getInfo() {
this.api.get('admin/info').then((res: any) => {
this.info = res;
}).catch((err: any) => {
console.error(err);
Swal.fire({
title: this.translateService.instant("error_title"),
text: err.error.message,
icon: 'error',
confirmButtonText: 'Ok'
});
});
}
ngOnInit(): void {
this.getInfo();
}
onUserImpersonate(user: number) {
if(this.auth.profile.can('users-impersonate')) {
this.router.navigate(['/list']);
this.auth.impersonate(user).then(() => {
console.log(user);
});
}
}
onMoreDetails(id: number) {
if(this.auth.profile.can('users-update')) {
this.modalService.show(ModalUserInfoComponent, {
initialState: {
id
}
});
}
}
editUser(id: number) {
this.router.navigate(['/users', id]);
}
}

View File

@ -1,11 +1,6 @@
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { BsDatepickerModule } from 'ngx-bootstrap/datepicker';
import { MapPickerModule } from '../../../_components/map-picker/map-picker.module';
import { DatetimePickerModule } from '../../../_components/datetime-picker/datetime-picker.module';
import { BackBtnModule } from '../../../_components/back-btn/back-btn.module';
import { TranslationModule } from '../../../translation.module';
import { FirstLetterUppercasePipe } from '../../../_pipes/first-letter-uppercase.pipe';
@ -19,12 +14,6 @@ import { AdminInfoRoutingModule } from './admin-info-routing.module';
imports: [
CommonModule,
AdminInfoRoutingModule,
FormsModule,
ReactiveFormsModule,
BsDatepickerModule.forRoot(),
MapPickerModule,
DatetimePickerModule,
BackBtnModule,
TranslationModule,
FirstLetterUppercasePipe
]