Compare commits

...

19 Commits

Author SHA1 Message Date
c000106ec8 Merge pull request '[feat] add chgk api' (#71) from sber_web into master
Reviewed-on: #71
2025-01-31 13:43:18 +03:00
Max
da84344a63 [feat] add chgk api 2025-01-31 13:35:11 +03:00
ff15a48414 Merge pull request '[feat][refactor] add events and edit users' (#70) from sberhubproject into master
Reviewed-on: #70
2025-01-29 21:25:59 +03:00
367c0de6fb [feat][refactor] add events and edit users 2025-01-29 15:50:53 +03:00
3c89d8b9a8 Merge pull request 'feat: add get master with orders' (#68) from feat/get-master into master
Reviewed-on: #68
2025-01-26 11:02:24 +03:00
bdc8d9a8e0 feat: add get master with orders
Some checks failed
platform/multy-stub/pipeline/head There was a failure building this commit
2025-01-26 00:41:48 +03:00
8814c2a64b Merge pull request 'kazan-explore multy stub changes' (#67) from kazan-explore into master
Reviewed-on: #67
2025-01-24 23:02:53 +03:00
298a82e0ae kazan-explore multy stub changes 2025-01-24 23:02:25 +03:00
a86eb0d4ef Merge pull request 'kazan-explore multy stub changes' (#66) from kazan-explore into master
Reviewed-on: #66
2025-01-24 22:42:50 +03:00
335179ad26 kazan-explore multy stub changes 2025-01-24 22:39:25 +03:00
a1d331b5b4 Merge pull request 'esc stubs fix2' (#65) from esc-stubs into master
Reviewed-on: #65
2025-01-24 16:54:00 +03:00
4b77958a92 esc stubs fix2
Some checks failed
platform/multy-stub/pipeline/head There was a failure building this commit
2025-01-24 16:52:46 +03:00
b36ee36e3a Merge pull request 'esc stubs fix?' (#64) from esc-stubs into master
Reviewed-on: #64
2025-01-24 16:44:45 +03:00
48ffee1a78 esc stubs fix? 2025-01-24 16:42:42 +03:00
6e0934e585 Merge pull request 'esc stubs' (#63) from esc-stubs into master
Reviewed-on: #63
2025-01-24 16:31:13 +03:00
846db377ef esc stubs 2025-01-24 15:00:11 +03:00
Primakov Alexandr Alexandrovich
3e8a8997b9 1.2.0 2025-01-19 22:47:53 +03:00
Primakov Alexandr Alexandrovich
04bce4b90f todo-app: patch & delete tidi item 2025-01-19 22:47:47 +03:00
Primakov Alexandr Alexandrovich
3d935af6f1 fix get comments to unknown user 2025-01-19 22:35:22 +03:00
22 changed files with 1374 additions and 377 deletions

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "multi-stub",
"version": "1.1.2",
"version": "1.2.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "multi-stub",
"version": "1.1.2",
"version": "1.2.0",
"license": "MIT",
"dependencies": {
"axios": "^1.7.9",

View File

@@ -1,6 +1,6 @@
{
"name": "multi-stub",
"version": "1.1.2",
"version": "1.2.0",
"description": "",
"main": "index.js",
"scripts": {

View File

@@ -88,7 +88,7 @@ app.use("/dry-wash", require("./routers/dry-wash"))
app.use("/freetracker", require("./routers/freetracker"))
app.use("/dhs-testing", require("./routers/dhs-testing"))
app.use("/gamehub", require("./routers/gamehub"))
app.use("/esc", require("./routers/esc"))
app.use(require("./error"))

View File

@@ -1,16 +1,40 @@
const router = require('express').Router()
const {MasterModel} = require('./model/master')
const mongoose = require("mongoose")
const {OrderModel} = require("./model/order")
router.get('/masters', async (req, res,next) => {
router.get("/masters", async (req, res, next) => {
try {
const master = await MasterModel.find({})
res.status(200).send({success: true, body: master})
const masters = await MasterModel.find({});
const orders = await OrderModel.find({});
const mastersWithOrders = masters.map((master) => {
const masterOrders = orders.filter((order) => {
return (
order?.master && order.master.toString() === master._id.toString()
);
});
const schedule = masterOrders.map((order) => ({
id: order._id,
startWashTime: order.startWashTime,
endWashTime: order.endWashTime,
}));
return {
id: master._id,
name: master.name,
schedule: schedule,
phone: master.phone,
};
});
res.status(200).send({ success: true, body: mastersWithOrders });
} catch (error) {
next(error)
next(error);
}
})
});
router.delete('/masters/:id', async (req, res,next) => {
const { id } = req.params;

View File

@@ -0,0 +1,12 @@
const router = require("express").Router();
router.get('/game-links', (request, response) => {
response.send(require('./json/game-links/success.json'))
})
router.get('/4u2k-links', (request, response) => {
response.send(require('./json/4u2k-links/success.json'))
})
;
module.exports = router;

View File

@@ -0,0 +1,31 @@
{
"data":[
{
"type": "video",
"links": {
"l1": "https://www.youtube.com/embed/DsQMLrPdLf8?si=l9X57nHqaSYlxDFf",
"l2": "https://www.youtube.com/embed/Dk8AAU_UdVk?si=N8NdYMUCfawdsJGE",
"l3": "https://www.youtube.com/embed/HKfDfWrCwEA?si=qPugjiKR8V9eZ-yG",
"l4": "https://www.youtube.com/embed/tD-6xHAHrQ4?si=ZFe41gSK8d5gqahW"
}
},
{
"type": "podcast",
"links": {
"l1": "https://www.youtube.com/embed/RtVs87Nd1MQ?si=i4giUCtbp4Ouqv2W",
"l2": "https://www.youtube.com/embed/DfTU5LA_kw8?si=m7fI5Ie9yIGDFCrU",
"l3": "https://www.youtube.com/embed/Sp-1fX1Q15I?si=xyealVly9IBMW7Xi",
"l4": "https://www.youtube.com/embed/rLYFJYfluRs?si=MjW1beQ-Q9-TAehF"
}
},
{
"type": "entertainment",
"links": {
"l1": "https://www.youtube.com/embed/DiuuglRCchQ?si=8wTVXKbV-mbHuSjW",
"l2": "https://www.youtube.com/embed/zmZcIX5PEyo?si=Hbrv32kl0fqcmtV9",
"l3": "https://www.youtube.com/embed/Te-TZUjmzFQ?si=fNG16eruoFEY2KNq",
"l4": "https://www.youtube.com/embed/si-MQ5qg3zE?si=67mfO6gV80n1ULqo"
}
}
]
}

View File

@@ -0,0 +1,20 @@
{
"data":[
{
"title": "ABC",
"description": "Мой брат Колян сбацал про меня байку на англицком и несколько фишек кинул для шухера. Англицкий ты вроде знаешь, впряжешься за меня, а?",
"link": "https://www.oxfordonlineenglish.com/english-level-test/reading"
},
{
"title": "Алё, меня слышно?",
"description": "Мой кент на мобилу текст записал с иностранкой. Понимаешь, о чём тут говорят?",
"link": "https://test-english.com/listening/"
},
{
"title": "Анонимное тестирование",
"description": "Ты язык-то нормально знаешь? Проверься, никто угарать не будет",
"link": "https://www.ego4u.com/en/cram-up/tests"
}
]
}

View File

@@ -0,0 +1,3 @@
exports.KAZAN_EXPLORE_RESULTS_MODEL_NAME = 'KAZAN_EXPLORE_RESULTS'
exports.TOKEN_KEY = "KAZAN_EXPLORE_TOP_SECRET_TOKEN_KEY"

View File

@@ -1,211 +1,250 @@
const router = require('express').Router();
// First page
router.get('/getInfoAboutKazan', (request, response) => {
const lang = request.query.lang || 'ru'; // Получаем язык из параметров запроса
try {
const data = require('./json/first/info-about-kazan/success.json'); // Загружаем весь JSON
const translatedData = data[lang] || data['ru']; // Выбираем перевод по языку или дефолтный
response.send(translatedData); // Отправляем перевод клиенту
} catch (error) {
response.status(500).send({ message: 'Internal server error' }); // Ошибка в случае проблем с JSON
}
});
router.get('/getNews', (request, response) => {
const lang = request.query.lang || 'ru';
try {
const data = require(`./json/first/news/${lang}/success.json`);
response.send(data);
} catch (error) {
response.status(404).send({ message: 'Language not found' });
}
})
// Sport page
router.get('/getFirstText', (request, response) => {
const lang = request.query.lang || 'ru'; // Получаем язык из параметров
try {
const data = require('./json/sport/first-text/success.json'); // Загружаем JSON
const translatedData = data[lang] || data['ru']; // Берём перевод или дефолтный
response.send(translatedData);
} catch (error) {
response.status(404).send({ message: 'Language not found' }); // Обработка ошибки
}
});
router.get('/getSecondText', (request, response) => {
const lang = request.query.lang || 'ru';
try {
const data = require('./json/sport/second-text/success.json');
const translatedData = data[lang] || data['ru'];
response.send(translatedData);
} catch (error) {
response.status(404).send({ message: 'Language not found' });
}
});
router.get('/getSportData', (request, response) => {
const lang = request.query.lang || 'ru';
try {
const data = require(`./json/sport/sport-list/${lang}/success.json`);
response.send(data);
} catch (error) {
response.status(404).send({ message: 'Language not found' });
}
})
router.get('/getSportQuiz', (request, response) => {
const lang = request.query.lang || 'ru';
try {
const data = require(`./json/sport/quiz/${lang}/success.json`);
response.send(data);
} catch (error) {
response.status(404).send({ message: 'Language not found' });
}
})
// Places page
router.get('/getPlacesData', (request, response) => {
const lang = request.query.lang || 'ru';
try {
const data = require(`./json/places/${lang}/success.json`);
response.send(data);
} catch (error) {
response.status(404).send({ message: 'Language not found' });
}
})
// Transport page
router.get('/getInfoAboutTransportPage', (request, response) => {
const lang = request.query.lang || 'ru';
try {
const data = require('./json/transport/info-about-page/success.json');
const translatedData = data[lang] || data['ru'];
response.send(translatedData);
} catch (error) {
response.status(404).send({ message: 'Language not found' });
}
})
router.get('/getBus', (request, response) => {
response.send(require('./json/transport/bus-numbers/success.json'))
})
router.get('/getTral', (request, response) => {
response.send(require('./json/transport/tral-numbers/success.json'))
})
router.get('/getEvents', (request, response) => {
response.send(require('./json/transport/events-calendar/success.json'))
})
router.get('/getTripSchedule', (request, response) => {
const lang = request.query.lang || 'ru';
try {
const data = require(`./json/transport/trip-schedule/${lang}/success.json`);
response.send(data);
} catch (error) {
response.status(404).send({ message: 'Language not found' });
}
})
// History page
router.get('/getHistoryText', (request, response) => {
const lang = request.query.lang || 'ru';
try {
const data = require(`./json/history/text/${lang}/success.json`);
response.send(data);
} catch (error) {
response.status(404).send({ message: 'Language not found' });
}
})
router.get('/getHistoryList', (request, response) => {
const lang = request.query.lang || 'ru';
try {
const data = require(`./json/history/list/${lang}/success.json`);
response.send(data);
} catch (error) {
response.status(404).send({ message: 'Language not found' });
}
})
// Education page
router.get('/getInfoAboutEducation', (request, response) => {
const lang = request.query.lang || 'ru';
try {
const data = require('./json/education/text/success.json');
const translatedData = data[lang] || data['ru'];
response.send(translatedData);
} catch (error) {
response.status(404).send({ message: 'Language not found' });
}
})
router.get('/getEducationList', (request, response) => {
const lang = request.query.lang || 'ru';
try {
const data = require(`./json/education/cards/${lang}/success.json`);
response.send(data);
} catch (error) {
response.status(404).send({ message: 'Language not found' });
}
})
router.get('/getInfoAboutKFU', (request, response) => {
const lang = request.query.lang || 'ru';
try {
const data = require('./json/education/kfu/success.json');
const translatedData = data[lang] || data['ru'];
response.send(translatedData);
} catch (error) {
response.status(404).send({ message: 'Language not found' });
}
})
// Login
router.post('/entrance', (request, response) => {
const { email, password } = request.body.entranceData;
try {
const users = require('./json/users-information/success.json');
const user = users.data.find(user => user.email === email && user.password === password);
if (!user) {
return response.status(401).send('Неверные учетные данные');
}
const responseObject = {
email: user.email,
}
return response.json(responseObject);
} catch (error) {
console.error('Ошибка чтения файла:', error);
response.status(500).send('Внутренняя ошибка сервера');
}
})
router.post('/registration', async (request, response) => {
const { email, password, confirmPassword } = request.body.registerData;
try {
if (password !== confirmPassword) {
return response.status(400).send('Пароли не совпадают!');
}
const users = require('./json/users-information/success.json');
const existingUser = users.data.find(user => user.email === email);
if (existingUser) {
return response.status(400).send('Пользователь с такой почтой уже существует!');
}
return response.json({ email: email });
} catch (error) {
console.error('Ошибка регистрации пользователя:', error);
response.status(500).send('Внутренняя ошибка сервера');
}
});
module.exports = router;
const router = require('express').Router();
const { ResultsModel } = require('./model/results')
router.get('/getQuizResults/:userId', async (request, response) => {
const { userId } = request.params;
try {
const results = await ResultsModel.findOne({ userId : userId }).exec();
if (!results) {
return response.status(404).send({ message: 'Quiz results not found' });
}
response.send(results.items);
} catch (error) {
response.status(500).send({ message: 'An error occurred while fetching quiz results' });
}
});
router.post('/addQuizResult', async (request, response) => {
const { userId, quizId, result } = request.body;
if (!userId || !quizId || !result) {
return response.status(400).send({ message: 'Invalid input data' });
}
try {
let userResults = await ResultsModel.findOne({ userId : userId }).exec();
if (!userResults) {
userResults = new ResultsModel({ userId, items: [] });
}
userResults.items.push({ quizId, result });
await userResults.save();
response.status(200).send({ message: 'Quiz result added successfully', data: userResults });
} catch (error) {
response.status(500).send({ message: 'An error occurred while adding quiz result' });
}
});
// First page
router.get('/getInfoAboutKazan', (request, response) => {
const lang = request.query.lang || 'ru';
try {
const data = require('./json/first/info-about-kazan/success.json');
const translatedData = data[lang] || data['ru'];
response.send(translatedData);
} catch (error) {
response.status(500).send({ message: 'Internal server error' });
}
});
router.get('/getNews', (request, response) => {
const lang = request.query.lang || 'ru';
try {
const data = require(`./json/first/news/${lang}/success.json`);
response.send(data);
} catch (error) {
response.status(404).send({ message: 'Language not found' });
}
})
// Sport page
router.get('/getFirstText', (request, response) => {
const lang = request.query.lang || 'ru';
try {
const data = require('./json/sport/first-text/success.json');
const translatedData = data[lang] || data['ru'];
response.send(translatedData);
} catch (error) {
response.status(404).send({ message: 'Language not found' });
}
});
router.get('/getSecondText', (request, response) => {
const lang = request.query.lang || 'ru';
try {
const data = require('./json/sport/second-text/success.json');
const translatedData = data[lang] || data['ru'];
response.send(translatedData);
} catch (error) {
response.status(404).send({ message: 'Language not found' });
}
});
router.get('/getSportData', (request, response) => {
const lang = request.query.lang || 'ru';
try {
const data = require(`./json/sport/sport-list/${lang}/success.json`);
response.send(data);
} catch (error) {
response.status(404).send({ message: 'Language not found' });
}
})
router.get('/getSportQuiz', (request, response) => {
const lang = request.query.lang || 'ru';
try {
const data = require(`./json/sport/quiz/${lang}/success.json`);
response.send(data);
} catch (error) {
response.status(404).send({ message: 'Language not found' });
}
})
// Places page
router.get('/getPlacesData', (request, response) => {
const lang = request.query.lang || 'ru';
try {
const data = require(`./json/places/${lang}/success.json`);
response.send(data);
} catch (error) {
response.status(404).send({ message: 'Language not found' });
}
})
// Transport page
router.get('/getInfoAboutTransportPage', (request, response) => {
const lang = request.query.lang || 'ru';
try {
const data = require('./json/transport/info-about-page/success.json');
const translatedData = data[lang] || data['ru'];
response.send(translatedData);
} catch (error) {
response.status(404).send({ message: 'Language not found' });
}
})
router.get('/getBus', (request, response) => {
response.send(require('./json/transport/bus-numbers/success.json'))
})
router.get('/getTral', (request, response) => {
response.send(require('./json/transport/tral-numbers/success.json'))
})
router.get('/getEvents', (request, response) => {
response.send(require('./json/transport/events-calendar/success.json'))
})
router.get('/getTripSchedule', (request, response) => {
const lang = request.query.lang || 'ru';
try {
const data = require(`./json/transport/trip-schedule/${lang}/success.json`);
response.send(data);
} catch (error) {
response.status(404).send({ message: 'Language not found' });
}
})
// History page
router.get('/getHistoryText', (request, response) => {
const lang = request.query.lang || 'ru';
try {
const data = require(`./json/history/text/${lang}/success.json`);
response.send(data);
} catch (error) {
response.status(404).send({ message: 'Language not found' });
}
})
router.get('/getHistoryList', (request, response) => {
const lang = request.query.lang || 'ru';
try {
const data = require(`./json/history/list/${lang}/success.json`);
response.send(data);
} catch (error) {
response.status(404).send({ message: 'Language not found' });
}
})
// Education page
router.get('/getInfoAboutEducation', (request, response) => {
const lang = request.query.lang || 'ru';
try {
const data = require('./json/education/text/success.json');
const translatedData = data[lang] || data['ru'];
response.send(translatedData);
} catch (error) {
response.status(404).send({ message: 'Language not found' });
}
})
router.get('/getEducationList', (request, response) => {
const lang = request.query.lang || 'ru';
try {
const data = require(`./json/education/cards/${lang}/success.json`);
response.send(data);
} catch (error) {
response.status(404).send({ message: 'Language not found' });
}
})
router.get('/getInfoAboutKFU', (request, response) => {
const lang = request.query.lang || 'ru';
try {
const data = require('./json/education/kfu/success.json');
const translatedData = data[lang] || data['ru'];
response.send(translatedData);
} catch (error) {
response.status(404).send({ message: 'Language not found' });
}
})
// Login
router.post('/entrance', (request, response) => {
const { email, password } = request.body.entranceData;
try {
const users = require('./json/users-information/success.json');
const user = users.data.find(user => user.email === email && user.password === password);
if (!user) {
return response.status(401).send('Неверные учетные данные');
}
const responseObject = {
email: user.email,
}
return response.json(responseObject);
} catch (error) {
console.error('Ошибка чтения файла:', error);
response.status(500).send('Внутренняя ошибка сервера');
}
})
router.post('/registration', async (request, response) => {
const { email, password, confirmPassword } = request.body.registerData;
try {
if (password !== confirmPassword) {
return response.status(400).send('Пароли не совпадают!');
}
const users = require('./json/users-information/success.json');
const existingUser = users.data.find(user => user.email === email);
if (existingUser) {
return response.status(400).send('Пользователь с такой почтой уже существует!');
}
return response.json({ email: email });
} catch (error) {
console.error('Ошибка регистрации пользователя:', error);
response.status(500).send('Внутренняя ошибка сервера');
}
});
module.exports = router;

View File

@@ -0,0 +1,27 @@
const { Schema, model } = require('mongoose')
const { KAZAN_EXPLORE_RESULTS_MODEL_NAME } = require('../const')
const schema = new Schema({
userId: { type: String },
items: [
{
quizId: { type: String },
result: { type: Number }
}
]
})
schema.set('toJSON', {
virtuals: true,
versionKey: false,
transform: function (doc, ret) {
delete ret._id
}
})
schema.virtual('id').get(function () {
return this._id.toHexString()
})
exports.ResultsModel = model(KAZAN_EXPLORE_RESULTS_MODEL_NAME, schema)

View File

@@ -3,6 +3,7 @@ const router = Router()
router.use('/eng-it-lean', require('./eng-it-lean/index'))
router.use('/sberhubproject', require('./sberhubproject/index'))
router.use('/sber_web', require('./sber_web/index'))
module.exports = router

View File

@@ -0,0 +1,8 @@
const router = require('express').Router();
const listRouter = require('./questions');
const questionRouter = require('./question');
module.exports = router;
router.use('/questions', listRouter);
router.use('/question', questionRouter);

View File

@@ -0,0 +1,16 @@
const axios = require('axios');
const router = require('express').Router();
module.exports = router;
router.get('/:id', async (req, res) => {
const id = req.params.id;
const baseUrl = 'http://www.db.chgk.info';
try {
const data = await axios.get(baseUrl + `/questions/${id}`);
res.send(data.data);
}
catch (e) {
res.send(undefined);
}
});

View File

@@ -0,0 +1,16 @@
const axios = require('axios');
const router = require('express').Router();
module.exports = router;
router.get('/:page', async (req, res) => {
const page = req.params.page;
const baseUrl = 'http://www.db.chgk.info';
try {
const data = await axios.get(baseUrl + `/questions?page=${page}&itemsPerPage=15`);
res.send(data.data);
}
catch (e) {
res.send(undefined);
}
});

View File

@@ -0,0 +1,602 @@
[
{
"id": 1,
"name": "Конференция 2025",
"description": "Ежегодная конференция по технологиям",
"date": "2025-03-15T10:00:00Z"
},
{
"id": 2,
"name": "Командная встреча",
"description": "Ежеквартальная встреча для согласования целей",
"date": 1672444800000
},
{
"id": 3,
"name": "День рождения",
"description": "Празднование 30-летия Ивана",
"date": "2025-01-25"
},
{
"id": 4,
"name": "Вебинар",
"description": "Онлайн-вебинар по лучшим практикам TypeScript",
"date": "2025-02-10T14:30:00Z"
},
{
"id": 5,
"name": "Митап разработчиков",
"description": "Встреча разработчиков для обмена опытом",
"date": "2025-04-05T18:00:00Z"
},
{
"id": 6,
"name": "Хакатон",
"description": "48-часовой марафон программирования",
"date": "2025-05-20T09:00:00Z"
},
{
"id": 7,
"name": "Обучение Agile",
"description": "Тренинг по методологии Agile",
"date": "2025-06-10T10:00:00Z"
},
{
"id": 8,
"name": "Презентация продукта",
"description": "Анонс нового продукта компании",
"date": "2025-07-01T14:00:00Z"
},
{
"id": 9,
"name": "Корпоратив",
"description": "Ежегодный корпоративный праздник",
"date": "2025-08-15T19:00:00Z"
},
{
"id": 10,
"name": "Обучение DevOps",
"description": "Курс по основам DevOps",
"date": "2025-09-05T09:00:00Z"
},
{
"id": 11,
"name": "Встреча с клиентом",
"description": "Обсуждение нового проекта",
"date": "2025-10-12T11:00:00Z"
},
{
"id": 12,
"name": "Технический семинар",
"description": "Семинар по новым технологиям",
"date": "2025-11-20T13:00:00Z"
},
{
"id": 13,
"name": "Рождественская вечеринка",
"description": "Празднование Рождества",
"date": "2025-12-24T20:00:00Z"
},
{
"id": 14,
"name": "Планирование года",
"description": "Стратегическое планирование на следующий год",
"date": "2026-01-10T09:00:00Z"
},
{
"id": 15,
"name": "Обучение Python",
"description": "Курс для начинающих",
"date": "2026-02-15T10:00:00Z"
},
{
"id": 16,
"name": "Встреча инвесторов",
"description": "Презентация финансовых результатов",
"date": "2026-03-01T15:00:00Z"
},
{
"id": 17,
"name": "Марафон кодирования",
"description": "24-часовой марафон",
"date": "2026-04-05T12:00:00Z"
},
{
"id": 18,
"name": "Обучение React",
"description": "Продвинутый курс по React",
"date": "2026-05-10T14:00:00Z"
},
{
"id": 19,
"name": "Конференция AI",
"description": "Конференция по искусственному интеллекту",
"date": "2026-06-15T09:00:00Z"
},
{
"id": 20,
"name": "День открытых дверей",
"description": "Знакомство с компанией",
"date": "2026-07-01T10:00:00Z"
},
{
"id": 21,
"name": "Обучение Docker",
"description": "Курс по контейнеризации",
"date": "2026-08-10T11:00:00Z"
},
{
"id": 22,
"name": "Встреча с партнерами",
"description": "Обсуждение сотрудничества",
"date": "2026-09-05T13:00:00Z"
},
{
"id": 23,
"name": "Технический митап",
"description": "Обсуждение новых технологий",
"date": "2026-10-12T18:00:00Z"
},
{
"id": 24,
"name": "Хэллоуин",
"description": "Корпоративная вечеринка",
"date": "2026-10-31T20:00:00Z"
},
{
"id": 25,
"name": "Обучение Kubernetes",
"description": "Курс по оркестрации контейнеров",
"date": "2026-11-15T09:00:00Z"
},
{
"id": 26,
"name": "Встреча команды",
"description": "Обсуждение текущих задач",
"date": "2026-12-01T10:00:00Z"
},
{
"id": 27,
"name": "Новогодний корпоратив",
"description": "Празднование Нового года",
"date": "2026-12-31T21:00:00Z"
},
{
"id": 28,
"name": "Обучение GraphQL",
"description": "Курс по GraphQL",
"date": "2027-01-10T14:00:00Z"
},
{
"id": 29,
"name": "Конференция Blockchain",
"description": "Конференция по блокчейн-технологиям",
"date": "2027-02-15T09:00:00Z"
},
{
"id": 30,
"name": "Встреча с заказчиком",
"description": "Обсуждение требований",
"date": "2027-03-01T11:00:00Z"
},
{
"id": 31,
"name": "Обучение Node.js",
"description": "Курс по серверному JavaScript",
"date": "2027-04-05T10:00:00Z"
},
{
"id": 32,
"name": "Митап по DevOps",
"description": "Обсуждение лучших практик",
"date": "2027-05-10T18:00:00Z"
},
{
"id": 33,
"name": "Конференция Cloud",
"description": "Конференция по облачным технологиям",
"date": "2027-06-15T09:00:00Z"
},
{
"id": 34,
"name": "Обучение Security",
"description": "Курс по кибербезопасности",
"date": "2027-07-01T14:00:00Z"
},
{
"id": 35,
"name": "Встреча с командой",
"description": "Планирование спринта",
"date": "2027-08-10T10:00:00Z"
},
{
"id": 36,
"name": "Обучение AWS",
"description": "Курс по Amazon Web Services",
"date": "2027-09-05T11:00:00Z"
},
{
"id": 37,
"name": "Конференция Big Data",
"description": "Конференция по большим данным",
"date": "2027-10-12T09:00:00Z"
},
{
"id": 38,
"name": "Обучение Machine Learning",
"description": "Курс по машинному обучению",
"date": "2027-11-15T14:00:00Z"
},
{
"id": 39,
"name": "Встреча с инвесторами",
"description": "Презентация новых проектов",
"date": "2027-12-01T15:00:00Z"
},
{
"id": 40,
"name": "Новогодний митап",
"description": "Подведение итогов года",
"date": "2027-12-31T20:00:00Z"
},
{
"id": 41,
"name": "Обучение Go",
"description": "Курс по языку Go",
"date": "2028-01-10T10:00:00Z"
},
{
"id": 42,
"name": "Конференция IoT",
"description": "Конференция по интернету вещей",
"date": "2028-02-15T09:00:00Z"
},
{
"id": 43,
"name": "Встреча с партнерами",
"description": "Обсуждение новых инициатив",
"date": "2028-03-01T11:00:00Z"
},
{
"id": 44,
"name": "Обучение Rust",
"description": "Курс по языку Rust",
"date": "2028-04-05T14:00:00Z"
},
{
"id": 45,
"name": "Митап по AI",
"description": "Обсуждение трендов в AI",
"date": "2028-05-10T18:00:00Z"
},
{
"id": 46,
"name": "Конференция Cybersecurity",
"description": "Конференция по кибербезопасности",
"date": "2028-06-15T09:00:00Z"
},
{
"id": 47,
"name": "Обучение Vue.js",
"description": "Курс по фреймворку Vue.js",
"date": "2028-07-01T10:00:00Z"
},
{
"id": 48,
"name": "Встреча команды",
"description": "Обсуждение текущих проектов",
"date": "2028-08-10T11:00:00Z"
},
{
"id": 49,
"name": "Обучение Angular",
"description": "Курс по фреймворку Angular",
"date": "2028-09-05T14:00:00Z"
},
{
"id": 50,
"name": "Конференция DevOps",
"description": "Конференция по DevOps",
"date": "2028-10-12T09:00:00Z"
},
{
"id": 51,
"name": "Обучение SQL",
"description": "Курс по базам данных",
"date": "2028-11-15T10:00:00Z"
},
{
"id": 52,
"name": "Встреча с клиентом",
"description": "Обсуждение новых требований",
"date": "2028-12-01T11:00:00Z"
},
{
"id": 53,
"name": "Новогодний корпоратив",
"description": "Празднование Нового года",
"date": "2028-12-31T21:00:00Z"
},
{
"id": 54,
"name": "Обучение NoSQL",
"description": "Курс по NoSQL базам данных",
"date": "2029-01-10T14:00:00Z"
},
{
"id": 55,
"name": "Конференция Frontend",
"description": "Конференция по фронтенд-разработке",
"date": "2029-02-15T09:00:00Z"
},
{
"id": 56,
"name": "Встреча с командой",
"description": "Планирование задач",
"date": "2029-03-01T10:00:00Z"
},
{
"id": 57,
"name": "Обучение Svelte",
"description": "Курс по фреймворку Svelte",
"date": "2029-04-05T11:00:00Z"
},
{
"id": 58,
"name": "Митап по Backend",
"description": "Обсуждение backend-разработки",
"date": "2029-05-10T18:00:00Z"
},
{
"id": 59,
"name": "Конференция Mobile",
"description": "Конференция по мобильной разработке",
"date": "2029-06-15T09:00:00Z"
},
{
"id": 60,
"name": "Обучение Flutter",
"description": "Курс по Flutter",
"date": "2029-07-01T10:00:00Z"
},
{
"id": 61,
"name": "Встреча с партнерами",
"description": "Обсуждение новых проектов",
"date": "2029-08-10T11:00:00Z"
},
{
"id": 62,
"name": "Обучение Kotlin",
"description": "Курс по языку Kotlin",
"date": "2029-09-05T14:00:00Z"
},
{
"id": 63,
"name": "Конференция GameDev",
"description": "Конференция по разработке игр",
"date": "2029-10-12T09:00:00Z"
},
{
"id": 64,
"name": "Обучение Unity",
"description": "Курс по Unity",
"date": "2029-11-15T10:00:00Z"
},
{
"id": 65,
"name": "Встреча с клиентом",
"description": "Обсуждение фидбэка",
"date": "2029-12-01T11:00:00Z"
},
{
"id": 66,
"name": "Новогодний митап",
"description": "Подведение итогов года",
"date": "2029-12-31T20:00:00Z"
},
{
"id": 67,
"name": "Обучение Swift",
"description": "Курс по языку Swift",
"date": "2030-01-10T14:00:00Z"
},
{
"id": 68,
"name": "Конференция AR/VR",
"description": "Конференция по AR/VR технологиям",
"date": "2030-02-15T09:00:00Z"
},
{
"id": 69,
"name": "Встреча команды",
"description": "Обсуждение текущих задач",
"date": "2030-03-01T10:00:00Z"
},
{
"id": 70,
"name": "Обучение Dart",
"description": "Курс по языку Dart",
"date": "2030-04-05T11:00:00Z"
},
{
"id": 71,
"name": "Митап по Mobile",
"description": "Обсуждение мобильной разработки",
"date": "2030-05-10T18:00:00Z"
},
{
"id": 72,
"name": "Конференция QA",
"description": "Конференция по тестированию",
"date": "2030-06-15T09:00:00Z"
},
{
"id": 73,
"name": "Обучение Selenium",
"description": "Курс по автоматизации тестирования",
"date": "2030-07-01T10:00:00Z"
},
{
"id": 74,
"name": "Встреча с партнерами",
"description": "Обсуждение сотрудничества",
"date": "2030-08-10T11:00:00Z"
},
{
"id": 75,
"name": "Обучение Jenkins",
"description": "Курс по CI/CD",
"date": "2030-09-05T14:00:00Z"
},
{
"id": 76,
"name": "Конференция Automation",
"description": "Конференция по автоматизации",
"date": "2030-10-12T09:00:00Z"
},
{
"id": 77,
"name": "Обучение Git",
"description": "Курс по системе контроля версий",
"date": "2030-11-15T10:00:00Z"
},
{
"id": 78,
"name": "Встреча с клиентом",
"description": "Обсуждение новых требований",
"date": "2030-12-01T11:00:00Z"
},
{
"id": 79,
"name": "Новогодний корпоратив",
"description": "Празднование Нового года",
"date": "2030-12-31T21:00:00Z"
},
{
"id": 80,
"name": "Обучение Linux",
"description": "Курс по операционной системе Linux",
"date": "2031-01-10T14:00:00Z"
},
{
"id": 81,
"name": "Конференция Open Source",
"description": "Конференция по открытому ПО",
"date": "2031-02-15T09:00:00Z"
},
{
"id": 82,
"name": "Встреча команды",
"description": "Планирование задач",
"date": "2031-03-01T10:00:00Z"
},
{
"id": 83,
"name": "Обучение Bash",
"description": "Курс по скриптингу",
"date": "2031-04-05T11:00:00Z"
},
{
"id": 84,
"name": "Митап по DevOps",
"description": "Обсуждение лучших практик",
"date": "2031-05-10T18:00:00Z"
},
{
"id": 85,
"name": "Конференция Cloud Native",
"description": "Конференция по облачным технологиям",
"date": "2031-06-15T09:00:00Z"
},
{
"id": 86,
"name": "Обучение Terraform",
"description": "Курс по инфраструктуре как код",
"date": "2031-07-01T10:00:00Z"
},
{
"id": 87,
"name": "Встреча с партнерами",
"description": "Обсуждение новых проектов",
"date": "2031-08-10T11:00:00Z"
},
{
"id": 88,
"name": "Обучение Ansible",
"description": "Курс по автоматизации",
"date": "2031-09-05T14:00:00Z"
},
{
"id": 89,
"name": "Конференция Microservices",
"description": "Конференция по микросервисам",
"date": "2031-10-12T09:00:00Z"
},
{
"id": 90,
"name": "Обучение Kafka",
"description": "Курс по потоковой обработке данных",
"date": "2031-11-15T10:00:00Z"
},
{
"id": 91,
"name": "Встреча с клиентом",
"description": "Обсуждение фидбэка",
"date": "2031-12-01T11:00:00Z"
},
{
"id": 92,
"name": "Новогодний митап",
"description": "Подведение итогов года",
"date": "2031-12-31T20:00:00Z"
},
{
"id": 93,
"name": "Обучение Prometheus",
"description": "Курс по мониторингу",
"date": "2032-01-10T14:00:00Z"
},
{
"id": 94,
"name": "Конференция Monitoring",
"description": "Конференция по мониторингу",
"date": "2032-02-15T09:00:00Z"
},
{
"id": 95,
"name": "Встреча команды",
"description": "Обсуждение текущих задач",
"date": "2032-03-01T10:00:00Z"
},
{
"id": 96,
"name": "Обучение Grafana",
"description": "Курс по визуализации данных",
"date": "2032-04-05T11:00:00Z"
},
{
"id": 97,
"name": "Митап по SRE",
"description": "Обсуждение Site Reliability Engineering",
"date": "2032-05-10T18:00:00Z"
},
{
"id": 98,
"name": "Конференция Infrastructure",
"description": "Конференция по инфраструктуре",
"date": "2032-06-15T09:00:00Z"
},
{
"id": 99,
"name": "Обучение ELK",
"description": "Курс по Elasticsearch, Logstash, Kibana",
"date": "2032-07-01T10:00:00Z"
},
{
"id": 100,
"name": "Встреча с партнерами",
"description": "Обсуждение сотрудничества",
"date": "2032-08-10T11:00:00Z"
}
]

View File

@@ -0,0 +1,40 @@
const router = require('express').Router();
module.exports = router;
const data = require('./data/event.json');
const users_data = require('../users/data/users.json');
router.get('/', (req, res) => {
res.json(data);
});
router.get('/:pageSize/:page', (req, res) => {
const pageSize = parseInt(req.params.pageSize);
const page = parseInt(req.params.page);
res.json(data.slice(pageSize * (page - 1), pageSize * page));
});
router.post('/', (req, res) => {
res.status(201).send();
});
router.delete('/:id', (req, res) => {
res.status(204).send();
});
router.post('/:user_id/:action/:id', (req, res) => {
const user_id = parseInt(req.params.user_id);
const id = parseInt(req.params.id);
const action = req.params.action;
if (users_data.findIndex((item) => item.id === user_id) === -1 || data.findIndex((item) => item.id === id) === -1) {
res.status(404).send();
return;
}
if (action !== 'participate' && action !== 'refuse') {
res.status(400).send({ error: 'Invalid action' });
return;
}
res.status(201).send({ message: `${action} action processed` });
});

View File

@@ -1,17 +1,16 @@
const router = require('express').Router();
const interestsRouter = require('./interests');
const usersRouter = require('./users');
const eventsRouter = require('./events');
module.exports = router;
const delay =
(ms = 1000) =>
(req, res, next) => {
setTimeout(next, ms);
};
router.use(delay());
router.use('/interests', interestsRouter);
router.use('/users', usersRouter);
router.use('/users/:id', usersRouter);
router.use('/events', eventsRouter);

View File

@@ -5,8 +5,5 @@ module.exports = router;
const data = require('./data/interest.json');
router.get('/', (req, res) => {
//res.status(500).send({
// message: 'Internal server error'
//});
res.json(data)
});
res.json(data);
});

View File

@@ -1,113 +1,233 @@
[
{
"id": 1252744945,
"username": "Иван Иванов",
"photo": "https://example.com/photos/1.jpg",
"about": "Разработчик с 10-летним стажем, увлекаюсь новыми технологиями.",
"email": "ivan.ivanov@example.com",
"interests": [
{ "value": "Новые технологии, ИИ, техника", "label": "Новые технологии, ИИ, техника" },
{ "value": "Музыка", "label": "Музыка" }
]
},
{
"id": 2,
"username": "Мария Смирнова",
"photo": "https://example.com/photos/2.jpg",
"about": "Люблю путешествия и фотографию, обожаю изучать новые культуры.",
"email": "maria.smirnova@example.com",
"interests": [
{ "value": "Путешествия и туризм", "label": "Путешествия и туризм" },
{ "value": "Искусство, фотография и дизайн", "label": "Искусство, фотография и дизайн" }
]
},
{
"id": 3,
"username": "Алексей Кузнецов",
"photo": "https://example.com/photos/3.jpg",
"about": "Финансовый аналитик, интересуюсь инвестициями и рынками.",
"email": "aleksey.kuznetsov@example.com",
"interests": [
{ "value": "Политика, социология, активизм и дебаты", "label": "Политика, социология, активизм и дебаты" },
{ "value": "Математика, физика и информатика", "label": "Математика, физика и информатика" }
]
},
{
"id": 4,
"username": "Ольга Петрова",
"photo": "https://example.com/photos/4.jpg",
"about": "Дизайнер интерьеров, люблю создавать уютные и стильные пространства.",
"email": "olga.petrovna@example.com",
"interests": [
{ "value": "Искусство, фотография и дизайн", "label": "Искусство, фотография и дизайн" },
{ "value": "Кино и другое многомодальное искусство", "label": "Кино и другое многомодальное искусство" }
]
},
{
"id": 5,
"username": "Дмитрий Сидоров",
"photo": "https://example.com/photos/5.jpg",
"about": "Тренер по фитнесу, придерживаюсь здорового образа жизни.",
"email": "dmitriy.sidorov@example.com",
"interests": [
{ "value": "Спорт, фитнес и ЗОЖ", "label": "Спорт, фитнес и ЗОЖ" },
{ "value": "Волонтерство и благотворительность", "label": "Волонтерство и благотворительность" }
]
},
{
"id": 6,
"username": "Елена Волкова",
"photo": "https://example.com/photos/6.jpg",
"about": "Психолог, занимаюсь личностным ростом и развитием.",
"email": "elena.volkova@example.com",
"interests": [
{ "value": "Психология и психическое здоровье", "label": "Психология и психическое здоровье" },
{ "value": "Литература и история", "label": "Литература и история" }
]
},
{
"id": 7,
"username": "Артем Морозов",
"photo": "https://example.com/photos/7.jpg",
"about": "Ведущий мероприятий и организатор, люблю работать с людьми.",
"email": "artem.morozov@example.com",
"interests": [
{ "value": "Настольные игры", "label": "Настольные игры" },
{ "value": "Кино и другое многомодальное искусство", "label": "Кино и другое многомодальное искусство" }
]
},
{
"id": 8,
"username": "Ирина Фёдорова",
"photo": "https://example.com/photos/8.jpg",
"about": "Веду блог о моде и стиле, увлекаюсь новыми трендами.",
"email": "irina.fedorova@example.com",
"interests": [
{ "value": "Мода", "label": "Мода" },
{ "value": "Путешествия и туризм", "label": "Путешествия и туризм" }
]
},
{
"id": 9,
"username": "Сергей Чернов",
"photo": "https://example.com/photos/9.jpg",
"about": "Разработчик мобильных приложений, увлекаюсь игровыми технологиями.",
"email": "sergey.chernov@example.com",
"interests": [
{ "value": "Соревновательные видеоигры", "label": "Соревновательные видеоигры" },
{ "value": "Новые технологии, ИИ, техника", "label": "Новые технологии, ИИ, техника" }
]
},
{
"id": 10,
"username": "Татьяна Лебедева",
"photo": "https://example.com/photos/10.jpg",
"about": "Работаю в области маркетинга, увлекаюсь продвижением брендов.",
"email": "tatyana.lebedeva@example.com",
"interests": [
{ "value": "Маркетинг", "label": "Маркетинг" },
{ "value": "Литература и история", "label": "Литература и история" }
]
}
]
{
"id": 1,
"username": "Иван Иванов",
"photo": "https://i.pravatar.cc/150?img=64",
"about": "Разработчик с 10-летним стажем, увлекаюсь новыми технологиями.",
"email": "ivan.ivanov@example.com",
"interests": [
{ "value": "Новые технологии, ИИ, техника", "label": "Новые технологии, ИИ, техника" },
{ "value": "Музыка", "label": "Музыка" }
]
},
{
"id": 2,
"username": "Мария Смирнова",
"photo": "https://i.pravatar.cc/150?img=47",
"about": "Люблю путешествия и фотографию, обожаю изучать новые культуры.",
"email": "maria.smirnova@example.com",
"interests": [
{ "value": "Путешествия и туризм", "label": "Путешествия и туризм" },
{ "value": "Искусство, фотография и дизайн", "label": "Искусство, фотография и дизайн" }
]
},
{
"id": 3,
"username": "Алексей Кузнецов",
"photo": "https://i.pravatar.cc/150?img=68",
"about": "Финансовый аналитик, интересуюсь инвестициями и рынками.",
"email": "aleksey.kuznetsov@example.com",
"interests": [
{ "value": "Политика, социология, активизм и дебаты", "label": "Политика, социология, активизм и дебаты" },
{ "value": "Математика, физика и информатика", "label": "Математика, физика и информатика" }
]
},
{
"id": 4,
"username": "Ольга Петрова",
"photo": "https://i.pravatar.cc/150?img=49",
"about": "Дизайнер интерьеров, люблю создавать уютные и стильные пространства.",
"email": "olga.petrovna@example.com",
"interests": [
{ "value": "Искусство, фотография и дизайн", "label": "Искусство, фотография и дизайн" },
{ "value": "Кино и другое многомодальное искусство", "label": "Кино и другое многомодальное искусство" }
]
},
{
"id": 5,
"username": "Дмитрий Сидоров",
"photo": "https://i.pravatar.cc/150?img=60",
"about": "Тренер по фитнесу, придерживаюсь здорового образа жизни.",
"email": "dmitriy.sidorov@example.com",
"interests": [
{ "value": "Спорт, фитнес и ЗОЖ", "label": "Спорт, фитнес и ЗОЖ" },
{ "value": "Волонтерство и благотворительность", "label": "Волонтерство и благотворительность" }
]
},
{
"id": 6,
"username": "Елена Волкова",
"photo": "https://i.pravatar.cc/150?img=42",
"about": "Психолог, занимаюсь личностным ростом и развитием.",
"email": "elena.volkova@example.com",
"interests": [
{ "value": "Психология и психическое здоровье", "label": "Психология и психическое здоровье" },
{ "value": "Литература и история", "label": "Литература и история" }
]
},
{
"id": 7,
"username": "Артем Морозов",
"photo": "https://i.pravatar.cc/150?img=69",
"about": "Ведущий мероприятий и организатор, люблю работать с людьми.",
"email": "artem.morozov@example.com",
"interests": [
{ "value": "Настольные игры", "label": "Настольные игры" },
{ "value": "Кино и другое многомодальное искусство", "label": "Кино и другое многомодальное искусство" }
]
},
{
"id": 8,
"username": "Ирина Фёдорова",
"photo": "https://i.pravatar.cc/150?img=48",
"about": "Веду блог о моде и стиле, увлекаюсь новыми трендами.",
"email": "irina.fedorova@example.com",
"interests": [
{ "value": "Мода", "label": "Мода" },
{ "value": "Путешествия и туризм", "label": "Путешествия и туризм" }
]
},
{
"id": 9,
"username": "Сергей Чернов",
"photo": "https://i.pravatar.cc/150?img=65",
"about": "Разработчик мобильных приложений, увлекаюсь игровыми технологиями.",
"email": "sergey.chernov@example.com",
"interests": [
{ "value": "Соревновательные видеоигры", "label": "Соревновательные видеоигры" },
{ "value": "Новые технологии, ИИ, техника", "label": "Новые технологии, ИИ, техника" }
]
},
{
"id": 10,
"username": "Татьяна Лебедева",
"photo": "https://i.pravatar.cc/150?img=50",
"about": "Работаю в области маркетинга, увлекаюсь продвижением брендов.",
"email": "tatyana.lebedeva@example.com",
"interests": [
{ "value": "Маркетинг", "label": "Маркетинг" },
{ "value": "Литература и история", "label": "Литература и история" }
]
},
{
"id": 11,
"username": "Андрей Васильев",
"photo": "https://i.pravatar.cc/150?img=70",
"about": "Инженер-программист, увлекаюсь разработкой игр и виртуальной реальностью.",
"email": "andrey.vasilyev@example.com",
"interests": [
{ "value": "Разработка игр", "label": "Разработка игр" },
{ "value": "Виртуальная реальность", "label": "Виртуальная реальность" }
]
},
{
"id": 12,
"username": "Наталья Козлова",
"photo": "https://i.pravatar.cc/150?img=51",
"about": "Преподаватель литературы, люблю поэзию и классическую литературу.",
"email": "natalya.kozlova@example.com",
"interests": [
{ "value": "Литература и история", "label": "Литература и история" },
{ "value": "Образование и наука", "label": "Образование и наука" }
]
},
{
"id": 13,
"username": "Павел Новиков",
"photo": "https://i.pravatar.cc/150?img=71",
"about": "Спортсмен, занимаюсь бегом и триатлоном.",
"email": "pavel.novikov@example.com",
"interests": [
{ "value": "Спорт, фитнес и ЗОЖ", "label": "Спорт, фитнес и ЗОЖ" },
{ "value": "Путешествия и туризм", "label": "Путешествия и туризм" }
]
},
{
"id": 14,
"username": "Екатерина Михайлова",
"photo": "https://i.pravatar.cc/150?img=52",
"about": "Архитектор, увлекаюсь современным дизайном и урбанистикой.",
"email": "ekaterina.mikhailova@example.com",
"interests": [
{ "value": "Искусство, фотография и дизайн", "label": "Искусство, фотография и дизайн" },
{ "value": "Урбанистика", "label": "Урбанистика" }
]
},
{
"id": 15,
"username": "Виктор Соколов",
"photo": "https://i.pravatar.cc/150?img=72",
"about": "Бизнес-консультант, помогаю компаниям развиваться.",
"email": "viktor.sokolov@example.com",
"interests": [
{ "value": "Бизнес и предпринимательство", "label": "Бизнес и предпринимательство" },
{ "value": "Политика, социология, активизм и дебаты", "label": "Политика, социология, активизм и дебаты" }
]
},
{
"id": 16,
"username": "Анна Павлова",
"photo": "https://i.pravatar.cc/150?img=53",
"about": "Художник, работаю в стиле абстракционизма.",
"email": "anna.pavlova@example.com",
"interests": [
{ "value": "Искусство, фотография и дизайн", "label": "Искусство, фотография и дизайн" },
{ "value": "Кино и другое многомодальное искусство", "label": "Кино и другое многомодальное искусство" }
]
},
{
"id": 17,
"username": "Денис Иванов",
"photo": "https://i.pravatar.cc/150?img=73",
"about": "Ученый, занимаюсь исследованиями в области биотехнологий.",
"email": "denis.ivanov@example.com",
"interests": [
{ "value": "Биология и биотехнологии", "label": "Биология и биотехнологии" },
{ "value": "Образование и наука", "label": "Образование и наука" }
]
},
{
"id": 18,
"username": "Людмила Кузнецова",
"photo": "https://i.pravatar.cc/150?img=54",
"about": "Повар, специализируюсь на авторской кухне.",
"email": "lyudmila.kuznetsova@example.com",
"interests": [
{ "value": "Кулинария", "label": "Кулинария" },
{ "value": "Путешествия и туризм", "label": "Путешествия и туризм" }
]
},
{
"id": 19,
"username": "Григорий Петров",
"photo": "https://i.pravatar.cc/150?img=74",
"about": "Музыкант, играю на гитаре и пишу песни.",
"email": "grigoriy.petrov@example.com",
"interests": [
{ "value": "Музыка", "label": "Музыка" },
{ "value": "Кино и другое многомодальное искусство", "label": "Кино и другое многомодальное искусство" }
]
},
{
"id": 20,
"username": "Валентина Семенова",
"photo": "https://i.pravatar.cc/150?img=55",
"about": "Врач, специализируюсь на профилактической медицине.",
"email": "valentina.semenova@example.com",
"interests": [
{ "value": "Медицина и здоровье", "label": "Медицина и здоровье" },
{ "value": "Спорт, фитнес и ЗОЖ", "label": "Спорт, фитнес и ЗОЖ" }
]
},
{
"id": 1252744945,
"username": "Моряков Сергей",
"photo": "https://i.pravatar.cc/150?img=50",
"about": "Люблю путешествия и фотографию, обожаю изучать новые культуры.",
"email": "maria.smirnova@example.com",
"interests": [
{ "value": "Путешествия и туризм", "label": "Путешествия и туризм" },
{ "value": "Искусство, фотография и дизайн", "label": "Искусство, фотография и дизайн" }
]
}
]

View File

@@ -5,35 +5,44 @@ module.exports = router;
const data = require('./data/users.json');
router.get('/', (req, res) => {
//res.status(500).send({
// message: 'Internal server error'
//});
res.json(data)
res.json(data);
});
router.get('/:pageSize/:page', (req, res) => {
const pageSize = parseInt(req.params.pageSize);
const page = parseInt(req.params.page);
res.json(data.slice(pageSize * (page - 1), pageSize * page));
});
router.get('/:id', (req, res) => {
//res.status(500).send({
// message: 'Internal server error'
//});
const userId = parseInt(req.params.id);
res.json(data.find(item => item.id = userId));
const userId = parseInt(req.params.id);
res.json(data.find((item) => item.id === userId));
});
router.post('/', (req, res) => {
//res.status(500).send({
// message: 'Internal server error'
//});
const data = req.body;
res.status(201).send();
});
router.post('/:to_id/:action/:from_id', (req, res) => {
const to_id = parseInt(req.params.to_id);
const from_id = parseInt(req.params.from_id);
const action = req.params.action;
if (data.findIndex((item) => item.id === to_id) === -1 || data.findIndex((item) => item.id === from_id) === -1) {
res.status(404).send();
return;
}
if (action !== 'like' && action !== 'dislike') {
res.status(400).send({ error: 'Invalid action' });
return;
}
res.status(200).send();
res.status(201).send({ message: `${action} action processed` });
});
router.put('/:id', (req, res) => {
//res.status(500).send({
// message: 'Internal server error'
//});
const userId = parseInt(req.params.id);
const data = req.body;
res.status(200).send();
});
res.status(204).send();
});
router.delete('/:id', (req, res) => {
res.status(204).send();
});

View File

@@ -10,6 +10,22 @@ const { TOKEN_KEY } = require('./const')
const router = Router()
router.get('/:todoId/:itemId', async (req, res) => {
const { todoId, itemId } = req.params
const todo = await ListModel.findById(todoId)
if (!todo) {
return res.send(getAnswer(new Error('no such todo')))
}
const item = await ItemModel.findById(itemId).populate({ path: 'comments', populate: { path: 'author' } }).exec()
if (!item) {
return res.send(getAnswer(new Error('no such item')))
}
res.send(getAnswer(null, item))
})
router.use(expressjwt({ secret: TOKEN_KEY, algorithms: ['HS256'] }))
router.post('/:todoId/:itemId', async (req, res) => {
@@ -34,20 +50,4 @@ router.post('/:todoId/:itemId', async (req, res) => {
res.send(getAnswer(null, comment))
})
router.get('/:todoId/:itemId', async (req, res) => {
const { todoId, itemId } = req.params
const todo = await ListModel.findById(todoId)
if (!todo) {
return res.send(getAnswer(new Error('no such todo')))
}
const item = await ItemModel.findById(itemId).populate({ path: 'comments', populate: { path: 'author' } }).exec()
if (!item) {
return res.send(getAnswer(new Error('no such item')))
}
res.send(getAnswer(null, item))
})
module.exports = router

View File

@@ -63,5 +63,38 @@ router.post('/item', requiredValidate('todoId', 'title'), async (req, res) => {
res.send(getAnswer(null, item))
})
// closed = new Date().toISOString()
router.patch('/item/:itemId', async (req, res) => {
const { itemId } = req.params
const { title, done } = req.body
const item = await ItemModel.findById(itemId)
if (!item) {
throw new Error('item not found')
}
if (title) {
item.title = title
}
if (done) {
item.done = done
item.closed = done ? new Date().toISOString() : null
}
await item.save()
res.send(getAnswer(null, item))
})
router.delete('/item/:itemId', async (req, res) => {
const { itemId } = req.params
await ItemModel.findByIdAndDelete(itemId)
res.send(getAnswer(null, { ok: true }))
})
module.exports = router