X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=client%2Fsrc%2Fapp%2Fshared%2Frest%2Frest-extractor.service.ts;h=ad08a32f80b7bfcb7dcaef59a0fc9f4dd9d30170;hb=23f4c3d412974fa5fda52589d1192e098e260f1a;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..ad08a32f8 100644 --- a/client/src/app/shared/rest/rest-extractor.service.ts +++ b/client/src/app/shared/rest/rest-extractor.service.ts @@ -1,46 +1,81 @@ -import { Injectable } from '@angular/core'; -import { Response } from '@angular/http'; -import { Observable } from 'rxjs/Observable'; - -export interface ResultList { - data: any[]; - total: number; -} +import { HttpErrorResponse } from '@angular/common/http' +import { Injectable } from '@angular/core' +import { dateToHuman } from '@app/shared/misc/utils' +import { Observable } from 'rxjs/Observable' +import { ResultList } from '../../../../../shared' @Injectable() export class RestExtractor { - constructor () { ; } - - 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 ]) + } + + convertDateToHuman (target: object, fieldsToConvert: string[]) { + fieldsToConvert.forEach(field => target[field] = dateToHuman(target[field])) + + return target } - handleError(res: Response) { - let text = 'Server error: '; - text += res.text(); - let json = res.json(); + handleError (err: HttpErrorResponse) { + 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 (err.status !== undefined) { + // A server-side error occurred. + if (err.error) { + if (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.error) { + errorMessage = err.error.error + } + } else if (err.status === 413) { + errorMessage = 'Request is too large for the server. Please contact you administrator if you want to increase the limit size.' + } + + errorMessage = errorMessage ? errorMessage : 'Unknown error.' + console.error(`Backend returned code ${err.status}, body was: ${errorMessage}`) + } else { + errorMessage = err + } + + const errorObj = { + message: errorMessage, + status: undefined, + body: undefined + } - const error = { - json, - text - }; + if (err.status) { + errorObj.status = err.status + errorObj.body = err.error + } - return Observable.throw(error); + return Observable.throw(errorObj) } }