fix: Bot registration duplicate prevention and SilverPay integration update
All checks were successful
Build and Deploy LittleShop / Deploy to Production VPS (Manual Only) (push) Has been skipped
Build and Deploy LittleShop / Deploy to Pre-Production (CT109) (push) Successful in 1m1s

- Fixed BotService to prevent duplicate bot registrations by checking for existing bot with same name/type
- Updated existing bot record instead of creating duplicates on re-registration
- Configured SilverPay integration with production API key
- Updated TeleBot configuration for local development (localhost API URL, Tor disabled)

This ensures single bot instances and proper payment gateway integration for testing.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
sysadmin 2025-11-17 15:56:23 +00:00
parent 8dfaa7e0f7
commit 1d249d13ba
3 changed files with 37 additions and 6 deletions

View File

@ -26,8 +26,39 @@ public class BotService : IBotService
public async Task<BotRegistrationResponseDto> RegisterBotAsync(BotRegistrationDto dto) public async Task<BotRegistrationResponseDto> RegisterBotAsync(BotRegistrationDto dto)
{ {
_logger.LogInformation("Registering new bot: {BotName}", dto.Name); _logger.LogInformation("Registering bot: {BotName} (Type: {BotType})", dto.Name, dto.Type);
// Check if a bot with the same name and type already exists
var existingBot = await _context.Bots
.FirstOrDefaultAsync(b => b.Name == dto.Name && b.Type == dto.Type);
if (existingBot != null)
{
_logger.LogInformation("Bot already exists: {BotId}. Updating existing bot instead of creating duplicate.", existingBot.Id);
// Update existing bot
existingBot.Description = dto.Description;
existingBot.Version = dto.Version;
existingBot.Settings = JsonSerializer.Serialize(dto.InitialSettings);
existingBot.PersonalityName = string.IsNullOrEmpty(dto.PersonalityName) ? existingBot.PersonalityName : dto.PersonalityName;
existingBot.Status = BotStatus.Active;
existingBot.IsActive = true;
existingBot.LastConfigSyncAt = DateTime.UtcNow;
await _context.SaveChangesAsync();
_logger.LogInformation("Existing bot updated: {BotId}", existingBot.Id);
return new BotRegistrationResponseDto
{
BotId = existingBot.Id,
BotKey = existingBot.BotKey,
Name = existingBot.Name,
Settings = dto.InitialSettings
};
}
// Create new bot if none exists
var botKey = await GenerateBotKeyAsync(); var botKey = await GenerateBotKeyAsync();
var bot = new Bot var bot = new Bot
@ -48,7 +79,7 @@ public class BotService : IBotService
_context.Bots.Add(bot); _context.Bots.Add(bot);
await _context.SaveChangesAsync(); await _context.SaveChangesAsync();
_logger.LogInformation("Bot registered successfully: {BotId}", bot.Id); _logger.LogInformation("New bot registered successfully: {BotId}", bot.Id);
return new BotRegistrationResponseDto return new BotRegistrationResponseDto
{ {

View File

@ -10,7 +10,7 @@
}, },
"SilverPay": { "SilverPay": {
"BaseUrl": "http://10.0.0.51:5500", "BaseUrl": "http://10.0.0.51:5500",
"ApiKey": "sp_test_key_development", "ApiKey": "OCTk42VKenf5KZqKDDRAAskxf53yJsEby72j99Fc",
"WebhookSecret": "webhook_secret_dev", "WebhookSecret": "webhook_secret_dev",
"DefaultWebhookUrl": "http://localhost:5000/api/orders/payments/webhook", "DefaultWebhookUrl": "http://localhost:5000/api/orders/payments/webhook",
"AllowUnsignedWebhooks": true "AllowUnsignedWebhooks": true

View File

@ -20,7 +20,7 @@
"Comment": "Optional secret key for webhook authentication" "Comment": "Optional secret key for webhook authentication"
}, },
"LittleShop": { "LittleShop": {
"ApiUrl": "http://littleshop:5000", "ApiUrl": "http://localhost:5000",
"OnionUrl": "", "OnionUrl": "",
"Username": "admin", "Username": "admin",
"Password": "admin", "Password": "admin",
@ -34,7 +34,7 @@
"EnableAnalytics": false, "EnableAnalytics": false,
"RequirePGPForShipping": false, "RequirePGPForShipping": false,
"EphemeralByDefault": true, "EphemeralByDefault": true,
"EnableTor": true, "EnableTor": false,
"TorSocksHost": "tor-gateway", "TorSocksHost": "tor-gateway",
"TorSocksPort": 9050, "TorSocksPort": 9050,
"TorControlPort": 9051, "TorControlPort": 9051,