2022-05-20 11:43:04 +02:00
|
|
|
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'
|
2022-07-15 15:30:14 +02:00
|
|
|
import { logger } from '@root-helpers/logger'
|
2018-03-01 13:57:29 +01:00
|
|
|
import { ServerService } from '../server'
|
2022-05-20 11:43:04 +02:00
|
|
|
import { SessionStorageService } from '../wrappers/storage.service'
|
2023-02-14 11:47:01 +01:00
|
|
|
import { PluginsManager } from '@root-helpers/plugins-manager'
|
|
|
|
import { environment } from 'src/environments/environment'
|
2022-05-20 11:43:04 +02:00
|
|
|
|
2022-07-15 15:30:14 +02:00
|
|
|
const debugLogger = debug('peertube:router:RedirectService')
|
2018-03-01 13:57:29 +01:00
|
|
|
|
|
|
|
@Injectable()
|
|
|
|
export class RedirectService {
|
2022-05-20 11:43:04 +02:00
|
|
|
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
|
|
|
|
|
2022-05-20 11:43:04 +02:00
|
|
|
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,
|
2022-05-20 11:43:04 +02:00
|
|
|
private serverService: ServerService,
|
|
|
|
private storage: SessionStorageService
|
2018-03-01 13:57:29 +01:00
|
|
|
) {
|
2023-02-20 10:17:03 +01:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
init () {
|
2021-06-04 13:31:41 +02:00
|
|
|
const config = this.serverService.getHTMLConfig()
|
2023-02-20 10:17:03 +01:00
|
|
|
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
|
|
|
}
|
2023-02-20 10:17:03 +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
|
|
|
}
|
|
|
|
|
2022-05-20 11:43:04 +02:00
|
|
|
this.latestSessionUrl = this.storage.getItem(RedirectService.SESSION_STORAGE_LATEST_SESSION_URL_KEY)
|
|
|
|
this.storage.removeItem(RedirectService.SESSION_STORAGE_LATEST_SESSION_URL_KEY)
|
|
|
|
|
2022-07-15 15:30:14 +02:00
|
|
|
debugLogger('Loaded latest session URL %s', this.latestSessionUrl)
|
2022-05-20 11:43:04 +02:00
|
|
|
|
2018-12-11 15:27:46 +01:00
|
|
|
// Track previous url
|
|
|
|
this.currentUrl = this.router.url
|
2023-02-20 10:17:03 +01:00
|
|
|
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
|
2022-07-04 22:04:55 +02:00
|
|
|
|
2018-12-11 15:27:46 +01:00
|
|
|
this.previousUrl = this.currentUrl
|
|
|
|
this.currentUrl = event.url
|
2022-05-20 11:43:04 +02:00
|
|
|
|
2022-07-15 15:30:14 +02:00
|
|
|
debugLogger('Previous URL is %s, current URL is %s', this.previousUrl, this.currentUrl)
|
|
|
|
debugLogger('Setting %s as latest URL in session storage.', this.currentUrl)
|
2022-05-20 11:43:04 +02:00
|
|
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
2022-05-20 11:43:04 +02:00
|
|
|
redirectToLatestSessionRoute () {
|
|
|
|
return this.doRedirect(this.latestSessionUrl)
|
2022-05-09 10:47:46 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
redirectToPreviousRoute (fallbackRoute?: string) {
|
2022-05-20 11:43:04 +02:00
|
|
|
return this.doRedirect(this.previousUrl, fallbackRoute)
|
|
|
|
}
|
2021-12-13 15:29:13 +01:00
|
|
|
|
2022-05-20 11:43:04 +02:00
|
|
|
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
|
|
|
|
|
2022-07-15 15:30:14 +02:00
|
|
|
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
|
|
|
|
|
|
|
}
|
2022-05-20 11:43:04 +02:00
|
|
|
|
2023-02-14 11:47:01 +01:00
|
|
|
redirectToLogin () {
|
|
|
|
const externalLoginUrl = PluginsManager.getDefaultLoginHref(environment.apiUrl, this.serverService.getHTMLConfig())
|
|
|
|
|
|
|
|
if (externalLoginUrl) window.location.href = externalLoginUrl
|
|
|
|
else this.router.navigate([ '/login' ])
|
|
|
|
}
|
|
|
|
|
2022-05-20 11:43:04 +02:00
|
|
|
private doRedirect (redirectUrl: string, fallbackRoute?: string) {
|
2022-07-15 15:30:14 +02:00
|
|
|
debugLogger('Redirecting on %s', redirectUrl)
|
2022-05-20 11:43:04 +02:00
|
|
|
|
|
|
|
if (this.isValidRedirection(redirectUrl)) {
|
|
|
|
return this.router.navigateByUrl(redirectUrl)
|
|
|
|
}
|
|
|
|
|
2022-07-15 15:30:14 +02:00
|
|
|
debugLogger('%s is not a valid redirection, try fallback route %s', redirectUrl, fallbackRoute)
|
2022-05-20 11:43:04 +02:00
|
|
|
if (fallbackRoute) {
|
|
|
|
return this.router.navigateByUrl(fallbackRoute)
|
|
|
|
}
|
|
|
|
|
2022-07-15 15:30:14 +02:00
|
|
|
debugLogger('There was no fallback route, redirecting to homepage')
|
2022-05-20 11:43:04 +02:00
|
|
|
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
|
|
|
}
|