forked from bro-students/multy-stub
		
	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('/cats', require('./cats/index')) | ||||
| 
 | ||||
| module.exports = router | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user