PeerTube/client/src/app/core/routing/redirect.service.ts

143 lines
4.5 KiB
TypeScript
Raw Normal View History

import * as debug from 'debug'
2018-03-01 13:57:29 +01:00
import { Injectable } from '@angular/core'
2021-01-14 14:13:23 +01:00
import { NavigationCancel, NavigationEnd, Router } from '@angular/router'
import { logger } from '@root-helpers/logger'
2018-03-01 13:57:29 +01:00
import { ServerService } from '../server'
import { SessionStorageService } from '../wrappers/storage.service'
import { PluginsManager } from '@root-helpers/plugins-manager'
import { environment } from 'src/environments/environment'
const debugLogger = debug('peertube:router:RedirectService')
2018-03-01 13:57:29 +01:00
@Injectable()
export class RedirectService {
private static SESSION_STORAGE_LATEST_SESSION_URL_KEY = 'redirect-latest-session-url'
2018-03-01 13:57:29 +01:00
// Default route could change according to the instance configuration
static INIT_DEFAULT_ROUTE = '/videos/trending'
2021-01-27 17:15:21 +01:00
static INIT_DEFAULT_TRENDING_ALGORITHM = 'most-viewed'
2018-03-01 13:57:29 +01:00
2018-12-11 15:27:46 +01:00
private previousUrl: string
private currentUrl: string
private latestSessionUrl: string
2020-11-27 15:31:09 +01:00
private redirectingToHomepage = false
2021-05-14 12:04:44 +02:00
private defaultTrendingAlgorithm = RedirectService.INIT_DEFAULT_TRENDING_ALGORITHM
private defaultRoute = RedirectService.INIT_DEFAULT_ROUTE
2020-11-27 15:31:09 +01:00
2018-03-01 13:57:29 +01:00
constructor (
private router: Router,
private serverService: ServerService,
private storage: SessionStorageService
2018-03-01 13:57:29 +01:00
) {
}
init () {
2021-06-04 13:31:41 +02:00
const config = this.serverService.getHTMLConfig()
if (config.instance.defaultClientRoute) {
2021-06-04 13:31:41 +02:00
this.defaultRoute = config.instance.defaultClientRoute
2021-01-27 17:15:21 +01:00
}
if (config.trending.videos.algorithms.default) {
2021-06-04 13:31:41 +02:00
this.defaultTrendingAlgorithm = config.trending.videos.algorithms.default
2018-03-01 13:57:29 +01:00
}
this.latestSessionUrl = this.storage.getItem(RedirectService.SESSION_STORAGE_LATEST_SESSION_URL_KEY)
this.storage.removeItem(RedirectService.SESSION_STORAGE_LATEST_SESSION_URL_KEY)
debugLogger('Loaded latest session URL %s', this.latestSessionUrl)
2018-12-11 15:27:46 +01:00
// Track previous url
this.currentUrl = this.router.url
this.router.events.subscribe(event => {
2021-01-14 14:13:23 +01:00
if (event instanceof NavigationEnd || event instanceof NavigationCancel) {
2022-07-08 10:32:33 +02:00
if ([ '/401', '/404' ].includes(event.url)) return
2018-12-11 15:27:46 +01:00
this.previousUrl = this.currentUrl
this.currentUrl = event.url
debugLogger('Previous URL is %s, current URL is %s', this.previousUrl, this.currentUrl)
debugLogger('Setting %s as latest URL in session storage.', this.currentUrl)
this.storage.setItem(RedirectService.SESSION_STORAGE_LATEST_SESSION_URL_KEY, this.currentUrl)
2018-12-11 15:27:46 +01:00
}
})
}
2021-05-14 12:04:44 +02:00
getDefaultRoute () {
return this.defaultRoute
}
getDefaultTrendingAlgorithm () {
return this.defaultTrendingAlgorithm
}
redirectToLatestSessionRoute () {
return this.doRedirect(this.latestSessionUrl)
}
redirectToPreviousRoute (fallbackRoute?: string) {
return this.doRedirect(this.previousUrl, fallbackRoute)
}
getPreviousUrl () {
return this.previousUrl
2018-03-01 13:57:29 +01:00
}
2018-06-08 11:25:12 +02:00
redirectToHomepage (skipLocationChange = false) {
2020-11-27 15:31:09 +01:00
if (this.redirectingToHomepage) return
this.redirectingToHomepage = true
logger.info(`Redirecting to ${this.defaultRoute}...`)
2018-03-01 13:57:29 +01:00
2021-05-14 12:04:44 +02:00
this.router.navigateByUrl(this.defaultRoute, { skipLocationChange })
2020-11-27 15:31:09 +01:00
.then(() => this.redirectingToHomepage = false)
2022-08-03 15:21:00 +02:00
.catch(err => {
2020-11-27 15:31:09 +01:00
this.redirectingToHomepage = false
2022-08-03 15:21:00 +02:00
logger.error(`Cannot navigate to ${this.defaultRoute}, resetting default route to ${RedirectService.INIT_DEFAULT_ROUTE}`, err)
2018-03-01 13:57:29 +01:00
2021-05-14 12:04:44 +02:00
this.defaultRoute = RedirectService.INIT_DEFAULT_ROUTE
return this.router.navigateByUrl(this.defaultRoute, { skipLocationChange })
2018-05-31 11:35:01 +02:00
})
2018-03-01 13:57:29 +01:00
}
redirectToLogin () {
const externalLoginUrl = PluginsManager.getDefaultLoginHref(environment.apiUrl, this.serverService.getHTMLConfig())
if (externalLoginUrl) window.location.href = externalLoginUrl
else this.router.navigate([ '/login' ])
}
private doRedirect (redirectUrl: string, fallbackRoute?: string) {
debugLogger('Redirecting on %s', redirectUrl)
if (this.isValidRedirection(redirectUrl)) {
return this.router.navigateByUrl(redirectUrl)
}
debugLogger('%s is not a valid redirection, try fallback route %s', redirectUrl, fallbackRoute)
if (fallbackRoute) {
return this.router.navigateByUrl(fallbackRoute)
}
debugLogger('There was no fallback route, redirecting to homepage')
return this.redirectToHomepage()
}
private isValidRedirection (redirectUrl: string) {
const exceptions = [
'/verify-account',
'/reset-password',
'/login'
]
if (!redirectUrl || redirectUrl === '/') return false
return exceptions.every(e => !redirectUrl.startsWith(e))
}
2018-03-01 13:57:29 +01:00
}