Skip to content

Commit c3fe57a

Browse files
committed
migation of improved webhook serve to new file, minor string sanitization for logging
1 parent 1725c1b commit c3fe57a

2 files changed

Lines changed: 96 additions & 88 deletions

File tree

src/RandomAPI/APIServices/Services/BaseWebhookService.cs

Lines changed: 0 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -1,96 +1,8 @@
1-
using Microsoft.AspNetCore.Mvc;
2-
using RandomAPI.Models;
31
using RandomAPI.Repository;
42
using static IWebhookService;
53

64
namespace RandomAPI.Services.Webhooks
75
{
8-
public class WebhookActionService : BaseWebhookService, IWebhookService
9-
{
10-
11-
public WebhookActionService(IWebhookRepository repo, ILogger<IWebhookService> logger)
12-
: base(repo, logger) { }
13-
14-
public async Task<IActionResult> HandleGetListenersActionAsync()
15-
{
16-
var urls = await base.GetListenersAsync();
17-
return new OkObjectResult(urls);
18-
}
19-
20-
public async Task<IActionResult> HandleGetListenersOfTypeAsync(WebhookType type)
21-
{
22-
var urls = await base.GetListenersAsync(type);
23-
return new OkObjectResult(urls);
24-
}
25-
26-
public async Task<IActionResult> HandleRegisterActionAsync([FromBody] string url, IWebhookService.WebhookType type = default)
27-
{
28-
if (string.IsNullOrWhiteSpace(url))
29-
return new BadRequestObjectResult("URL cannot be empty.");
30-
//neede both on regisdter and deregister
31-
url = url.Trim();
32-
var safeUrlForLog = url.Replace("\r", "").Replace("\n", "");
33-
34-
await base.AddListenerAsync(url, type);
35-
36-
_logger.LogInformation("Registered new webhook listener: {Url}", safeUrlForLog);
37-
38-
return new OkObjectResult(new { Message = $"Listener added successfully: {url}" });
39-
}
40-
41-
public async Task<IActionResult> HandleUnregisterActionAsync([FromBody] string url)
42-
{
43-
string safeUrlForLog = url;
44-
if (string.IsNullOrWhiteSpace(url))
45-
{
46-
safeUrlForLog = url.Replace("\r", "").Replace("\n", "");
47-
return new BadRequestObjectResult("URL cannot be empty.");
48-
}
49-
url = url.Trim();
50-
51-
var removed = await base.RemoveListenerAsync(url);
52-
53-
if (!removed)
54-
{
55-
return new NotFoundObjectResult(new { Message = $"URL not found: {url}" });
56-
}
57-
58-
_logger.LogInformation("Unregistered webhook listener: {Url}", safeUrlForLog);
59-
return new OkObjectResult(new { Message = $"Listener removed: {url}" });
60-
}
61-
62-
public async Task<IActionResult> HandleBroadcastActionAsync([FromBody] IWebHookPayload payload)
63-
{
64-
var listeners = await base.GetListenersAsync();
65-
66-
if (!listeners.Any())
67-
return new BadRequestObjectResult("No listeners registered to broadcast to.");
68-
69-
switch (payload)
70-
{
71-
case WebhookPayload p:
72-
p.Timestamp = DateTime.UtcNow;
73-
74-
break;
75-
76-
case DiscordWebhookPayload p:
77-
break;
78-
79-
default:
80-
_logger.LogWarning("Received unsupported payload type: {Type}", payload.GetType().Name);
81-
return new BadRequestObjectResult(new { Message = "Unsupported webhook payload type." });
82-
}
83-
84-
_logger.LogInformation("Broadcasting test payload: {Message}", payload.content);
85-
await base.BroadcastAsync(payload);
86-
return new OkObjectResult(new
87-
{
88-
Message = $"Broadcast sent for message: '{payload.content}'. Check logs for delivery status."
89-
});
90-
}
91-
}
92-
93-
946
public class BaseWebhookService
957
{
968
protected readonly IWebhookRepository _repo;
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
using Microsoft.AspNetCore.Mvc;
2+
using RandomAPI.Models;
3+
using RandomAPI.Repository;
4+
using static IWebhookService;
5+
6+
namespace RandomAPI.Services.Webhooks
7+
{
8+
public class WebhookActionService : BaseWebhookService, IWebhookService
9+
{
10+
public WebhookActionService(IWebhookRepository repo, ILogger<IWebhookService> logger)
11+
: base(repo, logger) { }
12+
13+
public async Task<IActionResult> HandleGetListenersActionAsync()
14+
{
15+
var urls = await base.GetListenersAsync();
16+
return new OkObjectResult(urls);
17+
}
18+
19+
public async Task<IActionResult> HandleGetListenersOfTypeAsync(WebhookType type)
20+
{
21+
var urls = await base.GetListenersAsync(type);
22+
return new OkObjectResult(urls);
23+
}
24+
25+
public async Task<IActionResult> HandleRegisterActionAsync([FromBody] string url, IWebhookService.WebhookType type = default)
26+
{
27+
if (string.IsNullOrWhiteSpace(url))
28+
return new BadRequestObjectResult("URL cannot be empty.");
29+
//neede both on regisdter and deregister
30+
string safeUrlForLog = SanitizeURL(ref url);
31+
32+
await base.AddListenerAsync(url, type);
33+
34+
_logger.LogInformation("Registered new webhook listener: {Url}", safeUrlForLog);
35+
36+
return new OkObjectResult(new { Message = $"Listener added successfully: {url}" });
37+
}
38+
39+
public async Task<IActionResult> HandleUnregisterActionAsync([FromBody] string url)
40+
{
41+
string safeUrlForLog = url;
42+
if (string.IsNullOrWhiteSpace(url))
43+
{
44+
45+
return new BadRequestObjectResult("URL cannot be empty.");
46+
}
47+
48+
safeUrlForLog = SanitizeURL(ref url);
49+
var removed = await base.RemoveListenerAsync(url);
50+
if (!removed)
51+
{
52+
return new NotFoundObjectResult(new { Message = $"URL not found: {url}" });
53+
}
54+
55+
_logger.LogInformation("Unregistered webhook listener: {Url}", safeUrlForLog);
56+
return new OkObjectResult(new { Message = $"Listener removed: {url}" });
57+
}
58+
59+
public async Task<IActionResult> HandleBroadcastActionAsync([FromBody] IWebHookPayload payload)
60+
{
61+
var listeners = await base.GetListenersAsync();
62+
63+
if (!listeners.Any())
64+
return new BadRequestObjectResult("No listeners registered to broadcast to.");
65+
66+
switch (payload)
67+
{
68+
case WebhookPayload p:
69+
p.Timestamp = DateTime.UtcNow;
70+
71+
break;
72+
73+
case DiscordWebhookPayload p:
74+
break;
75+
76+
default:
77+
_logger.LogWarning("Received unsupported payload type: {Type}", payload.GetType().Name);
78+
return new BadRequestObjectResult(new { Message = "Unsupported webhook payload type." });
79+
}
80+
81+
_logger.LogInformation("Broadcasting test payload: {Message}", payload.content);
82+
await base.BroadcastAsync(payload);
83+
return new OkObjectResult(new
84+
{
85+
Message = $"Broadcast sent for message: '{payload.content}'. Check logs for delivery status."
86+
});
87+
}
88+
89+
private static string SanitizeURL(ref string url)
90+
{
91+
url = url.Trim();
92+
var safeUrlForLog = url.Replace("\r", "").Replace("\n", "");
93+
return safeUrlForLog;
94+
}
95+
}
96+
}

0 commit comments

Comments
 (0)