54 lines
1.9 KiB
TypeScript
54 lines
1.9 KiB
TypeScript
import { inject } from '@angular/core';
|
|
import { ActivatedRouteSnapshot, Router, RouterStateSnapshot, CanActivateFn, UrlTree, RedirectCommand } from '@angular/router';
|
|
import { ContextService, HttpService, SessionStorageService } from '../services';
|
|
|
|
/**
|
|
* Guard to validate the access to a room.
|
|
*/
|
|
export const validateRoomAccessGuard: CanActivateFn = async (
|
|
_route: ActivatedRouteSnapshot,
|
|
state: RouterStateSnapshot
|
|
) => {
|
|
const httpService = inject(HttpService);
|
|
const contextService = inject(ContextService);
|
|
const router = inject(Router);
|
|
const sessionStorageService = inject(SessionStorageService);
|
|
|
|
const roomId = contextService.getRoomId();
|
|
const participantName = contextService.getParticipantName();
|
|
const secret = contextService.getSecret();
|
|
const storageSecret = sessionStorageService.getModeratorSecret(roomId);
|
|
|
|
try {
|
|
// Generate a participant token
|
|
const response = await httpService.generateParticipantToken({
|
|
roomId,
|
|
participantName,
|
|
secret: storageSecret || secret
|
|
});
|
|
contextService.setToken(response.token);
|
|
return true;
|
|
} catch (error: any) {
|
|
console.error('Error generating participant token:', error);
|
|
switch (error.status) {
|
|
case 409:
|
|
// Participant already exists.
|
|
// Send a timestamp to force update the query params and show the error message in participant name input form
|
|
const participantNameRoute = router.createUrlTree([`room/${roomId}/participant-name`], {
|
|
queryParams: { originUrl: state.url, accessError: 'participant-exists', t: Date.now() }
|
|
});
|
|
return new RedirectCommand(participantNameRoute, {
|
|
skipLocationChange: true
|
|
});
|
|
case 406:
|
|
return redirectToUnauthorized(router, 'unauthorized-participant');
|
|
default:
|
|
return redirectToUnauthorized(router, 'invalid-room');
|
|
}
|
|
}
|
|
};
|
|
|
|
const redirectToUnauthorized = (router: Router, reason: string): UrlTree => {
|
|
return router.createUrlTree(['unauthorized'], { queryParams: { reason } });
|
|
};
|