X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=client%2Fsrc%2Fapp%2Fshared%2Frest%2Frest-extractor.service.ts;h=e6518dd1d75ba22ed89e8892f8c7f028b7eef507;hb=2f1548fda32c3ba9e53913270394eedfacd55986;hp=aa44799af47a950e2bf878c835b891f44f502206;hpb=de59c48f5f317018e3f746bbe4a7b7efe00109f2;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 aa44799af..e6518dd1d 100644 --- a/client/src/app/shared/rest/rest-extractor.service.ts +++ b/client/src/app/shared/rest/rest-extractor.service.ts @@ -1,46 +1,109 @@ -import { Injectable } from '@angular/core'; -import { Response } from '@angular/http'; -import { Observable } from 'rxjs/Observable'; - -export interface ResultList { - data: any[]; - total: number; -} +import { throwError as observableThrowError } from 'rxjs' +import { Injectable } from '@angular/core' +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 () { ; } + constructor ( + private router: Router, + private i18n: I18n + ) { } - extractDataBool(res: Response) { - return true; + extractDataBool () { + return true } - extractDataList(res: Response) { - const body = res.json(); + applyToResultListData (result: ResultList, fun: Function, additionalArgs?: any[]): ResultList { + const data: T[] = result.data + const newData: T[] = [] - const ret: ResultList = { - data: body.data, - total: body.total - }; + data.forEach(d => newData.push(fun.apply(this, [ d ].concat(additionalArgs)))) - return ret; + return { + total: result.total, + data: newData + } } - extractDataGet(res: Response) { - return res.json(); + convertResultListDateToHuman (result: ResultList, fieldsToConvert: string[] = [ 'createdAt' ]): ResultList { + return this.applyToResultListData(result, this.convertDateToHuman, [ fieldsToConvert ]) } - handleError(res: Response) { - let text = 'Server error: '; - text += res.text(); - let json = res.json(); + convertDateToHuman (target: { [ id: string ]: string }, fieldsToConvert: string[]) { + fieldsToConvert.forEach(field => target[field] = dateToHuman(target[field])) + + return target + } + + 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) { + // 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: { message: string, status: string, body: string } = { + message: errorMessage, + status: undefined, + body: undefined + } + + if (err.status) { + errorObj.status = err.status + errorObj.body = err.error + } + + return observableThrowError(errorObj) + } - const error = { - json, - text - }; + 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(error); + return observableThrowError(obj) } }