frontend: Refactors project structure for better organization

Moves code into domain-specific folders for better modularity.
Updates imports to reflect the new directory structure.
This commit is contained in:
Carlos Santos 2026-01-12 19:16:44 +01:00
parent dac64bb1a9
commit 8afed3a2f8
42 changed files with 290 additions and 223 deletions

View File

@ -1,7 +1,7 @@
import { inject } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivateFn, RouterStateSnapshot } from '@angular/router';
import { AuthService } from '../../domains/auth/services/auth.service';
import { NavigationService } from '../services';
import { NavigationService } from '../../../shared/services';
import { AuthService } from '../services';
export const checkUserAuthenticatedGuard: CanActivateFn = async (
_route: ActivatedRouteSnapshot,

View File

@ -0,0 +1 @@
export * from './auth.guard';

View File

@ -1,3 +1,4 @@
export * from './guards';
export * from './interceptor-handlers';
export * from './pages';
export * from './services';

View File

@ -8,7 +8,7 @@ import { MatIconModule } from '@angular/material/icon';
import { MatInputModule } from '@angular/material/input';
import { MatTooltipModule } from '@angular/material/tooltip';
import { ActivatedRoute, RouterModule } from '@angular/router';
import { NavigationService } from '../../../../shared';
import { NavigationService } from '../../../../shared/services/navigation.service';
import { AuthService } from '../../services/auth.service';
@Component({

View File

@ -1,7 +1,9 @@
import { HttpErrorResponse } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { MeetUserDTO, MeetUserRole } from '@openvidu-meet/typings';
import { HttpService, NavigationService, TokenStorageService } from '../../../shared/services';
import { HttpService } from '../../../shared/services/http.service';
import { NavigationService } from '../../../shared/services/navigation.service';
import { TokenStorageService } from '../../../shared/services/token-storage.service';
@Injectable({
providedIn: 'root'

View File

@ -7,22 +7,24 @@ import { MatSidenav, MatSidenavModule } from '@angular/material/sidenav';
import { MatToolbarModule } from '@angular/material/toolbar';
import { MatTooltipModule } from '@angular/material/tooltip';
import { RouterModule } from '@angular/router';
import { AppDataService, ConsoleNavLink, ThemeService } from '../../../../shared';
import { ConsoleNavLink } from '../../../../shared/models/sidenav.model';
import { AppDataService } from '../../../../shared/services/app-data.service';
import { ThemeService } from '../../../../shared/services/theme.service';
@Component({
selector: 'ov-console-nav',
imports: [
CommonModule,
MatToolbarModule,
MatListModule,
MatButtonModule,
MatIconModule,
MatSidenavModule,
MatTooltipModule,
RouterModule
],
templateUrl: './console-nav.component.html',
styleUrl: './console-nav.component.scss'
selector: 'ov-console-nav',
imports: [
CommonModule,
MatToolbarModule,
MatListModule,
MatButtonModule,
MatIconModule,
MatSidenavModule,
MatTooltipModule,
RouterModule
],
templateUrl: './console-nav.component.html',
styleUrl: './console-nav.component.scss'
})
export class ConsoleNavComponent {
@ViewChild(MatSidenav) sidenav!: MatSidenav;

View File

@ -1,13 +1,13 @@
import { Component } from '@angular/core';
import { ConsoleNavLink } from '../../../../shared';
import { ConsoleNavLink } from '../../../../shared/models/sidenav.model';
import { AuthService } from '../../../auth/services/auth.service';
import { ConsoleNavComponent } from '../../components';
import { ConsoleNavComponent } from '../../components/console-nav/console-nav.component';
@Component({
selector: 'ov-console',
imports: [ConsoleNavComponent],
templateUrl: './console.component.html',
styleUrl: './console.component.scss'
selector: 'ov-console',
imports: [ConsoleNavComponent],
templateUrl: './console.component.html',
styleUrl: './console.component.scss'
})
export class ConsoleComponent {
navLinks: ConsoleNavLink[] = [

View File

@ -10,23 +10,25 @@ import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
import { MatTooltipModule } from '@angular/material/tooltip';
import { MeetApiKey } from '@openvidu-meet/typings';
import { ApiKeyService, GlobalConfigService, NotificationService } from '../../../../shared';
import { ApiKeyService } from '../../../../shared/services/api-key.service';
import { GlobalConfigService } from '../../../../shared/services/global-config.service';
import { NotificationService } from '../../../../shared/services/notification.service';
@Component({
selector: 'ov-embedded',
imports: [
MatCardModule,
MatButtonModule,
MatIconModule,
MatInputModule,
MatFormFieldModule,
MatSlideToggleModule,
MatTooltipModule,
ReactiveFormsModule,
MatProgressSpinnerModule
],
templateUrl: './embedded.component.html',
styleUrl: './embedded.component.scss'
selector: 'ov-embedded',
imports: [
MatCardModule,
MatButtonModule,
MatIconModule,
MatInputModule,
MatFormFieldModule,
MatSlideToggleModule,
MatTooltipModule,
ReactiveFormsModule,
MatProgressSpinnerModule
],
templateUrl: './embedded.component.html',
styleUrl: './embedded.component.scss'
})
export class EmbeddedComponent implements OnInit {
isLoading = signal(true);

View File

@ -3,10 +3,11 @@ import { MatButtonModule } from '@angular/material/button';
import { MatCardModule } from '@angular/material/card';
import { MatIconModule } from '@angular/material/icon';
import { ActivatedRoute } from '@angular/router';
import { AppDataService, NavigationService, } from '../../../../shared';
import { NavigationErrorReason } from '../../../../shared/models/navigation.model';
import { AppDataService } from '../../../../shared/services/app-data.service';
import { NavigationService } from '../../../../shared/services/navigation.service';
import { AuthService } from '../../../auth/services/auth.service';
import { MeetingWebComponentManagerService } from '../../../meeting/services';
import { MeetingWebComponentManagerService } from '../../../meeting/services/meeting-webcomponent-manager.service';
@Component({
selector: 'ov-error',

View File

@ -4,7 +4,8 @@ import { MatCardModule } from '@angular/material/card';
import { MatGridListModule } from '@angular/material/grid-list';
import { MatIconModule } from '@angular/material/icon';
import { MeetAnalytics } from '@openvidu-meet/typings';
import { AnalyticsService, NavigationService } from '../../../../shared';
import { AnalyticsService } from '../../../../shared/services/analytics.service';
import { NavigationService } from '../../../../shared/services/navigation.service';
@Component({
selector: 'ov-overview',

View File

@ -19,26 +19,27 @@ import { MatSelectModule } from '@angular/material/select';
import { MatTooltipModule } from '@angular/material/tooltip';
// import { ProFeatureBadgeComponent } from '../components';
import { AuthMode } from '@openvidu-meet/typings';
import { GlobalConfigService, NotificationService } from '../../../../shared';
import { GlobalConfigService } from '../../../../shared/services/global-config.service';
import { NotificationService } from '../../../../shared/services/notification.service';
import { AuthService } from '../../../auth/services/auth.service';
@Component({
selector: 'ov-users-permissions',
imports: [
MatCardModule,
MatButtonModule,
MatIconModule,
MatInputModule,
MatFormFieldModule,
MatSelectModule,
MatTooltipModule,
MatProgressSpinnerModule,
MatDividerModule,
ReactiveFormsModule,
// ProFeatureBadgeComponent
],
templateUrl: './users-permissions.component.html',
styleUrl: './users-permissions.component.scss'
selector: 'ov-users-permissions',
imports: [
MatCardModule,
MatButtonModule,
MatIconModule,
MatInputModule,
MatFormFieldModule,
MatSelectModule,
MatTooltipModule,
MatProgressSpinnerModule,
MatDividerModule,
ReactiveFormsModule
// ProFeatureBadgeComponent
],
templateUrl: './users-permissions.component.html',
styleUrl: './users-permissions.component.scss'
})
export class UsersPermissionsComponent implements OnInit {
isLoading = signal(true);

View File

@ -6,7 +6,7 @@ import { MatCardModule } from '@angular/material/card';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatIconModule } from '@angular/material/icon';
import { MatInputModule } from '@angular/material/input';
import { ShareMeetingLinkComponent } from '../../components';
import { ShareMeetingLinkComponent } from '../../components/share-meeting-link/share-meeting-link.component';
import { MeetingLobbyService } from '../../services/meeting-lobby.service';
import { MeetingService } from '../../services/meeting.service';

View File

@ -1,19 +1,19 @@
import { Component, OnInit } from '@angular/core';
import { MatButtonModule } from '@angular/material/button';
import { MatCardModule } from '@angular/material/card';
import { MatIconModule } from '@angular/material/icon';
import { ActivatedRoute } from '@angular/router';
import { LeftEventReason } from '@openvidu-meet/typings';
import { AppDataService, NavigationService, } from '../../../../shared';
import { AppDataService } from '../../../../shared/services/app-data.service';
import { NavigationService } from '../../../../shared/services/navigation.service';
import { AuthService } from '../../../auth/services/auth.service';
import { MeetingWebComponentManagerService } from '../../services';
import { MeetingWebComponentManagerService } from '../../services/meeting-webcomponent-manager.service';
@Component({
selector: 'ov-end-meeting',
imports: [MatCardModule, MatButtonModule, MatIconModule],
templateUrl: './end-meeting.component.html',
styleUrl: './end-meeting.component.scss'
selector: 'ov-end-meeting',
imports: [MatCardModule, MatButtonModule, MatIconModule],
templateUrl: './end-meeting.component.html',
styleUrl: './end-meeting.component.scss'
})
export class EndMeetingComponent implements OnInit {
disconnectedTitle = 'You Left the Meeting';

View File

@ -13,16 +13,18 @@ import {
ViewportService
} from 'openvidu-components-angular';
import { Subject } from 'rxjs';
import {
ApplicationFeatures,
FeatureConfigurationService,
GlobalConfigService,
NotificationService
} from '../../../../shared';
import { RoomMemberService, } from '../../../rooms/services';
import { ApplicationFeatures } from '../../../../shared/models/app.model';
import { FeatureConfigurationService } from '../../../../shared/services/feature-configuration.service';
import { GlobalConfigService } from '../../../../shared/services/global-config.service';
import { NotificationService } from '../../../../shared/services/notification.service';
import { RoomMemberService } from '../../../rooms/services/room-member.service';
import { MeetingLobbyComponent } from '../../components/meeting-lobby/meeting-lobby.component';
import { MeetingParticipantItemComponent } from '../../customization';
import { MeetingContextService, MeetingEventHandlerService, MeetingLobbyService, MeetingService, MeetingWebComponentManagerService } from '../../services';
import { MeetingParticipantItemComponent } from '../../customization/meeting-participant-item/meeting-participant-item.component';
import { MeetingContextService } from '../../services/meeting-context.service';
import { MeetingEventHandlerService } from '../../services/meeting-event-handler.service';
import { MeetingLobbyService } from '../../services/meeting-lobby.service';
import { MeetingWebComponentManagerService } from '../../services/meeting-webcomponent-manager.service';
import { MeetingService } from '../../services/meeting.service';
@Component({
selector: 'ov-meeting',

View File

@ -18,15 +18,14 @@ import {
Room,
RoomEvent
} from 'openvidu-components-angular';
import { MeetingContextService, MeetingWebComponentManagerService } from '.';
import {
FeatureConfigurationService,
NavigationService,
SessionStorageService,
TokenStorageService
} from '../../../shared';
import { RecordingService } from '../../recordings/services';
import { RoomMemberService } from '../../rooms/services';
import { FeatureConfigurationService } from '../../../shared/services/feature-configuration.service';
import { NavigationService } from '../../../shared/services/navigation.service';
import { SessionStorageService } from '../../../shared/services/session-storage.service';
import { TokenStorageService } from '../../../shared/services/token-storage.service';
import { RecordingService } from '../../recordings/services/recording.service';
import { RoomMemberService } from '../../rooms/services/room-member.service';
import { MeetingContextService } from './meeting-context.service';
import { MeetingWebComponentManagerService } from './meeting-webcomponent-manager.service';
/**
* Service that handles all LiveKit/OpenVidu room events.

View File

@ -1,8 +1,8 @@
import { computed, DestroyRef, effect, inject, Injectable, signal } from '@angular/core';
import { Participant, Room } from 'livekit-client';
import { LayoutService, LoggerService, ViewportService } from 'openvidu-components-angular';
import { MeetStorageService } from '../../../shared';
import { MeetLayoutMode } from '../models';
import { MeetStorageService } from '../../../shared/services/storage.service';
import { MeetLayoutMode } from '../models/layout.model';
@Injectable({ providedIn: 'root' })
export class MeetingLayoutService extends LayoutService {

View File

@ -3,21 +3,17 @@ import { FormControl, FormGroup, Validators } from '@angular/forms';
import { ActivatedRoute } from '@angular/router';
import { MeetRoomStatus } from '@openvidu-meet/typings';
import { LoggerService } from 'openvidu-components-angular';
import {
MeetingContextService,
MeetingService,
MeetingWebComponentManagerService
} from '.';
import { AppDataService, NavigationService } from '../../../shared';
import { NavigationErrorReason } from '../../../shared/models/navigation.model';
import { AppDataService } from '../../../shared/services/app-data.service';
import { NavigationService } from '../../../shared/services/navigation.service';
import { AuthService } from '../../auth/services/auth.service';
import { RecordingService } from '../../recordings/services';
import {
RoomMemberService,
RoomService,
} from '../../rooms/services';
import { RecordingService } from '../../recordings/services/recording.service';
import { RoomMemberService } from '../../rooms/services/room-member.service';
import { RoomService } from '../../rooms/services/room.service';
import { LobbyState } from '../models/lobby.model';
import { MeetingContextService } from './meeting-context.service';
import { MeetingWebComponentManagerService } from './meeting-webcomponent-manager.service';
import { MeetingService } from './meeting.service';
/**
* Service that manages the meeting lobby phase state and operations.

View File

@ -1,5 +1,4 @@
import { effect, inject, Injectable } from '@angular/core';
import { AppDataService } from '@openvidu-meet/shared-components';
import {
WebComponentCommand,
WebComponentEvent,
@ -7,8 +6,10 @@ import {
WebComponentOutboundEventMessage
} from '@openvidu-meet/typings';
import { LoggerService, OpenViduService } from 'openvidu-components-angular';
import { MeetingContextService, MeetingService } from '.';
import { RoomMemberService } from '../../rooms/services';
import { AppDataService } from '../../../shared/services/app-data.service';
import { RoomMemberService } from '../../rooms/services/room-member.service';
import { MeetingContextService } from './meeting-context.service';
import { MeetingService } from './meeting.service';
/**
* Service to manage the commands from OpenVidu Meet WebComponent/Iframe.

View File

@ -27,7 +27,7 @@ import { MatToolbarModule } from '@angular/material/toolbar';
import { MatTooltipModule } from '@angular/material/tooltip';
import { MeetRecordingInfo, MeetRecordingStatus } from '@openvidu-meet/typings';
import { ViewportService } from 'openvidu-components-angular';
import { formatBytes, formatDurationToHMS } from '../../../../shared';
import { formatBytes, formatDurationToHMS } from '../../../../shared/utils/format.utils';
export interface RecordingTableAction {
recordings: MeetRecordingInfo[];

View File

@ -15,26 +15,26 @@ import { MatInputModule } from '@angular/material/input';
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { MatRadioModule } from '@angular/material/radio';
import { MatTooltipModule } from '@angular/material/tooltip';
import { RecordingService } from '../../services';
import { RecordingService } from '../../services/recording.service';
@Component({
selector: 'ov-share-recording-dialog',
imports: [
FormsModule,
MatRadioModule,
MatFormFieldModule,
MatInputModule,
MatButtonModule,
MatIconModule,
MatDialogTitle,
MatDialogContent,
MatDialogActions,
MatDialogClose,
MatTooltipModule,
MatProgressSpinnerModule
],
templateUrl: './recording-share-dialog.component.html',
styleUrl: './recording-share-dialog.component.scss'
selector: 'ov-share-recording-dialog',
imports: [
FormsModule,
MatRadioModule,
MatFormFieldModule,
MatInputModule,
MatButtonModule,
MatIconModule,
MatDialogTitle,
MatDialogContent,
MatDialogActions,
MatDialogClose,
MatTooltipModule,
MatProgressSpinnerModule
],
templateUrl: './recording-share-dialog.component.html',
styleUrl: './recording-share-dialog.component.scss'
})
export class RecordingShareDialogComponent implements OnInit {
accessType: 'private' | 'public' = 'public';

View File

@ -4,9 +4,13 @@ import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { ActivatedRoute } from '@angular/router';
import { MeetRecordingFilters, MeetRecordingInfo } from '@openvidu-meet/typings';
import { ILogger, LoggerService } from 'openvidu-components-angular';
import { NotificationService } from '../../../../shared';
import { RecordingListsComponent, RecordingTableAction, RecordingTableFilter } from '../../components';
import { RecordingService } from '../../services';
import { NotificationService } from '../../../../shared/services/notification.service';
import {
RecordingListsComponent,
RecordingTableAction,
RecordingTableFilter
} from '../../components/recording-lists/recording-lists.component';
import { RecordingService } from '../../services/recording.service';
@Component({
selector: 'ov-recordings',

View File

@ -9,9 +9,10 @@ import { MatTooltipModule } from '@angular/material/tooltip';
import { ActivatedRoute, Router } from '@angular/router';
import { MeetRecordingInfo, MeetRecordingStatus } from '@openvidu-meet/typings';
import { ViewportService } from 'openvidu-components-angular';
import { formatDurationToTime, NotificationService } from '../../../../shared';
import { RecordingVideoPlayerComponent } from '../../components';
import { RecordingService } from '../../services';
import { NotificationService } from '../../../../shared/services/notification.service';
import { formatDurationToTime } from '../../../../shared/utils/format.utils';
import { RecordingVideoPlayerComponent } from '../../components/recording-video-player/recording-video-player.component';
import { RecordingService } from '../../services/recording.service';
@Component({
selector: 'ov-view-recording',

View File

@ -2,14 +2,12 @@ import { Injectable } from '@angular/core';
import { MatDialog } from '@angular/material/dialog';
import { MeetRecordingFilters, MeetRecordingInfo } from '@openvidu-meet/typings';
import { LoggerService } from 'openvidu-components-angular';
import {
FeatureConfigurationService,
GlobalConfigService,
HttpService,
TokenStorageService
} from '../../../shared/services';
import { FeatureConfigurationService } from '../../../shared/services/feature-configuration.service';
import { GlobalConfigService } from '../../../shared/services/global-config.service';
import { HttpService } from '../../../shared/services/http.service';
import { TokenStorageService } from '../../../shared/services/token-storage.service';
import { AuthService } from '../../auth/services/auth.service';
import { RecordingShareDialogComponent } from '../components';
import { RecordingShareDialogComponent } from '../components/recording-share-dialog/recording-share-dialog.component';
@Injectable({
providedIn: 'root'

View File

@ -6,11 +6,16 @@ import { MatToolbarModule } from '@angular/material/toolbar';
import { ActivatedRoute } from '@angular/router';
import { MeetRecordingFilters, MeetRecordingInfo } from '@openvidu-meet/typings';
import { ILogger, LoggerService } from 'openvidu-components-angular';
import { NavigationService, NotificationService } from '../../../../shared';
import { NavigationService } from '../../../../shared/services/navigation.service';
import { NotificationService } from '../../../../shared/services/notification.service';
import { MeetingContextService } from '../../../meeting/services';
import { RecordingListsComponent, RecordingTableAction, RecordingTableFilter } from '../../../recordings/components';
import { RecordingService } from '../../../recordings/services';
import { RoomMemberService } from '../../services';
import {
RecordingListsComponent,
RecordingTableAction,
RecordingTableFilter
} from '../../../recordings/components/recording-lists/recording-lists.component';
import { RecordingService } from '../../../recordings/services/recording.service';
import { RoomMemberService } from '../../services/room-member.service';
@Component({
selector: 'ov-room-recordings',

View File

@ -5,10 +5,13 @@ import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
import { ActivatedRoute } from '@angular/router';
import { MeetRoomOptions } from '@openvidu-meet/typings';
import { NavigationService, NotificationService, } from '../../../../shared';
import { StepIndicatorComponent, WizardNavComponent } from '../../components';
import { WizardNavigationConfig, WizardStep } from '../../models';
import { RoomService, RoomWizardStateService } from '../../services';
import { NavigationService } from '../../../../shared/services/navigation.service';
import { NotificationService } from '../../../../shared/services/notification.service';
import { StepIndicatorComponent } from '../../components/step-indicator/step-indicator.component';
import { WizardNavComponent } from '../../components/wizard-nav/wizard-nav.component';
import { WizardNavigationConfig, WizardStep } from '../../models/wizard.model';
import { RoomService } from '../../services/room.service';
import { RoomWizardStateService } from '../../services/wizard-state.service';
import { RoomBasicCreationComponent } from '../room-basic-creation/room-basic-creation.component';
import { RecordingConfigComponent } from './steps/recording-config/recording-config.component';
import { RecordingLayoutComponent } from './steps/recording-layout/recording-layout.component';

View File

@ -8,8 +8,12 @@ import { MatRadioModule } from '@angular/material/radio';
import { MatSelectModule } from '@angular/material/select';
import { MeetRecordingAccess, MeetRoomOptions } from '@openvidu-meet/typings';
import { Subject, takeUntil } from 'rxjs';
import { SelectableCardComponent, SelectableCardOption, SelectionCardEvent } from '../../../../../../shared';
import { RoomWizardStateService } from '../../../../services';
import {
SelectableCardComponent,
SelectableCardOption,
SelectionCardEvent
} from '../../../../../../shared/components/selectable-card/selectable-card.component';
import { RoomWizardStateService } from '../../../../services/wizard-state.service';
interface RecordingAccessOption {
value: MeetRecordingAccess;

View File

@ -6,8 +6,13 @@ import { MatCardModule } from '@angular/material/card';
import { MatIconModule } from '@angular/material/icon';
import { MatRadioModule } from '@angular/material/radio';
import { MeetRecordingLayout } from '@openvidu-meet/typings';
import { SelectableCardComponent, SelectableCardOption, SelectionCardEvent, ThemeService } from '../../../../../../shared';
import { RoomWizardStateService } from '../../../../services';
import {
SelectableCardComponent,
SelectableCardOption,
SelectionCardEvent
} from '../../../../../../shared/components/selectable-card/selectable-card.component';
import { ThemeService } from '../../../../../../shared/services/theme.service';
import { RoomWizardStateService } from '../../../../services/wizard-state.service';
@Component({
selector: 'ov-recording-layout',

View File

@ -1,4 +1,3 @@
import { Component, OnDestroy } from '@angular/core';
import { FormGroup, ReactiveFormsModule } from '@angular/forms';
import { MatButtonModule } from '@angular/material/button';
@ -6,21 +5,25 @@ import { MatCardModule } from '@angular/material/card';
import { MatIconModule } from '@angular/material/icon';
import { MatRadioModule } from '@angular/material/radio';
import { Subject, takeUntil } from 'rxjs';
import { SelectableCardComponent, SelectableCardOption, SelectionCardEvent } from '../../../../../../shared';
import { RoomWizardStateService } from '../../../../services';
import {
SelectableCardComponent,
SelectableCardOption,
SelectionCardEvent
} from '../../../../../../shared//components/selectable-card/selectable-card.component';
import { RoomWizardStateService } from '../../../../services/wizard-state.service';
@Component({
selector: 'ov-recording-trigger',
imports: [
ReactiveFormsModule,
MatButtonModule,
MatIconModule,
MatCardModule,
MatRadioModule,
SelectableCardComponent
],
templateUrl: './recording-trigger.component.html',
styleUrl: './recording-trigger.component.scss'
selector: 'ov-recording-trigger',
imports: [
ReactiveFormsModule,
MatButtonModule,
MatIconModule,
MatCardModule,
MatRadioModule,
SelectableCardComponent
],
templateUrl: './recording-trigger.component.html',
styleUrl: './recording-trigger.component.scss'
})
export class RecordingTriggerComponent implements OnDestroy {
triggerForm: FormGroup;

View File

@ -25,9 +25,17 @@ import {
MeetRoomStatus
} from '@openvidu-meet/typings';
import { ILogger, LoggerService } from 'openvidu-components-angular';
import { DeleteRoomDialogComponent, DeleteRoomDialogOptions, NavigationService, NotificationService } from '../../../../shared';
import { RoomsListsComponent, RoomTableAction, RoomTableFilter } from '../../components';
import { RoomService } from '../../services';
import { NavigationService } from '../../../../shared/services/navigation.service';
import { NotificationService } from '../../../../shared/services/notification.service';
import { DeleteRoomDialogComponent } from '../../../../shared/components/dialogs/delete-room-dialog/delete-room-dialog.component';
import { DeleteRoomDialogOptions } from '../../../../shared/models/notification.model';
import {
RoomsListsComponent,
RoomTableAction,
RoomTableFilter
} from '../../components/rooms-lists/rooms-lists.component';
import { RoomService } from '../../services/room.service';
@Component({
selector: 'ov-rooms',

View File

@ -6,7 +6,10 @@ import {
MeetRoomMemberTokenOptions
} from '@openvidu-meet/typings';
import { E2eeService, LoggerService } from 'openvidu-components-angular';
import { FeatureConfigurationService, HttpService, TokenStorageService, getValidDecodedToken } from '../../../shared';
import { FeatureConfigurationService } from '../../../shared/services/feature-configuration.service';
import { HttpService } from '../../../shared/services/http.service';
import { TokenStorageService } from '../../../shared/services/token-storage.service';
import { getValidDecodedToken } from '../../../shared/utils/token.utils';
@Injectable({
providedIn: 'root'

View File

@ -11,7 +11,8 @@ import {
MeetRoomStatus
} from '@openvidu-meet/typings';
import { ILogger, LoggerService } from 'openvidu-components-angular';
import { FeatureConfigurationService, HttpService } from '../../../shared';
import { FeatureConfigurationService } from '../../../shared/services/feature-configuration.service';
import { HttpService } from '../../../shared/services/http.service';
/**
* RoomService - Persistence Layer for Room Data

View File

@ -10,7 +10,7 @@ import {
MatDialogTitle
} from '@angular/material/dialog';
import { MatIconModule } from '@angular/material/icon';
import type { DialogOptions } from '../../../models';
import type { DialogOptions } from '../../../models/notification.model';
@Component({
selector: 'ov-dialog',

View File

@ -1,7 +1,7 @@
import { CommonModule } from '@angular/common';
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { MatIconModule } from '@angular/material/icon';
import { ProFeatureBadgeComponent } from '../';
import { ProFeatureBadgeComponent } from '../pro-feature-badge/pro-feature-badge.component';
/**
* Interface for selectable card option data

View File

@ -1,10 +1,12 @@
import { inject } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivateFn } from '@angular/router';
import { WebComponentProperty } from '@openvidu-meet/typings';
import { MeetingContextService } from '../../domains/meeting/services';
import { RoomMemberService } from '../../domains/rooms/services';
import { MeetingContextService } from '../../domains/meeting/services/meeting-context.service';
import { RoomMemberService } from '../../domains/rooms/services/room-member.service';
import { NavigationErrorReason } from '../models/navigation.model';
import { AppDataService, NavigationService, SessionStorageService } from '../services';
import { AppDataService } from '../services/app-data.service';
import { NavigationService } from '../services/navigation.service';
import { SessionStorageService } from '../services/session-storage.service';
export const extractRoomQueryParamsGuard: CanActivateFn = (route: ActivatedRouteSnapshot) => {
const navigationService = inject(NavigationService);

View File

@ -1,4 +1,3 @@
export * from './auth.guard';
export * from './extract-query-params.guard';
export * from './remove-query-params.guard';
export * from './run-serially.guard';

View File

@ -1,8 +1,8 @@
export * from './components/index';
export * from './guards/index';
export * from './interceptors/index';
export * from './models/index';
export * from './components';
export * from './guards';
export * from './interceptors';
export * from './models';
export * from './routes/base-routes';
export * from './services/index';
export * from './utils/index';
export * from './services';
export * from './utils';

View File

@ -1,40 +1,25 @@
import { Routes } from '@angular/router';
import { WebComponentProperty } from '@openvidu-meet/typings';
import { LoginComponent } from '../../domains/auth/pages/login/login.component';
import { checkUserAuthenticatedGuard, checkUserNotAuthenticatedGuard } from '../../domains/auth/guards/auth.guard';
import { validateRecordingAccessGuard } from '../../domains/recordings/guards/recording-validate-access.guard';
import { checkEditableRoomGuard } from '../../domains/rooms/guards/room-edit-check.guard';
import {
ConfigComponent,
ConsoleComponent,
EmbeddedComponent,
OverviewComponent,
UsersPermissionsComponent
} from '../../domains/console/pages';
import { ErrorComponent } from '../../domains/console/pages/error/error.component';
import { EndMeetingComponent, MeetingComponent } from '../../domains/meeting/pages';
import { validateRecordingAccessGuard } from '../../domains/recordings/guards';
import { RecordingsComponent, ViewRecordingComponent } from '../../domains/recordings/pages';
import {
checkEditableRoomGuard, validateRoomAccessGuard,
validateRoomAccessGuard,
validateRoomRecordingsAccessGuard
} from '../../domains/rooms/guards';
import { RoomRecordingsComponent, RoomsComponent, RoomWizardComponent } from '../../domains/rooms/pages';
import {
checkUserAuthenticatedGuard,
checkUserNotAuthenticatedGuard,
extractRecordingQueryParamsGuard,
extractRoomQueryParamsGuard,
removeQueryParamsGuard,
runGuardsSerially,
} from '../guards';
} from '../../domains/rooms/guards/room-validate-access.guard';
import { extractRecordingQueryParamsGuard, extractRoomQueryParamsGuard } from '../guards/extract-query-params.guard';
import { removeQueryParamsGuard } from '../guards/remove-query-params.guard';
import { runGuardsSerially } from '../guards/run-serially.guard';
export const baseRoutes: Routes = [
{
path: 'login',
component: LoginComponent,
loadComponent: () => import('../../domains/auth/pages/login/login.component').then((m) => m.LoginComponent),
canActivate: [checkUserNotAuthenticatedGuard]
},
{
path: 'room/:room-id',
component: MeetingComponent,
loadComponent: () =>
import('../../domains/meeting/pages/meeting/meeting.component').then((m) => m.MeetingComponent),
canActivate: [
runGuardsSerially(
extractRoomQueryParamsGuard,
@ -45,7 +30,10 @@ export const baseRoutes: Routes = [
},
{
path: 'room/:room-id/recordings',
component: RoomRecordingsComponent,
loadComponent: () =>
import('../../domains/rooms/pages/room-recordings/room-recordings.component').then(
(m) => m.RoomRecordingsComponent
),
canActivate: [
runGuardsSerially(
extractRecordingQueryParamsGuard,
@ -56,14 +44,25 @@ export const baseRoutes: Routes = [
},
{
path: 'recording/:recording-id',
component: ViewRecordingComponent,
loadComponent: () =>
import('../../domains/recordings/pages/view-recording/view-recording.component').then(
(m) => m.ViewRecordingComponent
),
canActivate: [validateRecordingAccessGuard]
},
{ path: 'disconnected', component: EndMeetingComponent },
{ path: 'error', component: ErrorComponent },
{
path: 'disconnected',
loadComponent: () =>
import('../../domains/meeting/pages/end-meeting/end-meeting.component').then((m) => m.EndMeetingComponent)
},
{
path: 'error',
loadComponent: () => import('../../domains/console/pages/error/error.component').then((m) => m.ErrorComponent)
},
{
path: '',
component: ConsoleComponent,
loadComponent: () =>
import('../../domains/console/pages/console/console.component').then((m) => m.ConsoleComponent),
canActivate: [checkUserAuthenticatedGuard],
children: [
{
@ -73,36 +72,53 @@ export const baseRoutes: Routes = [
},
{
path: 'overview',
component: OverviewComponent
loadComponent: () =>
import('../../domains/console/pages/overview/overview.component').then((m) => m.OverviewComponent)
},
{
path: 'rooms',
component: RoomsComponent
loadComponent: () =>
import('../../domains/rooms/pages/rooms/rooms.component').then((m) => m.RoomsComponent)
},
{
path: 'rooms/new',
component: RoomWizardComponent
loadComponent: () =>
import('../../domains/rooms/pages/room-wizard/room-wizard.component').then(
(m) => m.RoomWizardComponent
)
},
{
path: 'rooms/:roomId/edit',
component: RoomWizardComponent,
loadComponent: () =>
import('../../domains/rooms/pages/room-wizard/room-wizard.component').then(
(m) => m.RoomWizardComponent
),
canActivate: [checkEditableRoomGuard]
},
{
path: 'recordings',
component: RecordingsComponent
loadComponent: () =>
import('../../domains/recordings/pages/recordings/recordings.component').then(
(m) => m.RecordingsComponent
)
},
{
path: 'embedded',
component: EmbeddedComponent
loadComponent: () =>
import('../../domains/console/pages/embedded/embedded.component').then((m) => m.EmbeddedComponent)
},
{
path: 'users-permissions',
component: UsersPermissionsComponent
loadComponent: () =>
import('../../domains/console/pages/users-permissions/users-permissions.component').then(
(m) => m.UsersPermissionsComponent
)
},
{
path: 'config',
component: ConfigComponent
loadComponent: () =>
import('../../domains/console/pages/config/config.component').then((m) => m.ConfigComponent)
},
// {
// path: 'about',

View File

@ -1,6 +1,6 @@
import { Injectable } from '@angular/core';
import { MeetApiKey } from '@openvidu-meet/typings';
import { HttpService } from '.';
import { HttpService } from './http.service';
@Injectable({
providedIn: 'root'

View File

@ -1,7 +1,8 @@
import { inject, Injectable } from '@angular/core';
import { AuthMode, MeetAppearanceConfig, SecurityConfig, WebhookConfig } from '@openvidu-meet/typings';
import { ILogger, LoggerService } from 'openvidu-components-angular';
import { FeatureConfigurationService, HttpService } from '.';
import { FeatureConfigurationService } from './feature-configuration.service';
import { HttpService } from './http.service';
@Injectable({
providedIn: 'root'

View File

@ -1,7 +1,8 @@
import { Injectable } from '@angular/core';
import { Params, Router, UrlTree } from '@angular/router';
import { AppDataService, SessionStorageService } from '.';
import { NavigationErrorReason } from '../models/navigation.model';
import { AppDataService } from './app-data.service';
import { SessionStorageService } from './session-storage.service';
@Injectable({
providedIn: 'root'

View File

@ -3,7 +3,9 @@ import { ComponentPortal } from '@angular/cdk/portal';
import { Injectable } from '@angular/core';
import { MatDialog } from '@angular/material/dialog';
import { MatSnackBar } from '@angular/material/snack-bar';
import { DialogComponent, DialogOptions, SpinnerComponent } from '..';
import { DialogComponent } from '../components/dialogs/basic-dialog/dialog.component';
import { SpinnerComponent } from '../components/spinner/spinner.component';
import { DialogOptions } from '../models/notification.model';
@Injectable({
providedIn: 'root'

View File

@ -1,12 +1,14 @@
/*
* Public API Surface of shared-meet-components
*/
// Export shared infrastructure first (no dependencies on domains)
export * from './lib/shared';
// Then export domains (which depend on shared)
export * from './lib/domains/auth';
export * from './lib/domains/console';
export * from './lib/domains/meeting';
export * from './lib/domains/recordings';
export * from './lib/domains/rooms';
export * from './lib/shared/index';