1 import { omit } from 'lodash-es'
2 import { SortMeta } from 'primeng/api'
3 import { Observable } from 'rxjs'
4 import { catchError } from 'rxjs/operators'
5 import { HttpClient, HttpParams } from '@angular/common/http'
6 import { Injectable } from '@angular/core'
7 import { RestExtractor, RestPagination, RestService } from '@app/core'
12 AbusePredefinedReasonsString,
18 } from '@shared/models'
19 import { environment } from '../../../environments/environment'
22 export class AbuseService {
23 private static BASE_ABUSE_URL = environment.apiUrl + '/api/v1/abuses'
24 private static BASE_MY_ABUSE_URL = environment.apiUrl + '/api/v1/users/me/abuses'
27 private authHttp: HttpClient,
28 private restService: RestService,
29 private restExtractor: RestExtractor
32 getAdminAbuses (options: {
33 pagination: RestPagination
36 }): Observable<ResultList<AdminAbuse>> {
37 const { pagination, sort, search } = options
38 const url = AbuseService.BASE_ABUSE_URL
40 let params = new HttpParams()
41 params = this.restService.addRestGetParams(params, pagination, sort)
44 params = this.buildParamsFromSearch(search, params)
47 return this.authHttp.get<ResultList<AdminAbuse>>(url, { params })
49 catchError(res => this.restExtractor.handleError(res))
53 getUserAbuses (options: {
54 pagination: RestPagination
57 }): Observable<ResultList<UserAbuse>> {
58 const { pagination, sort, search } = options
59 const url = AbuseService.BASE_MY_ABUSE_URL
61 let params = new HttpParams()
62 params = this.restService.addRestGetParams(params, pagination, sort)
65 params = this.buildParamsFromSearch(search, params)
68 return this.authHttp.get<ResultList<UserAbuse>>(url, { params })
70 catchError(res => this.restExtractor.handleError(res))
74 reportVideo (parameters: AbuseCreate) {
75 const url = AbuseService.BASE_ABUSE_URL
77 const body = omit(parameters, [ 'id' ])
79 return this.authHttp.post(url, body)
80 .pipe(catchError(res => this.restExtractor.handleError(res)))
83 updateAbuse (abuse: AdminAbuse, abuseUpdate: AbuseUpdate) {
84 const url = AbuseService.BASE_ABUSE_URL + '/' + abuse.id
86 return this.authHttp.put(url, abuseUpdate)
87 .pipe(catchError(res => this.restExtractor.handleError(res)))
90 removeAbuse (abuse: AdminAbuse) {
91 const url = AbuseService.BASE_ABUSE_URL + '/' + abuse.id
93 return this.authHttp.delete(url)
94 .pipe(catchError(res => this.restExtractor.handleError(res)))
97 addAbuseMessage (abuse: UserAbuse, message: string) {
98 const url = AbuseService.BASE_ABUSE_URL + '/' + abuse.id + '/messages'
100 return this.authHttp.post(url, { message })
101 .pipe(catchError(res => this.restExtractor.handleError(res)))
104 listAbuseMessages (abuse: UserAbuse) {
105 const url = AbuseService.BASE_ABUSE_URL + '/' + abuse.id + '/messages'
107 return this.authHttp.get<ResultList<AbuseMessage>>(url)
109 catchError(res => this.restExtractor.handleError(res))
113 deleteAbuseMessage (abuse: UserAbuse, abuseMessage: AbuseMessage) {
114 const url = AbuseService.BASE_ABUSE_URL + '/' + abuse.id + '/messages/' + abuseMessage.id
116 return this.authHttp.delete(url)
117 .pipe(catchError(res => this.restExtractor.handleError(res)))
120 getPrefefinedReasons (type: AbuseFilter) {
121 let reasons: { id: AbusePredefinedReasonsString, label: string, description?: string, help?: string }[] = [
123 id: 'violentOrRepulsive',
124 label: $localize`Violent or repulsive`,
125 help: $localize`Contains offensive, violent, or coarse language or iconography.`
128 id: 'hatefulOrAbusive',
129 label: $localize`Hateful or abusive`,
130 help: $localize`Contains abusive, racist or sexist language or iconography.`
133 id: 'spamOrMisleading',
134 label: $localize`Spam, ad or false news`,
135 // eslint-disable-next-line max-len
136 help: $localize`Contains marketing, spam, purposefully deceitful news, or otherwise misleading thumbnail/text/tags. Please provide reputable sources to report hoaxes.`
140 label: $localize`Privacy breach or doxxing`,
141 // eslint-disable-next-line max-len
142 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).`
146 label: $localize`Copyright`,
147 help: $localize`Infringes your copyright wrt. the regional laws with which the server must comply.`
151 label: $localize`Breaks server rules`,
152 // eslint-disable-next-line max-len
153 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.`
157 if (type === 'video') {
158 reasons = reasons.concat([
161 label: $localize`Thumbnails`,
162 help: $localize`The above can only be seen in thumbnails.`
166 label: $localize`Captions`,
167 help: $localize`The above can only be seen in captions (please describe which).`
175 private buildParamsFromSearch (search: string, params: HttpParams) {
176 const filters = this.restService.parseQueryStringFilter(search, {
181 if (v === 'accepted') return AbuseState.ACCEPTED
182 if (v === 'pending') return AbuseState.PENDING
183 if (v === 'rejected') return AbuseState.REJECTED
191 if (v === 'deleted') return v
192 if (v === 'blacklisted') return v
197 searchReporter: { prefix: 'reporter:' },
198 searchReportee: { prefix: 'reportee:' },
199 predefinedReason: { prefix: 'tag:' }
202 return this.restService.addObjectParams(params, filters)