jschan - Anonymous imageboard software. Classic look, modern features and feel. Works without JavaScript and supports Tor, I2P, Lokinet, etc.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

67 lines
1.6 KiB

'use strict';
const { Boards, Accounts } = require(__dirname+'/../../db/')
, dynamicResponse = require(__dirname+'/../../helpers/dynamic.js')
, uploadDirectory = require(__dirname+'/../../helpers/files/uploadDirectory.js')
, restrictedURIs = new Set(['captcha', 'forms', 'randombanner', 'all'])
, { ensureDir } = require('fs-extra')
, { boardDefaults } = require(__dirname+'/../../configs/main.js');
module.exports = async (req, res, next) => {
const { name, description } = req.body
, uri = req.body.uri.toLowerCase()
, tags = req.body.tags.split('\n').filter(n => n)
, owner = req.session.user.username;
if (restrictedURIs.has(uri)) {
return dynamicResponse(req, res, 400, 'message', {
'title': 'Bad Request',
'message': 'That URI is not available for board creation',
'redirect': '/create.html'
});
}
const board = await Boards.findOne(uri);
// if board exists reject
if (board != null) {
return dynamicResponse(req, res, 409, 'message', {
'title': 'Conflict',
'message': 'Board with this URI already exists',
'redirect': '/create.html'
});
}
//todo: add a settings for defaults
const newBoard = {
'_id': uri,
owner,
'banners': [],
'sequence_value': 1,
'pph': 0,
'ips': 0,
'lastPostTimestamp': null,
'settings': {
name,
description,
tags,
'moderators': [],
...boardDefaults
}
}
await Promise.all([
Boards.insertOne(newBoard),
Accounts.addOwnedBoard(owner, uri),
ensureDir(`${uploadDirectory}/html/${uri}`),
ensureDir(`${uploadDirectory}/json/${uri}`),
ensureDir(`${uploadDirectory}/banners/${uri}`)
]);
return res.redirect(`/${uri}/index.html`);
}