X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;ds=sidebyside;f=client%2Fsrc%2Fapp%2Fshared%2Frest%2Frest-extractor.service.ts;h=e6518dd1d75ba22ed89e8892f8c7f028b7eef507;hb=2f1548fda32c3ba9e53913270394eedfacd55986;hp=62c600d25c3355ac95f5d988c3614b04359ee712;hpb=315cc0cc1871ab2a6d6c1bb61cf7b9f10511c3a9;p=github%2FChocobozzz%2FPeerTube.git diff --git a/client/src/app/shared/rest/rest-extractor.service.ts b/client/src/app/shared/rest/rest-extractor.service.ts index 62c600d25..e6518dd1d 100644 --- a/client/src/app/shared/rest/rest-extractor.service.ts +++ b/client/src/app/shared/rest/rest-extractor.service.ts @@ -1,13 +1,18 @@ +import { throwError as observableThrowError } from 'rxjs' import { Injectable } from '@angular/core' -import { Observable } from 'rxjs/Observable' -import { HttpErrorResponse } from '@angular/common/http' - -import { Utils } from '../utils' +import { dateToHuman } from '@app/shared/misc/utils' import { ResultList } from '../../../../../shared' +import { Router } from '@angular/router' +import { I18n } from '@ngx-translate/i18n-polyfill' @Injectable() export class RestExtractor { + constructor ( + private router: Router, + private i18n: I18n + ) { } + extractDataBool () { return true } @@ -16,7 +21,7 @@ export class RestExtractor { const data: T[] = result.data const newData: T[] = [] - data.forEach(d => newData.push(fun.call(this, d, additionalArgs))) + data.forEach(d => newData.push(fun.apply(this, [ d ].concat(additionalArgs)))) return { total: result.total, @@ -28,39 +33,77 @@ export class RestExtractor { return this.applyToResultListData(result, this.convertDateToHuman, [ fieldsToConvert ]) } - convertDateToHuman (target: object, fieldsToConvert: string[]) { - const source = {} - fieldsToConvert.forEach(field => { - source[field] = Utils.dateToHuman(target[field]) - }) + convertDateToHuman (target: { [ id: string ]: string }, fieldsToConvert: string[]) { + fieldsToConvert.forEach(field => target[field] = dateToHuman(target[field])) - return Object.assign(target, source) + return target } - handleError (err: HttpErrorResponse) { + handleError (err: any) { let errorMessage if (err.error instanceof Error) { // A client-side or network error occurred. Handle it accordingly. errorMessage = err.error.message console.error('An error occurred:', errorMessage) + } else if (typeof err.error === 'string') { + errorMessage = err.error } else if (err.status !== undefined) { - const body = err.error - errorMessage = body ? body.error : 'Unknown error.' - console.error(`Backend returned code ${err.status}, body was: ${errorMessage}`) + // A server-side error occurred. + if (err.error && err.error.errors) { + const errors = err.error.errors + const errorsArray: string[] = [] + + Object.keys(errors).forEach(key => { + errorsArray.push(errors[key].msg) + }) + + errorMessage = errorsArray.join('. ') + } else if (err.error && err.error.error) { + errorMessage = err.error.error + } else if (err.status === 413) { + errorMessage = this.i18n( + 'Request is too large for the server. Please contact you administrator if you want to increase the limit size.' + ) + } else if (err.status === 429) { + const secondsLeft = err.headers.get('retry-after') + if (secondsLeft) { + const minutesLeft = Math.floor(parseInt(secondsLeft, 10) / 60) + errorMessage = this.i18n('Too many attempts, please try again after {{minutesLeft}} minutes.', { minutesLeft }) + } else { + errorMessage = this.i18n('Too many attempts, please try again later.') + } + } else if (err.status === 500) { + errorMessage = this.i18n('Server error. Please retry later.') + } + + errorMessage = errorMessage ? errorMessage : 'Unknown error.' + console.error(`Backend returned code ${err.status}, errorMessage is: ${errorMessage}`) } else { + console.error(err) errorMessage = err } - const errorObj = { + const errorObj: { message: string, status: string, body: string } = { message: errorMessage, - status: undefined + status: undefined, + body: undefined } if (err.status) { errorObj.status = err.status + errorObj.body = err.error + } + + return observableThrowError(errorObj) + } + + redirectTo404IfNotFound (obj: { status: number }, status = [ 404 ]) { + if (obj && obj.status && status.indexOf(obj.status) !== -1) { + // Do not use redirectService to avoid circular dependencies + this.router.navigate([ '/404' ], { skipLocationChange: true }) } - return Observable.throw(errorObj) + return observableThrowError(obj) } }