Compare commits

..

No commits in common. "master" and "gamehub" have entirely different histories.

68 changed files with 1408 additions and 11678 deletions

2149
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{
"name": "multi-stub",
"version": "1.2.1",
"version": "1.2.0",
"description": "",
"main": "index.js",
"scripts": {
@ -23,12 +23,10 @@
"license": "MIT",
"homepage": "https://bitbucket.org/online-mentor/multi-stub#readme",
"dependencies": {
"ai": "^4.1.13",
"axios": "^1.7.7",
"bcrypt": "^5.1.0",
"body-parser": "^1.19.0",
"cookie-parser": "^1.4.5",
"cors": "^2.8.5",
"axios": "^1.7.9",
"bcrypt": "^5.1.1",
"body-parser": "^1.20.3",
"cookie-parser": "^1.4.7",
"cross-env": "^7.0.3",
"crypto-js": "^4.2.0",
"dotenv": "^16.4.7",
@ -39,7 +37,6 @@
"jsonwebtoken": "^9.0.2",
"mongodb": "^6.12.0",
"mongoose": "^8.9.2",
"mongoose-sequence": "^6.0.1",
"morgan": "^1.10.0",
"pbkdf2-password": "^1.2.1",
"rotating-file-stream": "^3.2.5",

View File

@ -89,7 +89,6 @@ 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('/connectme', require('./routers/connectme'))
app.use(require("./error"))

View File

@ -1,8 +0,0 @@
const { Router } = require('express')
const router = Router()
router.get('/cities', (request, response) => {
response.send(require('./json/cities.json'))
})
module.exports = router

View File

@ -1,85 +0,0 @@
{
"data": [
{
"id": 1,
"title": "Моска"
},
{
"id": 2,
"title": "Санкт-петербург"
},
{
"id": 3,
"title": "Новосибирска"
},
{
"id": 4,
"title": "Екатеринбург"
},
{
"id": 5,
"title": "Казань"
},
{
"id": 6,
"title": "Нижний новгород"
},
{
"id": 7,
"title": "Челябинск"
},
{
"id": 8,
"title": "Самара"
},
{
"id": 9,
"title": "Омск"
},
{
"id": 10,
"title": "Ростов-на-дону"
},
{
"id": 11,
"title": "Уфа"
},
{
"id": 12,
"title": "Красноярск"
},
{
"id": 13,
"title": "Пермь"
},
{
"id": 14,
"title": "Воронеж"
},
{
"id": 15,
"title": "Волгоград"
},
{
"id": 16,
"title": "Краснодар"
},
{
"id": 17,
"title": "Тюмень"
},
{
"id": 18,
"title": "Ижевск"
},
{
"id": 19,
"title": "Барнаул"
},
{
"id": 20,
"title": "Владивосток"
}
],
"count": 20
}

View File

@ -1,2 +0,0 @@
exports.DSF_AUTH_USER_MODEL_NAME = 'DSF_AUTH_USER'
exports.DSF_INTERACTION_MODEL_NAME = 'DSF_INTERACTION'

View File

@ -7,29 +7,29 @@ router.get("/users", (request, response) => {
router.post("/auth", (request, response) => {
const { phoneNumber, password } = request.body;
console.log(phoneNumber, password);
if (phoneNumber === "89999999999" || phoneNumber === "89559999999") {
response.send(require("./json/auth/success.json"));
if (phoneNumber === "89999999999") {
response.send(require("./json/auth/dogsitter.success.json"));
} else if (phoneNumber === "89555555555") {
response.status(400).send(require("./json/auth/error.json"));
} else {
response.status(401).send(require("./json/auth/error.json"));
response.send(require("./json/auth/owner.success.json"));
}
});
router.post("/auth/2fa", (request, response) => {
const { phoneNumber, code } = request.body;
if (code === "0000" && phoneNumber === "89999999999") {
response.send(require("./json/2fa/dogsitter.success.json"));
} else if (code === "0000" && phoneNumber === "89559999999") {
response.send(require("./json/2fa/owner.success.json"));
const { code } = request.body;
if (code === "0000") {
response.send(require("./json/2fa/success.json"));
} else {
response.status(401).send(require("./json/2fa/error.json"));
response.status(400).send(require("./json/2fa/error.json"));
}
});
router.post("/register", (request, response) => {
const { firstName, secondName, phoneNumber, password, role } = request.body;
console.log(phoneNumber, password, role);
if (phoneNumber === "89999999999" || phoneNumber === "89559999999") {
response.status(401).send(require("./json/register/error.json"));
if (phoneNumber === "89283244141" || phoneNumber === "89872855893") {
response.status(400).send(require("./json/register/error.json"));
} else if (role === "dogsitter") {
response.send(require("./json/register/dogsitter.success.json"));
} else {
@ -37,192 +37,4 @@ router.post("/register", (request, response) => {
}
});
router.get("/auth/session", (request, response) => {
const authHeader = request.headers.authorization;
if (!authHeader) {
return response.status(401).json({ error: "Authorization header missing" });
}
// Берём сам токен из заголовка
const token = authHeader.split(" ")[1];
if (!token) {
return response.status(401).json({ error: "Bearer token missing" });
}
const jwt = require("jsonwebtoken");
const secretKey = "secret";
try {
const decoded = jwt.verify(token, secretKey);
if (decoded.role === "dogsitter") {
response.send(require("./json/role/dogsitter.success.json"));
} else {
response.send(require("./json/role/owner.success.json"));
}
} catch (e) {
console.log("token e:", e);
return response.status(403).json({ error: "Invalid token" });
}
});
// Проверка взаимодействия между пользователем и догситтером
router.get("/interactions/check", (req, res) => {
const { owner_id, dogsitter_id } = req.query;
const usersFilePath = path.resolve(__dirname, "./json/users/users.json");
delete require.cache[require.resolve(usersFilePath)];
const usersFile = require(usersFilePath);
const interactions = usersFile.interactions || [];
const exists = interactions.some(
(interaction) =>
interaction.owner_id === Number(owner_id) &&
interaction.dogsitter_id === Number(dogsitter_id)
);
res.json({ exists });
});
// Добавление нового взаимодействия
router.post("/interactions", (req, res) => {
const { owner_id, dogsitter_id, interaction_type } = req.body;
if (!owner_id || !dogsitter_id || !interaction_type) {
return res.status(400).json({ error: "Missing required fields" });
}
const usersFilePath = path.resolve(__dirname, "./json/users/users.json");
delete require.cache[require.resolve(usersFilePath)];
const usersFile = require(usersFilePath);
if (!usersFile.interactions) {
usersFile.interactions = [];
}
// Проверяем, существует ли уже такое взаимодействие
const exists = usersFile.interactions.some(
(interaction) =>
interaction.owner_id === Number(owner_id) &&
interaction.dogsitter_id === Number(dogsitter_id)
);
if (!exists) {
usersFile.interactions.push({
owner_id: Number(owner_id),
dogsitter_id: Number(dogsitter_id),
interaction_type,
});
fs.writeFileSync(
usersFilePath,
JSON.stringify(usersFile, null, 2),
"utf8"
);
console.log(
`Добавлено взаимодействие: owner_id=${owner_id}, dogsitter_id=${dogsitter_id}`
);
}
res.json({ success: true });
});
router.get("/dogsitter-viewing", (req, res) => {
const { id } = req.query;
console.log(`Получен запрос для dogsitter с ID: ${id}`);
const usersFile = require("./json/users/users.json");
const users = usersFile.data; // Извлекаем массив из свойства "data"
const user = users.find((user) => user.id === Number(id));
if (user) {
res.json(user); // Возвращаем найденного пользователя
} else {
res.status(404).json({ error: "User not found" }); // Если пользователь не найден
}
});
const fs = require('fs');
const path = require('path');
router.post('/dogsitter-viewing/rating/:id', (req, res) => {
const { id } = req.params;
const { rating } = req.body;
if (!rating || rating < 1 || rating > 5) {
return res.status(400).json({ error: 'Некорректная оценка' });
}
const usersFilePath = path.resolve(__dirname, "./json/users/users.json");
delete require.cache[require.resolve(usersFilePath)];
const usersFile = require(usersFilePath);
const users = usersFile.data;
const userIndex = users.findIndex(user => user.id === Number(id));
if (userIndex === -1) {
return res.status(404).json({ error: 'Догситтер не найден' });
}
if (!users[userIndex].ratings) {
users[userIndex].ratings = [];
}
users[userIndex].ratings.push(rating);
if (users[userIndex].ratings.length > 100) {
users[userIndex].ratings.shift();
}
const total = users[userIndex].ratings.reduce((sum, r) => sum + r, 0);
users[userIndex].rating = parseFloat((total / users[userIndex].ratings.length).toFixed(2));
fs.writeFileSync(usersFilePath, JSON.stringify({ data: users }, null, 2), 'utf8');
console.log(`Обновлен рейтинг догситтера ${id}: ${users[userIndex].rating}`);
res.json({ rating: users[userIndex].rating, ratings: users[userIndex].ratings });
});
router.patch('/users/:id', (req, res) => {
const { id } = req.params;
const updateData = req.body;
console.log('Полученные данные для обновления:', updateData);
const usersFilePath = path.resolve(__dirname, "./json/users/users.json");
delete require.cache[require.resolve(usersFilePath)];
const usersFile = require(usersFilePath);
const users = usersFile.data;
const userIndex = users.findIndex((user) => user.id === Number(id));
if (userIndex === -1) {
return res.status(404).json({ error: 'User not found' });
}
users[userIndex] = { ...users[userIndex], ...updateData };
fs.writeFileSync(
usersFilePath,
JSON.stringify({ data: users }, null, 2),
'utf8'
);
console.log('Обновлённые данные пользователя:', users[userIndex]);
res.json(users[userIndex]);
});
module.exports = router
module.exports = router;

View File

@ -1,3 +0,0 @@
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6MSwicm9sZSI6ImRvZ3NpdHRlciIsImlhdCI6MTUxNjIzOTAyMn0.7q66wTNyLZp3TGFYF_JdU-yhlWViJulTxP_PCQzO4OI"
}

View File

@ -1,5 +1,4 @@
{
"status": "error",
"message": "Invalid code",
"statusCode": 401
"message": "Invalid code."
}

View File

@ -1,3 +0,0 @@
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6Mywicm9sZSI6Im93bmVyIiwiaWF0IjoxNTE2MjM5MDIyfQ.sI9839YXveTpEWhdpr5QbCYllt6hHYO7NsrQDcrXZIQ"
}

View File

@ -0,0 +1,4 @@
{
"status": "success",
"message": "Two-factor authentication passed."
}

View File

@ -0,0 +1,12 @@
{
"data": {
"id": 1,
"phoneNumber": 89283244141,
"firstName": "Вася",
"secondName": "Пупкин",
"role": "dogsitter",
"location": "Россия, республика Татарстан, Казань, улица Пушкина, 12",
"price": 1500,
"aboutMe": "Я люблю собак"
}
}

View File

@ -1,5 +1,3 @@
{
"message": "Неверный логин или пароль",
"error": "Unauthorized",
"statusCode": 401
}
"error": "Пользователь не найден"
}

View File

@ -0,0 +1,9 @@
{
"data": {
"id": 3,
"phoneNumber": 89872855893,
"firstName": "Гадий",
"secondName": "Петрович",
"role": "owner"
}
}

View File

@ -1,5 +0,0 @@
{
"status": "success",
"message": "Первый фактор аутентификации пройден",
"statusCode": 200
}

View File

@ -1,3 +1,12 @@
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NSwicm9sZSI6ImRvZ3NpdHRlciIsImlhdCI6MTUxNjIzOTAyMn0.T9V3-f3rD1deA5a2J-tYNw0cACEpzKHbhMPkc7gh8c0"
"data": {
"id": 5,
"phoneNumber": 89555555555,
"firstName": "Масяня",
"secondName": "Карлова",
"role": "dogsitter",
"location": "Россия, республика Татарстан, Казань, улица Пушкина, 12",
"price": 100,
"aboutMe": "Все на свете - собаки"
}
}

View File

@ -1,5 +1,3 @@
{
"message": "Такой пользователь уже был зарегистрирован",
"error": "Unauthorized",
"statusCode": 401
"error": "Пользователь с таким номером телефона уже существует"
}

View File

@ -1,3 +1,9 @@
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6Niwicm9sZSI6Im93bmVyIiwiaWF0IjoxNTE2MjM5MDIyfQ.qgOhk9tNcaMRbarRWISTgvGx5Eq_X8fcA5lhdVs2tQI"
"data": {
"id": 6,
"phoneNumber": 89888888888,
"firstName": "Генадий",
"secondName": "Паровозов",
"role": "owner"
}
}

View File

@ -1,4 +0,0 @@
{
"id": 1,
"role": "dogsitter"
}

View File

@ -1,5 +0,0 @@
{
"message": "Неверный jwt token",
"error": "Forbidden",
"statusCode": 403
}

View File

@ -1,4 +0,0 @@
{
"id": 3,
"role": "owner"
}

View File

@ -1,69 +1,39 @@
{
"data": [
{
"id": 1,
"phone_number": "89999999999",
"first_name": "Вася",
"second_name": "Пупкин",
"role": "dogsitter",
"location": "Россия, республика Татарстан, Казань, Пушкина, 12",
"price": "1500",
"about_me": "Я люблю собак!",
"rating": 5,
"ratings": [
5,
5
],
"tg": "jullllllie"
},
{
"id": 2,
"phone_number": 89272844541,
"first_name": "Ваня",
"second_name": "Пуськин",
"role": "dogsitter",
"location": "Россия, республика Татарстан, Казань, улица Абсалямова, 19",
"price": 2000,
"about_me": "Я не люблю собак. И вообще я котоман.",
"rating": 4,
"ratings": [
4,
4
],
"tg": "vanya006"
},
{
"id": 3,
"phone_number": 89559999999,
"first_name": "Гадий",
"second_name": "Петрович",
"role": "owner"
},
{
"id": 4,
"phone_number": 89872844591,
"first_name": "Галкин",
"second_name": "Максим",
"role": "dogsitter",
"location": "Россия, республика Татарстан, Казань, проспект Ямашева, 83",
"price": 1750,
"about_me": "Миллион алых роз",
"rating": 4.5,
"ratings": [
4,
5
],
"tg": "maks100500"
}
],
"interactions": [
{
"owner_id": 3,
"dogsitter_id": 4
},
{
"owner_id": 1,
"dogsitter_id": 2
}
]
}
[
{
"id": 1,
"phone_number": 89283244141,
"first_name": "Вася",
"second_name": "Пупкин",
"role": "dogsitter",
"location": "Россия, республика Татарстан, Казань, улица Пушкина, 12",
"price": 1500,
"about_me": "Я люблю собак"
},
{
"id": 2,
"phone_number": 89272844541,
"first_name": "Ваня",
"second_name": "Пуськин",
"role": "dogsitter",
"location": "Россия, республика Татарстан, Казань, улица Абсалямова, 19",
"price": 1000000,
"about_me": "Я не люблю собак. И вообще я котоман."
},
{
"id": 3,
"phone_number": 89872855893,
"first_name": "Гадий",
"second_name": "Петрович",
"role": "owner"
},
{
"id": 4,
"phone_number": 89872844591,
"first_name": "Галкин",
"second_name": "Максим",
"role": "dogsitter",
"location": "Россия, республика Татарстан, Казань, проспект Ямашева, 83",
"price": 1000000,
"about_me": "Миллион алых роз"
}
]

View File

@ -1,24 +0,0 @@
const { Schema, model } = require("mongoose");
const { DSF_AUTH_USER_MODEL_NAME, DSF_INTERACTION_MODEL_NAME } = require("../../const");
const interactionSchema = new Schema({
owner_id: {
type: Schema.Types.ObjectId,
ref: DSF_AUTH_USER_MODEL_NAME,
required: true
},
dogsitter_id: {
type: Schema.Types.ObjectId,
ref: DSF_AUTH_USER_MODEL_NAME,
required: true
},
timestamp: {
type: Date,
default: Date.now
}
});
interactionSchema.index({ owner_id: 1, dogsitter_id: 1 });
module.exports.Interaction = model(DSF_INTERACTION_MODEL_NAME, interactionSchema);

View File

@ -1,83 +0,0 @@
const { Schema, model } = require("mongoose");
const { DSF_AUTH_USER_MODEL_NAME } = require("../../const");
const userSchema = new Schema({
phone_number: {
type: String,
required: true,
unique: true,
match: /^\+?\d{10,15}$/
},
first_name: {
type: String,
required: true,
trim: true
},
second_name: {
type: String,
required: true,
trim: true
},
role: {
type: String,
enum: ["dogsitter", "owner"],
required: true
},
location: {
type: String,
required: function() {
return this.role === "dogsitter";
}
},
price: {
type: Number,
min: 0,
required: function() {
return this.role === "dogsitter";
}
},
about_me: {
type: String,
maxlength: 500
},
rating: {
type: Number,
min: 0,
max: 5,
default: 0
},
ratings: {
type: [Number],
default: [],
validate: {
validator: function(arr) {
return arr.every(v => v >= 0 && v <= 5);
},
message: "Рейтинг должен быть в диапазоне от 0 до 5!"
}
},
tg: {
type: String,
match: /^[a-zA-Z0-9_]{5,32}$/
},
created: {
type: Date,
default: Date.now
}
});
userSchema.virtual("id").get(function() {
return this._id.toHexString();
});
userSchema.set("toJSON", {
virtuals: true,
versionKey: false,
transform: function(doc, ret) {
delete ret._id;
delete ret.__v;
}
});
module.exports.User = model(DSF_AUTH_USER_MODEL_NAME, userSchema);

View File

@ -1,149 +0,0 @@
const { Router } = require('express')
const { expressjwt } = require('express-jwt')
const { getAnswer } = require('../../utils/common')
const { User, Interaction } = require('./model')
const { TOKEN_KEY } = require('./const')
const { requiredValidate } = require('./utils')
const router = Router()
// Получение списка пользователей
router.get('/users', async (req, res) => {
const users = await User.find()
.select('-__v -ratings -phone_number')
.lean()
console.log('get users successfull')
res.send(getAnswer(null, users))
})
// Получение конкретного пользователя
router.get('/dogsitter-viewing', async (req, res) => {
const { userId } = req.params
const user = await User.findById(userId)
.select('-__v -ratings')
.lean()
if (!user) {
return res.status(404).send(getAnswer(new Error('Пользователь не найден')))
}
res.send(getAnswer(null, user))
})
router.use(expressjwt({ secret: TOKEN_KEY, algorithms: ['HS256'] }))
// Добавление оценки пользователю
router.post('/dogsitter-viewing/rating', requiredValidate('value'), async (req, res) => {
const { userId } = req.params
const { value } = req.body
const authUserId = req.auth.id
try {
const user = await User.findById(userId)
if (!user) throw new Error('Пользователь не найден')
if (user.role !== 'dogsitter') throw new Error('Нельзя оценивать этого пользователя')
if (user.id === authUserId) throw new Error('Нельзя оценивать самого себя')
user.ratings.push(Number(value))
user.rating = user.ratings.reduce((a, b) => a + b, 0) / user.ratings.length
const updatedUser = await user.save()
res.send(getAnswer(null, {
id: updatedUser.id,
rating: updatedUser.rating.toFixed(1),
totalRatings: updatedUser.ratings.length
}))
} catch (error) {
res.status(400).send(getAnswer(error))
}
})
// Обновление информации пользователя
router.patch('/users', async (req, res) => {
const { userId } = req.params
const updates = req.body
try {
const user = await User.findByIdAndUpdate(userId, updates, { new: true })
.select('-__v -ratings')
if (!user) throw new Error('Пользователь не найден')
res.send(getAnswer(null, user))
} catch (error) {
res.status(400).send(getAnswer(error))
}
})
// Создание объекта взаимодействия
router.post('/interactions',
expressjwt({ secret: TOKEN_KEY, algorithms: ['HS256'] }),
requiredValidate('dogsitter_id'),
async (req, res) => {
try {
const { dogsitter_id } = req.body
const owner_id = req.auth.id // ID из JWT токена
// Проверка существования пользователей
const [owner, dogsitter] = await Promise.all([
User.findById(owner_id),
User.findById(dogsitter_id)
])
if (!owner || owner.role !== 'owner') {
throw new Error('Владелец не найден или имеет неверную роль')
}
if (!dogsitter || dogsitter.role !== 'dogsitter') {
throw new Error('Догситтер не найден или имеет неверную роль')
}
// Создание взаимодействия
const interaction = await Interaction.create({
owner_id,
dogsitter_id
})
res.send(getAnswer(null, {
id: interaction.id,
timestamp: interaction.timestamp
}))
} catch (error) {
res.status(400).send(getAnswer(error))
}
}
)
router.get('/interactions/check', async (req, res) => {
const { owner_id, dogsitter_id } = req.query;
if (!owner_id || !dogsitter_id) {
return res.status(400).send(getAnswer('Missing owner_id or dogsitter_id'));
}
try {
// Поиск взаимодействий по owner_id и dogsitter_id
const interactions = await Interaction.find({ owner_id, dogsitter_id })
.select('-__v') // Выбираем только нужные поля
.lean();
if (interactions.length === 0) {
return res.status(404).send(getAnswer('No interactions found'));
}
res.send(getAnswer(null, interactions));
} catch (error) {
console.error('Error checking interactions:', error);
res.status(500).send(getAnswer('Internal Server Error'));
}
});
module.exports = router

View File

@ -1,40 +1,16 @@
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 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 });
const master = await MasterModel.find({})
res.status(200).send({success: true, body: master})
} catch (error) {
next(error);
next(error)
}
});
})
router.delete('/masters/:id', async (req, res,next) => {
const { id } = req.params;

View File

@ -1,6 +1,5 @@
const { Schema, model } = require('mongoose')
const { orderStatus } = require('./const')
const { OrderNumberModel } = require('./order.number')
const schema = new Schema({
phone: {
@ -28,10 +27,6 @@ const schema = new Schema({
type: String,
required: true
},
orderNumber: {
type: String,
unique: true
},
status: {
type: String,
required: true,
@ -52,18 +47,6 @@ const schema = new Schema({
},
})
schema.pre('save', async function (next) {
if (this.isNew) {
const counter = await OrderNumberModel.findOneAndUpdate(
{ _id: 'orderNumber' },
{ $inc: { sequenceValue: 1 } },
{ new: true, upsert: true }
)
this.orderNumber = counter.sequenceValue.toString()
}
next()
})
schema.set('toJSON', {
virtuals: true,
versionKey: false,

View File

@ -1,14 +0,0 @@
const { Schema, model } = require('mongoose')
const schema = new Schema({
_id: {
type: String,
required: true,
},
sequenceValue: {
type: Number,
default: 0
}
})
exports.OrderNumberModel = model('dry-wash-order-number', schema)

View File

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

View File

@ -1,9 +1,44 @@
const router = require('express').Router();
const { expressjwt } = require('express-jwt')
const axios = require('axios');
const jwt = require('jsonwebtoken')
const { ResultsModel } = require('./model/results')
const { TOKEN_KEY } = require('./const')
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) => {
@ -17,16 +52,6 @@ router.get('/getInfoAboutKazan', (request, response) => {
}
});
router.get('/getServices', (request, response) => {
const lang = request.query.lang || 'ru';
try {
const data = require(`./json/first/services/${lang}/success.json`);
response.send(data);
} catch (error) {
response.status(404).send({ message: 'Language not found' });
}
})
router.get('/getNews', (request, response) => {
const lang = request.query.lang || 'ru';
try {
@ -222,89 +247,4 @@ router.post('/registration', async (request, response) => {
}
});
router.post('/signin', async (req, res) => {
const { user } = req.body
if (!user || !user.token) {
return res.status(404).json({error : "No user found"});
}
const valRes = await axios.get('https://antd-table-v2-backend.onrender.com/api/auth/check',
{
headers: {
'authorization': `Bearer ${user.token}`
}
}
)
if (valRes.status !== 200) {
return res.status(401).json({error : "User authorization error"});
}
const accessToken = jwt.sign({
...JSON.parse(JSON.stringify(user._id)),
}, TOKEN_KEY, {
expiresIn: '12h'
})
user.token = accessToken;
res.json(user)
})
router.use(
expressjwt({
secret: TOKEN_KEY,
algorithms: ['HS256'],
getToken: function fromHeaderOrQuerystring(req) {
if (req.headers.authorization && req.headers.authorization.split(" ")[0] === "Bearer")
return req.headers.authorization.split(" ")[1];
else if (req.query && req.query.token)
return req.query.token;
return null;
}
})
)
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: [] });
}
const itemToOverride = userResults.items.find(item => item.quizId === quizId)
if (!itemToOverride) {
userResults.items.push({ quizId, result });
}
else {
itemToOverride.result = result;
}
await userResults.save();
response.status(200).send({ message: 'Quiz result added successfully' });
} catch (error) {
response.status(500).send({ message: 'An error occurred while adding quiz result' });
}
});
module.exports = router;

View File

@ -1,102 +0,0 @@
{
"banks": [
{
"name": "Sberbank of Russia",
"description": "One of the largest and most popular banks in Russia. There are many branches and ATMs in Kazan. Sberbank offers a wide range of services, including loans, deposits, insurance, business services, and online banking."
},
{
"name": "VTB",
"description": "The second largest bank in Russia, with many offices and ATMs in Kazan. VTB offers various financial products for individuals and businesses, including loans, deposits, investment solutions, and cards."
},
{
"name": "Tinkoff Bank",
"description": "Although Tinkoff does not have traditional offices in Kazan, its products and services are available in the city through online banking and remote services. Tinkoff offers favorable terms for credit cards, deposits, and services for small and medium-sized businesses."
},
{
"name": "Alfa-Bank",
"description": "One of the largest private banks in Russia, with offices in Kazan. Alfa-Bank offers standard banking services such as loans, deposits, cards, as well as investment and insurance products."
},
{
"name": "Rosselkhozbank",
"description": "Rosselkhozbank is also present in Kazan, specializing in servicing the agro-industrial complex, but also provides services for individuals and businesses, including loans, deposits, and cards."
},
{
"name": "RBC Bank",
"description": "A Russian bank with several offices and ATMs in Kazan. It offers loans, cards, deposits, and business services."
},
{
"name": "Bank Saint Petersburg",
"description": "A local bank that also provides services in Kazan. It offers a wide range of banking products for individuals and businesses."
}
],
"hospitals": [
{
"name": "Kazan City Clinical Hospital No. 1",
"description": "One of the largest multidisciplinary hospitals in Kazan, offering services in surgery, traumatology, neurology, cardiology, and other medical fields. Modern technologies and highly qualified staff."
},
{
"name": "Republican Clinical Hospital",
"description": "The main medical organization of the Republic of Tatarstan, providing a wide range of services for adults and children, including emergency care, high-tech surgeries, and diagnostics."
},
{
"name": "City Hospital No. 7",
"description": "A hospital specializing in providing medical care in therapeutic, surgical, and resuscitation medicine. The hospital employs experienced specialists and uses modern treatment methods."
},
{
"name": "Kazan Children's Clinical Hospital",
"description": "A specialized medical facility for children, providing services for the treatment of diseases related to pediatrics, surgery, cardiology, and other fields for children of all ages."
},
{
"name": "Kazan Oncology Dispensary",
"description": "A medical institution specializing in the treatment of oncological diseases. It uses the latest methods of cancer diagnosis and treatment, including chemotherapy, radiotherapy, and surgical interventions."
},
{
"name": "City Hospital No. 18",
"description": "A multidisciplinary medical institution offering treatment in various medical fields, including traumatology, neurology, and cardiology. The hospital has a rehabilitation department for patients recovering from serious diseases."
},
{
"name": "Republican Hospital for War Veterans",
"description": "A medical institution providing specialized care for World War II veterans, disabled individuals, and elderly people. It also offers a wide range of services for citizens with chronic diseases."
}
],
"pharmacies": [
{
"name": "Apteka 36.6",
"description": "A pharmacy chain with a wide range of medications, vitamins, cosmetics, and health products. Loyalty programs and online orders for customer convenience."
},
{
"name": "Rigla",
"description": "One of the largest pharmacy chains in Russia. It offers a wide range of medicines, medical products, and cosmetics. It also provides the option to order online."
},
{
"name": "Zdorovaya Semya",
"description": "A pharmacy chain focused on the sale of medicines and health products, including medical equipment. Often runs promotions and discounts on popular items."
},
{
"name": "A5 Pharmacy Chain",
"description": "Pharmacies offering a wide range of products, including medicines, vitamins, cosmetics, and children's products. Convenient delivery and online order services."
},
{
"name": "Samson-Pharma Pharmacy",
"description": "A pharmacy chain offering customers all necessary medicines and health products. Pharmacies offer various discount and bonus programs for regular customers."
},
{
"name": "Tsvetnoy Pharmacy Chain",
"description": "Pharmacies known for their convenient locations and high-quality service. They sell medicines, vitamins, self-care products, and medical equipment."
},
{
"name": "Doctor Stoletev Pharmacy",
"description": "A pharmacy chain focused on selling pharmaceutical products, medical goods, and cosmetics. Convenient service and promotions for customers."
}
],
"airports": [
{
"name": "Kazan International Airport",
"description": "The main airport of the city of Kazan, serving international and domestic flights. The airport is equipped with modern terminals, comfortable waiting areas, shops, and restaurants. It is one of the largest in the Volga region and an important transport hub for Tatarstan."
},
{
"name": "Kazan-2 (when it was operational)",
"description": "Previously used for domestic flights and military needs. It is no longer fully operational as all passenger flights have been redirected to Kazan International Airport. The airport building is closed for commercial air traffic."
}
]
}

View File

@ -1,102 +0,0 @@
{
"banks": [
{
"name": "Сбербанк России",
"description": "Один из крупнейших и самых популярных банков в России. В Казани есть множество отделений и банкоматов. Сбербанк предлагает широкий спектр услуг, включая кредиты, депозиты, страхование, обслуживание бизнеса и онлайн-банкинг."
},
{
"name": "ВТБ",
"description": "Второй по величине банк в России, с большим количеством офисов и банкоматов в Казани. ВТБ предлагает различные финансовые продукты для физических и юридических лиц, включая кредиты, вклады, инвестиционные решения и карты."
},
{
"name": "Тинькофф Банк",
"description": "Несмотря на то что у Тинькофф нет традиционных офисов в Казани, его продукты и услуги доступны в городе через онлайн-банкинг и удаленное обслуживание. Тинькофф предлагает выгодные условия по кредитным картам, вклады, а также услуги для малого и среднего бизнеса."
},
{
"name": "Альфа-Банк",
"description": "Один из крупных частных банков в России, с офисами в Казани. Альфа-Банк предлагает стандартные банковские услуги, такие как кредиты, депозиты, карты, а также инвестиционные и страховые продукты."
},
{
"name": "Россельхозбанк",
"description": "В Казани также присутствует Россельхозбанк, специализирующийся на обслуживании агропромышленного комплекса, но также предоставляет услуги для физических и юридических лиц, включая кредиты, депозиты и карты."
},
{
"name": "РБК Банк",
"description": "Российский банк с рядом офисов и банкоматов в Казани. Предлагает кредиты, карты, депозиты, а также обслуживание для бизнеса."
},
{
"name": "Банк Санкт-Петербург",
"description": "Местный банк, который также предоставляет услуги в Казани. Предлагает широкий выбор банковских продуктов для частных лиц и бизнеса."
}
],
"hospitals": [
{
"name": "Казанская городская клиническая больница №1",
"description": "Одна из крупнейших многопрофильных больниц Казани, предлагающая услуги в области хирургии, травматологии, неврологии, кардиологии и других медицинских направлений. Современные технологии и высококвалифицированный персонал."
},
{
"name": "Республиканская клиническая больница",
"description": "Основная медицинская организация Республики Татарстан, предоставляющая широкий спектр услуг для взрослых и детей, включая экстренную помощь, высокотехнологичные операции и диагностику."
},
{
"name": "Городская больница №7",
"description": "Больница, специализирующаяся на оказании медицинской помощи в области терапевтической, хирургической и реанимационной медицины. В больнице работают опытные специалисты, используемые современные методы лечения."
},
{
"name": "Казанская детская клиническая больница",
"description": "Профильное медицинское учреждение для детей, которое предоставляет услуги по лечению заболеваний, связанных с педиатрией, хирургией, кардиологией и другими направлениями для детей всех возрастов."
},
{
"name": "Казанский онкологический диспансер",
"description": "Медицинское учреждение, специализирующееся на лечении онкологических заболеваний. Использует новейшие методы диагностики и лечения рака, включая химиотерапию, радиотерапию и операционные вмешательства."
},
{
"name": "Городская больница №18",
"description": "Многопрофильное медицинское учреждение, предлагающее лечение в различных областях медицины, включая травматологию, неврологию и кардиологию. В больнице есть отделение для реабилитации пациентов после тяжелых заболеваний."
},
{
"name": "Республиканская больница для ветеранов войн",
"description": "Медицинское учреждение, оказывающее специализированную помощь ветеранам Великой Отечественной войны, инвалидам и пожилым людям. Также предлагает широкий спектр услуг для граждан с хроническими заболеваниями."
}
],
"pharmacies": [
{
"name": "Аптека 36,6",
"description": "Сеть аптек с большим ассортиментом лекарственных средств, витаминов, косметики и товаров для здоровья. Программы лояльности и онлайн-заказы для удобства клиентов."
},
{
"name": "Ригла",
"description": "Одна из крупнейших аптечных сетей в России. Предлагает широкий выбор лекарств, медицинских товаров и косметики. Также предоставляет возможность заказа через интернет."
},
{
"name": "Здоровая семья",
"description": "Аптечная сеть, ориентированная на продажу лекарств и товаров для здоровья, включая медицинскую технику. Часто проводятся акции и скидки на популярные товары."
},
{
"name": "Аптечная сеть 'А5'",
"description": "Аптеки, предлагающие широкий ассортимент товаров, включая лекарства, витамины, косметику и товары для детей. Удобные услуги доставки и онлайн-заказов."
},
{
"name": "Аптека 'Самсон-Фарма'",
"description": "Сеть аптек, предоставляющая клиентам все необходимые лекарства и товары для здоровья. Аптеки предлагают различные программы скидок и бонусов для постоянных клиентов."
},
{
"name": "Аптечная сеть 'Цветной'",
"description": "Аптеки, известные своими удобными местоположениями и качественным обслуживанием. В продаже лекарства, витамины, товары для ухода за собой и медтехника."
},
{
"name": "Аптека 'Доктор Столетов'",
"description": "Сеть аптек, ориентированная на продажу фармацевтической продукции, медицинских товаров и косметики. Удобный сервис и акции для клиентов."
}
],
"airports": [
{
"name": "Международный аэропорт Казань",
"description": "Главный аэропорт города Казани, обслуживающий международные и внутренние рейсы. Аэропорт оснащен современными терминалами, удобными зонами ожидания, магазинами и ресторанами. Он является одним из крупнейших в Поволжье и важным транспортным узлом для Татарстана."
},
{
"name": "Казань-2 (когда был действующим)",
"description": "Ранее используемый аэропорт для внутренних рейсов и военных нужд. В настоящее время не функционирует в полном объеме, поскольку все пассажирские рейсы перенаправлены в Международный аэропорт Казань. Здание аэропорта закрыто для коммерческих авиаперевозок."
}
]
}

View File

@ -1,102 +0,0 @@
{
"banks": [
{
"name": "Россия Сбербанкы",
"description": "Россиядәге иң зур һәм популяр банкларның берсе. Казан шәһәрендә күпсанлы бүлекләр һәм банкоматлар бар. Сбербанк киң спектрлы хезмәтләр тәкъдим итә, шул исәптән кредитлар, депозиты, иминиятләштерү, бизнеска хезмәт күрсәтү һәм онлайн-банкчылык."
},
{
"name": "ВТБ",
"description": "Россиядә икенче зурлыктагы банк, Казан шәһәрендә күп санлы офислар һәм банкоматлар белән. ВТБ физик һәм юридик затлар өчен төрле финанс продуктларын тәкъдим итә, шул исәптән кредитлар, депозитлар, инвестицион чишелешләр һәм карталар."
},
{
"name": "Тинькофф Банк",
"description": "Тинькофф Казан шәһәрендә традицион офисларга ия булмаса да, аның продуктлары һәм хезмәтләре шәһәрдә онлайн-банкчылык һәм ерак хезмәт күрсәтү аша тәкъдим ителә. Тинькофф кредит карталары, депозитлар, шулай ук кечкенә һәм урта бизнес өчен хезмәтләр тәкъдим итә."
},
{
"name": "Альфа-Банк",
"description": "Россиядәге зур шәхси банкларның берсе, Казанда офислары белән. Альфа-Банк стандарт банк хезмәтләрен тәкъдим итә, шул исәптән кредитлар, депозитлар, карталар, шулай ук инвестицион һәм иминият продуктлары."
},
{
"name": "Россельхозбанк",
"description": "Казан шәһәрендә Россельхозбанк та бар, ул агропромышленность өлкәсендә хезмәт күрсәтүгә махсуслашкан, ләкин шулай ук физик һәм юридик затлар өчен хезмәтләр тәкъдим итә, шул исәптән кредитлар, депозитлар һәм карталар."
},
{
"name": "РБК Банк",
"description": "Казан шәһәрендә офислары һәм банкоматлары булган Россия банкы. Кредитлар, карталар, депозитлар һәм бизнеска хезмәт күрсәтү тәкъдим итә."
},
{
"name": "Санкт-Петербург Банкы",
"description": "Казан шәһәрендә дә хезмәт күрсәткән җирле банк. Ул шәхси затлар һәм бизнес өчен киң банк продуктлары сайлау тәкъдим итә."
}
],
"hospitals": [
{
"name": "Казан шәһәр клиник хастаханәсе №1",
"description": "Казанның иң зур күппрофильле хастаханәләренең берсе, хирургия, травматология, неврология, кардиология һәм башка медицина юнәлешләре буенча хезмәтләр тәкъдим итә. Замана технологияләре һәм югары квалификацияле персонал."
},
{
"name": "Республиканың клиник хастаханәсе",
"description": "Татарстан Республикасы өчен төп медицина оешмасы, зур спектрдагы хезмәтләрне тәкъдим итә, шул исәптән ашыгыч ярдәм, югары технологияле операцияләр һәм диагностика."
},
{
"name": "Шәһәр хастаханәсе №7",
"description": "Терапевтик, хирургик һәм реанимация медицинасы өлкәсендә медицина ярдәме күрсәтүгә махсуслашкан хастаханә. Хастаханәдә тәҗрибәле белгечләр эшли, заманча дәвалау ысуллары кулланыла."
},
{
"name": "Казан балалар клиник хастаханәсе",
"description": "Балалар өчен профильле медицина учреждениесе, педиатрия, хирургия, кардиология һәм башка юнәлешләр буенча хезмәтләр тәкъдим итә."
},
{
"name": "Казан онкология диспансеры",
"description": "Онкологик авыруларны дәвалауга махсуслашкан медицина учреждениесе. Рак диагнозын һәм дәвалауны үткәрүдә заманча ысуллар кулланыла, шул исәптән химиотерапия, радиотерапия һәм операцияләр."
},
{
"name": "Шәһәр хастаханәсе №18",
"description": "Күппрофильле медицина учреждениесе, төрле медицина өлкәләрендә дәвалау тәкъдим итә, шул исәптән травматология, неврология һәм кардиология. Хастаханәдә авыр авырулардан соң реабилитация бүлекләре бар."
},
{
"name": "Ветераннар өчен республика хастаханәсе",
"description": "Бөек Ватан сугышы ветераннарына, инвалидларга һәм картларга махсус медицина ярдәме күрсәтүче учреждение. Шулай ук хроник авырулары булган гражданнар өчен хезмәтләр тәкъдим итә."
}
],
"pharmacies": [
{
"name": "Аптека 36,6",
"description": "Дәреслекләр, витаминнар, косметика һәм сәламәтлек товарларының киң ассортименты булган аптека челтәре. Лояльлек программалары һәм онлайн-заказлар клиентлар өчен уңайлы."
},
{
"name": "Ригла",
"description": "Россиядәге иң зур аптекалар челтәрләренең берсе. Дәреслекләр, медицина товарлары һәм косметика тәкъдим итә. Шулай ук интернет аша заказ бирү мөмкинлеге бар."
},
{
"name": "Здоровая семья",
"description": "Дәреслекләр һәм сәламәтлек товарлары, шул исәптән медицина техникасы сатуга юнәлдерелгән аптека челтәре. Популяр товарларга акцияләр һәм ташламалар еш үткәрелә."
},
{
"name": "Аптечная сеть 'А5'",
"description": "Дәреслекләр, витаминнар, косметика һәм балалар товарларының киң ассортименты булган аптека челтәре. Уңайлы җибәрү һәм онлайн-заказлар хезмәтләре."
},
{
"name": "Аптека 'Самсон-Фарма'",
"description": "Дәреслекләр һәм сәламәтлек товарлары тәкъдим итә торган аптека челтәре. Аптекалар даими клиентлар өчен скидкалар һәм бонуслар тәкъдим итә."
},
{
"name": "Аптечная сеть 'Цветной'",
"description": "Уңайлы урнашкан һәм сыйфатлы хезмәт күрсәтү белән танылган аптекалар. Дәреслекләр, витаминнар, үз-үзеңне карау товарлары һәм медицина техникасы сатыла."
},
{
"name": "Аптека 'Доктор Столетов'",
"description": "Фармацевтик продукция, медицина товарлары һәм косметика сату белән шөгыльләнгән аптека челтәре. Уңайлы хезмәт һәм клиентлар өчен акцияләр."
}
],
"airports": [
{
"name": "Казан Халыкара Аэропорты",
"description": "Казанның төп аэропорты, халыкара һәм эчке рейсларны башкаручы. Аэропорт заманча терминаллар, уңайлы көтү зоналары, кибетләр һәм рестораннар белән җиһазландырылган. Ул Поволжье төбәгендә иң зур аэропортларның берсе һәм Татарстан өчен мөһим транспорт узелы."
},
{
"name": "Казан-2 (эшләгән вакытта)",
"description": "Элекке эчке рейслар һәм хәрби кирәклекләр өчен кулланылган аэропорт. Хәзерге вакытта тулы көченә эшләми, чөнки барлык пассажир рейслары Казан Халыкара Аэропортына күчерелгән. Аэропорт бинасы коммерция авиаперевозкалары өчен ябык."
}
]
}

View File

@ -788,121 +788,5 @@
"image_url": "w_six"
}
]
},
"history": {
"intro_text": "Let's see how well you know UNICS!",
"intro_image": "culture",
"questions": [
{
"question": "When was Kazan founded?",
"options": [
"1005",
"1156",
"1230",
"1323"
],
"correct_answer": "1005",
"image_url": "culture"
},
{
"question": "What is the main river flowing through Kazan?",
"options": [
"Volga",
"Kazanka",
"Kama",
"Izh"
],
"correct_answer": "Kazanka",
"image_url": "culture"
},
{
"question": "Who was the first khan of Kazan?",
"options": [
"Ulugh Muhammad",
"Akhmat",
"Shah Ali",
"Mamuka"
],
"correct_answer": "Ulugh Muhammad",
"image_url": "culture"
},
{
"question": "What is the name of Kazan's main sports complex where the 2013 Universiade was held?",
"options": [
"Kazan Arena",
"Tatneft Arena",
"Bugulma Arena",
"Ak Bars Sports Palace"
],
"correct_answer": "Kazan Arena",
"image_url": "culture"
},
{
"question": "Which mosque in Kazan is considered one of the largest in Russia?",
"options": [
"Kul Sharif Mosque",
"Mari El Mosque",
"Aisha Mosque",
"Imam Muhammad Mosque"
],
"correct_answer": "Kul Sharif Mosque",
"image_url": "culture"
},
{
"question": "What is the name of the square where the Kazan Kremlin and Kul Sharif Mosque are located?",
"options": [
"Vakhitov Square",
"Freedom Square",
"Kremlin Square",
"Revolution Square"
],
"correct_answer": "Kremlin Square",
"image_url": "culture"
},
{
"question": "What symbol of Kazan is depicted on the city's coat of arms?",
"options": [
"Dragon",
"Tiger",
"Lion",
"Eagle"
],
"correct_answer": "Dragon",
"image_url": "culture"
},
{
"question": "Who was the architect of the Kazan Kremlin?",
"options": [
"Ivan Zarudny",
"Fyodor Benjamin",
"Andrey Ushakov",
"Yury Dashevsky"
],
"correct_answer": "Andrey Ushakov",
"image_url": "culture"
},
{
"question": "Which of these universities is located in Kazan?",
"options": [
"Moscow State University",
"Kazan Federal University",
"St. Petersburg Polytechnic University",
"Novosibirsk State University"
],
"correct_answer": "Kazan Federal University",
"image_url": "culture"
},
{
"question": "What is the name of the largest street in Kazan, which is also the center of the city's nightlife?",
"options": [
"Kremlin Street",
"Bauman Street",
"Pushkin Street",
"Kayum Nasyri Street"
],
"correct_answer": "Bauman Street",
"image_url": "culture"
}
]
}
}

