Add reports management (#186)
implements part of #178, other parts will come later Co-authored-by: Sol Fisher Romanoff <sol@solfisher.com> Reviewed-on: https://akkoma.dev/AkkomaGang/pleroma-fe/pulls/186 Co-authored-by: sfr <sol@solfisher.com> Co-committed-by: sfr <sol@solfisher.com>
This commit is contained in:
parent
23b0b01829
commit
15bac1e401
30 changed files with 1082 additions and 32 deletions
|
@ -1,5 +1,5 @@
|
|||
import { each, map, concat, last, get } from 'lodash'
|
||||
import { parseStatus, parseSource, parseUser, parseNotification, parseAttachment, parseLinkHeaderPagination } from '../entity_normalizer/entity_normalizer.service.js'
|
||||
import { parseStatus, parseSource, parseUser, parseNotification, parseReport, parseAttachment, parseLinkHeaderPagination } from '../entity_normalizer/entity_normalizer.service.js'
|
||||
import { RegistrationError, StatusCodeError } from '../errors/errors'
|
||||
|
||||
/* eslint-env browser */
|
||||
|
@ -19,6 +19,9 @@ const ADMIN_USERS_URL = '/api/pleroma/admin/users'
|
|||
const SUGGESTIONS_URL = '/api/v1/suggestions'
|
||||
const NOTIFICATION_SETTINGS_URL = '/api/pleroma/notification_settings'
|
||||
const NOTIFICATION_READ_URL = '/api/v1/pleroma/notifications/read'
|
||||
const ADMIN_REPORTS_URL = '/api/v1/pleroma/admin/reports'
|
||||
const ADMIN_REPORT_NOTES_URL = id => `/api/v1/pleroma/admin/reports/${id}/notes`
|
||||
const ADMIN_REPORT_NOTE_URL = (report, note) => `/api/v1/pleroma/admin/reports/${report}/notes/${note}`
|
||||
|
||||
const MFA_SETTINGS_URL = '/api/pleroma/accounts/mfa'
|
||||
const MFA_BACKUP_CODES_URL = '/api/pleroma/accounts/mfa/backup_codes'
|
||||
|
@ -342,7 +345,7 @@ const fetchUserRelationship = ({ id, credentials }) => {
|
|||
return new Promise((resolve, reject) => response.json()
|
||||
.then((json) => {
|
||||
if (!response.ok) {
|
||||
return reject(new StatusCodeError(response.status, json, { url }, response))
|
||||
return reject(new StatusCodeError(400, json, { url }, response))
|
||||
}
|
||||
return resolve(json)
|
||||
}))
|
||||
|
@ -635,6 +638,57 @@ const deleteUser = ({ credentials, user }) => {
|
|||
})
|
||||
}
|
||||
|
||||
const getReports = ({ state, limit, page, pageSize, credentials }) => {
|
||||
let url = ADMIN_REPORTS_URL
|
||||
const args = [
|
||||
state && `state=${state}`,
|
||||
limit && `limit=${limit}`,
|
||||
page && `page=${page}`,
|
||||
pageSize && `page_size=${pageSize}`
|
||||
].filter(_ => _).join('&')
|
||||
|
||||
url = url + (args ? '?' + args : '')
|
||||
return fetch(url, { headers: authHeaders(credentials) })
|
||||
.then((data) => data.json())
|
||||
.then((data) => data.reports.map(parseReport))
|
||||
}
|
||||
|
||||
const updateReportStates = ({ credentials, reports }) => {
|
||||
// reports syntax: [{ id: int, state: string }...]
|
||||
const updates = {
|
||||
reports: reports.map(report => {
|
||||
return {
|
||||
id: report.id.toString(),
|
||||
state: report.state
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
return promisedRequest({
|
||||
url: ADMIN_REPORTS_URL,
|
||||
method: 'PATCH',
|
||||
payload: updates,
|
||||
credentials
|
||||
})
|
||||
}
|
||||
|
||||
const addNoteToReport = ({ id, note, credentials }) => {
|
||||
return promisedRequest({
|
||||
url: ADMIN_REPORT_NOTES_URL(id),
|
||||
method: 'POST',
|
||||
payload: { content: note },
|
||||
credentials
|
||||
})
|
||||
}
|
||||
|
||||
const deleteNoteFromReport = ({ report, note, credentials }) => {
|
||||
return promisedRequest({
|
||||
url: ADMIN_REPORT_NOTE_URL(report, note),
|
||||
method: 'DELETE',
|
||||
credentials
|
||||
})
|
||||
}
|
||||
|
||||
const fetchTimeline = ({
|
||||
timeline,
|
||||
credentials,
|
||||
|
@ -1726,7 +1780,11 @@ const apiService = {
|
|||
getSettingsProfile,
|
||||
saveSettingsProfile,
|
||||
listSettingsProfiles,
|
||||
deleteSettingsProfile
|
||||
deleteSettingsProfile,
|
||||
getReports,
|
||||
updateReportStates,
|
||||
addNoteToReport,
|
||||
deleteNoteFromReport
|
||||
}
|
||||
|
||||
export default apiService
|
||||
|
|
|
@ -5,6 +5,7 @@ import followRequestFetcher from '../../services/follow_request_fetcher/follow_r
|
|||
import listsFetcher from '../../services/lists_fetcher/lists_fetcher.service.js'
|
||||
import announcementsFetcher from '../../services/announcements_fetcher/announcements_fetcher.service.js'
|
||||
import configFetcher from '../config_fetcher/config_fetcher.service.js'
|
||||
import reportsFetcher from '../reports_fetcher/reports_fetcher.service.js'
|
||||
|
||||
const backendInteractorService = credentials => ({
|
||||
startFetchingTimeline ({ timeline, store, userId = false, listId = false, tag }) {
|
||||
|
@ -39,6 +40,10 @@ const backendInteractorService = credentials => ({
|
|||
return announcementsFetcher.startFetching({ store, credentials })
|
||||
},
|
||||
|
||||
startFetchingReports ({ store, state, limit, page, pageSize }) {
|
||||
return reportsFetcher.startFetching({ store, credentials, state, limit, page, pageSize })
|
||||
},
|
||||
|
||||
startUserSocket ({ store }) {
|
||||
const serv = store.rootState.instance.server.replace('http', 'ws')
|
||||
const url = serv + getMastodonSocketURI({ credentials, stream: 'user' })
|
||||
|
|
|
@ -429,6 +429,24 @@ export const parseNotification = (data) => {
|
|||
return output
|
||||
}
|
||||
|
||||
export const parseReport = (data) => {
|
||||
const report = {}
|
||||
|
||||
report.account = parseUser(data.account)
|
||||
report.actor = parseUser(data.actor)
|
||||
report.statuses = data.statuses.map(parseStatus)
|
||||
report.notes = data.notes.map(note => {
|
||||
note.user = parseUser(note.user)
|
||||
return note
|
||||
})
|
||||
report.state = data.state
|
||||
report.content = data.content
|
||||
report.created_at = data.created_at
|
||||
report.id = data.id
|
||||
|
||||
return report
|
||||
}
|
||||
|
||||
const isNsfw = (status) => {
|
||||
const nsfwRegex = /#nsfw/i
|
||||
return (status.tags || []).includes('nsfw') || !!(status.text || '').match(nsfwRegex)
|
||||
|
|
20
src/services/reports_fetcher/reports_fetcher.service.js
Normal file
20
src/services/reports_fetcher/reports_fetcher.service.js
Normal file
|
@ -0,0 +1,20 @@
|
|||
import apiService from '../api/api.service.js'
|
||||
import { promiseInterval } from '../promise_interval/promise_interval.js'
|
||||
import { forEach } from 'lodash'
|
||||
|
||||
const fetchAndUpdate = ({ store, credentials, state, limit, page, pageSize }) => {
|
||||
return apiService.getReports({ credentials, state, limit, page, pageSize })
|
||||
.then(reports => forEach(reports, report => store.commit('setReport', { report })))
|
||||
}
|
||||
|
||||
const startFetching = ({ store, credentials, state, limit, page, pageSize }) => {
|
||||
const boundFetchAndUpdate = () => fetchAndUpdate({ store, credentials, state, limit, page, pageSize })
|
||||
boundFetchAndUpdate()
|
||||
return promiseInterval(boundFetchAndUpdate, 60000)
|
||||
}
|
||||
|
||||
const reportsFetcher = {
|
||||
startFetching
|
||||
}
|
||||
|
||||
export default reportsFetcher
|
Loading…
Add table
Add a link
Reference in a new issue