diff --git a/ogWebconsole/src/app/app-routing.module.ts b/ogWebconsole/src/app/app-routing.module.ts index f901d43..501a3ad 100644 --- a/ogWebconsole/src/app/app-routing.module.ts +++ b/ogWebconsole/src/app/app-routing.module.ts @@ -3,28 +3,26 @@ import { RouterModule, Routes } from '@angular/router'; import { MainLayoutComponent } from './layout/main-layout/main-layout.component'; import { AuthLayoutComponent } from './layout/auth-layout/auth-layout.component'; import { LoginComponent } from './components/login/login.component'; -import { DashboardComponent } from './components/dashboard/dashboard.component'; import { PageNotFoundComponent } from './shared/page-not-found/page-not-found.component'; -import { AdminComponent } from './components/admin/admin.component'; import { UsersComponent } from './components/admin/users/users/users.component'; import { RolesComponent } from './components/admin/roles/roles/roles.component'; import { GroupsComponent } from './components/groups/groups.component'; import { PXEimagesComponent } from './components/ogboot/pxe-images/pxe-images.component'; import { PxeComponent } from './components/ogboot/pxe/pxe.component'; import { PxeBootFilesComponent } from './components/ogboot/pxe-boot-files/pxe-boot-files.component'; -import {OgbootStatusComponent} from "./components/ogboot/ogboot-status/ogboot-status.component"; +import { OgbootStatusComponent } from "./components/ogboot/ogboot-status/ogboot-status.component"; import { CalendarComponent } from "./components/calendar/calendar.component"; import { CommandsComponent } from './components/commands/main-commands/commands.component'; import { CommandsGroupsComponent } from './components/commands/commands-groups/commands-groups.component'; import { CommandsTaskComponent } from './components/commands/commands-task/commands-task.component'; import { TaskLogsComponent } from './components/task-logs/task-logs.component'; -import {SoftwareComponent} from "./components/software/software.component"; -import {SoftwareProfileComponent} from "./components/software-profile/software-profile.component"; -import {OperativeSystemComponent} from "./components/operative-system/operative-system.component"; +import { SoftwareComponent } from "./components/software/software.component"; +import { SoftwareProfileComponent } from "./components/software-profile/software-profile.component"; +import { OperativeSystemComponent } from "./components/operative-system/operative-system.component"; import { PartitionAssistantComponent } from "./components/groups/components/client-main-view/partition-assistant/partition-assistant.component"; -import {RepositoriesComponent} from "./components/repositories/repositories.component"; +import { RepositoriesComponent } from "./components/repositories/repositories.component"; import { CreateClientImageComponent } from "./components/groups/components/client-main-view/create-image/create-image.component"; @@ -34,44 +32,44 @@ import { import { MainRepositoryViewComponent } from "./components/repositories/main-repository-view/main-repository-view.component"; -import {EnvVarsComponent} from "./components/admin/env-vars/env-vars.component"; -import {MenusComponent} from "./components/menus/menus.component"; -import {OgDhcpSubnetsComponent} from "./components/ogdhcp/og-dhcp-subnets.component"; -import {StatusComponent} from "./components/ogdhcp/status/status.component"; +import { EnvVarsComponent } from "./components/admin/env-vars/env-vars.component"; +import { MenusComponent } from "./components/menus/menus.component"; +import { OgDhcpSubnetsComponent } from "./components/ogdhcp/og-dhcp-subnets.component"; +import { StatusComponent } from "./components/ogdhcp/status/status.component"; import { RunScriptAssistantComponent } from "./components/groups/components/client-main-view/run-script-assistant/run-script-assistant.component"; +import { roleGuard } from './guards/role.guard'; const routes: Routes = [ { path: '', redirectTo: 'auth/login', pathMatch: 'full' }, - { path: '', component: MainLayoutComponent, + { + path: '', component: MainLayoutComponent, children: [ - { path: 'dashboard', component: DashboardComponent }, - { path: 'admin', component: AdminComponent }, - { path: 'users', component: UsersComponent }, - { path: 'env-vars', component: EnvVarsComponent }, - { path: 'user-groups', component: RolesComponent }, + { path: 'users', component: UsersComponent, canActivate: [roleGuard], data: { allowedRoles: ['super-admin'] } }, + { path: 'env-vars', component: EnvVarsComponent, canActivate: [roleGuard], data: { allowedRoles: ['super-admin'] } }, + { path: 'roles', component: RolesComponent, canActivate: [roleGuard], data: { allowedRoles: ['super-admin'] } }, { path: 'groups', component: GroupsComponent }, - { path: 'pxe-images', component: PXEimagesComponent }, - { path: 'pxe', component: PxeComponent }, - { path: 'pxe-boot-file', component: PxeBootFilesComponent }, - { path: 'ogboot-status', component: OgbootStatusComponent }, - { path: 'subnets', component: OgDhcpSubnetsComponent }, - { path: 'ogdhcp-status', component: StatusComponent }, - { path: 'commands', component: CommandsComponent }, - { path: 'commands-groups', component: CommandsGroupsComponent }, - { path: 'commands-task', component: CommandsTaskComponent }, - { path: 'commands-logs', component: TaskLogsComponent }, - { path: 'calendars', component: CalendarComponent }, - { path: 'clients/deploy-image', component: DeployImageComponent }, - { path: 'clients/partition-assistant', component: PartitionAssistantComponent }, - { path: 'clients/run-script', component: RunScriptAssistantComponent }, - { path: 'clients/:id/create-image', component: CreateClientImageComponent }, - { path: 'repositories', component: RepositoriesComponent }, - { path: 'repository/:id', component: MainRepositoryViewComponent }, - { path: 'software', component: SoftwareComponent }, - { path: 'software-profiles', component: SoftwareProfileComponent }, - { path: 'operative-systems', component: OperativeSystemComponent }, - { path: 'menus', component: MenusComponent }, + { path: 'pxe-images', component: PXEimagesComponent, canActivate: [roleGuard], data: { allowedRoles: ['super-admin', 'ou-admin'] } }, + { path: 'pxe', component: PxeComponent, canActivate: [roleGuard], data: { allowedRoles: ['super-admin', 'ou-admin'] } }, + { path: 'pxe-boot-file', component: PxeBootFilesComponent, canActivate: [roleGuard], data: { allowedRoles: ['super-admin', 'ou-admin'] } }, + { path: 'ogboot-status', component: OgbootStatusComponent, canActivate: [roleGuard], data: { allowedRoles: ['super-admin', 'ou-admin'] } }, + { path: 'subnets', component: OgDhcpSubnetsComponent, canActivate: [roleGuard], data: { allowedRoles: ['super-admin', 'ou-admin'] } }, + { path: 'ogdhcp-status', component: StatusComponent, canActivate: [roleGuard], data: { allowedRoles: ['super-admin', 'ou-admin'] } }, + { path: 'commands', component: CommandsComponent, canActivate: [roleGuard], data: { allowedRoles: ['super-admin', 'ou-admin'] } }, + { path: 'commands-groups', component: CommandsGroupsComponent, canActivate: [roleGuard], data: { allowedRoles: ['super-admin', 'ou-admin'] } }, + { path: 'commands-task', component: CommandsTaskComponent, canActivate: [roleGuard], data: { allowedRoles: ['super-admin', 'ou-admin'] } }, + { path: 'commands-logs', component: TaskLogsComponent, canActivate: [roleGuard], data: { allowedRoles: ['super-admin', 'ou-admin'] } }, + { path: 'calendars', component: CalendarComponent, canActivate: [roleGuard], data: { allowedRoles: ['super-admin', 'ou-admin'] } }, + { path: 'clients/deploy-image', component: DeployImageComponent, canActivate: [roleGuard], data: { allowedRoles: ['super-admin', 'ou-admin'] } }, + { path: 'clients/partition-assistant', component: PartitionAssistantComponent, canActivate: [roleGuard], data: { allowedRoles: ['super-admin', 'ou-admin'] } }, + { path: 'clients/run-script', component: RunScriptAssistantComponent, canActivate: [roleGuard], data: { allowedRoles: ['super-admin', 'ou-admin'] } }, + { path: 'clients/:id/create-image', component: CreateClientImageComponent, canActivate: [roleGuard], data: { allowedRoles: ['super-admin', 'ou-admin'] } }, + { path: 'repositories', component: RepositoriesComponent, canActivate: [roleGuard], data: { allowedRoles: ['super-admin', 'ou-admin'] } }, + { path: 'repository/:id', component: MainRepositoryViewComponent, canActivate: [roleGuard], data: { allowedRoles: ['super-admin', 'ou-admin'] } }, + { path: 'software', component: SoftwareComponent, canActivate: [roleGuard], data: { allowedRoles: ['super-admin', 'ou-admin'] } }, + { path: 'software-profiles', component: SoftwareProfileComponent, canActivate: [roleGuard], data: { allowedRoles: ['super-admin', 'ou-admin'] } }, + { path: 'operative-systems', component: OperativeSystemComponent, canActivate: [roleGuard], data: { allowedRoles: ['super-admin', 'ou-admin'] } }, + { path: 'menus', component: MenusComponent, canActivate: [roleGuard], data: { allowedRoles: ['super-admin', 'ou-admin'] } }, ], }, { diff --git a/ogWebconsole/src/app/app.module.ts b/ogWebconsole/src/app/app.module.ts index c1c0e66..2e04ddc 100644 --- a/ogWebconsole/src/app/app.module.ts +++ b/ogWebconsole/src/app/app.module.ts @@ -17,7 +17,6 @@ import { MatIconModule } from '@angular/material/icon'; import { MatButtonModule } from '@angular/material/button'; import { MatSidenavModule } from '@angular/material/sidenav'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; -import { AdminComponent } from './components/admin/admin.component'; import { MatCardModule } from '@angular/material/card'; import { MatCheckboxModule } from '@angular/material/checkbox'; import { MatFormFieldModule } from '@angular/material/form-field'; @@ -172,7 +171,6 @@ registerLocaleData(localeEs, 'es-ES'); HeaderComponent, SidebarComponent, LoginComponent, - AdminComponent, MainLayoutComponent, UsersComponent, RolesComponent, diff --git a/ogWebconsole/src/app/components/admin/admin.component.css b/ogWebconsole/src/app/components/admin/admin.component.css deleted file mode 100644 index 8c90c1c..0000000 --- a/ogWebconsole/src/app/components/admin/admin.component.css +++ /dev/null @@ -1,48 +0,0 @@ -/* Estilos del contenedor para centrar los botones */ -.container { - display: flex; - justify-content: center; - align-items: center; - height: 100vh; -} - -/* Estilos del contenedor de cada botón y texto */ -.button-container { - display: flex; - flex-direction: column; - align-items: center; - margin: 0 10px; -} - -/* Estilos del texto debajo de los botones */ -span{ - margin: 0; - font-size: 20px; - text-align: center; -} - -/* Media query para hacer los botones responsive */ -@media (max-width: 900px) { - button { - height: 120px; - width: 120px; - } -} - -@media (max-width: 600px) { - button { - height: 90px; - width: 90px; - } -} - -@media (max-width: 400px) { - button { - height: 70px; - width: 70px; - } - - span{ - font-size: 14px; - } -} diff --git a/ogWebconsole/src/app/components/admin/admin.component.html b/ogWebconsole/src/app/components/admin/admin.component.html deleted file mode 100644 index bf2ca78..0000000 --- a/ogWebconsole/src/app/components/admin/admin.component.html +++ /dev/null @@ -1,10 +0,0 @@ -
- - -
diff --git a/ogWebconsole/src/app/components/admin/admin.component.spec.ts b/ogWebconsole/src/app/components/admin/admin.component.spec.ts deleted file mode 100644 index 2ed2fec..0000000 --- a/ogWebconsole/src/app/components/admin/admin.component.spec.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { AdminComponent } from './admin.component'; -import { MatButtonModule } from '@angular/material/button'; -import { MatIconModule } from '@angular/material/icon'; -import { TranslateModule } from '@ngx-translate/core'; -import { Router } from '@angular/router'; - -describe('AdminComponent', () => { - let component: AdminComponent; - let fixture: ComponentFixture; - let router: Router; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [AdminComponent], - imports: [ - RouterTestingModule, - MatButtonModule, - MatIconModule, - TranslateModule.forRoot() - ] - }).compileComponents(); - - router = TestBed.inject(Router); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(AdminComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('debería crear el componente', () => { - expect(component).toBeTruthy(); - }); - - it('debería renderizar dos botones', () => { - const buttons = fixture.nativeElement.querySelectorAll('button'); - expect(buttons.length).toBe(2); - }); - - it('debería tener un botón con routerLink a "/users"', () => { - const button = fixture.nativeElement.querySelector('button[routerLink="/users"]'); - expect(button).toBeTruthy(); - expect(button.querySelector('mat-icon').textContent.trim()).toBe('group'); - }); -}); diff --git a/ogWebconsole/src/app/components/admin/admin.component.ts b/ogWebconsole/src/app/components/admin/admin.component.ts deleted file mode 100644 index 256f80d..0000000 --- a/ogWebconsole/src/app/components/admin/admin.component.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Component } from '@angular/core'; - - -@Component({ - selector: 'app-admin', - templateUrl: './admin.component.html', - styleUrl: './admin.component.css' -}) - -export class AdminComponent { - -} - diff --git a/ogWebconsole/src/app/components/dashboard/dashboard.component.css b/ogWebconsole/src/app/components/dashboard/dashboard.component.css deleted file mode 100644 index e69de29..0000000 diff --git a/ogWebconsole/src/app/components/dashboard/dashboard.component.html b/ogWebconsole/src/app/components/dashboard/dashboard.component.html deleted file mode 100644 index c83a790..0000000 --- a/ogWebconsole/src/app/components/dashboard/dashboard.component.html +++ /dev/null @@ -1 +0,0 @@ -

dashboard works!

\ No newline at end of file diff --git a/ogWebconsole/src/app/components/dashboard/dashboard.component.spec.ts b/ogWebconsole/src/app/components/dashboard/dashboard.component.spec.ts deleted file mode 100644 index 5e8286f..0000000 --- a/ogWebconsole/src/app/components/dashboard/dashboard.component.spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { DashboardComponent } from './dashboard.component'; - -describe('DashboardComponent', () => { - let component: DashboardComponent; - let fixture: ComponentFixture; - - beforeEach(async () => { - await TestBed.configureTestingModule({ - declarations: [DashboardComponent] - }).compileComponents(); - }); - - beforeEach(() => { - fixture = TestBed.createComponent(DashboardComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create the component', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/ogWebconsole/src/app/components/dashboard/dashboard.component.ts b/ogWebconsole/src/app/components/dashboard/dashboard.component.ts deleted file mode 100644 index e32c2fc..0000000 --- a/ogWebconsole/src/app/components/dashboard/dashboard.component.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'app-dashboard', - templateUrl: './dashboard.component.html', - styleUrl: './dashboard.component.css' -}) -export class DashboardComponent { - -} diff --git a/ogWebconsole/src/app/guards/role.guard.spec.ts b/ogWebconsole/src/app/guards/role.guard.spec.ts new file mode 100644 index 0000000..30809a2 --- /dev/null +++ b/ogWebconsole/src/app/guards/role.guard.spec.ts @@ -0,0 +1,17 @@ +import { TestBed } from '@angular/core/testing'; +import { CanActivateFn } from '@angular/router'; + +import { roleGuard } from './role.guard'; + +describe('roleGuard', () => { + const executeGuard: CanActivateFn = (...guardParameters) => + TestBed.runInInjectionContext(() => roleGuard(...guardParameters)); + + beforeEach(() => { + TestBed.configureTestingModule({}); + }); + + it('should be created', () => { + expect(executeGuard).toBeTruthy(); + }); +}); diff --git a/ogWebconsole/src/app/guards/role.guard.ts b/ogWebconsole/src/app/guards/role.guard.ts new file mode 100644 index 0000000..313f4f9 --- /dev/null +++ b/ogWebconsole/src/app/guards/role.guard.ts @@ -0,0 +1,19 @@ +import { inject } from '@angular/core'; +import { CanActivateFn, Router } from '@angular/router'; +import { AuthService } from '@services/auth.service'; + +export const roleGuard: CanActivateFn = (route, state) => { + const auth = inject(AuthService); + const router = inject(Router); + + const currentRole = auth.getCurrentRole(); + + const allowedRoles = route.data?.['allowedRoles'] as string[]; + + if (allowedRoles?.includes(currentRole)) { + return true; + } else { + router.navigate(['/groups']); + return false; + } +}; diff --git a/ogWebconsole/src/app/layout/header/header.component.html b/ogWebconsole/src/app/layout/header/header.component.html index 1d311d9..1ad8f7d 100644 --- a/ogWebconsole/src/app/layout/header/header.component.html +++ b/ogWebconsole/src/app/layout/header/header.component.html @@ -65,7 +65,7 @@ matTooltipShowDelay="1000"> {{ 'labelUsers' | translate }} -