View File

@ -788,121 +788,5 @@
"image_url": "w_six"
}
]
},
"history": {
"intro_text": "Давайте узнаем, насколько вы хорошо знаете историю Казани!",
"intro_image": "culture",
"questions": [
{
"question": "Когда Казань была основана?",
"options": [
"1000 год",
"1156 год",
"1230 год",
"1323 год"
],
"correct_answer": "1000 год",
"image_url": "culture"
},
{
"question": "Как называется главная река, протекающая через Казань?",
"options": [
"Волга",
"Казанка",
"Кама",
"Иж"
],
"correct_answer": "Казанка",
"image_url": "culture"
},
{
"question": "Кто был первым казанским ханом?",
"options": [
"Улу-Мухаммед",
"Ахмат",
"Шах-Али",
"Мамука"
],
"correct_answer": "Улу-Мухаммед",
"image_url": "culture"
},
{
"question": "Как называется главный спортивный комплекс Казани, где проводились Универсиада 2013 года?",
"options": [
"Казан Арена",
"Татнефть Арена",
"Бугульминская арена",
"Дворец спорта \"Ак Барс\""
],
"correct_answer": "Казан Арена",
"image_url": "culture"
},
{
"question": "Какая мечеть в Казани считается одной из самых больших в России?",
"options": [
"Мечеть Кул Шариф",
"Мечеть Марий Эл",
"Мечеть Айша",
"Мечеть имама Мухаммада"
],
"correct_answer": "Мечеть Кул Шариф",
"image_url": "culture"
},
{
"question": "Как называется площадь, на которой расположены Казанский Кремль и мечеть Кул Шариф?",
"options": [
"Площадь Вахитова",
"Площадь Свободы",
"Площадь Кремля",
"Площадь Революции"
],
"correct_answer": "Площадь Кремля",
"image_url": "culture"
},
{
"question": "Какой символ Казани изображён на гербе города?",
"options": [
"Дракон",
"Тигр",
"Лев",
"Орел"
],
"correct_answer": "Дракон",
"image_url": "culture"
},
{
"question": "Какой архитектор спроектировал Казанский Кремль?",
"options": [
"Иван Зарудный",
"Фёдор Бенжамин",
"Андрей Ушаков",
"Юрий Дашевский"
],
"correct_answer": "Андрей Ушаков",
"image_url": "culture"
},
{
"question": "Какой из этих вузов находится в Казани?",
"options": [
"Московский государственный университет",
"Казанский федеральный университет",
"Санкт-Петербургский политехнический университет",
"Новосибирский государственный университет"
],
"correct_answer": "Казанский федеральный университет",
"image_url": "culture"
},
{
"question": "Как называется крупнейшая в Казани улица, которая также является центром ночной жизни города?",
"options": [
"Кремлевская улица",
"Баумана улица",
"Пушкина улица",
"Каюма Насыри улица"
],
"correct_answer": "Баумана улица",
"image_url": "culture"
}
]
}
}

