diff --git a/server/lib/moderation/channel/storage.ts b/server/lib/moderation/channel/storage.ts index 33eea5ed..a3a798b2 100644 --- a/server/lib/moderation/channel/storage.ts +++ b/server/lib/moderation/channel/storage.ts @@ -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 { + 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 { - 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 { diff --git a/server/lib/routers/api/moderation.ts b/server/lib/routers/api/moderation.ts index 050a16e2..57ddbfde 100644 --- a/server/lib/routers/api/moderation.ts +++ b/server/lib/routers/api/moderation.ts @@ -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) }