mirror of
https://github.com/pawelmalak/flame.git
synced 2025-07-18 19:19:36 +02:00
Changed config api. Split config controllers into separate files. Split bookmarks controllers into separate files
This commit is contained in:
parent
76e50624e7
commit
cfb471e578
23 changed files with 579 additions and 602 deletions
|
@ -1,8 +1,8 @@
|
|||
const App = require('../../models/App');
|
||||
const App = require('../../../models/App');
|
||||
const axios = require('axios');
|
||||
const Logger = require('../../utils/Logger');
|
||||
const Logger = require('../../../utils/Logger');
|
||||
const logger = new Logger();
|
||||
const loadConfig = require('../../utils/loadConfig');
|
||||
const loadConfig = require('../../../utils/loadConfig');
|
||||
|
||||
const useDocker = async (apps) => {
|
||||
const {
|
||||
|
@ -50,7 +50,7 @@ const useDocker = async (apps) => {
|
|||
for (const container of containers) {
|
||||
let labels = container.Labels;
|
||||
|
||||
// todo
|
||||
// Traefik labels for URL configuration
|
||||
if (!('flame.url' in labels)) {
|
||||
for (const label of Object.keys(labels)) {
|
||||
if (/^traefik.*.frontend.rule/.test(label)) {
|
||||
|
|
|
@ -1,112 +0,0 @@
|
|||
const asyncWrapper = require('../middleware/asyncWrapper');
|
||||
const ErrorResponse = require('../utils/ErrorResponse');
|
||||
const Bookmark = require('../models/Bookmark');
|
||||
const { Sequelize } = require('sequelize');
|
||||
|
||||
// @desc Create new bookmark
|
||||
// @route POST /api/bookmarks
|
||||
// @access Public
|
||||
exports.createBookmark = asyncWrapper(async (req, res, next) => {
|
||||
let bookmark;
|
||||
|
||||
let _body = {
|
||||
...req.body,
|
||||
categoryId: parseInt(req.body.categoryId),
|
||||
};
|
||||
|
||||
if (req.file) {
|
||||
_body.icon = req.file.filename;
|
||||
}
|
||||
|
||||
bookmark = await Bookmark.create(_body);
|
||||
|
||||
res.status(201).json({
|
||||
success: true,
|
||||
data: bookmark,
|
||||
});
|
||||
});
|
||||
|
||||
// @desc Get all bookmarks
|
||||
// @route GET /api/bookmarks
|
||||
// @access Public
|
||||
exports.getBookmarks = asyncWrapper(async (req, res, next) => {
|
||||
const bookmarks = await Bookmark.findAll({
|
||||
order: [[Sequelize.fn('lower', Sequelize.col('name')), 'ASC']],
|
||||
});
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
data: bookmarks,
|
||||
});
|
||||
});
|
||||
|
||||
// @desc Get single bookmark
|
||||
// @route GET /api/bookmarks/:id
|
||||
// @access Public
|
||||
exports.getBookmark = asyncWrapper(async (req, res, next) => {
|
||||
const bookmark = await Bookmark.findOne({
|
||||
where: { id: req.params.id },
|
||||
});
|
||||
|
||||
if (!bookmark) {
|
||||
return next(
|
||||
new ErrorResponse(
|
||||
`Bookmark with id of ${req.params.id} was not found`,
|
||||
404
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
data: bookmark,
|
||||
});
|
||||
});
|
||||
|
||||
// @desc Update bookmark
|
||||
// @route PUT /api/bookmarks/:id
|
||||
// @access Public
|
||||
exports.updateBookmark = asyncWrapper(async (req, res, next) => {
|
||||
let bookmark = await Bookmark.findOne({
|
||||
where: { id: req.params.id },
|
||||
});
|
||||
|
||||
if (!bookmark) {
|
||||
return next(
|
||||
new ErrorResponse(
|
||||
`Bookmark with id of ${req.params.id} was not found`,
|
||||
404
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
let _body = {
|
||||
...req.body,
|
||||
categoryId: parseInt(req.body.categoryId),
|
||||
};
|
||||
|
||||
if (req.file) {
|
||||
_body.icon = req.file.filename;
|
||||
}
|
||||
|
||||
bookmark = await bookmark.update(_body);
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
data: bookmark,
|
||||
});
|
||||
});
|
||||
|
||||
// @desc Delete bookmark
|
||||
// @route DELETE /api/bookmarks/:id
|
||||
// @access Public
|
||||
exports.deleteBookmark = asyncWrapper(async (req, res, next) => {
|
||||
await Bookmark.destroy({
|
||||
where: { id: req.params.id },
|
||||
});
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
data: {},
|
||||
});
|
||||
});
|
27
controllers/bookmarks/createBookmark.js
Normal file
27
controllers/bookmarks/createBookmark.js
Normal file
|
@ -0,0 +1,27 @@
|
|||
const asyncWrapper = require('../../middleware/asyncWrapper');
|
||||
const Bookmark = require('../../models/Bookmark');
|
||||
|
||||
// @desc Create new bookmark
|
||||
// @route POST /api/bookmarks
|
||||
// @access Public
|
||||
const createBookmark = asyncWrapper(async (req, res, next) => {
|
||||
let bookmark;
|
||||
|
||||
let _body = {
|
||||
...req.body,
|
||||
categoryId: parseInt(req.body.categoryId),
|
||||
};
|
||||
|
||||
if (req.file) {
|
||||
_body.icon = req.file.filename;
|
||||
}
|
||||
|
||||
bookmark = await Bookmark.create(_body);
|
||||
|
||||
res.status(201).json({
|
||||
success: true,
|
||||
data: bookmark,
|
||||
});
|
||||
});
|
||||
|
||||
module.exports = createBookmark;
|
18
controllers/bookmarks/deleteBookmark.js
Normal file
18
controllers/bookmarks/deleteBookmark.js
Normal file
|
@ -0,0 +1,18 @@
|
|||
const asyncWrapper = require('../../middleware/asyncWrapper');
|
||||
const Bookmark = require('../../models/Bookmark');
|
||||
|
||||
// @desc Delete bookmark
|
||||
// @route DELETE /api/bookmarks/:id
|
||||
// @access Public
|
||||
const deleteBookmark = asyncWrapper(async (req, res, next) => {
|
||||
await Bookmark.destroy({
|
||||
where: { id: req.params.id },
|
||||
});
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
data: {},
|
||||
});
|
||||
});
|
||||
|
||||
module.exports = deleteBookmark;
|
19
controllers/bookmarks/getAllBookmarks.js
Normal file
19
controllers/bookmarks/getAllBookmarks.js
Normal file
|
@ -0,0 +1,19 @@
|
|||
const asyncWrapper = require('../../middleware/asyncWrapper');
|
||||
const Bookmark = require('../../models/Bookmark');
|
||||
const { Sequelize } = require('sequelize');
|
||||
|
||||
// @desc Get all bookmarks
|
||||
// @route GET /api/bookmarks
|
||||
// @access Public
|
||||
const getAllBookmarks = asyncWrapper(async (req, res, next) => {
|
||||
const bookmarks = await Bookmark.findAll({
|
||||
order: [[Sequelize.fn('lower', Sequelize.col('name')), 'ASC']],
|
||||
});
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
data: bookmarks,
|
||||
});
|
||||
});
|
||||
|
||||
module.exports = getAllBookmarks;
|
28
controllers/bookmarks/getSingleBookmark.js
Normal file
28
controllers/bookmarks/getSingleBookmark.js
Normal file
|
@ -0,0 +1,28 @@
|
|||
const asyncWrapper = require('../../middleware/asyncWrapper');
|
||||
const ErrorResponse = require('../../utils/ErrorResponse');
|
||||
const Bookmark = require('../../models/Bookmark');
|
||||
|
||||
// @desc Get single bookmark
|
||||
// @route GET /api/bookmarks/:id
|
||||
// @access Public
|
||||
const getSingleBookmark = asyncWrapper(async (req, res, next) => {
|
||||
const bookmark = await Bookmark.findOne({
|
||||
where: { id: req.params.id },
|
||||
});
|
||||
|
||||
if (!bookmark) {
|
||||
return next(
|
||||
new ErrorResponse(
|
||||
`Bookmark with the id of ${req.params.id} was not found`,
|
||||
404
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
data: bookmark,
|
||||
});
|
||||
});
|
||||
|
||||
module.exports = getSingleBookmark;
|
7
controllers/bookmarks/index.js
Normal file
7
controllers/bookmarks/index.js
Normal file
|
@ -0,0 +1,7 @@
|
|||
module.exports = {
|
||||
createBookmark: require('./createBookmark'),
|
||||
getAllBookmarks: require('./getAllBookmarks'),
|
||||
getSingleBookmark: require('./getSingleBookmark'),
|
||||
updateBookmark: require('./updateBookmark'),
|
||||
deleteBookmark: require('./deleteBookmark'),
|
||||
};
|
39
controllers/bookmarks/updateBookmark.js
Normal file
39
controllers/bookmarks/updateBookmark.js
Normal file
|
@ -0,0 +1,39 @@
|
|||
const asyncWrapper = require('../../middleware/asyncWrapper');
|
||||
const ErrorResponse = require('../../utils/ErrorResponse');
|
||||
const Bookmark = require('../../models/Bookmark');
|
||||
|
||||
// @desc Update bookmark
|
||||
// @route PUT /api/bookmarks/:id
|
||||
// @access Public
|
||||
const updateBookmark = asyncWrapper(async (req, res, next) => {
|
||||
let bookmark = await Bookmark.findOne({
|
||||
where: { id: req.params.id },
|
||||
});
|
||||
|
||||
if (!bookmark) {
|
||||
return next(
|
||||
new ErrorResponse(
|
||||
`Bookmark with id of ${req.params.id} was not found`,
|
||||
404
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
let _body = {
|
||||
...req.body,
|
||||
categoryId: parseInt(req.body.categoryId),
|
||||
};
|
||||
|
||||
if (req.file) {
|
||||
_body.icon = req.file.filename;
|
||||
}
|
||||
|
||||
bookmark = await bookmark.update(_body);
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
data: bookmark,
|
||||
});
|
||||
});
|
||||
|
||||
module.exports = updateBookmark;
|
|
@ -4,15 +4,13 @@ const Category = require('../models/Category');
|
|||
const Bookmark = require('../models/Bookmark');
|
||||
const Config = require('../models/Config');
|
||||
const { Sequelize } = require('sequelize');
|
||||
const loadConfig = require('../utils/loadConfig');
|
||||
|
||||
// @desc Create new category
|
||||
// @route POST /api/categories
|
||||
// @access Public
|
||||
exports.createCategory = asyncWrapper(async (req, res, next) => {
|
||||
// Get config from database
|
||||
const pinCategories = await Config.findOne({
|
||||
where: { key: 'pinCategoriesByDefault' },
|
||||
});
|
||||
const { pinCategoriesByDefault: pinCategories } = await loadConfig();
|
||||
|
||||
let category;
|
||||
|
||||
|
@ -37,12 +35,8 @@ exports.createCategory = asyncWrapper(async (req, res, next) => {
|
|||
// @route GET /api/categories
|
||||
// @access Public
|
||||
exports.getCategories = asyncWrapper(async (req, res, next) => {
|
||||
// Get config from database
|
||||
const useOrdering = await Config.findOne({
|
||||
where: { key: 'useOrdering' },
|
||||
});
|
||||
const { useOrdering: orderType } = await loadConfig();
|
||||
|
||||
const orderType = useOrdering ? useOrdering.value : 'createdAt';
|
||||
let categories;
|
||||
|
||||
if (orderType == 'name') {
|
||||
|
|
|
@ -1,177 +0,0 @@
|
|||
const asyncWrapper = require('../middleware/asyncWrapper');
|
||||
const ErrorResponse = require('../utils/ErrorResponse');
|
||||
const Config = require('../models/Config');
|
||||
const { Op } = require('sequelize');
|
||||
const File = require('../utils/File');
|
||||
const { join } = require('path');
|
||||
const fs = require('fs');
|
||||
|
||||
// @desc Insert new key:value pair
|
||||
// @route POST /api/config
|
||||
// @access Public
|
||||
exports.createPair = asyncWrapper(async (req, res, next) => {
|
||||
const pair = await Config.create(req.body);
|
||||
|
||||
res.status(201).json({
|
||||
success: true,
|
||||
data: pair,
|
||||
});
|
||||
});
|
||||
|
||||
// @desc Get all key:value pairs
|
||||
// @route GET /api/config
|
||||
// @route GET /api/config?keys=foo,bar,baz
|
||||
// @access Public
|
||||
exports.getAllPairs = asyncWrapper(async (req, res, next) => {
|
||||
let pairs;
|
||||
|
||||
if (req.query.keys) {
|
||||
// Check for specific keys to get in a single query
|
||||
const keys = req.query.keys.split(',').map((key) => {
|
||||
return { key };
|
||||
});
|
||||
|
||||
pairs = await Config.findAll({
|
||||
where: {
|
||||
[Op.or]: keys,
|
||||
},
|
||||
});
|
||||
} else {
|
||||
// Else get all
|
||||
pairs = await Config.findAll();
|
||||
}
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
data: pairs,
|
||||
});
|
||||
});
|
||||
|
||||
// @desc Get single key:value pair
|
||||
// @route GET /api/config/:key
|
||||
// @access Public
|
||||
exports.getSinglePair = asyncWrapper(async (req, res, next) => {
|
||||
const pair = await Config.findOne({
|
||||
where: { key: req.params.key },
|
||||
});
|
||||
|
||||
if (!pair) {
|
||||
return next(new ErrorResponse(`Key ${req.params.key} was not found`, 404));
|
||||
}
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
data: pair,
|
||||
});
|
||||
});
|
||||
|
||||
// @desc Update value
|
||||
// @route PUT /api/config/:key
|
||||
// @access Public
|
||||
exports.updateValue = asyncWrapper(async (req, res, next) => {
|
||||
let pair = await Config.findOne({
|
||||
where: { key: req.params.key },
|
||||
});
|
||||
|
||||
if (!pair) {
|
||||
return next(new ErrorResponse(`Key ${req.params.key} was not found`, 404));
|
||||
}
|
||||
|
||||
if (pair.isLocked) {
|
||||
return next(
|
||||
new ErrorResponse(
|
||||
`Value of key ${req.params.key} is locked and can not be changed`,
|
||||
400
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
pair = await pair.update({ ...req.body });
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
data: pair,
|
||||
});
|
||||
});
|
||||
|
||||
// @desc Update multiple values
|
||||
// @route PUT /api/config/
|
||||
// @access Public
|
||||
exports.updateValues = asyncWrapper(async (req, res, next) => {
|
||||
Object.entries(req.body).forEach(async ([key, value]) => {
|
||||
await Config.update(
|
||||
{ value },
|
||||
{
|
||||
where: { key },
|
||||
}
|
||||
);
|
||||
});
|
||||
|
||||
const config = await Config.findAll();
|
||||
|
||||
res.status(200).send({
|
||||
success: true,
|
||||
data: config,
|
||||
});
|
||||
});
|
||||
|
||||
// @desc Delete key:value pair
|
||||
// @route DELETE /api/config/:key
|
||||
// @access Public
|
||||
exports.deletePair = asyncWrapper(async (req, res, next) => {
|
||||
const pair = await Config.findOne({
|
||||
where: { key: req.params.key },
|
||||
});
|
||||
|
||||
if (!pair) {
|
||||
return next(new ErrorResponse(`Key ${req.params.key} was not found`, 404));
|
||||
}
|
||||
|
||||
if (pair.isLocked) {
|
||||
return next(
|
||||
new ErrorResponse(
|
||||
`Value of key ${req.params.key} is locked and can not be deleted`,
|
||||
400
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
await pair.destroy();
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
data: {},
|
||||
});
|
||||
});
|
||||
|
||||
// @desc Get custom CSS file
|
||||
// @route GET /api/config/0/css
|
||||
// @access Public
|
||||
exports.getCss = asyncWrapper(async (req, res, next) => {
|
||||
const file = new File(join(__dirname, '../public/flame.css'));
|
||||
const content = file.read();
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
data: content,
|
||||
});
|
||||
});
|
||||
|
||||
// @desc Update custom CSS file
|
||||
// @route PUT /api/config/0/css
|
||||
// @access Public
|
||||
exports.updateCss = asyncWrapper(async (req, res, next) => {
|
||||
const file = new File(join(__dirname, '../public/flame.css'));
|
||||
file.write(req.body.styles, false);
|
||||
|
||||
// Copy file to docker volume
|
||||
fs.copyFileSync(
|
||||
join(__dirname, '../public/flame.css'),
|
||||
join(__dirname, '../data/flame.css')
|
||||
);
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
data: {},
|
||||
});
|
||||
});
|
18
controllers/config/getCSS.js
Normal file
18
controllers/config/getCSS.js
Normal file
|
@ -0,0 +1,18 @@
|
|||
const asyncWrapper = require('../../middleware/asyncWrapper');
|
||||
const File = require('../../utils/File');
|
||||
const { join } = require('path');
|
||||
|
||||
// @desc Get custom CSS file
|
||||
// @route GET /api/config/0/css
|
||||
// @access Public
|
||||
const getCSS = asyncWrapper(async (req, res, next) => {
|
||||
const file = new File(join(__dirname, '../../public/flame.css'));
|
||||
const content = file.read();
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
data: content,
|
||||
});
|
||||
});
|
||||
|
||||
module.exports = getCSS;
|
16
controllers/config/getConfig.js
Normal file
16
controllers/config/getConfig.js
Normal file
|
@ -0,0 +1,16 @@
|
|||
const asyncWrapper = require('../../middleware/asyncWrapper');
|
||||
const loadConfig = require('../../utils/loadConfig');
|
||||
|
||||
// @desc Get config
|
||||
// @route GET /api/config
|
||||
// @access Public
|
||||
const getConfig = asyncWrapper(async (req, res, next) => {
|
||||
const config = await loadConfig();
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
data: config,
|
||||
});
|
||||
});
|
||||
|
||||
module.exports = getConfig;
|
6
controllers/config/index.js
Normal file
6
controllers/config/index.js
Normal file
|
@ -0,0 +1,6 @@
|
|||
module.exports = {
|
||||
getCSS: require('./getCSS'),
|
||||
updateCSS: require('./updateCSS'),
|
||||
getConfig: require('./getConfig'),
|
||||
updateConfig: require('./updateConfig'),
|
||||
};
|
24
controllers/config/updateCSS.js
Normal file
24
controllers/config/updateCSS.js
Normal file
|
@ -0,0 +1,24 @@
|
|||
const asyncWrapper = require('../../middleware/asyncWrapper');
|
||||
const File = require('../../utils/File');
|
||||
const { join } = require('path');
|
||||
|
||||
// @desc Update custom CSS file
|
||||
// @route PUT /api/config/0/css
|
||||
// @access Public
|
||||
const updateCSS = asyncWrapper(async (req, res, next) => {
|
||||
const file = new File(join(__dirname, '../../public/flame.css'));
|
||||
file.write(req.body.styles, false);
|
||||
|
||||
// Copy file to docker volume
|
||||
fs.copyFileSync(
|
||||
join(__dirname, '../../public/flame.css'),
|
||||
join(__dirname, '../../data/flame.css')
|
||||
);
|
||||
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
data: {},
|
||||
});
|
||||
});
|
||||
|
||||
module.exports = updateCSS;
|
24
controllers/config/updateConfig.js
Normal file
24
controllers/config/updateConfig.js
Normal file
|
@ -0,0 +1,24 @@
|
|||
const asyncWrapper = require('../../middleware/asyncWrapper');
|
||||
const loadConfig = require('../../utils/loadConfig');
|
||||
const { writeFile } = require('fs/promises');
|
||||
|
||||
// @desc Update config
|
||||
// @route PUT /api/config/
|
||||
// @access Public
|
||||
const updateConfig = asyncWrapper(async (req, res, next) => {
|
||||
const existingConfig = await loadConfig();
|
||||
|
||||
const newConfig = {
|
||||
...existingConfig,
|
||||
...req.body,
|
||||
};
|
||||
|
||||
await writeFile('data/config.json', JSON.stringify(newConfig));
|
||||
|
||||
res.status(200).send({
|
||||
success: true,
|
||||
data: newConfig,
|
||||
});
|
||||
});
|
||||
|
||||
module.exports = updateConfig;
|
Loading…
Add table
Add a link
Reference in a new issue