View File

@ -788,121 +788,5 @@
"image_url": "w_six"
}
]
},
"history": {
"intro_text": "Әйдәгез, Казан тарихын белүегезне ачыклыйк!",
"intro_image": "culture",
"questions": [
{
"question": "Казан кайчан нигезләнгән?",
"options": [
"1000 ел",
"1156 ел",
"1230 ел",
"1323 ел"
],
"correct_answer": "1000 ел",
"image_url": "culture"
},
{
"question": "Казан аша агучы төп елга ничек атала?",
"options": [
"Идел",
"Казанка",
"Кама",
"Иж"
],
"correct_answer": "Казанка",
"image_url": "culture"
},
{
"question": "Казанның беренче ханы кем булган?",
"options": [
"Олуг Мөхәммәт",
"Әхмәт",
"Шаһ-Әли",
"Мамука"
],
"correct_answer": "Олуг Мөхәммәт",
"image_url": "culture"
},
{
"question": "2013 елда Универсиада узган Казанның төп спорт комплексы ничек атала?",
"options": [
"Казан Арена",
"Татнефть Арена",
"Бөгелмә Арена",
"Ак Барс спорт сарае"
],
"correct_answer": "Казан Арена",
"image_url": "culture"
},
{
"question": "Казандагы иң зур мәчетләрнең берсе Россиядәге кайсысы?",
"options": [
"Кол Шәриф мәчете",
"Марий Эл мәчете",
"Айша мәчете",
"Имам Мөхәммәт мәчете"
],
"correct_answer": "Кол Шәриф мәчете",
"image_url": "culture"
},
{
"question": "Казан Кремле һәм Кол Шәриф мәчете урнашкан мәйдан ничек атала?",
"options": [
"Вахитов мәйданы",
"Ирек мәйданы",
"Кремль мәйданы",
"Революция мәйданы"
],
"correct_answer": "Кремль мәйданы",
"image_url": "culture"
},
{
"question": "Казан гербында кайсы символ сурәтләнгән?",
"options": [
"Аждаһа",
"Юлбарыс",
"Арслан",
"Бүре"
],
"correct_answer": "Аждаһа",
"image_url": "culture"
},
{
"question": "Казан Кремленең архитекторын атагыз.",
"options": [
"Иван Зарудный",
"Фёдор Бенжамин",
"Андрей Ушаков",
"Юрий Дашевский"
],
"correct_answer": "Андрей Ушаков",
"image_url": "culture"
},
{
"question": "Бу югары уку йортларының кайсысы Казанда урнашкан?",
"options": [
"Мәскәү дәүләт университеты",
"Казан федераль университеты",
"Санкт-Петербург политехник университеты",
"Новосибирск дәүләт университеты"
],
"correct_answer": "Казан федераль университеты",
"image_url": "culture"
},
{
"question": "Казандагы иң зур урам ничек атала? Ул шулай ук шәһәрнең төнге тормыш үзәге булып тора.",
"options": [
"Кремль урамы",
"Бауман урамы",
"Пушкин урамы",
"Каюм Насыйри урамы"
],
"correct_answer": "Бауман урамы",
"image_url": "culture"
}
]
}
}

