X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=client%2Fsrc%2Fapp%2Fcore%2Frest%2Frest-extractor.service.ts;h=86c7484a5c0be56493868c1c518eff82d812daa9;hb=ef2b5520f963deec43abd0a11881473c45965788;hp=29a56ba39203cad2130f1c58c15bc7a24a87460f;hpb=1378c0d343028f3d40d7d795422684ab9e6a1599;p=github%2FChocobozzz%2FPeerTube.git diff --git a/client/src/app/core/rest/rest-extractor.service.ts b/client/src/app/core/rest/rest-extractor.service.ts index 29a56ba39..86c7484a5 100644 --- a/client/src/app/core/rest/rest-extractor.service.ts +++ b/client/src/app/core/rest/rest-extractor.service.ts @@ -9,19 +9,16 @@ export class RestExtractor { constructor (private router: Router) { } - extractDataBool () { - return true - } - - applyToResultListData (result: ResultList, fun: Function, additionalArgs?: any[]): ResultList { + applyToResultListData ( + result: ResultList, + fun: (data: T, ...args: A[]) => U, + additionalArgs: A[] = [] + ): ResultList { const data: T[] = result.data - const newData: T[] = [] - - data.forEach(d => newData.push(fun.apply(this, [ d ].concat(additionalArgs)))) return { total: result.total, - data: newData + data: data.map(d => fun.apply(this, [ d, ...additionalArgs ])) } } @@ -29,54 +26,25 @@ export class RestExtractor { return this.applyToResultListData(result, this.convertDateToHuman, [ fieldsToConvert ]) } - convertDateToHuman (target: { [ id: string ]: string }, fieldsToConvert: string[]) { - fieldsToConvert.forEach(field => target[field] = dateToHuman(target[field])) + convertDateToHuman (target: any, fieldsToConvert: string[]) { + fieldsToConvert.forEach(field => { + target[field] = dateToHuman(target[field]) + }) return target } - handleError (err: any) { - let errorMessage + redirectTo404IfNotFound (obj: { status: number }, type: 'video' | 'other', status = [ HttpStatusCode.NOT_FOUND_404 ]) { + if (obj?.status && status.includes(obj.status)) { + // Do not use redirectService to avoid circular dependencies + this.router.navigate([ '/404' ], { state: { type, obj }, skipLocationChange: true }) + } - if (err.error instanceof Error) { - // A client-side or network error occurred. Handle it accordingly. - errorMessage = err.error.detail || err.error.title - 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 === HttpStatusCode.PAYLOAD_TOO_LARGE_413) { - errorMessage = $localize`Media is too large for the server. Please contact you administrator if you want to increase the limit size.` - } else if (err.status === HttpStatusCode.TOO_MANY_REQUESTS_429) { - const secondsLeft = err.headers.get('retry-after') - if (secondsLeft) { - const minutesLeft = Math.floor(parseInt(secondsLeft, 10) / 60) - errorMessage = $localize`Too many attempts, please try again after ${minutesLeft} minutes.` - } else { - errorMessage = $localize`Too many attempts, please try again later.` - } - } else if (err.status === HttpStatusCode.INTERNAL_SERVER_ERROR_500) { - errorMessage = $localize`Server error. Please retry later.` - } + return observableThrowError(() => obj) + } - errorMessage = errorMessage ? errorMessage : 'Unknown error.' - console.error(`Backend returned code ${err.status}, errorMessage is: ${errorMessage}`) - } else { - console.error(err) - errorMessage = err - } + handleError (err: any) { + const errorMessage = this.buildErrorMessage(err) const errorObj: { message: string, status: string, body: string } = { message: errorMessage, @@ -92,12 +60,63 @@ export class RestExtractor { return observableThrowError(() => errorObj) } - redirectTo404IfNotFound (obj: { status: number }, type: 'video' | 'other', status = [ HttpStatusCode.NOT_FOUND_404 ]) { - if (obj && obj.status && status.indexOf(obj.status) !== -1) { - // Do not use redirectService to avoid circular dependencies - this.router.navigate([ '/404' ], { state: { type, obj }, skipLocationChange: true }) + private buildErrorMessage (err: any) { + if (err.error instanceof Error) { + // A client-side or network error occurred. Handle it accordingly. + const errorMessage = err.error.detail || err.error.title + console.error('An error occurred:', errorMessage) + + return errorMessage } - return observableThrowError(() => obj) + if (typeof err.error === 'string') { + return err.error + } + + if (err.status !== undefined) { + const errorMessage = this.buildServerErrorMessage(err) + console.error(`Backend returned code ${err.status}, errorMessage is: ${errorMessage}`) + + return errorMessage + } + + console.error(err) + return err + } + + private buildServerErrorMessage (err: any) { + // A server-side error occurred. + if (err.error?.errors) { + const errors = err.error.errors + + return Object.keys(errors) + .map(key => errors[key].msg) + .join('. ') + } + + if (err.error?.error) { + return err.error.error + } + + if (err.status === HttpStatusCode.PAYLOAD_TOO_LARGE_413) { + return $localize`Media is too large for the server. Please contact you administrator if you want to increase the limit size.` + } + + if (err.status === HttpStatusCode.TOO_MANY_REQUESTS_429) { + const secondsLeft = err.headers.get('retry-after') + + if (secondsLeft) { + const minutesLeft = Math.floor(parseInt(secondsLeft, 10) / 60) + return $localize`Too many attempts, please try again after ${minutesLeft} minutes.` + } + + return $localize`Too many attempts, please try again later.` + } + + if (err.status === HttpStatusCode.INTERNAL_SERVER_ERROR_500) { + return $localize`Server error. Please retry later.` + } + + return $localize`Unknown server error` } }