Cats backend routes
This commit is contained in:
parent
c77aa76645
commit
0c693e1bac
146
server/routers/epja-2024-1/cats/admin/index.js
Normal file
146
server/routers/epja-2024-1/cats/admin/index.js
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
const adminRouter = require('express').Router();
|
||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
require('dotenv').config();
|
||||||
|
|
||||||
|
const dataFilePath = path.join(__dirname, '../data.json');
|
||||||
|
let data = require('../data.json');
|
||||||
|
|
||||||
|
const verifyToken = (req, res, next) => {
|
||||||
|
const token = req.headers['authorization'];
|
||||||
|
if (token === process.env.TOKEN) {
|
||||||
|
next();
|
||||||
|
} else {
|
||||||
|
res.status(403).send({ 'status': 'Failed', 'data': 'Invalid token' });
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const saveData = (data) => {
|
||||||
|
fs.writeFileSync(dataFilePath, JSON.stringify(data, null, 2), 'utf-8');
|
||||||
|
};
|
||||||
|
|
||||||
|
adminRouter.post('/edit/nickname', verifyToken, (req, res) => {
|
||||||
|
const { name, colored } = req.body;
|
||||||
|
if (!name || !colored) {
|
||||||
|
return res.status(400).send({ 'status': 'Failed', 'data': 'Nickname is required' });
|
||||||
|
}
|
||||||
|
|
||||||
|
data.nickname = { name, colored };
|
||||||
|
saveData(data);
|
||||||
|
|
||||||
|
res.status(200).send({ 'status': 'OK', 'data': 'Nickname updated successfully' });
|
||||||
|
});
|
||||||
|
|
||||||
|
adminRouter.post('/edit/tech-stack', verifyToken, (req, res) => {
|
||||||
|
const { techStack } = req.body;
|
||||||
|
if (!techStack || !Array.isArray(techStack)) {
|
||||||
|
return res.status(400).send({ 'status': 'Failed', 'data': 'Valid tech stack is required' });
|
||||||
|
}
|
||||||
|
|
||||||
|
data.techStack = techStack;
|
||||||
|
saveData(data);
|
||||||
|
|
||||||
|
res.status(200).send({ 'status': 'OK', 'data': 'Tech stack updated successfully' });
|
||||||
|
});
|
||||||
|
|
||||||
|
adminRouter.post('/edit/city', verifyToken, (req, res) => {
|
||||||
|
const { city } = req.body;
|
||||||
|
if (!city) {
|
||||||
|
return res.status(400).send({ 'status': 'Failed', 'data': 'City is required' });
|
||||||
|
}
|
||||||
|
|
||||||
|
const isValid = typeof city === 'object' && 'name' in city && 'href' in city;
|
||||||
|
|
||||||
|
if (!isValid) {
|
||||||
|
return res.status(400).send({ 'status': 'Failed', 'data': 'City must contain href and name' });
|
||||||
|
}
|
||||||
|
|
||||||
|
data.city = city;
|
||||||
|
saveData(data);
|
||||||
|
|
||||||
|
res.status(200).send({ 'status': 'OK', 'data': 'City updated successfully' });
|
||||||
|
});
|
||||||
|
|
||||||
|
adminRouter.post('/edit/github-repo', verifyToken, (req, res) => {
|
||||||
|
const { github } = req.body;
|
||||||
|
if (!github) {
|
||||||
|
return res.status(400).send({ 'status': 'Failed', 'data': 'Github is required' });
|
||||||
|
}
|
||||||
|
|
||||||
|
const isValid = typeof github === 'object' && 'author' in github && 'repo' in github;
|
||||||
|
|
||||||
|
if (!isValid) {
|
||||||
|
return res.status(400).send({ 'status': 'Failed', 'data': 'Github must contain author and repo' });
|
||||||
|
}
|
||||||
|
|
||||||
|
data.githubRepo = github;
|
||||||
|
saveData(data);
|
||||||
|
|
||||||
|
res.status(200).send({ 'status': 'OK', 'data': 'Github updated successfully' });
|
||||||
|
});
|
||||||
|
|
||||||
|
adminRouter.post('/edit/nav-links', verifyToken, (req, res) => {
|
||||||
|
const { navLinks } = req.body;
|
||||||
|
if (!navLinks || !Array.isArray(navLinks)) {
|
||||||
|
return res.status(400).send({ 'status': 'Failed', 'data': 'Valid navLinks are required' });
|
||||||
|
}
|
||||||
|
|
||||||
|
const isValid = navLinks.every(link =>
|
||||||
|
link && typeof link === 'object' && 'href' in link && 'title' in link
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!isValid) {
|
||||||
|
return res.status(400).send({ 'status': 'Failed', 'data': 'Each navLink must contain href and title' });
|
||||||
|
}
|
||||||
|
|
||||||
|
data.navLinks = navLinks;
|
||||||
|
saveData(data);
|
||||||
|
|
||||||
|
res.status(200).send({ 'status': 'OK', 'data': 'Navigation links updated successfully' });
|
||||||
|
});
|
||||||
|
|
||||||
|
adminRouter.post('/edit/links', verifyToken, (req, res) => {
|
||||||
|
const { links } = req.body;
|
||||||
|
if (!links || !Array.isArray(links)) {
|
||||||
|
return res.status(400).send({ 'status': 'Failed', 'data': 'Valid links are required' });
|
||||||
|
}
|
||||||
|
|
||||||
|
const isValid = links.every(link =>
|
||||||
|
link && typeof link === 'object' && 'href' in link && 'title' in link
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!isValid) {
|
||||||
|
return res.status(400).send({ 'status': 'Failed', 'data': 'Each link must contain href and title' });
|
||||||
|
}
|
||||||
|
|
||||||
|
data.links = links;
|
||||||
|
saveData(data);
|
||||||
|
|
||||||
|
res.status(200).send({ 'status': 'OK', 'data': 'Links updated successfully' });
|
||||||
|
});
|
||||||
|
|
||||||
|
adminRouter.post('/edit/projects', verifyToken, (req, res) => {
|
||||||
|
const { projects } = req.body;
|
||||||
|
if (!projects) {
|
||||||
|
return res.status(400).send({ 'status': 'Failed', 'data': 'Projects are required' });
|
||||||
|
}
|
||||||
|
|
||||||
|
const projectFields = ['id', 'title', 'description', 'link', 'techStack', 'image'];
|
||||||
|
|
||||||
|
const isValidProject = (project) => {
|
||||||
|
return projectFields.every(field => field && field in project);
|
||||||
|
}
|
||||||
|
|
||||||
|
const allProjectsValid = projects.every(project => isValidProject(project));
|
||||||
|
|
||||||
|
if (!allProjectsValid) {
|
||||||
|
return res.status(400).send({ 'status': 'Failed', 'data': 'All projects must contain ' + projectFields.join(", ") });
|
||||||
|
}
|
||||||
|
|
||||||
|
data.projects = projects;
|
||||||
|
saveData(data);
|
||||||
|
|
||||||
|
res.status(200).send({ 'status': 'OK', 'data': 'Projects updated successfully' });
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = adminRouter;
|
15
server/routers/epja-2024-1/cats/auth/index.js
Normal file
15
server/routers/epja-2024-1/cats/auth/index.js
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
const authRouter = require('express').Router();
|
||||||
|
require('dotenv').config();
|
||||||
|
|
||||||
|
module.exports = authRouter;
|
||||||
|
|
||||||
|
authRouter.post('/login', (req, res) => {
|
||||||
|
const { email, password } = req.body;
|
||||||
|
console.log(`Login with email=${email} and password=${password}`);
|
||||||
|
|
||||||
|
if (email === 'admin@admin.admin' && password === 'admin') {
|
||||||
|
res.status(200).send({ 'status': 'OK', 'data': `${process.env.TOKEN}` });
|
||||||
|
} else {
|
||||||
|
res.status(401).send({ 'status': 'Failed!', 'data': 'Invalid email or password' });
|
||||||
|
}
|
||||||
|
});
|
118
server/routers/epja-2024-1/cats/data.json
Normal file
118
server/routers/epja-2024-1/cats/data.json
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
{
|
||||||
|
"nickname": {
|
||||||
|
"name": "supercool",
|
||||||
|
"colored": "nickname"
|
||||||
|
},
|
||||||
|
"techStack": [
|
||||||
|
"React",
|
||||||
|
"Next.js",
|
||||||
|
"Svelte",
|
||||||
|
"SvelteKit",
|
||||||
|
"HTML",
|
||||||
|
"CSS",
|
||||||
|
"JavaScript",
|
||||||
|
"TypeScript",
|
||||||
|
"TailwindCSS",
|
||||||
|
"Styled-Components",
|
||||||
|
"Framer-Motion",
|
||||||
|
"shadcn-ui",
|
||||||
|
"Ant-Design",
|
||||||
|
"ESLint",
|
||||||
|
"Prettier",
|
||||||
|
"husky",
|
||||||
|
"lint-staged",
|
||||||
|
"Redux",
|
||||||
|
"RTK Query",
|
||||||
|
"Tanstack Query",
|
||||||
|
"Python",
|
||||||
|
"FastApi",
|
||||||
|
"Flask",
|
||||||
|
"SQLite",
|
||||||
|
"PostgreSQL",
|
||||||
|
"MongoDB",
|
||||||
|
"SQLAlchemy",
|
||||||
|
"Alembic",
|
||||||
|
"PyPy",
|
||||||
|
"poetry",
|
||||||
|
"pylint",
|
||||||
|
"GitHub Actions",
|
||||||
|
"GitLab CI/CD",
|
||||||
|
"Docker",
|
||||||
|
"Git"
|
||||||
|
],
|
||||||
|
"githubRepo": {
|
||||||
|
"author": "MishaBlin",
|
||||||
|
"repo": "EPJA_portfolio_app"
|
||||||
|
},
|
||||||
|
"city": {
|
||||||
|
"name": "Innopolis",
|
||||||
|
"href": "https://ru.wikipedia.org/wiki/Иннополис"
|
||||||
|
},
|
||||||
|
"navLinks": [
|
||||||
|
{
|
||||||
|
"href": "#about",
|
||||||
|
"title": "About"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "#projects",
|
||||||
|
"title": "Projects"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"links": [
|
||||||
|
{
|
||||||
|
"href": "mailto:svyatoslavsvyatkin@yandex.ru",
|
||||||
|
"title": "Mail"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "https://t.me/dmhd6219",
|
||||||
|
"title": "Telegram"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "https://github.com/dmhd6219",
|
||||||
|
"title": "GitHub"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "https://last.fm/user/dmhd",
|
||||||
|
"title": "LastFm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"href": "https://pay.cloudtips.ru/p/02da9349",
|
||||||
|
"title": "Buy me a coffee"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"projects": [
|
||||||
|
{
|
||||||
|
"title": "Elasticsearch",
|
||||||
|
"description": "Elasticsearch is a distributed search and analytics engine, scalable data store and vector database optimized for speed and relevance on production-scale workloads.",
|
||||||
|
"link": "https://github.com/elastic/elasticsearch",
|
||||||
|
"techStack": [
|
||||||
|
"Java",
|
||||||
|
"Groovy"
|
||||||
|
],
|
||||||
|
"image": "https://datascientest.com/en/files/2023/04/Elasticsearch.jpg",
|
||||||
|
"id": "elasticsearch"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "React-native",
|
||||||
|
"description": "React Native brings React's declarative UI framework to iOS and Android. With React Native, you use native UI controls and have full access to the native platform.",
|
||||||
|
"link": "https://github.com/facebook/react-native",
|
||||||
|
"techStack": [
|
||||||
|
"C++",
|
||||||
|
"Javascript",
|
||||||
|
"Kotlin"
|
||||||
|
],
|
||||||
|
"image": "https://www.simplilearn.com/ice9/free_resources_article_thumb/React_Native_Tutorial.jpg",
|
||||||
|
"id": "react-native"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Zarr",
|
||||||
|
"description": "Zarr is a Python package providing an implementation of compressed, chunked, N-dimensional arrays, designed for use in parallel computing. See the documentation for more information.",
|
||||||
|
"link": "https://github.com/zarr-developers/zarr-python",
|
||||||
|
"techStack": [
|
||||||
|
"Python"
|
||||||
|
],
|
||||||
|
"image": "https://raw.githubusercontent.com/zarr-developers/community/main/logos/logo2.png",
|
||||||
|
"id": "zarr"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
11
server/routers/epja-2024-1/cats/index.js
Normal file
11
server/routers/epja-2024-1/cats/index.js
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
const authRouter = require('./auth');
|
||||||
|
const adminRouter = require('./admin');
|
||||||
|
const rootRouter = require('./root');
|
||||||
|
|
||||||
|
const router = require('express').Router();
|
||||||
|
|
||||||
|
module.exports = router;
|
||||||
|
|
||||||
|
router.use(`/auth`, authRouter);
|
||||||
|
router.use(`/admin`, adminRouter);
|
||||||
|
router.use(`/`, rootRouter);
|
45
server/routers/epja-2024-1/cats/root/index.js
Normal file
45
server/routers/epja-2024-1/cats/root/index.js
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
const rootRouter = require('express').Router();
|
||||||
|
require('dotenv').config();
|
||||||
|
const data = require('../data.json');
|
||||||
|
|
||||||
|
rootRouter.get('/get/nickname', (req, res) => {
|
||||||
|
res.status(200).send({ 'status': 'OK', 'data': data.nickname });
|
||||||
|
});
|
||||||
|
|
||||||
|
rootRouter.get('/get/tech-stack', (req, res) => {
|
||||||
|
res.status(200).send({ 'status': 'OK', 'data': data.techStack });
|
||||||
|
});
|
||||||
|
|
||||||
|
rootRouter.get('/get/github-repo', (req, res) => {
|
||||||
|
res.status(200).send({ 'status': 'OK', 'data': data.githubRepo });
|
||||||
|
});
|
||||||
|
|
||||||
|
rootRouter.get('/get/city', (req, res) => {
|
||||||
|
res.status(200).send({ 'status': 'OK', 'data': data.city });
|
||||||
|
});
|
||||||
|
|
||||||
|
rootRouter.get('/get/nav-links', (req, res) => {
|
||||||
|
res.status(200).send({ 'status': 'OK', 'data': data.navLinks });
|
||||||
|
});
|
||||||
|
|
||||||
|
rootRouter.get('/get/links', (req, res) => {
|
||||||
|
res.status(200).send({ 'status': 'OK', 'data': data.links });
|
||||||
|
});
|
||||||
|
|
||||||
|
rootRouter.get('/get/projects', (req, res) => {
|
||||||
|
res.status(200).send({ 'status': 'OK', 'data': data.projects });
|
||||||
|
});
|
||||||
|
|
||||||
|
rootRouter.get('/get/projects/:id', (req, res) => {
|
||||||
|
const { id } = req.params;
|
||||||
|
const project = data.projects.find(p => p.id === id);
|
||||||
|
|
||||||
|
if (project) {
|
||||||
|
res.status(200).send({ status: 'OK', data: project });
|
||||||
|
} else {
|
||||||
|
res.status(404).send({ status: 'NOT_FOUND', message: 'Project not found' });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
module.exports = rootRouter;
|
@ -4,4 +4,6 @@ const router = express.Router()
|
|||||||
|
|
||||||
router.use('/enterfront', require('./enterfront/index'))
|
router.use('/enterfront', require('./enterfront/index'))
|
||||||
|
|
||||||
|
router.use('/cats', require('./cats/index'))
|
||||||
|
|
||||||
module.exports = router
|
module.exports = router
|
||||||
|
Loading…
Reference in New Issue
Block a user