View File

@ -0,0 +1,17 @@
[
{
"id": 0,
"description": "10 часто используемых",
"imageFilename": "kart1.jpg"
},
{
"id": 1,
"description": "10 слов в Data Science",
"imageFilename": "kart1.jpg"
},
{
"id": 2,
"description": "IT Basics Dictionary",
"imageFilename": "kart1.jpg"
}
]

View File

@ -6,14 +6,18 @@
"id": 0,
"word": "Tech",
"definition": "short for technical, relating to the knowledge, machines, or methods used in science and industry. Tech is a whole industry, which includes IT",
"examples": ["“As a DevOps engineer I have been working in Tech since 2020.”"],
"examples": [
"“As a DevOps engineer I have been working in Tech since 2020.”"
],
"synonyms": ["IT"]
},
{
"id": 1,
"word": "career path",
"definition": "the series of jobs or roles that constitute a person's career, especially one in a particular field",
"examples": ["“Technology is an evolving field with a variety of available career paths.”"],
"examples": [
"“Technology is an evolving field with a variety of available career paths.”"
],
"synonyms": []
}
]
@ -142,5 +146,130 @@
]
}
]
},
{
"id": 2,
"words": [
{
"id": 0,
"word": "software",
"translation": "программное обеспечение",
"definition": "A collection of computer instructions that perform a specific task, typically for use by humans or machines.",
"synonyms": ["код", "приложение", "управление программами"],
"examples":
[
"I need to update the software on my new laptop.",
"The company uses Windows as its operating system."
]
},
{
"id": 1,
"word": "hardware",
"translation": "железо",
"definition": "Physical components of a computer that process information, including processors and storage devices.",
"synonyms": ["equipment", "приборы", "оборудование"],
"examples":
[
"The keyboard is part of the hardware on this device.",
"They upgraded their router to improve internet speed."
]
},
{
"id": 2,
"word": "network",
"translation": "сети",
"definition": "A system of interconnected devices that communicate with each other through data transmission over a networked medium.",
"synonyms": ["трансляция", "коммуникации", "диалог"],
"examples":
[
"We use the internet to connect our devices in the same area.",
"The company relies on their internal network for data sharing."
]
},
{
"id": 3,
"word": "algorithm",
"translation": "алгоритм",
"definition": "A set of instructions that a computer follows to solve a problem or achieve a specific task.",
"synonyms": ["процесс", "схема", "текст"],
"examples":
[
"The algorithm for sorting numbers is easy to follow.",
"The new software includes an advanced algorithm."
]
},
{
"id": 4,
"word": "encryption",
"translation": "криптография",
"definition": "A technique that transforms information into a secure form, making it unreadable without the appropriate key.",
"synonyms": ["шифрование", "окрышение", "опциональное"],
"examples":
[
"Our data is encrypted to ensure its privacy and security.",
"I need to use an encryption program for my important documents."
]
},
{
"id": 5,
"word": "debugging",
"translation": "поиск и исправление ошибок",
"definition": "The process of identifying and correcting errors or defects in a computer program.",
"synonyms": ["исправление", "сканирование", "анализ"],
"examples":
[
"I need to debug the code for this new project.",
"We use automated tools to find bugs."
]
},
{
"id": 6,
"word": "API",
"translation": "интерфейс приложения",
"definition": "A set of rules and protocols that enables communication between software applications, typically over a network.",
"synonyms": ["серверное программирование", "функциональная структура"],
"examples":
[
"We use the API for our mobile app to access data from the backend server.",
"I need to write an API for connecting my devices to the internet."
]
},
{
"id": 7,
"word": "virtual",
"translation": "виртуальный",
"definition": "A representation of a thing that does not exist physically but exists in digital form.",
"synonyms": ["высокопроизводительный", "представление", "цифровой"],
"examples":
[
"I use virtual reality to experience different environments.",
"Our company offers virtual office spaces for remote work."
]
},
{
"id": 8,
"word": "infrastructure",
"translation": "инфраструктура",
"definition": "The underlying systems and equipment of a computer network or organization, including hardware, software, and physical connections.",
"synonyms": ["оборудование", "устройство", "системы"],
"examples":
[
"Our IT infrastructure is robust to ensure reliable operations.",
"They need to improve their internet infrastructure for better connectivity."
]
},
{
"id": 9,
"word": "hacker",
"translation": "хакер",
"definition": "A skilled individual who uses computer technology to break into and misuse a system or network.",
"synonyms": ["дезориентированный", "манипулятор", "прокурор"],
"examples":
[
"I need to avoid getting involved with hackers.",
"They were caught hacking into the company's confidential database."
]
}
]
}
]

View File

