X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=client%2Fsrc%2Fapp%2Fshared%2Fshared-instance%2Finstance-follow.service.ts;h=7568fbbf445327239d693c219f5591464a0ca784;hb=59b741d6e3bd883b0a32d7aa02f953cc1bee16d6;hp=3c9ccc40f5238447aaa5786d792ae95e849337a5;hpb=67ed6552b831df66713bac9e672738796128d33f;p=github%2FChocobozzz%2FPeerTube.git diff --git a/client/src/app/shared/shared-instance/instance-follow.service.ts b/client/src/app/shared/shared-instance/instance-follow.service.ts index 3c9ccc40f..7568fbbf4 100644 --- a/client/src/app/shared/shared-instance/instance-follow.service.ts +++ b/client/src/app/shared/shared-instance/instance-follow.service.ts @@ -1,11 +1,13 @@ import { SortMeta } from 'primeng/api' -import { Observable } from 'rxjs' -import { catchError, map } from 'rxjs/operators' +import { from, Observable } from 'rxjs' +import { catchError, concatMap, toArray } from 'rxjs/operators' import { HttpClient, HttpParams } from '@angular/common/http' import { Injectable } from '@angular/core' import { RestExtractor, RestPagination, RestService } from '@app/core' -import { ActivityPubActorType, ActorFollow, FollowState, ResultList } from '@shared/index' +import { arrayify } from '@shared/core-utils' +import { ActivityPubActorType, ActorFollow, FollowState, ResultList, ServerFollowCreate } from '@shared/models' import { environment } from '../../../environments/environment' +import { AdvancedInputFilter } from '../shared-forms' @Injectable() export class InstanceFollowService { @@ -19,10 +21,10 @@ export class InstanceFollowService { } getFollowing (options: { - pagination: RestPagination, - sort: SortMeta, - search?: string, - actorType?: ActivityPubActorType, + pagination: RestPagination + sort: SortMeta + search?: string + actorType?: ActivityPubActorType state?: FollowState }): Observable> { const { pagination, sort, search, state, actorType } = options @@ -30,22 +32,22 @@ export class InstanceFollowService { let params = new HttpParams() params = this.restService.addRestGetParams(params, pagination, sort) - if (search) params = params.append('search', search) + if (search) { + params = this.restService.addObjectParams(params, this.parseFollowsListFilters(search)) + } + if (state) params = params.append('state', state) if (actorType) params = params.append('actorType', actorType) return this.authHttp.get>(InstanceFollowService.BASE_APPLICATION_URL + '/following', { params }) - .pipe( - map(res => this.restExtractor.convertResultListDateToHuman(res)), - catchError(res => this.restExtractor.handleError(res)) - ) + .pipe(catchError(res => this.restExtractor.handleError(res))) } getFollowers (options: { - pagination: RestPagination, - sort: SortMeta, - search?: string, - actorType?: ActivityPubActorType, + pagination: RestPagination + sort: SortMeta + search?: string + actorType?: ActivityPubActorType state?: FollowState }): Observable> { const { pagination, sort, search, state, actorType } = options @@ -53,64 +55,114 @@ export class InstanceFollowService { let params = new HttpParams() params = this.restService.addRestGetParams(params, pagination, sort) - if (search) params = params.append('search', search) + if (search) { + params = this.restService.addObjectParams(params, this.parseFollowsListFilters(search)) + } + if (state) params = params.append('state', state) if (actorType) params = params.append('actorType', actorType) return this.authHttp.get>(InstanceFollowService.BASE_APPLICATION_URL + '/followers', { params }) - .pipe( - map(res => this.restExtractor.convertResultListDateToHuman(res)), - catchError(res => this.restExtractor.handleError(res)) - ) + .pipe(catchError(res => this.restExtractor.handleError(res))) } - follow (notEmptyHosts: string[]) { - const body = { - hosts: notEmptyHosts + follow (hostsOrHandles: string[]) { + const body: ServerFollowCreate = { + handles: hostsOrHandles.filter(v => v.includes('@')), + hosts: hostsOrHandles.filter(v => !v.includes('@')) } return this.authHttp.post(InstanceFollowService.BASE_APPLICATION_URL + '/following', body) - .pipe( - map(this.restExtractor.extractDataBool), - catchError(res => this.restExtractor.handleError(res)) - ) + .pipe(catchError(res => this.restExtractor.handleError(res))) } - unfollow (follow: ActorFollow) { - return this.authHttp.delete(InstanceFollowService.BASE_APPLICATION_URL + '/following/' + follow.following.host) - .pipe( - map(this.restExtractor.extractDataBool), - catchError(res => this.restExtractor.handleError(res)) - ) + unfollow (followsArg: ActorFollow[] | ActorFollow) { + const follows = arrayify(followsArg) + + return from(follows) + .pipe( + concatMap(follow => { + const handle = follow.following.name + '@' + follow.following.host + + return this.authHttp.delete(InstanceFollowService.BASE_APPLICATION_URL + '/following/' + handle) + }), + toArray(), + catchError(err => this.restExtractor.handleError(err)) + ) } - acceptFollower (follow: ActorFollow) { - const handle = follow.follower.name + '@' + follow.follower.host + acceptFollower (followsArg: ActorFollow[] | ActorFollow) { + const follows = arrayify(followsArg) + + return from(follows) + .pipe( + concatMap(follow => { + const handle = follow.follower.name + '@' + follow.follower.host - return this.authHttp.post(`${InstanceFollowService.BASE_APPLICATION_URL}/followers/${handle}/accept`, {}) - .pipe( - map(this.restExtractor.extractDataBool), - catchError(res => this.restExtractor.handleError(res)) - ) + return this.authHttp.post(`${InstanceFollowService.BASE_APPLICATION_URL}/followers/${handle}/accept`, {}) + }), + toArray(), + catchError(err => this.restExtractor.handleError(err)) + ) } - rejectFollower (follow: ActorFollow) { - const handle = follow.follower.name + '@' + follow.follower.host + rejectFollower (followsArg: ActorFollow[] | ActorFollow) { + const follows = arrayify(followsArg) - return this.authHttp.post(`${InstanceFollowService.BASE_APPLICATION_URL}/followers/${handle}/reject`, {}) - .pipe( - map(this.restExtractor.extractDataBool), - catchError(res => this.restExtractor.handleError(res)) - ) + return from(follows) + .pipe( + concatMap(follow => { + const handle = follow.follower.name + '@' + follow.follower.host + + return this.authHttp.post(`${InstanceFollowService.BASE_APPLICATION_URL}/followers/${handle}/reject`, {}) + }), + toArray(), + catchError(err => this.restExtractor.handleError(err)) + ) + } + + removeFollower (followsArg: ActorFollow[] | ActorFollow) { + const follows = arrayify(followsArg) + + return from(follows) + .pipe( + concatMap(follow => { + const handle = follow.follower.name + '@' + follow.follower.host + + return this.authHttp.delete(`${InstanceFollowService.BASE_APPLICATION_URL}/followers/${handle}`) + }), + toArray(), + catchError(err => this.restExtractor.handleError(err)) + ) } - removeFollower (follow: ActorFollow) { - const handle = follow.follower.name + '@' + follow.follower.host + buildFollowsListFilters (): AdvancedInputFilter[] { + return [ + { + title: $localize`Advanced filters`, + children: [ + { + value: 'state:accepted', + label: $localize`Accepted follows` + }, + { + value: 'state:rejected', + label: $localize`Rejected follows` + }, + { + value: 'state:pending', + label: $localize`Pending follows` + } + ] + } + ] + } - return this.authHttp.delete(`${InstanceFollowService.BASE_APPLICATION_URL}/followers/${handle}`) - .pipe( - map(this.restExtractor.extractDataBool), - catchError(res => this.restExtractor.handleError(res)) - ) + private parseFollowsListFilters (search: string) { + return this.restService.parseQueryStringFilter(search, { + state: { + prefix: 'state:' + } + }) } }