Исправление удаления записей у Телеграм бота
Всем привет! Написал на коленке телеграм бота, чтобы записывать отработанные часы каждый день. Пока что функционал бота таков: создавать новый отработанный день и удалять какой-то день. С созданием проблем нету, а вот с удалением есть, а именно: После того как пользователь выбрал удаление бот должен запросить всего 2 поля (month и date), но запрашивает он все поля как для создания. Еще одна проблема: Бот при удалении может вести себя так (пытается сделать и удаление и создание сразу, я выбирал Delete): 
Слишком много кода и проблем - понимаю, просто слишком долго ищу ошибку и от безысходности полез сюда (chatGPT не смог поправить), если есть вопросы по коду или функционалу - задавайте.
Вот сам код бота:
const TelegramBot = require('node-telegram-bot-api');
const token = process.env.TELEGRAM_BOT_TOKEN;
const gitToken = process.env.GITHUB_TOKEN;
const bot = new TelegramBot(token, { polling: true });
const express = require('express');
const app = express();
const port = process.env.PORT || 3000;
bot.onText(/\/start/, (msg) => {
bot.sendMessage(msg.chat.id, "Выберите действие:", {
reply_markup: {
inline_keyboard: [
[
{
text: "Create",
callback_data: "create"
},
{
text: "Delete",
callback_data: "delete"
}
]
]
}
});
});
bot.on('callback_query', (query) => {
const action = query.data;
switch (action) {
case 'create':
createData(query.message.chat.id);
break;
case 'delete':
deleteData(query.message.chat.id);
break;
}
});
function createData(chatId) {
let newData = {
month: '',
total: '',
course: '',
date: ''
};
let currentField = 'month';
bot.sendMessage(chatId, 'Введите месяц (название на английском):');
bot.on('message', (msg) => {
const text = msg.text;
const isValidInput = validateInput(currentField, text);
if (!isValidInput) {
bot.sendMessage(chatId, 'Некорректный ввод. Попробуйте еще раз:');
return;
}
newData[currentField] = text;
if (currentField === 'date') {
saveData(newData, chatId);
// bot.sendMessage(chatId, 'Данные успешно сохранены!');
bot.removeAllListeners('message');
return;
}
currentField = getNextField(currentField);
bot.sendMessage(chatId, `Введите ${currentField}:`);
});
}
function deleteData(chatId) {
let deletingData = {
month: '',
date: ''
};
let currentField = 'month';
bot.sendMessage(chatId, 'Введите месяц (название на английском):');
bot.on('message', (msg) => {
const text = msg.text;
const isValidInput = validateInput(currentField, text);
if (!isValidInput) {
bot.sendMessage(chatId, 'Некорректный ввод. Попробуйте еще раз:');
return;
}
deletingData[currentField] = text;
if (currentField === 'date') {
removeData(deletingData, chatId);
// bot.sendMessage(chatId, 'Данные успешно удалены!');
bot.removeAllListeners('message');
return;
}
currentField = getNextField(currentField);
bot.sendMessage(chatId, `Введите ${currentField}:`);
});
}
function getNextField(currentField) {
const fields = ['total', 'course', 'date'];
const currentIndex = fields.indexOf(currentField);
return fields[currentIndex + 1];
}
function validateInput(field, input) {
switch (field) {
case 'month':
return /^[a-zA-Z]+$/.test(input);
case 'total':
case 'course':
return /^\d+$/.test(input);
case 'date':
return /^\d{4}\.\d{2}\.\d{2}$/.test(input);
default:
return false;
}
}
function saveData(newData, chatId) {
const month = newData.month
let newDataWithoutMonth = Object.assign({}, newData);
delete newDataWithoutMonth.month;
SendingDataToGithub(month, newDataWithoutMonth, 'PUT', chatId)
}
function removeData(deletingData, chatId) {
const month = deletingData.month
SendingDataToGithub(month, deletingData, 'DELETE', chatId)
}
async function SendingDataToGithub(month, newData, type, chatId) {
let SendMessage = '';
const owner = "...";
const repo = "...";
const path = "db.json";
const url = `https://api.github.com/repos/${owner}/${repo}/contents/${path}`;
const branch = "main";
const message = type === 'PUT' ? `Add data for ${month}` : `Remove data for ${month}`;
const response = await fetch(url, {
headers: {
Authorization: `Bearer ${gitToken}`,
Accept: "application/vnd.github+json",
},
});
const data = await response.json()
const content = Buffer.from(data.content, "base64").toString("utf-8");
const jsonData = JSON.parse(content);
if (type === 'PUT') {
if (!jsonData[month]) {
jsonData[month] = [newData];
} else {
jsonData[month].push(newData);
}
} else {
if (jsonData[month]) {
jsonData[month] = jsonData[month].filter(entry => entry.date !== newData.date);
if (jsonData[month].length === 0) {
delete jsonData[month]
SendMessage = `Month ${month} removed`
} else {
SendMessage = `Data removed for ${month} on ${newData.date}`
}
} else {
await bot.sendMessage(chatId, `Error finding ${month} with ${newData.date}`);
}
}
const newContent = Buffer.from(JSON.stringify(jsonData, null, 2)).toString(
"base64"
);
const body = {
message,
content: newContent,
sha: data.sha,
branch,
};
const updateResponse = await fetch(url, {
method: "PUT",
headers: {
Authorization: `Bearer ${gitToken}`,
Accept: "application/vnd.github+json",
"Content-Type": "application/json",
},
body: JSON.stringify(body),
});
const updateData = await updateResponse.json();
if (type === 'PUT') {
if (updateData.content && updateData.content.sha) {
await bot.sendMessage(chatId, `Data added for ${month}`);
} else {
await bot.sendMessage(chatId, `Error adding data for ${month}`);
}
} else {
if (updateData.content && updateData.content.sha) {
await bot.sendMessage(chatId, SendMessage);
} else {
await bot.sendMessage(chatId, `Error removing data for ${month} on ${newData.date}`);
}
}
}
app.listen(port, () => {
console.log(`Сервер запущен на порту ${port}`);
bot.startPolling();
});```