@ -1,26 +0,0 @@
[
{
"id": 1,
"description": "10 слов в Data Science",
"imageFilename": "kart1.jpg",
"words": [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
},
{
"id": 2,
"description": "Job Interview",
"imageFilename": "kart1.jpg",
"words": [13, 14, 15, 16, 17, 18, 19, 20, 21, 22]
},
{
"id": 3,
"description": "ReactJS",
"imageFilename": "kart1.jpg",
"words": [23, 24, 25, 26, 27, 28, 29, 30, 31, 32]
},
{
"id": 4,
"description": "NodeJS",
"imageFilename": "kart1.jpg",
"words": [33, 34, 35, 36, 37, 38, 39, 40, 41, 42]
}
]

View File

@ -1,99 +1,42 @@
const fs = require('fs');
const path = require('path');
const router = require('express').Router();
const router = require("express").Router();
module.exports = router;
const dictionaries = require('./dictionaries.json');
const words = require('../words/words.json');
const data = require("./data/dictionaries.json");
const wordsData = require("./data/dictionaryWords.json");
router.get('/', (req, res) => {
res.send(dictionaries);
});
router.get('/:id', (req, res) => {
const id = parseInt(req.params.id);
if (!id || isNaN(id)) {
return res.status(400).send('Invalid ID'); // Bad request
}
if (!dictionaries) {
return res.status(500).send('No data to update'); // Internal server error
}
const dictionary = dictionaries.find((dictionary) => dictionary.id === id);
if (!dictionary) {
return res.status(404).send('Not found');
}
const dictionaryWords = dictionary.words.map((wordId) => {
const word = words.find((word) => word.id === wordId);
return { ...word, ...word };
});
res.send({ ...dictionary, words: dictionaryWords });
});
router.post('/:id', (req, res) => {
const id = parseInt(req.params.id);
if (!id || isNaN(id)) {
return res.status(400).send('Invalid ID'); // Bad request
}
if (!dictionaries) {
return res.status(500).send('No data to update'); // Internal server error
}
const dictionary = dictionaries.find((dictionary) => dictionary.id === id);
if (!dictionary) {
return res.status(404).send('Not found');
}
const newWord = req.body;
if (!newWord) {
return res.status(400).send('No data to add'); // Bad request
}
console.log(newWord);
if (isNaN(newWord.id)) {
return res.status(400).send('Invalid word ID'); // Bad request
}
dictionary.words.push(newWord.id);
fs.writeFile(path.join(__dirname, 'dictionaries.json'), JSON.stringify(dictionaries), (err) => {
if (err) {
console.error(err); // Log the error
return res.status(500).send('Error saving data');
}
res.status(200).json(dictionary); // Send back the updated data
});
router.get("/", (req, res) => {
res.send(data);
});
// Put new dictionary to the array of dictionaries
router.put('/', (req, res) => {
if (!dictionaries || !Array.isArray(dictionaries)) {
router.put('/new', (req, res) => {
if (!data || !Array.isArray(data)) {
return res.status(400).send('No array of dictionaries found`');
}
const newData = req.body;
const updatedData = req.body;
if (!newData) {
return res.status(400).send('No data to add'); // Bad request
if (!updatedData) {
return res.status(400).send('No data to update'); // Bad request
}
if (!dictionaries) {
if (!data) {
return res.status(500).send('No data to update'); // Internal server error
}
const indexedUpdatedData = { ...newData, id: dictionaries.length + 1 }; // Add the new dictionary to the array
const indexedUpdatedData = { id: data.length, ...updatedData }; // Add the new dictionary to the array
dictionaries.push(indexedUpdatedData); // Add the new dictionary to the array
data.push(indexedUpdatedData); // Add the new dictionary to the array
fs.writeFile(path.join(__dirname, 'dictionaries.json'), JSON.stringify(dictionaries), (err) => {
fs.writeFile(path.join(__dirname, 'data/dictionaries.json'), JSON.stringify(data), (err) => {
if (err) {
console.error(err); // Log the error
return res.status(500).send('Error saving data');
}
res.status(200).json(dictionaries); // Send back the updated data
res.status(200).json(data); // Send back the updated data
});
});
@ -104,15 +47,15 @@ router.delete('/:id', (req, res) => {
return res.status(400).send('Invalid ID'); // Bad request
}
const index = dictionaries.findIndex((dictionary) => dictionary.id === id);
const index = data.findIndex((dictionary) => dictionary.id === id);
if (index < 0) {
return res.status(404).send('Not found'); // Not found
}
dictionaries.splice(index, 1); // Remove the dictionary from the array
data.splice(index, 1); // Remove the dictionary from the array
fs.writeFile(path.join(__dirname, 'dictionaries.json'), JSON.stringify(dictionaries), (err) => {
fs.writeFile(path.join(__dirname, 'data/dictionaries.json'), JSON.stringify(data), (err) => {
if (err) {
console.error(err); // Log the error
return res.status(500).send('Error saving data');
@ -120,3 +63,14 @@ router.delete('/:id', (req, res) => {
res.send({ message: `Dictionary with id ${id} deleted` });
});
});
router.get("/:id", (req, res) => {
const id = parseInt(req.params.id);
const words = wordsData.find((word) => word.id === id);
if (!words) {
return res.status(404).send("Not found");
}
res.send(words);
});

File diff suppressed because it is too large Load Diff

View File

@ -1,614 +0,0 @@
"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/index.ts
var index_exports = {};
__export(index_exports, {
createGigachat: () => createGigachat,
gigachat: () => gigachat
});
module.exports = __toCommonJS(index_exports);
// src/gigachat-provider.ts
var import_provider_utils4 = require("@ai-sdk/provider-utils");
// src/gigachat-chat-language-model.ts
var import_provider_utils2 = require("@ai-sdk/provider-utils");
var import_zod2 = require("zod");
// src/convert-to-gigachat-chat-messages.ts
var import_provider = require("@ai-sdk/provider");
function convertToGigachatChatMessages(prompt) {
const messages = [];
for (let i = 0; i < prompt.length; i++) {
const { role, content } = prompt[i];
const isLastMessage = i === prompt.length - 1;
switch (role) {
case "system": {
messages.push({ role: "system", content });
break;
}
case "user": {
messages.push({
role: "user",
content: content.map((part) => {
switch (part.type) {
case "text": {
return part.text;
}
case "image": {
throw new import_provider.UnsupportedFunctionalityError({
functionality: 'Images should be added in "attachments" object'
});
}
case "file": {
throw new import_provider.UnsupportedFunctionalityError({
functionality: "File content parts in user messages"
});
}
}
}).join("")
});
break;
}
case "assistant": {
let text = "";
let functionCall;
for (const part of content) {
switch (part.type) {
case "text": {
text += part.text;
break;
}
case "tool-call": {
functionCall = {
name: part.toolName,
arguments: part.args
};
break;
}
default: {
const _exhaustiveCheck = part;
throw new Error(`Unsupported part: ${_exhaustiveCheck}`);
}
}
}
messages.push({
role: "assistant",
content: text,
prefix: isLastMessage ? true : void 0,
function_call: functionCall
});
break;
}
case "tool": {
for (const toolResponse of content) {
messages.push({
role: "function",
name: toolResponse.toolName,
content: JSON.stringify(toolResponse.result)
});
}
break;
}
default: {
const _exhaustiveCheck = role;
throw new Error(`Unsupported role: ${_exhaustiveCheck}`);
}
}
}
return messages;
}
// src/map-gigachat-finish-reason.ts
function mapGigachatFinishReason(finishReason) {
switch (finishReason) {
case "stop":
return "stop";
case "length":
case "model_length":
return "length";
case "function_call":
return "tool-calls";
case "error":
return "error";
default:
return "unknown";
}
}
// src/gigachat-error.ts
var import_provider_utils = require("@ai-sdk/provider-utils");
var import_zod = require("zod");
var gigachatErrorDataSchema = import_zod.z.object({
object: import_zod.z.literal("error"),
message: import_zod.z.string(),
type: import_zod.z.string(),
param: import_zod.z.string().nullable(),
code: import_zod.z.string().nullable()
});
var gigachatFailedResponseHandler = (0, import_provider_utils.createJsonErrorResponseHandler)({
errorSchema: gigachatErrorDataSchema,
errorToMessage: (data) => data.message
});
// src/get-response-metadata.ts
function getResponseMetadata({
model,
created
}) {
return {
modelId: model != null ? model : void 0,
timestamp: created != null ? new Date(created * 1e3) : void 0
};
}
// src/gigachat-prepare-tools.ts
var import_provider2 = require("@ai-sdk/provider");
function prepareTools(mode) {
var _a;
const tools = ((_a = mode.tools) == null ? void 0 : _a.length) ? mode.tools : void 0;
const toolWarnings = [];
if (tools == null) {
return { tools: void 0, tool_choice: void 0, toolWarnings };
}
const gigachatTools = [];
for (const tool of tools) {
if (tool.type === "provider-defined") {
toolWarnings.push({ type: "unsupported-tool", tool });
} else {
gigachatTools.push({
type: "function",
function: {
name: tool.name,
description: tool.description,
parameters: tool.parameters
}
});
}
}
const toolChoice = mode.toolChoice;
if (toolChoice == null) {
return { tools: gigachatTools, tool_choice: void 0, toolWarnings };
}
const type = toolChoice.type;
switch (type) {
case "auto":
case "none":
return { tools: gigachatTools, tool_choice: type, toolWarnings };
case "required":
return { tools: gigachatTools, tool_choice: "any", toolWarnings };
// gigachat does not support tool mode directly,
// so we filter the tools and force the tool choice through 'any'
case "tool":
return {
tools: gigachatTools.filter((tool) => tool.function.name === toolChoice.toolName),
tool_choice: "any",
toolWarnings
};
default: {
const _exhaustiveCheck = type;
throw new import_provider2.UnsupportedFunctionalityError({
functionality: `Unsupported tool choice type: ${_exhaustiveCheck}`
});
}
}
}
// src/gigachat-chat-language-model.ts
var GigachatChatLanguageModel = class {
constructor(modelId, settings, config) {
this.specificationVersion = "v1";
this.defaultObjectGenerationMode = "json";
this.supportsImageUrls = false;
this.modelId = modelId;
this.settings = settings;
this.config = config;
}
get provider() {
return this.config.provider;
}
getArgs({
mode,
prompt,
maxTokens,
temperature,
topP,
topK,
frequencyPenalty,
presencePenalty,
stopSequences,
responseFormat,
seed
}) {
const type = mode.type;
const warnings = [];
if (topK != null) {
warnings.push({
type: "unsupported-setting",
setting: "topK"
});
}
if (frequencyPenalty != null) {
warnings.push({
type: "unsupported-setting",
setting: "frequencyPenalty"
});
}
if (presencePenalty != null) {
warnings.push({
type: "unsupported-setting",
setting: "presencePenalty"
});
}
if (stopSequences != null) {
warnings.push({
type: "unsupported-setting",
setting: "stopSequences"
});
}
if (responseFormat != null && responseFormat.type === "json" && responseFormat.schema != null) {
warnings.push({
type: "unsupported-setting",
setting: "responseFormat",
details: "JSON response format schema is not supported"
});
}
const baseArgs = {
// model id:
model: this.modelId,
// model specific settings:
stream: this.settings.stream,
repetition_penalty: this.settings.repetition_penalty,
update_interval: this.settings.update_interval,
// standardized settings:
max_tokens: maxTokens,
temperature,
top_p: topP,
// response format:
response_format: (responseFormat == null ? void 0 : responseFormat.type) === "json" ? { type: "json_object" } : void 0,
// messages:
messages: convertToGigachatChatMessages(prompt)
};
switch (type) {
case "regular": {
const { tools, tool_choice, toolWarnings } = prepareTools(mode);
return {
args: { ...baseArgs, tools, tool_choice },
warnings: [...warnings, ...toolWarnings]
};
}
case "object-json": {
return {
args: {
...baseArgs,
response_format: { type: "json_object" }
},
warnings
};
}
case "object-tool": {
return {
args: {
...baseArgs,
tool_choice: "any",
tools: [{ type: "function", function: mode.tool }]
},
warnings
};
}
default: {
const _exhaustiveCheck = type;
throw new Error(`Unsupported type: ${_exhaustiveCheck}`);
}
}
}
async doGenerate(options) {
var _a;
const { args, warnings } = this.getArgs(options);
const { responseHeaders, value: response } = await (0, import_provider_utils2.postJsonToApi)({
url: `${this.config.baseURL}/chat/completions`,
headers: (0, import_provider_utils2.combineHeaders)(this.config.headers(), options.headers),
body: args,
failedResponseHandler: gigachatFailedResponseHandler,
successfulResponseHandler: (0, import_provider_utils2.createJsonResponseHandler)(gigachatChatResponseSchema),
abortSignal: options.abortSignal,
fetch: this.config.fetch
});
const { messages: rawPrompt, ...rawSettings } = args;
const choice = response.choices[0];
let text = (_a = choice.message.content) != null ? _a : void 0;
const lastMessage = rawPrompt[rawPrompt.length - 1];
if (lastMessage.role === "assistant" && (text == null ? void 0 : text.startsWith(lastMessage.content))) {
text = text.slice(lastMessage.content.length);
}
return {
text,
toolCalls: choice.message.function_call ? [
{
toolCallType: "function",
toolCallId: choice.message.function_call.name,
toolName: choice.message.function_call.name,
args: JSON.stringify(choice.message.function_call.arguments)
}
] : [],
finishReason: mapGigachatFinishReason(choice.finish_reason),
usage: {
promptTokens: response.usage.prompt_tokens,
completionTokens: response.usage.completion_tokens
},
rawCall: { rawPrompt, rawSettings },
rawResponse: { headers: responseHeaders },
request: { body: JSON.stringify(args) },
response: getResponseMetadata(response),
warnings
};
}
async doStream(options) {
const { args, warnings } = this.getArgs(options);
const body = { ...args, stream: true };
const { responseHeaders, value: response } = await (0, import_provider_utils2.postJsonToApi)({
url: `${this.config.baseURL}/chat/completions`,
headers: (0, import_provider_utils2.combineHeaders)(this.config.headers(), options.headers),
body,
failedResponseHandler: gigachatFailedResponseHandler,
successfulResponseHandler: (0, import_provider_utils2.createEventSourceResponseHandler)(gigachatChatChunkSchema),
abortSignal: options.abortSignal,
fetch: this.config.fetch
});
const { messages: rawPrompt, ...rawSettings } = args;
let finishReason = "unknown";
let usage = {
promptTokens: Number.NaN,
completionTokens: Number.NaN
};
let chunkNumber = 0;
let trimLeadingSpace = false;
return {
stream: response.pipeThrough(
new TransformStream({
transform(chunk, controller) {
if (!chunk.success) {
controller.enqueue({ type: "error", error: chunk.error });
return;
}
chunkNumber++;
const value = chunk.value;
if (chunkNumber === 1) {
controller.enqueue({
type: "response-metadata",
...getResponseMetadata(value)
});
}
if (value.usage != null) {
usage = {
promptTokens: value.usage.prompt_tokens,
completionTokens: value.usage.completion_tokens
};
}
const choice = value.choices[0];
if ((choice == null ? void 0 : choice.finish_reason) != null) {
finishReason = mapGigachatFinishReason(choice.finish_reason);
}
if ((choice == null ? void 0 : choice.delta) == null) {
return;
}
const delta = choice.delta;
if (chunkNumber <= 2) {
const lastMessage = rawPrompt[rawPrompt.length - 1];
if (lastMessage.role === "assistant" && delta.content === lastMessage.content.trimEnd()) {
if (delta.content.length < lastMessage.content.length) {
trimLeadingSpace = true;
}
return;
}
}
if (delta.content != null) {
controller.enqueue({
type: "text-delta",
textDelta: trimLeadingSpace ? delta.content.trimStart() : delta.content
});
trimLeadingSpace = false;
}
if (delta.function_call != null) {
controller.enqueue({
type: "tool-call-delta",
toolCallType: "function",
toolCallId: delta.function_call.name,
toolName: delta.function_call.name,
argsTextDelta: JSON.stringify(delta.function_call.arguments)
});
controller.enqueue({
type: "tool-call",
toolCallType: "function",
toolCallId: delta.function_call.name,
toolName: delta.function_call.name,
args: JSON.stringify(delta.function_call.arguments)
});
}
},
flush(controller) {
controller.enqueue({ type: "finish", finishReason, usage });
}
})
),
rawCall: { rawPrompt, rawSettings },
rawResponse: { headers: responseHeaders },
request: { body: JSON.stringify(body) },
warnings
};
}
};
var gigachatChatResponseSchema = import_zod2.z.object({
created: import_zod2.z.number().nullish(),
model: import_zod2.z.string().nullish(),
choices: import_zod2.z.array(
import_zod2.z.object({
message: import_zod2.z.object({
role: import_zod2.z.literal("assistant"),
content: import_zod2.z.string().nullable(),
created: import_zod2.z.number().nullish(),
name: import_zod2.z.string().nullish(),
function_call: import_zod2.z.object({
name: import_zod2.z.string(),
arguments: import_zod2.z.record(import_zod2.z.any())
}).nullish(),
data_for_context: import_zod2.z.array(import_zod2.z.object({})).nullish()
}),
index: import_zod2.z.number(),
finish_reason: import_zod2.z.string().nullish()
})
),
object: import_zod2.z.literal("chat.completion"),
usage: import_zod2.z.object({
prompt_tokens: import_zod2.z.number(),
completion_tokens: import_zod2.z.number(),
total_tokens: import_zod2.z.number()
})
});
var gigachatChatChunkSchema = import_zod2.z.object({
created: import_zod2.z.number().nullish(),
model: import_zod2.z.string().nullish(),
object: import_zod2.z.literal("chat.completion"),
choices: import_zod2.z.array(
import_zod2.z.object({
delta: import_zod2.z.object({
role: import_zod2.z.enum(["assistant"]).optional(),
content: import_zod2.z.string().nullish(),
functions_state_id: import_zod2.z.string().nullish(),
function_call: import_zod2.z.object({
name: import_zod2.z.string(),
arguments: import_zod2.z.object({})
}).nullish()
}),
finish_reason: import_zod2.z.string().nullish(),
index: import_zod2.z.number()
})
),
usage: import_zod2.z.object({
prompt_tokens: import_zod2.z.number(),
completion_tokens: import_zod2.z.number()
}).nullish()
});
// src/gigachat-embedding-model.ts
var import_provider3 = require("@ai-sdk/provider");
var import_provider_utils3 = require("@ai-sdk/provider-utils");
var import_zod3 = require("zod");
var GigachatEmbeddingModel = class {
constructor(modelId, settings, config) {
this.specificationVersion = "v1";
this.modelId = modelId;
this.settings = settings;
this.config = config;
}
get provider() {
return this.config.provider;
}
get maxEmbeddingsPerCall() {
var _a;
return (_a = this.settings.maxEmbeddingsPerCall) != null ? _a : 32;
}
get supportsParallelCalls() {
var _a;
return (_a = this.settings.supportsParallelCalls) != null ? _a : false;
}
async doEmbed({
values,
abortSignal,
headers
}) {
if (values.length > this.maxEmbeddingsPerCall) {
throw new import_provider3.TooManyEmbeddingValuesForCallError({
provider: this.provider,
modelId: this.modelId,
maxEmbeddingsPerCall: this.maxEmbeddingsPerCall,
values
});
}
const { responseHeaders, value: response } = await (0, import_provider_utils3.postJsonToApi)({
url: `${this.config.baseURL}/embeddings`,
headers: (0, import_provider_utils3.combineHeaders)(this.config.headers(), headers),
body: {
model: this.modelId,
input: values,
encoding_format: "float"
},
failedResponseHandler: gigachatFailedResponseHandler,
successfulResponseHandler: (0, import_provider_utils3.createJsonResponseHandler)(GigachatTextEmbeddingResponseSchema),
abortSignal,
fetch: this.config.fetch
});
return {
embeddings: response.data.map((item) => item.embedding),
usage: response.usage ? { tokens: response.usage.prompt_tokens } : void 0,
rawResponse: { headers: responseHeaders }
};
}
};
var GigachatTextEmbeddingResponseSchema = import_zod3.z.object({
data: import_zod3.z.array(import_zod3.z.object({ embedding: import_zod3.z.array(import_zod3.z.number()) })),
usage: import_zod3.z.object({ prompt_tokens: import_zod3.z.number() }).nullish()
});
// src/gigachat-provider.ts
function createGigachat(options = {}) {
var _a;
const baseURL = (_a = (0, import_provider_utils4.withoutTrailingSlash)(options.baseURL)) != null ? _a : "https://gigachat.devices.sberbank.ru/api/v1";
const getAccessToken = () => ({});
const getHeaders = () => ({
Authorization: `Bearer ${(0, import_provider_utils4.loadApiKey)({
apiKey: options.apiKey,
environmentVariableName: "GIGACHAT_ACCESS_TOKEN",
description: "GigaChat"
})}`,
...options.headers
});
const createChatModel = (modelId, settings = {}) => new GigachatChatLanguageModel(modelId, settings, {
provider: "gigachat.chat",
baseURL,
headers: getHeaders,
fetch: options.fetch
});
const createEmbeddingModel = (modelId, settings = {}) => new GigachatEmbeddingModel(modelId, settings, {
provider: "gigachat.embedding",
baseURL,
headers: getHeaders,
fetch: options.fetch
});
const provider = function(modelId, settings) {
if (new.target) {
throw new Error("Gigachat function cannot be called with the new keyword.");
}
return createChatModel(modelId, settings);
};
provider.languageModel = createChatModel;
provider.chat = createChatModel;
provider.embedding = createEmbeddingModel;
provider.textEmbedding = createEmbeddingModel;
provider.textEmbeddingModel = createEmbeddingModel;
return provider;
}
var gigachat = createGigachat();
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
createGigachat,
gigachat
});
//# sourceMappingURL=index.js.map

View File

@ -1,144 +0,0 @@
const axios = require('axios');
const https = require('https');
const fs = require('fs');
const qs = require('querystring');
const uuid = require('uuid');
const router = require('express').Router();
// vercel/ai package
const ai = require('./ai');
// gigachat provider for vercel/ai
const gigachatProvider = require('./gigachat');
module.exports = router;
const path = require('path');
//process.env.NODE_EXTRA_CA_CERTS= path.resolve(__dirname, 'certs')
//process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'
process.env.GIGACHAT_AUTH =
'NWVjYTczYjctNWRkYi00NzExLTg0YTEtMjhlOWVmODM2MjI4OjlmMTBkMGVkLWZjZjktNGZhOS1hNDZjLTc5ZWU1YzExOGExMw==';
const agent = new https.Agent({
rejectUnauthorized: false
});
const gigachat = gigachatProvider.createGigachat({
headers: {
'Content-Type': 'application/json',
Accept: 'text/event-stream'
},
fetch: (url, options) => {
return axios({
method: 'post',
maxBodyLength: Infinity,
url: url,
headers: options.headers,
httpsAgent: agent,
data: options.body
}).then((response) => {
return new Response(response.data, {
status: response.status,
statusText: response.statusText,
headers: response.headers,
body: response.data
});
}).catch((error) => {
return new Response(error.message, {
status: error.response.status,
statusText: error.response.statusText,
headers: error.response.headers,
body: error.response.data
});
});
}
});
router.use(async (req, res, next) => {
const hasToken = process.env.GIGACHAT_ACCESS_TOKEN && process.env.GIGACHAT_EXPIRES_AT != null;
const hasExpired = new Date(process.env.GIGACHAT_EXPIRES_AT) <= new Date();
if (!hasToken || hasExpired) {
let auth = process.env.GIGACHAT_AUTH;
let rquid = uuid.v4();
let config = {
method: 'post',
maxBodyLength: Infinity,
url: 'https://ngw.devices.sberbank.ru:9443/api/v2/oauth',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
Accept: 'application/json',
RqUID: rquid,
Authorization: 'Basic ' + auth
},
httpsAgent: agent,
data: qs.stringify({
scope: 'GIGACHAT_API_PERS'
})
};
try {
const response = await axios(config);
const json = response.data;
process.env.GIGACHAT_ACCESS_TOKEN = json.access_token;
process.env.GIGACHAT_EXPIRES_AT = json.expires_at;
console.log(JSON.stringify(response.data));
} catch {
console.log(error);
}
}
next();
});
router.post('/chat', async (req, res) => {
const { messages } = req.body;
const result = ai.streamText({
model: gigachat('GigaChat'),
system: 'You are a helpful assistant.',
messages,
stream: true,
update_interval: 0.2
});
result.pipeDataStreamToResponse(res);
});
router.post('/new-unit', async (req, res) => {
const { prompt } = req.body;
const systemMessage = `
Я хочу, чтобы вы выступали в роли помощника для создания продвинутых текстовых уроков английского языка. Я буду указывать тему и уровень сложности (начинающий, средний, продвинутый), а вы будете предоставлять структурированный план урока в формате Markdown. Урок должен включать только текстовые элементы (без видео, картинок, аудио) и содержать следующие разделы:
-Цель урока конкретный навык или знание, которое освоят студенты.
-Лексика
-Базовые термины: 5-7 слов/фраз с примерами употребления.
-Расширенная лексика: 3-5 идиом, фразовых глаголов или сложных выражений (для среднего/продвинутого уровня).
-Грамматический фокус
-Правило с пояснением и 3-5 примерами.
-Типичные ошибки и как их избежать.
-Контекстуализация
-Короткий текст (диалог, статья, описание) для анализа с использованием лексики и грамматики урока.
-Упражнения
-Письменное задание: например, составить предложения/эссе по теме.
-Устная практика: ролевые диалоги (текстовые сценарии), описание ситуаций.
-Аналитическое задание: исправление ошибок в предложениях, перевод сложных конструкций.
-Домашнее задание
Текстовые задачи: написание текста, грамматические тесты, поиск синонимов/антонимов.
Ответ должен быть оформлен в Markdown, лаконичным, без лишних комментариев, если пишешь блок кода, начинай его с новой строки.
`;
try {
const result = ai.streamText({
model: gigachat('GigaChat'),
system: systemMessage,
prompt,
stream: true,
update_interval: 0.3
});
result.pipeTextStreamToResponse(res);
} catch (e) {
console.log(e);
}
});

View File

@ -1,10 +1,7 @@
const router = require('express').Router();
const router = require("express").Router();
const wordsRouter = require('./words');
const dictionariesRouter = require('./dictionaries');
const dictionariesRouter = require("./dictionaries");
const unitsRouter = require('./units');
const gigachatRouter = require('./gigachat');
const usersRouter = require('./users');
module.exports = router;
const delay =
@ -14,8 +11,5 @@ const delay =
};
router.use(delay());
router.use('/words', wordsRouter);
router.use('/dictionaries', dictionariesRouter);
router.use("/dictionaries", dictionariesRouter);
router.use('/units', unitsRouter);
router.use('/gigachat', gigachatRouter);
router.use('/users', usersRouter);

View File

@ -1,70 +0,0 @@
### Цель урока:
Изучение ключевых слов и фраз, связанных с процессом трудоустройства, а также освоение базовой структуры диалога на собеседовании.
### Лексика:
**Базовая лексика:**
1. **Job interview** собеседование при приеме на работу
2. **Resume / CV** резюме
3. **Cover letter** сопроводительное письмо
4. **Interviewer** интервьюер
5. **Application form** анкета при приеме на работу
6. **Salary** зарплата
7. **Benefits** льготы
**Расширенная лексика:**
1. **To apply for a job** подавать заявку на работу
2. **To be offered the job** получить предложение о работе
3. **To negotiate salary** вести переговоры о зарплате
4. **To accept the offer** принять предложение
5. **To decline the offer** отклонить предложение
6. **To resign from your current position** подать заявление об уходе с текущей работы
7. **To start working at the company** начать работать в компании
8. **Probation period** испытательный срок
9. **References** рекомендации
10. **Work experience** опыт работы
### Грамматический фокус:
**Правило:**
Структура простого вопроса на английском языке:
- Общий вопрос: "Do you have any questions?"
- Специальный вопрос: "What are your strengths and weaknesses?"
**Пример:**
Общий вопрос: "How do you feel about this job opportunity?"
Специальный вопрос: "Can you tell me about your previous work experience?"
**Типичные ошибки и как их избежать:**
Ошибка: Неправильное использование порядка слов в вопросах.
Решение: Практиковать построение вопросов до автоматизма.
### Контекстуализация:
**Текст для анализа:**
"I'm applying for the position of a marketing manager at XYZ Company. Here is my resume."
"Thank you for considering me. Can you please tell me more about the responsibilities of this role?"
"Sure, let me give you an overview."
### Упражнения:
**Письменное задание:**
Составьте список из 5 вопросов, которые вы бы задали на собеседовании. Используйте простые вопросы и специальные вопросы.
**Устная практика:**
Ролевая игра: один студент играет роль интервьюера, другой кандидата на должность. Меняйтесь ролями.
**Аналитическое задание:**
Найдите и исправьте ошибки в следующем письме:
"Dear HR Manager,
My name is John Smith and I am writing to apply for the position of Sales Representative at ABC Inc. I enclose my resume for your review.
I believe that my skills and experiences make me an ideal candidate for this position. In my current role as a sales representative at XYZ Corp, I have consistently met or exceeded my sales targets. Additionally, I possess strong communication and negotiation skills which will enable me to effectively represent your products and services.
If you would like to schedule an interview, please contact me at your convenience. Thank you for your time and consideration.
Best regards,
John Smith"
### Домашнее задание:
**Текстовые задачи:**
1. Написать сопроводительное письмо для конкретной вакансии, используя расширенную лексику.
2. Составить резюме для воображаемой должности, включая все необходимые разделы.
3. Перевести текст собеседования на английский язык, сохраняя структуру и смысл.

View File

@ -1,74 +0,0 @@
# Цель урока
Изучение структуры документации программы с блоком кода.
## Лексика
### Базовая лексика:
- Documentation документация
- Code block блок кода
- Description описание
- Function функция
- Variable переменная
- Comment комментарий
### Расширенная лексика:
- API интерфейс прикладного программирования
- Method метод
- Class класс
- Library библиотека
- Framework фреймворк
## Грамматический фокус
Правило: Структура документации программы должна включать краткое описание, блок кода и примеры использования.
Пример:
Documentation for a program typically includes the following sections:
1. **Description**: A brief overview of what the program does and its purpose.
2. **Code Block**: The actual code that implements the functionality described in the first section.
3. **Examples**: One or more examples demonstrating how to use the features described in the documentation.
Типичные ошибки и как их избежать: Ошибки могут возникнуть из-за недостаточного описания функционала или неправильного форматирования кода. Чтобы избежать этого, важно тщательно проработать каждый раздел документации и убедиться, что все примеры корректны и понятны.
## Контекстуализация
Текст для анализа:
**Description**: This is a simple Python script that calculates the average value of a list of numbers.
**Code Block**:
```python
def calculate_average(numbers):
"""Calculate the average value of a list of numbers"""
return sum(numbers)/len(numbers)
```
Примеры использования:
```python
# Example usage
numbers = [10, 20, 30]
average = calculate_average(numbers)
print("The average value of the list", numbers, "is", average)
```
## Упражнения
Письменное задание: Написать документацию для простой функции на языке Python, которая принимает список чисел и возвращает среднее значение. Включить описание, код блока и пример использования.
Устная практика: Ролевой диалог между разработчиком и техническим писателем о структуре и содержании документации программы.
Аналитическое задание: Проанализировать существующую документацию программы и найти ошибки или неясности. Предложить улучшения.
## Домашнее задание
Текстовые задачи:
- Написать документацию для другой функции на языке Python, используя правильную структуру.
- Исправить ошибки в существующей документации программы.
- Перевести фрагмент документации на русский язык, сохраняя точность и стиль.

View File

@ -1 +1 @@
[{"id":1,"filename":"unit-1","name":"Unit 1: Multifunctional Verbs: Be, Have, and Do"},{"id":2,"filename":"unit-2","name":"Документация программы"},{"id":3,"fileName":"job-interview","name":"Job Interview"}]
[{"id":0,"filename":"unit-1","name":"Unit 1: Multifunctional Verbs: Be, Have, and Do"}]

View File

@ -4,90 +4,55 @@ const router = require('express').Router();
module.exports = router;
const data = require('./units.json');
const data = require('./data/units.json');
router.get('/', (req, res) => {
// for every data set author from users and save it to authoredData variable
const users = require('../users/users.json');
const authoredData = data.map((unit) => {
const user = users.find((user) => user.public_id == unit.author);
let authoredUnit = undefined;
if (user) {
authoredUnit = { ...unit, author: user };
}
return authoredUnit;
});
res.send(authoredData);
});
router.post('/:id', (req, res) => {
const id = parseInt(req.params.id);
const updatedUnit = req.body;
if (!updatedUnit) {
return res.status(400).send('No unit to be added');
}
if (!data) {
return res.status(500).send('No data to be updated');
}
const index = data.findIndex((unit) => unit.id === id);
if (index < 0) {
return res.status(404).send('Not found');
}
data.splice(index, 1);
data.push({...updatedUnit, author: updatedUnit.author.public_id});
res.status(200).send(data);
res.send(data);
});
router.put('/', (req, res) => {
const newUnit = req.body;
const newUnit = req.body
if (!newUnit) {
return res.status(400).send('No new unit to be added');
}
if (!newUnit) {
return res.status(400).send('No new unit to be added')
}
if (!newUnit.author) {
return res.status(400).send('User is not logged in!');
}
if (!data) {
return res.status(500).send('No data to be updated')
}
if (!data) {
return res.status(500).send('No data to be updated');
}
data.push({ "id": data.length, ...newUnit })
const newId = data.length + 1;
data.push({ ...newUnit, id: newId });
res.status(200).send(data);
fs.writeFileSync(path.join(__dirname, 'data', 'units.json'), JSON.stringify(data));
res.status(200).send(data);
});
router.delete('/:id', (req, res) => {
const id = parseInt(req.params.id);
const index = data.findIndex((unit) => unit.id === id);
const id = parseInt(req.params.id);
const index = data.findIndex((unit) => unit.id === id);
if (index < 0) {
return res.status(404).send('Not found');
}
if (index < 0) {
return res.status(404).send('Not found');
}
data.splice(index, 1);
res.send({ message: `Unit with ID ${id} deleted` });
data.splice(index, 1);
fs.writeFileSync(path.join(__dirname, 'data', 'units.json'), JSON.stringify(data));
res.send({ message: `Unit with ID ${id} deleted` });
});
router.get('/:id', (req, res) => {
const users = require('../users/users.json');
const id = parseInt(req.params.id);
const unit = data.find((unit) => unit.id === id);
if (!unit) {
return res.status(404).send('Unit not found');
return res.status(404).send('Not found');
}
const user = users.find((user) => user.public_id == unit.author);
const unitFilepath = path.join(__dirname, 'data', `${unit.filename}.md`);
const unitContent = fs.readFileSync(unitFilepath, 'utf-8');
res.send({...unit, author: user});
if (!unitContent) {
return res.status(404).send('Not found');
}
res.send({ ...unit, content: unitContent });
});

View File

@ -1,20 +0,0 @@
[
{
"content": "# Цель урока\n\nИзучение структуры документации программы с блоком кода.\n\n## Лексика\n\n### Базовая лексика:\n\n- Documentation документация\n- Code block блок кода\n- Description описание\n- Function функция\n- Variable переменная\n- Comment комментарий\n\n### Расширенная лексика:\n\n- API интерфейс прикладного программирования\n- Method метод\n- Class класс\n- Library библиотека\n- Framework фреймворк\n\n## Грамматический фокус\n\nПравило: Структура документации программы должна включать краткое описание, блок кода и примеры использования.\n\nПример:\n\nDocumentation for a program typically includes the following sections:\n\n1. **Description**: A brief overview of what the program does and its purpose.\n2. **Code Block**: The actual code that implements the functionality described in the first section.\n3. **Examples**: One or more examples demonstrating how to use the features described in the documentation.\n\nТипичные ошибки и как их избежать: Ошибки могут возникнуть из-за недостаточного описания функционала или неправильного форматирования кода. Чтобы избежать этого, важно тщательно проработать каждый раздел документации и убедиться, что все примеры корректны и понятны.\n\n## Контекстуализация\n\nТекст для анализа:\n\n**Description**: This is a simple Python script that calculates the average value of a list of numbers.\n\n**Code Block**: \n```python\ndef calculate_average(numbers):\n \"\"\"Calculate the average value of a list of numbers\"\"\"\n return sum(numbers)/len(numbers)\n```\n\nПримеры использования:\n\n```python\n# Example usage\nnumbers = [10, 20, 30]\naverage = calculate_average(numbers)\nprint(\"The average value of the list\", numbers, \"is\", average)\n```\n\n## Упражнения\n\nПисьменное задание: Написать документацию для простой функции на языке Python, которая принимает список чисел и возвращает среднее значение. Включить описание, код блока и пример использования.\n\nУстная практика: Ролевой диалог между разработчиком и техническим писателем о структуре и содержании документации программы.\n\nАналитическое задание: Проанализировать существующую документацию программы и найти ошибки или неясности. Предложить улучшения.\n\n## Домашнее задание\n\nТекстовые задачи:\n\n- Написать документацию для другой функции на языке Python, используя правильную структуру.\n- Исправить ошибки в существующей документации программы.\n- Перевести фрагмент документации на русский язык, сохраняя точность и стиль.\n",
"id": 2,
"author": "1738707541324",
"name": "Документация программы"
},
{
"content": "### Цель урока:\nИзучение ключевых слов и фраз, связанных с процессом трудоустройства, а также освоение базовой структуры диалога на собеседовании.\n\n### Лексика:\n**Базовая лексика:**\n1. **Job interview** собеседование при приеме на работу\n2. **Resume / CV** резюме\n3. **Cover letter** сопроводительное письмо\n4. **Interviewer** интервьюер\n5. **Application form** анкета при приеме на работу\n6. **Salary** зарплата\n7. **Benefits** льготы\n\n**Расширенная лексика:**\n1. **To apply for a job** подавать заявку на работу\n2. **To be offered the job** получить предложение о работе\n3. **To negotiate salary** вести переговоры о зарплате\n4. **To accept the offer** принять предложение\n5. **To decline the offer** отклонить предложение\n6. **To resign from your current position** подать заявление об уходе с текущей работы\n7. **To start working at the company** начать работать в компании\n8. **Probation period** испытательный срок\n9. **References** рекомендации\n10. **Work experience** опыт работы\n\n### Грамматический фокус:\n**Правило:**\nСтруктура простого вопроса на английском языке:\n- Общий вопрос: \"Do you have any questions?\"\n- Специальный вопрос: \"What are your strengths and weaknesses?\"\n\n**Пример:**\nОбщий вопрос: \"How do you feel about this job opportunity?\"\nСпециальный вопрос: \"Can you tell me about your previous work experience?\"\n\n**Типичные ошибки и как их избежать:**\nОшибка: Неправильное использование порядка слов в вопросах.\nРешение: Практиковать построение вопросов до автоматизма.\n\n### Контекстуализация:\n**Текст для анализа:**\n\"I'm applying for the position of a marketing manager at XYZ Company. Here is my resume.\"\n\"Thank you for considering me. Can you please tell me more about the responsibilities of this role?\"\n\"Sure, let me give you an overview.\"\n\n### Упражнения:\n**Письменное задание:**\nСоставьте список из 5 вопросов, которые вы бы задали на собеседовании. Используйте простые вопросы и специальные вопросы.\n\n**Устная практика:**\nРолевая игра: один студент играет роль интервьюера, другой кандидата на должность. Меняйтесь ролями.\n\n**Аналитическое задание:**\nНайдите и исправьте ошибки в следующем письме:\n\"Dear HR Manager,\n\nMy name is John Smith and I am writing to apply for the position of Sales Representative at ABC Inc. I enclose my resume for your review.\n\nI believe that my skills and experiences make me an ideal candidate for this position. In my current role as a sales representative at XYZ Corp, I have consistently met or exceeded my sales targets. Additionally, I possess strong communication and negotiation skills which will enable me to effectively represent your products and services.\n\nIf you would like to schedule an interview, please contact me at your convenience. Thank you for your time and consideration.\n\nBest regards,\nJohn Smith\"\n\n### Домашнее задание:\n**Текстовые задачи:**\n1. Написать сопроводительное письмо для конкретной вакансии, используя расширенную лексику.\n2. Составить резюме для воображаемой должности, включая все необходимые разделы.\n3. Перевести текст собеседования на английский язык, сохраняя структуру и смысл.",
"id": 3,
"author": "1738707541324",
"name": "Job Interview"
},
{
"content": "# Multifunctional Verbs\n\n## Overview\n\nThis unit focuses on the use of multifunctional verbs in English. These verbs are able to express multiple meanings depending on their use in a sentence.\n\n## Learning Objectives\n\nBy the end of this unit, you will be able to:\n\n* Identify the different forms of the main multifunctional verb.\n* Explain how these forms can be used interchangeably in sentences.\n* Demonstrate the correct usage of the three forms of the multifunctional verb by providing sentences and examples.\n\n## Vocabulary Review\n\n| Term | Definition |\n| ---- | -------------------------------------------------------- |\n| Be | To express a present or ongoing state of being. |\n| Have | To express ownership or possession. |\n| Do | To express an action to be done, future action or habit. |\n\n## Activities\n\n### Activity 1: Identify the Different Forms of the Main Multifunctional Verb\n\n* Read through each sentence and identify if the verb is used in its present tense (is), past tense (was/were), or future tense (will, would).\n* Discuss how this usage can vary depending on context.\n* Write down sentences that use different forms to illustrate your points.\n\n1. **Sentence 1**\n\n : \"The cat is sleeping.\"\n * Present tense: The cat is sleeping.\n * Past tense: The cat slept.\n * Future tense: The cat will sleep.\n2. **Sentence 2**\n\n : \"I have a dog at home.\"\n * Present tense: I have a dog.\n * Past tense: I had a dog.\n * Future tense: I will have a dog.\n3. **Sentence 3**\n\n : \"We are going on a hike tomorrow.\"\n * Present tense: We are going on a hike.\n * Past tense: We went on a hike.\n * Future tense: We will go on a hike.\n4. **Sentence 4**\n\n : \"He has been studying all day.\"\n * Present tense: He is studying.\n * Past tense: He studied.\n * Future tense: He will study.\n5. **Sentence 5**\n\n : \"We are going to buy some groceries later today.\"\n * Present tense: We are going to buy some groceries.\n * Past tense: We bought some groceries.\n * Future tense: We will buy some groceries.\n\n### Activity 2: Explain How These Forms Can Be Used Interchangeably in Sentences\n\n* Read through a sentence and identify the present, past, and future tense uses.\n* In pairs, explain why these forms are used interchangeably.\n* Provide examples of sentences that demonstrate this usage.\n* Highlight how the context changes the meaning.\n\n### Activity 3: Correct Usage of the Three Forms of the Multifunctional Verb\n\n* Read through a sentence and identify which form is being used.\n* In pairs, discuss why these forms are used in certain situations.\n* Provide sentences that demonstrate the correct usage of the three forms.",
"id": 1,
"author": "1738707541324",
"name": "Multifunctional Verbs"
}
]

View File

@ -1,53 +0,0 @@
const router = require('express').Router();
const fs = require('fs');
module.exports = router;
let data = require('./users.json');
const path = require('path');
router.get('/', (req, res) => {
res.send(data);
});
router.post('/', (req, res) => {
const newUser = req.body;
data.push(newUser);
fs.writeFileSync(path.join(__dirname, 'users.json'), JSON.stringify(data));
res.send(data);
});
router.post('/login', (req, res) => {
const { email, password } = req.body;
const user = data.find((user) => user.email === email && user.password === password);
if (!user) {
res.status(404).send('Пользователь не найден');
}
res.json({ public_id: user.public_id });
});
router.get('/account', (req, res) => {
const { public_id } = req.query;
const user = data.find((user) => user.public_id == public_id);
if (!user) {
res.status(404).send('Пользователь не найден');
}
res.send({ ...user, id: -1 });
});
router.post('/account/save', (req, res) => {
const updatedUser = req.body;
const { public_id } = updatedUser;
const index = data.findIndex((user) => user.public_id == public_id);
if (!index || index === -1) {
res.status(404).send('Пользователь не найден');
}
data[index] = { ...data[index], ...updatedUser, id: data[index].id, password: data[index].password };
fs.writeFileSync(path.join(__dirname, 'users.json'), JSON.stringify(data));
res.status(200);
});

View File

@ -1 +0,0 @@
[{"id":1738707541324,"public_id":1738707541324,"email":"1@gmail.com","password":"1","age":"22","nickname":"324324","about":"Чиловый "}]

View File

@ -1,75 +0,0 @@
const fs = require('fs');
const path = require('path');
const router = require("express").Router();
module.exports = router;
const words = require("../words/words.json");
router.get("/", (req, res) => {
res.send(words);
});
router.put('/', (req, res) => {
const newData = req.body;
if (!newData) {
return res.status(400).send('No data to add'); // Bad request
}
if (!words) {
return res.status(500).send('No data to update'); // Internal server error
}
console.log(words.length)
const indexedUpdatedData = { ...newData, id: words.length + 1 }; // Add the new word to the array
console.log(indexedUpdatedData);
words.push(indexedUpdatedData); // Add the new word to the array
fs.writeFile(path.join(__dirname, 'words.json'), JSON.stringify(words), (err) => {
if (err) {
console.error(err); // Log the error
return res.status(500).send('Error saving data');
}
res.status(200).json(indexedUpdatedData);
});
});
router.get("/:id", (req, res) => {
const id = parseInt(req.params.id);
if (!id || isNaN(id)) {
return res.status(400).send('Invalid ID'); // Bad request
}
if (!words) {
return res.status(500).send('No data to update'); // Internal server error
}
const word = words.find((word) => word.id === id);
if (!word) {
return res.status(404).send("Not found");
}
res.send(word);
});
router.delete("/:id", (req, res) => {
const id = parseInt(req.params.id);
if (!id || isNaN(id)) {
return res.status(400).send('Invalid ID'); // Bad request
}
const index = words.findIndex((word) => word.id === id);
if (index < 0) {
return res.status(404).send("Not found");
}
if (!words) {
return res.status(500).send('No data to update'); // Internal server error
}
words.splice(index, 1);
fs.writeFile(path.join(__dirname, 'words.json'), JSON.stringify(words), (err) => {
if (err) {
console.error(err); // Log the error
return res.status(500).send('Error saving data');
}
res.send({ message: `Word with id ${id} deleted` });
});
});

View File

@ -1,437 +0,0 @@
[
{
"id": 12,
"word": "Tech",
"definition": "short for technical, relating to the knowledge, machines, or methods used in science and industry. Tech is a whole industry, which includes IT",
"examples": ["“As a DevOps engineer I have been working in Tech since 2020.”"],
"synonyms": ["IT"]
},
{
"id": 1,
"word": "career path",
"definition": "the series of jobs or roles that constitute a person's career, especially one in a particular field",
"examples": ["“Technology is an evolving field with a variety of available career paths.”"],
"synonyms": []
},
{
"id": 2,
"word": "Machine Learning",
"translation": "Машинное обучение",
"definition": "An approach to artificial intelligence where computers learn from data without being explicitly programmed.",
"synonyms": ["Trainable Algorithms", "Automated Learning"],
"examples": [
"We used machine learning techniques to forecast product demand.",
"The movie recommendation system is based on machine learning algorithms.",
"Machine learning helped improve the accuracy of speech recognition in our application."
]
},
{
"id": 3,
"word": "Neural Network",
"translation": "Нейронная сеть",
"definition": "A mathematical model inspired by the structure and function of biological neural networks, consisting of interconnected nodes organized in layers that can process information.",
"synonyms": ["Artificial Neural Network", "Deep Neural Network"],
"examples": [
"To process large amounts of data, we created a deep learning neural network.",
"This neural network is capable of generating realistic images.",
"Using neural networks significantly improved the quality of text translation."
]
},
{
"id": 4,
"word": "Algorithm",
"translation": "Алгоритм",
"definition": "A step-by-step procedure or set of instructions for solving a problem or performing a computation.",
"synonyms": ["Procedure", "Method"],
"examples": [
"The algorithm we developed quickly finds the optimal delivery route.",
"This algorithm sorts an array with a minimal number of operations.",
"Encryption algorithms ensure secure transmission of data over the internet."
]
},
{
"id": 5,
"word": "Data Model",
"translation": "Модель данных",
"definition": "An abstract representation of the structure of data, describing how data is organized and related to each other.",
"synonyms": ["Data Structure", "Schema"],
"examples": [
"Our data model allows us to efficiently manage relationships between customers and orders.",
"The data model was designed considering scalability and performance requirements.",
"This data model is used for storing information about social network users."
]
},
{
"id": 6,
"word": "Regression",
"translation": "Регрессия",
"definition": "A statistical method used to determine the relationship between one variable and others.",
"synonyms": ["Linear Regression", "Nonlinear Regression"],
"examples": [
"We applied linear regression to analyze the impact of advertising campaigns on sales.",
"Results from the regression analysis showed a strong correlation between customer age and purchase frequency.",
"Regression helped us assess how changes in environmental conditions affect crop yield."
]
},
{
"id": 7,
"word": "Clustering",
"translation": "Кластеризация",
"definition": "The process of grouping similar objects into clusters so that objects within the same cluster are more similar to each other than to those in other clusters.",
"synonyms": ["Grouping", "Segmentation"],
"examples": [
"Clustering allowed us to divide customers into several groups according to their purchasing behavior.",
"Clustering methods are used to automatically group news by topic.",
"As a result of clustering, several market segments were identified, each with its own characteristics."
]
},
{
"id": 8,
"word": "Supervised Learning",
"translation": "Обучение с учителем",
"definition": "A type of machine learning where the algorithm learns from labeled data, meaning data for which correct answers are known.",
"synonyms": ["Controlled Learning", "Labeled Classification"],
"examples": [
"Supervised learning is used to classify emails as spam or not-spam.",
"This approach was used to create a model that predicts real estate prices based on multiple parameters.",
"Supervised learning helps diagnose diseases at early stages through medical data analysis."
]
},
{
"id": 9,
"word": "Data Labeling",
"translation": "Разметка данных",
"definition": "The process of assigning labels or classes to data so it can be used in supervised learning.",
"synonyms": ["Data Annotation", "Tagging"],
"examples": [
"Before starting model training, we labeled the data by assigning each photo an animal category.",
"Data labeling includes marking user reviews as positive or negative.",
"Text documents were labeled with special tags for subsequent analysis."
]
},
{
"id": 10,
"word": "Hyperparameters",
"translation": "Гиперпараметры",
"definition": "Parameters that define the structure and behavior of a machine learning model, set before the learning process begins.",
"synonyms": ["Model Settings", "Configuration Parameters"],
"examples": [
"Optimizing hyperparameters enabled us to enhance the performance of our machine learning model.",
"Hyperparameters include settings such as the number of layers in a neural network and the learning rate.",
"Choosing the right hyperparameters is crucial for achieving high model accuracy."
]
},
{
"id": 11,
"word": "Model Validation",
"translation": "Валидация модели",
"definition": "The process of evaluating the quality of a model by testing it on new, previously unseen data.",
"synonyms": ["Model Testing", "Model Verification"],
"examples": [
"After completing the training, we validated the model using a test dataset.",
"During model validation, its ability to make accurate predictions on new data is checked.",
"Validation showed that the model is robust against changes in data and has low generalization error."
]
},
{
"id": 13,
"word": "resume",
"translation": "резюме",
"definition": "a document containing a summary of your work experience, education, and skills that you submit when applying for a job",
"synonyms": ["CV", "curriculum vitae"],
"examples": [
"Make sure to update your resume before the interview."
]
},
{
"id": 14,
"word": "interviewer",
"translation": "интервьюер",
"definition": "the person who conducts an interview, typically a representative of the company or organization offering the job",
"synonyms": ["questioner", "examiner"],
"examples": [
"The interviewer asked about my previous work experiences."
]
},
{
"id": 15,
"word": "qualification",
"translation": "квалификация",
"definition": "a quality, skill, or attribute that makes someone suitable for a particular job or activity",
"synonyms": ["credential", "competence"],
"examples": [
"Do you have any qualifications in project management?"
]
},
{
"id": 16,
"word": "experience",
"translation": "опыт",
"definition": "practical contact with and observation of facts or events, especially those gained through employment",
"synonyms": ["background", "track record"],
"examples": [
"She has five years of experience in marketing."
]
},
{
"id": 17,
"word": "skillset",
"translation": "набор навыков",
"definition": "the range of skills and abilities possessed by an individual",
"synonyms": ["abilities", "talents"],
"examples": [
"Her skillset includes proficiency in several programming languages."
]
},
{
"id": 18,
"word": "cover letter",
"translation": "сопроводительное письмо",
"definition": "a document sent with your resume that provides additional information on why you're qualified for the position",
"synonyms": ["application letter", "letter of introduction"],
"examples": [
"Always include a well-written cover letter with your application."
]
},
{
"id": 19,
"word": "hiring manager",
"translation": "менеджер по найму",
"definition": "the person responsible for making hiring decisions within a company or department",
"synonyms": ["recruiter", "HR manager"],
"examples": [
"The hiring manager will review all applications and select candidates for interviews."
]
},
{
"id": 20,
"word": "job description",
"translation": "описание вакансии",
"definition": "a detailed account of the responsibilities, duties, required skills, and working conditions associated with a specific job",
"synonyms": ["position profile", "role specification"],
"examples": [
"Read the job description carefully to understand what the employer is looking for."
]
},
{
"id": 21,
"word": "salary negotiation",
"translation": "переговоры о зарплате",
"definition": "the process of discussing and agreeing upon the compensation for a job, including salary, benefits, and other forms of remuneration",
"synonyms": ["compensation discussion", "pay bargaining"],
"examples": [
"It's important to prepare for salary negotiations during the final stages of the interview process."
]
},
{
"id": 22,
"word": "reference",
"translation": "рекомендация",
"definition": "a person who can vouch for your qualifications, character, and work ethic, often contacted by potential employers",
"synonyms": ["endorsement", "testimonial"],
"examples": [
"Be prepared to provide references from former supervisors or colleagues."
]
},
{
"id": 23,
"word": "component",
"translation": "компонент",
"definition": "A reusable piece of code that renders part of the user interface.",
"synonyms": ["module", "widget"],
"examples": [
"In React, components are the building blocks of the UI."
]
},
{
"id": 24,
"word": "props",
"translation": "пропсы",
"definition": "Short for 'properties', these are read-only components passed down from parent components to child components.",
"synonyms": ["attributes", "parameters"],
"examples": [
"Props allow you to pass data between components."
]
},
{
"id": 25,
"word": "state",
"translation": "состояние",
"definition": "An object that holds data specific to a component which may change over time.",
"synonyms": ["data", "context"],
"examples": [
"Managing state is crucial for dynamic web applications."
]
},
{
"id": 26,
"word": "render",
"translation": "рендеринг",
"definition": "The process of updating the DOM to match the current state of a component.",
"synonyms": ["update", "refresh"],
"examples": [
"React efficiently handles rendering to ensure smooth updates."
]
},
{
"id": 27,
"word": "virtual DOM",
"translation": "виртуальный DOM",
"definition": "A lightweight copy of the actual DOM maintained by React to improve performance by minimizing updates to the real DOM.",
"synonyms": ["shadow tree", "virtual representation"],
"examples": [
"Virtual DOM allows React to update only necessary parts of the UI."
]
},
{
"id": 28,
"word": "JSX",
"translation": "JSX",
"definition": "A syntax extension to JavaScript used in React to describe what the user interface should look like.",
"synonyms": ["template language", "syntax extension"],
"examples": [
"JSX makes it easier to write and understand React components."
]
},
{
"id": 29,
"word": "hooks",
"translation": "хуки",
"definition": "Functions that let you use state and other React features without writing a class.",
"synonyms": ["functionalities", "utilities"],
"examples": [
"Hooks make functional components more powerful."
]
},
{
"id": 30,
"word": "event handling",
"translation": "обработка событий",
"definition": "The mechanism by which React components respond to user actions such as clicks, key presses, etc.",
"synonyms": ["interaction management", "action response"],
"examples": [
"Event handlers in React allow you to define how components react to user interactions."
]
},
{
"id": 31,
"word": "lifecycle methods",
"translation": "методы жизненного цикла",
"definition": "Methods called at different stages of a component's existence, allowing developers to perform tasks at each stage.",
"synonyms": ["phase callbacks", "stage handlers"],
"examples": [
"Lifecycle methods help manage the behavior of components throughout their lifecycle."
]
},
{
"id": 32,
"word": "routing",
"translation": "маршрутизация",
"definition": "The process of defining and managing navigation paths within a single-page application.",
"synonyms": ["navigation control", "path management"],
"examples": [
"React Router is commonly used for routing in React apps."
]
},
{
"id": 33,
"word": "server-side",
"translation": "серверная сторона",
"definition": "Refers to operations performed by the server in contrast to client-side operations.",
"synonyms": ["backend", "back-end"],
"examples": [
"Node.js is primarily used for server-side development."
]
},
{
"id": 34,
"word": "asynchronous",
"translation": "асинхронный",
"definition": "Programming model where operations execute independently of other operations, allowing efficient handling of multiple requests simultaneously.",
"synonyms": ["non-blocking", "concurrent"],
"examples": [
"Node.js uses asynchronous I/O to handle many concurrent connections efficiently."
]
},
{
"id": 35,
"word": "callback",
"translation": "коллбек",
"definition": "A function passed into another function as an argument, which is then invoked inside the outer function to complete some kind of routine or action.",
"synonyms": ["handler", "continuation"],
"examples": [
"Callbacks are widely used in Node.js for handling asynchronous operations."
]
},
{
"id": 36,
"word": "event loop",
"translation": "цикл событий",
"definition": "Mechanism in Node.js that handles asynchronous operations and ensures non-blocking I/O by offloading operations to the system kernel whenever possible.",
"synonyms": ["event-driven architecture", "runtime environment"],
"examples": [
"The event loop is fundamental to understanding how Node.js works."
]
},
{
"id": 37,
"word": "package manager",
"translation": "менеджер пакетов",
"definition": "Tool used to install, update, configure, and remove packages in Node.js projects.",
"synonyms": ["dependency manager", "library manager"],
"examples": [
"npm and yarn are popular package managers for Node.js."
]
},
{
"id": 38,
"word": "middleware",
"translation": "промежуточное ПО",
"definition": "Software that sits between an application and the backend infrastructure, providing additional functionality to the request-response cycle.",
"synonyms": ["interceptor", "filter"],
"examples": [
"Express.js uses middleware to handle common tasks like logging, authentication, and error handling."
]
},
{
"id": 39,
"word": "REST API",
"translation": "REST API",
"definition": "Architectural style for building APIs using HTTP methods to perform CRUD operations on resources.",
"synonyms": ["web service", "API design pattern"],
"examples": [
"Many Node.js applications implement RESTful APIs to communicate with clients."
]
},
{
"id": 40,
"word": "streams",
"translation": "потоки",
"definition": "Data structures that facilitate continuous transfer of data in chunks rather than loading everything into memory at once.",
"synonyms": ["data flow", "pipeline"],
"examples": [
"Streams are useful for handling large files or continuous data in Node.js."
]
},
{
"id": 41,
"word": "cluster module",
"translation": "модуль кластера",
"definition": "Built-in module in Node.js that allows an application to be split into multiple processes running on separate CPU cores, improving performance and scalability.",
"synonyms": ["multi-processing", "parallel execution"],
"examples": [
"Using the cluster module can significantly enhance the throughput of a Node.js application."
]
},
{
"id": 42,
"word": "event emitter",
"translation": "излучатель событий",
"definition": "Class in Node.js that facilitates communication between objects in an application by emitting named events that other objects can listen to.",
"synonyms": ["publisher-subscriber", "observer pattern"],
"examples": [
"Event emitters are useful for implementing custom event-based systems in Node.js."
]
}
]

View File

@ -3,7 +3,6 @@ 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

@ -1,8 +0,0 @@
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

@ -1,16 +0,0 @@
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

@ -1,16 +0,0 @@
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

@ -1,602 +0,0 @@
[
{
"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

@ -1,42 +0,0 @@
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,83 +0,0 @@
const { v4: uuidv4 } = require('uuid');
const axios = require('axios');
const https = require('https');
process.env.GIGACHAT_AUTH =
'YzA2ODg0NTYtYzE3Yi00OGJkLTkyY2MtMzdkM2U0YjE4ZmQ5Ojc0ZWVhN2YxLTI5MWYtNDNiZS05MTY2LWIyZjg5MGY2YWQ3Ng==';
const agent = new https.Agent({
rejectUnauthorized: false
});
class controller {
async getText(req, res) {
try {
const { text } = req.body;
const headers = {
Authorization: `Basic ${process.env.GIGACHAT_AUTH}`,
RqUID: uuidv4(),
'Content-Type': 'application/x-www-form-urlencoded',
Accept: 'application/json'
};
const access_token = await axios
.post('https://ngw.devices.sberbank.ru:9443/api/v2/oauth', encodeURI(`scope=GIGACHAT_API_PERS`), {
headers: headers,
httpsAgent: agent
})
.then((response) => {
return response.data.access_token;
})
.catch((error) => {
return error;
});
const systemMessage = ` Создай анализ совместимости между двумя людьми и отобрази результат исключительно в формате JSON, который будет результатом работы 'JSON.stringify()'. Он должен состоять из следующих частей:
1. **Совместимость** в процентах.
2. **Список точек соприкосновения**. Перечисли их через запятую.
3. **Список потенциальных различий**. Перечисли через запятую.
Результат должен быть строкой JSON, полученной через 'JSON.stringify()', и не содержать дополнительных пояснений или текста.
Пример:
{"compatibility": 70, "pointsOfContact": ["общие интересы", "совместные увлечения", "взаимное уважение"], "potentialDifferences": ["различные жизненные цели", "противоположные характеры", "несовпадающие ценности"]}
`;
const textAI = await axios
.post(
'https://gigachat.devices.sberbank.ru/api/v1/chat/completions',
JSON.stringify({
model: 'GigaChat:latest',
messages: [
{
role: 'user',
content: systemMessage + text
}
],
profanity_check: true
}),
{
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${access_token}`
},
httpsAgent: agent
}
)
.then((response) => {
return response.data.choices[0].message.content;
})
.catch((error) => {
return error;
});
res.status(200).json({ text: textAI });
} catch (e) {
res.status(400).json({ message: e });
}
}
}
module.exports = new controller();

View File

@ -1,6 +0,0 @@
const router = require('express').Router();
const controller = require('./controller');
router.post('/', controller.getText);
module.exports = router;

View File

@ -1,20 +1,17 @@
const router = require('express').Router();
const interestsRouter = require('./interests');
const usersRouter = require('./users');
const eventsRouter = require('./events');
const gigachatRouter = require('./gigachat');
const telegramRouter = require('./telegram');
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('/events', eventsRouter);
router.use('/gigachat', gigachatRouter);
router.use('/telegram', telegramRouter);
router.use('/users/:id', usersRouter);

View File

@ -1,19 +1,19 @@
[
"Стартапы, поиск команды и нетворкинг",
"Искусство, фотография и дизайн",
"Музыка",
"Хореография",
"Спорт, фитнес и ЗОЖ",
"Литература и история",
"Политика, социология, активизм и дебаты",
"Кино и другое многомодальное искусство",
"Психология и психическое здоровье",
"Соревновательные видеоигры",
"Новые технологии, ИИ, техника",
"Математика, физика и информатика",
"Волонтерство и благотворительность",
"Настольные игры",
"Путешествия и туризм",
"Английский (иностранные языки)",
"Цифровые кафедры"
{"value":"Стартапы, поиск команды и нетворкинг", "label":"Стартапы, поиск команды и нетворкинг"},
{"value":"Искусство, фотография и дизайн", "label":"Искусство, фотография и дизайн"},
{"value":"Музыка", "label":"Музыка"},
{"value":"Хореография", "label":"Хореография"},
{"value":"Спорт, фитнес и ЗОЖ", "label":"Спорт, фитнес и ЗОЖ"},
{"value":"Литература и история", "label":"Литература и история"},
{"value":"Политика, социология, активизм и дебаты", "label":"Политика, социология, активизм и дебаты"},
{"value":"Кино и другое многомодальное искусство", "label":"Кино и другое многомодальное искусство"},
{"value":"Психология и психическое здоровье", "label":"Психология и психическое здоровье"},
{"value":"Соревновательные видеоигры", "label":"Соревновательные видеоигры"},
{"value":"Новые технологии, ИИ, техника", "label":"Новые технологии, ИИ, техника"},
{"value":"Математика, физика и информатика", "label":"Математика, физика и информатика"},
{"value" :"Волонтерство и благотворительность", "label": "Волонтерство и благотворительность"},
{"value" :"Настольные игры", "label": "Настольные игры"},
{"value" :"Путешествия и туризм", "label": "Путешествия и туризм"},
{"value" :"Английский (иностранные языки)", "label": "Английский (иностранные языки)"},
{"value" :"Цифровые кафедры", "label": "Цифровые кафедры"}
]

View File

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

View File

@ -1,24 +0,0 @@
const axios = require('axios');
process.env.TELEGRAM_TOKEN = '7866617284:AAHDOfPQJdKmufOdRgFza6XA8ZWRHPeA_Yc';
class controller {
async sendMessage(req, res) {
try {
const { chat_id, text } = req.body;
const response = await axios.get(`https://api.telegram.org/bot${process.env.TELEGRAM_TOKEN}/sendMessage`, {
params: {
chat_id: chat_id,
text: text,
parse_mode: 'html'
}
});
res.json(response.data);
} catch (e) {
res.status(400).json({ message: e.message });
}
}
}
module.exports = new controller();

View File

@ -1,6 +0,0 @@
const router = require('express').Router();
const controller = require('./controller');
router.post('/', controller.sendMessage);
module.exports = router;

View File

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

View File

@ -5,46 +5,35 @@ module.exports = router;
const data = require('./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));
//res.status(500).send({
// message: 'Internal server error'
//});
res.json(data)
});
router.get('/:id', (req, res) => {
const userId = parseInt(req.params.id);
res.json(data.find((item) => item.id === userId));
//res.status(500).send({
// message: 'Internal server error'
//});
const userId = parseInt(req.params.id);
res.json(data.find(item => item.id = userId));
});
router.post('/', (req, res) => {
res.status(201).send();
});
//res.status(500).send({
// message: 'Internal server error'
//});
const data = req.body;
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(201).send({ message: `${action} action processed` });
res.status(200).send();
});
router.put('/:id', (req, res) => {
res.status(204).send();
});
router.delete('/:id', (req, res) => {
res.status(204).send();
});
//res.status(500).send({
// message: 'Internal server error'
//});
const userId = parseInt(req.params.id);
const data = req.body;
res.status(200).send();
});