]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - client/src/app/core/rest/rest-extractor.service.ts
Don't display account setup modal on signup
[github/Chocobozzz/PeerTube.git] / client / src / app / core / rest / rest-extractor.service.ts
CommitLineData
a51bad1a 1import { throwError as observableThrowError } from 'rxjs'
df98563e 2import { Injectable } from '@angular/core'
a51bad1a 3import { Router } from '@angular/router'
67ed6552 4import { dateToHuman } from '@app/helpers'
c0e8b12e 5import { HttpStatusCode, ResultList } from '@shared/models'
de59c48f
C
6
7@Injectable()
8export class RestExtractor {
9
66357162 10 constructor (private router: Router) { }
a51bad1a 11
d592e0a9 12 extractDataBool () {
df98563e 13 return true
de59c48f
C
14 }
15
9df52d66
C
16 applyToResultListData <T, A, U> (
17 result: ResultList<T>,
18 fun: (data: T, ...args: A[]) => U,
19 additionalArgs: A[] = []
20 ): ResultList<U> {
d592e0a9 21 const data: T[] = result.data
de59c48f 22
d592e0a9
C
23 return {
24 total: result.total,
9df52d66 25 data: data.map(d => fun.apply(this, [ d, ...additionalArgs ]))
d592e0a9 26 }
de59c48f
C
27 }
28
d592e0a9
C
29 convertResultListDateToHuman <T> (result: ResultList<T>, fieldsToConvert: string[] = [ 'createdAt' ]): ResultList<T> {
30 return this.applyToResultListData(result, this.convertDateToHuman, [ fieldsToConvert ])
de59c48f
C
31 }
32
9df52d66
C
33 convertDateToHuman (target: any, fieldsToConvert: string[]) {
34 fieldsToConvert.forEach(field => {
35 target[field] = dateToHuman(target[field])
36 })
bf68dd75 37
61bbc727 38 return target
d592e0a9 39 }
de59c48f 40
47f8de28 41 handleError (err: any) {
d592e0a9
C
42 let errorMessage
43
44 if (err.error instanceof Error) {
45 // A client-side or network error occurred. Handle it accordingly.
76148b27 46 errorMessage = err.error.detail || err.error.title
d592e0a9 47 console.error('An error occurred:', errorMessage)
47f8de28
C
48 } else if (typeof err.error === 'string') {
49 errorMessage = err.error
d592e0a9 50 } else if (err.status !== undefined) {
8376734e 51 // A server-side error occurred.
9df52d66 52 if (err.error?.errors) {
490b595a
C
53 const errors = err.error.errors
54 const errorsArray: string[] = []
55
56 Object.keys(errors).forEach(key => {
57 errorsArray.push(errors[key].msg)
58 })
59
60 errorMessage = errorsArray.join('. ')
9df52d66 61 } else if (err.error?.error) {
490b595a 62 errorMessage = err.error.error
f2eb23cd 63 } else if (err.status === HttpStatusCode.PAYLOAD_TOO_LARGE_413) {
9df52d66 64 // eslint-disable-next-line max-len
dc5bb5ce 65 errorMessage = $localize`Media is too large for the server. Please contact you administrator if you want to increase the limit size.`
f2eb23cd 66 } else if (err.status === HttpStatusCode.TOO_MANY_REQUESTS_429) {
490b595a
C
67 const secondsLeft = err.headers.get('retry-after')
68 if (secondsLeft) {
69 const minutesLeft = Math.floor(parseInt(secondsLeft, 10) / 60)
66357162 70 errorMessage = $localize`Too many attempts, please try again after ${minutesLeft} minutes.`
490b595a 71 } else {
66357162 72 errorMessage = $localize`Too many attempts, please try again later.`
490b595a 73 }
f2eb23cd 74 } else if (err.status === HttpStatusCode.INTERNAL_SERVER_ERROR_500) {
66357162 75 errorMessage = $localize`Server error. Please retry later.`
8376734e 76 }
13fb4de9 77
9df52d66 78 errorMessage = errorMessage || 'Unknown error.'
490b595a 79 console.error(`Backend returned code ${err.status}, errorMessage is: ${errorMessage}`)
d592e0a9 80 } else {
2f1548fd 81 console.error(err)
d592e0a9 82 errorMessage = err
df98563e 83 }
de59c48f 84
c199c427 85 const errorObj: { message: string, status: string, body: string } = {
bfb3a98f 86 message: errorMessage,
c9d6d155
C
87 status: undefined,
88 body: undefined
bfb3a98f
C
89 }
90
91 if (err.status) {
92 errorObj.status = err.status
c9d6d155 93 errorObj.body = err.error
bfb3a98f
C
94 }
95
1378c0d3 96 return observableThrowError(() => errorObj)
de59c48f 97 }
a51bad1a 98
ab398a05 99 redirectTo404IfNotFound (obj: { status: number }, type: 'video' | 'other', status = [ HttpStatusCode.NOT_FOUND_404 ]) {
9df52d66 100 if (obj?.status && status.includes(obj.status)) {
a51bad1a 101 // Do not use redirectService to avoid circular dependencies
ab398a05 102 this.router.navigate([ '/404' ], { state: { type, obj }, skipLocationChange: true })
a51bad1a
C
103 }
104
1378c0d3 105 return observableThrowError(() => obj)
a51bad1a 106 }
de59c48f 107}