Reorganize client shared modules
[oweals/peertube.git] / client / src / app / shared / shared-instance / instance-follow.service.ts
1 import { SortMeta } from 'primeng/api'
2 import { Observable } from 'rxjs'
3 import { catchError, map } from 'rxjs/operators'
4 import { HttpClient, HttpParams } from '@angular/common/http'
5 import { Injectable } from '@angular/core'
6 import { RestExtractor, RestPagination, RestService } from '@app/core'
7 import { ActivityPubActorType, ActorFollow, FollowState, ResultList } from '@shared/index'
8 import { environment } from '../../../environments/environment'
9
10 @Injectable()
11 export class InstanceFollowService {
12   private static BASE_APPLICATION_URL = environment.apiUrl + '/api/v1/server'
13
14   constructor (
15     private authHttp: HttpClient,
16     private restService: RestService,
17     private restExtractor: RestExtractor
18   ) {
19   }
20
21   getFollowing (options: {
22     pagination: RestPagination,
23     sort: SortMeta,
24     search?: string,
25     actorType?: ActivityPubActorType,
26     state?: FollowState
27   }): Observable<ResultList<ActorFollow>> {
28     const { pagination, sort, search, state, actorType } = options
29
30     let params = new HttpParams()
31     params = this.restService.addRestGetParams(params, pagination, sort)
32
33     if (search) params = params.append('search', search)
34     if (state) params = params.append('state', state)
35     if (actorType) params = params.append('actorType', actorType)
36
37     return this.authHttp.get<ResultList<ActorFollow>>(InstanceFollowService.BASE_APPLICATION_URL + '/following', { params })
38                .pipe(
39                  map(res => this.restExtractor.convertResultListDateToHuman(res)),
40                  catchError(res => this.restExtractor.handleError(res))
41                )
42   }
43
44   getFollowers (options: {
45     pagination: RestPagination,
46     sort: SortMeta,
47     search?: string,
48     actorType?: ActivityPubActorType,
49     state?: FollowState
50   }): Observable<ResultList<ActorFollow>> {
51     const { pagination, sort, search, state, actorType } = options
52
53     let params = new HttpParams()
54     params = this.restService.addRestGetParams(params, pagination, sort)
55
56     if (search) params = params.append('search', search)
57     if (state) params = params.append('state', state)
58     if (actorType) params = params.append('actorType', actorType)
59
60     return this.authHttp.get<ResultList<ActorFollow>>(InstanceFollowService.BASE_APPLICATION_URL + '/followers', { params })
61                .pipe(
62                  map(res => this.restExtractor.convertResultListDateToHuman(res)),
63                  catchError(res => this.restExtractor.handleError(res))
64                )
65   }
66
67   follow (notEmptyHosts: string[]) {
68     const body = {
69       hosts: notEmptyHosts
70     }
71
72     return this.authHttp.post(InstanceFollowService.BASE_APPLICATION_URL + '/following', body)
73                .pipe(
74                  map(this.restExtractor.extractDataBool),
75                  catchError(res => this.restExtractor.handleError(res))
76                )
77   }
78
79   unfollow (follow: ActorFollow) {
80     return this.authHttp.delete(InstanceFollowService.BASE_APPLICATION_URL + '/following/' + follow.following.host)
81                .pipe(
82                  map(this.restExtractor.extractDataBool),
83                  catchError(res => this.restExtractor.handleError(res))
84                )
85   }
86
87   acceptFollower (follow: ActorFollow) {
88     const handle = follow.follower.name + '@' + follow.follower.host
89
90     return this.authHttp.post(`${InstanceFollowService.BASE_APPLICATION_URL}/followers/${handle}/accept`, {})
91                .pipe(
92                  map(this.restExtractor.extractDataBool),
93                  catchError(res => this.restExtractor.handleError(res))
94                )
95   }
96
97   rejectFollower (follow: ActorFollow) {
98     const handle = follow.follower.name + '@' + follow.follower.host
99
100     return this.authHttp.post(`${InstanceFollowService.BASE_APPLICATION_URL}/followers/${handle}/reject`, {})
101                .pipe(
102                  map(this.restExtractor.extractDataBool),
103                  catchError(res => this.restExtractor.handleError(res))
104                )
105   }
106
107   removeFollower (follow: ActorFollow) {
108     const handle = follow.follower.name + '@' + follow.follower.host
109
110     return this.authHttp.delete(`${InstanceFollowService.BASE_APPLICATION_URL}/followers/${handle}`)
111                .pipe(
112                  map(this.restExtractor.extractDataBool),
113                  catchError(res => this.restExtractor.handleError(res))
114                )
115   }
116 }