X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=client%2Fsrc%2Fapp%2Fshared%2Fshared-moderation%2Fabuse.service.ts;h=bf98d4b36d6b294ba0aa7de041372f6595e844ab;hb=66357162f8e1227495f09bd4f68446aad7071c6d;hp=95ac169557abfdc6586a3cb9e29364544b44a84d;hpb=17aa80ed016bafa3ccb071af3f86054033823284;p=github%2FChocobozzz%2FPeerTube.git diff --git a/client/src/app/shared/shared-moderation/abuse.service.ts b/client/src/app/shared/shared-moderation/abuse.service.ts index 95ac16955..bf98d4b36 100644 --- a/client/src/app/shared/shared-moderation/abuse.service.ts +++ b/client/src/app/shared/shared-moderation/abuse.service.ts @@ -5,26 +5,35 @@ import { catchError, map } from 'rxjs/operators' import { HttpClient, HttpParams } from '@angular/common/http' import { Injectable } from '@angular/core' import { RestExtractor, RestPagination, RestService } from '@app/core' -import { Abuse, AbuseCreate, AbuseFilter, AbusePredefinedReasonsString, AbuseState, AbuseUpdate, ResultList } from '@shared/models' +import { + AbuseCreate, + AbuseFilter, + AbuseMessage, + AbusePredefinedReasonsString, + AbuseState, + AbuseUpdate, + AdminAbuse, + ResultList, + UserAbuse +} from '@shared/models' import { environment } from '../../../environments/environment' -import { I18n } from '@ngx-translate/i18n-polyfill' @Injectable() export class AbuseService { private static BASE_ABUSE_URL = environment.apiUrl + '/api/v1/abuses' + private static BASE_MY_ABUSE_URL = environment.apiUrl + '/api/v1/users/me/abuses' constructor ( - private i18n: I18n, private authHttp: HttpClient, private restService: RestService, private restExtractor: RestExtractor ) { } - getAbuses (options: { + getAdminAbuses (options: { pagination: RestPagination, sort: SortMeta, search?: string - }): Observable> { + }): Observable> { const { pagination, sort, search } = options const url = AbuseService.BASE_ABUSE_URL @@ -32,36 +41,31 @@ export class AbuseService { params = this.restService.addRestGetParams(params, pagination, sort) if (search) { - const filters = this.restService.parseQueryStringFilter(search, { - id: { prefix: '#' }, - state: { - prefix: 'state:', - handler: v => { - if (v === 'accepted') return AbuseState.ACCEPTED - if (v === 'pending') return AbuseState.PENDING - if (v === 'rejected') return AbuseState.REJECTED - - return undefined - } - }, - videoIs: { - prefix: 'videoIs:', - handler: v => { - if (v === 'deleted') return v - if (v === 'blacklisted') return v - - return undefined - } - }, - searchReporter: { prefix: 'reporter:' }, - searchReportee: { prefix: 'reportee:' }, - predefinedReason: { prefix: 'tag:' } - }) + params = this.buildParamsFromSearch(search, params) + } - params = this.restService.addObjectParams(params, filters) + return this.authHttp.get>(url, { params }) + .pipe( + catchError(res => this.restExtractor.handleError(res)) + ) + } + + getUserAbuses (options: { + pagination: RestPagination, + sort: SortMeta, + search?: string + }): Observable> { + const { pagination, sort, search } = options + const url = AbuseService.BASE_MY_ABUSE_URL + + let params = new HttpParams() + params = this.restService.addRestGetParams(params, pagination, sort) + + if (search) { + params = this.buildParamsFromSearch(search, params) } - return this.authHttp.get>(url, { params }) + return this.authHttp.get>(url, { params }) .pipe( catchError(res => this.restExtractor.handleError(res)) ) @@ -79,7 +83,7 @@ export class AbuseService { ) } - updateAbuse (abuse: Abuse, abuseUpdate: AbuseUpdate) { + updateAbuse (abuse: AdminAbuse, abuseUpdate: AbuseUpdate) { const url = AbuseService.BASE_ABUSE_URL + '/' + abuse.id return this.authHttp.put(url, abuseUpdate) @@ -89,7 +93,7 @@ export class AbuseService { ) } - removeAbuse (abuse: Abuse) { + removeAbuse (abuse: AdminAbuse) { const url = AbuseService.BASE_ABUSE_URL + '/' + abuse.id return this.authHttp.delete(url) @@ -99,37 +103,66 @@ export class AbuseService { ) } + addAbuseMessage (abuse: UserAbuse, message: string) { + const url = AbuseService.BASE_ABUSE_URL + '/' + abuse.id + '/messages' + + return this.authHttp.post(url, { message }) + .pipe( + map(this.restExtractor.extractDataBool), + catchError(res => this.restExtractor.handleError(res)) + ) + } + + listAbuseMessages (abuse: UserAbuse) { + const url = AbuseService.BASE_ABUSE_URL + '/' + abuse.id + '/messages' + + return this.authHttp.get>(url) + .pipe( + catchError(res => this.restExtractor.handleError(res)) + ) + } + + deleteAbuseMessage (abuse: UserAbuse, abuseMessage: AbuseMessage) { + const url = AbuseService.BASE_ABUSE_URL + '/' + abuse.id + '/messages/' + abuseMessage.id + + return this.authHttp.delete(url) + .pipe( + map(this.restExtractor.extractDataBool), + catchError(res => this.restExtractor.handleError(res)) + ) + } + getPrefefinedReasons (type: AbuseFilter) { let reasons: { id: AbusePredefinedReasonsString, label: string, description?: string, help?: string }[] = [ { id: 'violentOrRepulsive', - label: this.i18n('Violent or repulsive'), - help: this.i18n('Contains offensive, violent, or coarse language or iconography.') + label: $localize`Violent or repulsive`, + help: $localize`Contains offensive, violent, or coarse language or iconography.` }, { id: 'hatefulOrAbusive', - label: this.i18n('Hateful or abusive'), - help: this.i18n('Contains abusive, racist or sexist language or iconography.') + label: $localize`Hateful or abusive`, + help: $localize`Contains abusive, racist or sexist language or iconography.` }, { id: 'spamOrMisleading', - label: this.i18n('Spam, ad or false news'), - help: this.i18n('Contains marketing, spam, purposefully deceitful news, or otherwise misleading thumbnail/text/tags. Please provide reputable sources to report hoaxes.') + label: $localize`Spam, ad or false news`, + help: $localize`Contains marketing, spam, purposefully deceitful news, or otherwise misleading thumbnail/text/tags. Please provide reputable sources to report hoaxes.` }, { id: 'privacy', - label: this.i18n('Privacy breach or doxxing'), - help: this.i18n('Contains personal information that could be used to track, identify, contact or impersonate someone (e.g. name, address, phone number, email, or credit card details).') + label: $localize`Privacy breach or doxxing`, + help: $localize`Contains personal information that could be used to track, identify, contact or impersonate someone (e.g. name, address, phone number, email, or credit card details).` }, { id: 'rights', - label: this.i18n('Intellectual property violation'), - help: this.i18n('Infringes my intellectual property or copyright, wrt. the regional rules with which the server must comply.') + label: $localize`Copyright`, + help: $localize`Infringes your copyright wrt. the regional laws with which the server must comply.` }, { id: 'serverRules', - label: this.i18n('Breaks server rules'), - description: this.i18n('Anything not included in the above that breaks the terms of service, code of conduct, or general rules in place on the server.') + label: $localize`Breaks server rules`, + description: $localize`Anything not included in the above that breaks the terms of service, code of conduct, or general rules in place on the server.` } ] @@ -137,13 +170,13 @@ export class AbuseService { reasons = reasons.concat([ { id: 'thumbnails', - label: this.i18n('Thumbnails'), - help: this.i18n('The above can only be seen in thumbnails.') + label: $localize`Thumbnails`, + help: $localize`The above can only be seen in thumbnails.` }, { id: 'captions', - label: this.i18n('Captions'), - help: this.i18n('The above can only be seen in captions (please describe which).') + label: $localize`Captions`, + help: $localize`The above can only be seen in captions (please describe which).` } ]) } @@ -151,4 +184,33 @@ export class AbuseService { return reasons } + private buildParamsFromSearch (search: string, params: HttpParams) { + const filters = this.restService.parseQueryStringFilter(search, { + id: { prefix: '#' }, + state: { + prefix: 'state:', + handler: v => { + if (v === 'accepted') return AbuseState.ACCEPTED + if (v === 'pending') return AbuseState.PENDING + if (v === 'rejected') return AbuseState.REJECTED + + return undefined + } + }, + videoIs: { + prefix: 'videoIs:', + handler: v => { + if (v === 'deleted') return v + if (v === 'blacklisted') return v + + return undefined + } + }, + searchReporter: { prefix: 'reporter:' }, + searchReportee: { prefix: 'reportee:' }, + predefinedReason: { prefix: 'tag:' } + }) + + return this.restService.addObjectParams(params, filters) + } }