Moderation configuration screen: store options.

This commit is contained in:
John Livingston 2023-08-09 16:39:12 +02:00
parent 0987a036a0
commit 7e89e430d0
No known key found for this signature in database
GPG Key ID: B17B5640CE66CDBC
2 changed files with 71 additions and 10 deletions

View File

@ -1,25 +1,85 @@
import type { RegisterServerOptions } from '@peertube/peertube-types'
import type { ChannelModeration, ChannelInfos } from '../../../../shared/lib/types'
import { sanitizeChannelModerationOptions } from '../../moderation/channel/sanitize'
import * as fs from 'fs'
import * as path from 'path'
/**
* Get saved moderation options for the given channel.
* Can throw an exception.
* @param options Peertube server options
* @param channelInfos Info from channel from which we want to get infos
* @returns Channel moderation data
*/
async function getChannelModerationOptions (
options: RegisterServerOptions,
channelInfos: ChannelInfos
): Promise<ChannelModeration> {
const logger = options.peertubeHelpers.logger
const filePath = _getFilePath(options, channelInfos)
if (!fs.existsSync(filePath)) {
logger.debug('No stored data for channel, returning default values')
return {
channel: channelInfos,
moderation: {
bot: false,
bannedJIDs: [],
forbiddenWords: []
}
}
}
const content = await fs.promises.readFile(filePath, {
encoding: 'utf-8'
})
const sanitized = await sanitizeChannelModerationOptions(options, channelInfos, JSON.parse(content))
return {
channel: channelInfos,
moderation: {
bot: false,
bannedJIDs: [],
forbiddenWords: []
}
moderation: sanitized
}
}
/**
* Save channel moderation options.
* Can throw an exception.
* @param _options Peertube server options
* @param _channelModeration data to save
*/
async function storeChannelModerationOptions (
_options: RegisterServerOptions,
_channelModeration: ChannelModeration
options: RegisterServerOptions,
channelModeration: ChannelModeration
): Promise<void> {
throw new Error('Not implemented yet')
const channelInfos = channelModeration.channel
const filePath = _getFilePath(options, channelInfos)
if (!fs.existsSync(filePath)) {
const dir = path.dirname(filePath)
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir, { recursive: true })
}
}
const jsonContent = JSON.stringify(channelModeration.moderation)
await fs.promises.writeFile(filePath, jsonContent, {
encoding: 'utf-8'
})
}
function _getFilePath (
options: RegisterServerOptions,
channelInfos: ChannelInfos
): string {
const channelId = channelInfos.id
// some sanitization, just in case...
if (!/^\d+$/.test(channelId.toString())) {
throw new Error(`Invalid channelId: ${channelId}`)
}
return path.resolve(
options.peertubeHelpers.plugin.getDataDirectoryPath(),
'channelModerationOptions',
channelId.toString() + '.json'
)
}
export {

View File

@ -47,10 +47,11 @@ async function initModerationApiRouter (options: RegisterServerOptions): Promise
}
logger.debug('Data seems ok, storing them.')
const result = await storeChannelModerationOptions(options, {
const result = {
channel: channelInfos,
moderation
})
}
await storeChannelModerationOptions(options, result)
res.status(200)
res.json(result)
}