Colubrina/backend/routes/theme.js

122 lines
2.3 KiB
JavaScript

const express = require("express")
const router = express.Router()
const Errors = require("../lib/errors.js")
const auth = require("../lib/authorize.js")
const { User, Theme } = require("../models")
const { Op } = require("sequelize")
router.get("/", auth, async (req, res, next) => {
try {
const themes = await Theme.findAll({
where: {
[Op.or]: [
{
userId: req.user.id
},
{
public: true
}
]
},
include: [
{
model: User,
attributes: ["id", "username"],
as: "user"
}
]
})
res.json(themes)
} catch (e) {
next(e)
}
})
router.post("/", auth, async (req, res, next) => {
try {
if (
!req.body.theme?.name ||
!req.body.theme?.primaryType ||
!req.body.theme?.dark ||
!req.body.theme?.light
) {
throw Errors.invalidParameter("theme", "Theme validation failed.")
}
const theme = await Theme.create({
name: req.body.name,
public: false,
userId: req.user.id,
theme: req.body.theme
})
res.json(theme)
} catch (e) {
next(e)
}
})
router.put("/:id", auth, async (req, res, next) => {
try {
if (
!req.body.theme?.name ||
!req.body.theme?.primaryType ||
!req.body.theme?.dark ||
!req.body.theme?.light
) {
throw Errors.invalidParameter("theme", "Theme validation failed.")
}
const theme = await Theme.findOne({
where: {
id: req.params.id,
userId: req.user.id
}
})
if (!theme) {
throw Errors.invalidParameter("theme", "Theme not found.")
}
await theme.update({
name: req.body.name,
theme: req.body.theme
})
res.json(theme)
} catch (e) {
next(e)
}
})
router.delete("/:id", auth, async (req, res, next) => {
try {
const theme = await Theme.findOne({
where: {
id: req.params.id,
userId: req.user.id
}
})
if (!theme) {
throw Errors.invalidParameter("theme", "Theme not found.")
}
await User.update(
{
themeId: 1
},
{
where: {
themeId: theme.id
}
}
)
await theme.destroy()
res.sendStatus(204)
} catch (e) {
next(e)
}
})
module.exports = router