Skip to content

Commit 419fb97

Browse files
authored
Add topics view and improve dark theme (#13)
* Add subscriptions view * Improve dark theme message error visibility * Add mono font for JSON view * Update changelog * Updates * Update * Update * Update changelog * Update * update * Update nuget version
1 parent b5950dd commit 419fb97

File tree

30 files changed

+492
-1341
lines changed

30 files changed

+492
-1341
lines changed

.github/workflows/deploy.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ jobs:
4343
DeployImage:
4444
runs-on: ubuntu-latest
4545
env:
46-
ResQueueImageVersion: "1.2.0"
46+
ResQueueImageVersion: "1.3.0"
4747
DockerRegistry: ghcr.io
4848
DockerRepository: filipbekic01/resqueue
4949
steps:

CHANGELOG.md

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,24 @@
22

33
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
44

5+
## [v1.3.0] - 2025-01-09
6+
7+
### Added
8+
9+
- Topics table view with filters
10+
- Recurring job indicator in table view
11+
12+
### Changed
13+
14+
- One click less for auto-refresh action
15+
- JSON view uses mono font now
16+
- Dark theme message colors
17+
- Sticky-top actions when scroll is present
18+
19+
### Fixed
20+
21+
- Queue messages count invalidation on refresh
22+
523
## [v1.2.0] - 2025-01-05
624

725
### Added
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
namespace ResQueue.Dtos.Messages;
2+
3+
public record SubscriptionDto(
4+
string TopicName,
5+
string DestinationType,
6+
string DestinationName,
7+
int SubscriptionType,
8+
string RoutingKey
9+
);
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using ResQueue.Features.Subscriptions.GetSubscriptions;
2+
3+
namespace ResQueue.Endpoints;
4+
5+
public static class SubscriptionsEndpoints
6+
{
7+
public static void MapSubscriptionsEndpoints(this IEndpointRouteBuilder routes)
8+
{
9+
RouteGroupBuilder group = routes.MapGroup("subscriptions");
10+
11+
group.MapGet("",
12+
async (IGetSubscriptionsFeature feature) =>
13+
{
14+
var result = await feature.ExecuteAsync(new GetSubscriptionsRequest(
15+
));
16+
17+
return result.IsSuccess
18+
? Results.Ok(result.Value!.Subscriptions)
19+
: Results.Problem(result.Problem!);
20+
});
21+
}
22+
}

backend/ResQueue/ResQueue/Features/Messages/GetMessages/GetMessagesFeature.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using Dapper;
2-
using Microsoft.Extensions.Options;
32
using ResQueue.Dtos.Messages;
43
using ResQueue.Enums;
54
using ResQueue.Factories;
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
using Dapper;
2+
using ResQueue.Dtos.Messages;
3+
using ResQueue.Enums;
4+
using ResQueue.Factories;
5+
using ResQueue.Providers.DbConnectionProvider;
6+
7+
namespace ResQueue.Features.Subscriptions.GetSubscriptions;
8+
9+
public record GetSubscriptionsRequest();
10+
11+
public record GetSubscriptionsResponse(List<SubscriptionDto> Subscriptions);
12+
13+
public class GetSubscriptionsFeature(
14+
IDatabaseConnectionFactory connectionFactory,
15+
IDbConnectionProvider conn
16+
) : IGetSubscriptionsFeature
17+
{
18+
public async Task<OperationResult<GetSubscriptionsResponse>> ExecuteAsync(GetSubscriptionsRequest request)
19+
{
20+
await using var connection = connectionFactory.CreateConnection();
21+
22+
var subscriptions = await connection.QueryAsync<SubscriptionDto>(GetSqlQueryText());
23+
24+
return OperationResult<GetSubscriptionsResponse>.Success(new GetSubscriptionsResponse(
25+
Subscriptions: subscriptions.ToList()
26+
));
27+
}
28+
29+
private string GetSqlQueryText()
30+
{
31+
return conn.SqlEngine switch
32+
{
33+
ResQueueSqlEngine.Postgres => $"""
34+
SELECT
35+
s.topic_name AS TopicName,
36+
s.destination_type AS DestinationType,
37+
s.destination_name AS DestinationName,
38+
s.subscription_type AS SubscriptionType,
39+
s.routing_key AS RoutingKey
40+
FROM {conn.Schema}.subscriptions s
41+
""",
42+
ResQueueSqlEngine.SqlServer => $"""
43+
SELECT
44+
s.TopicName,
45+
s.DestinationType,
46+
s.DestinationName,
47+
s.SubscriptionType,
48+
s.RoutingKey
49+
FROM {conn.Schema}.Subscriptions s
50+
""",
51+
_ => throw new NotSupportedException("Unsupported SQL Engine")
52+
};
53+
}
54+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
namespace ResQueue.Features.Subscriptions.GetSubscriptions;
2+
3+
public interface IGetSubscriptionsFeature
4+
{
5+
Task<OperationResult<GetSubscriptionsResponse>> ExecuteAsync(GetSubscriptionsRequest request);
6+
}

backend/ResQueue/ResQueue/ResQueue.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828

2929
<!-- NuGet package properties -->
3030
<PackageId>ResQueue.MassTransit</PackageId>
31-
<Version>1.2.0</Version>
31+
<Version>1.3.0</Version>
3232
<Authors>Filip Bekić, Miroljub Tomić</Authors>
3333
<Company>ResQueue</Company>
3434
<Description>MassTransit SQL Transport Web UI</Description>

backend/ResQueue/ResQueue/ResQueueExtensions.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using ResQueue.Features.Messages.PurgeQueue;
99
using ResQueue.Features.Messages.RequeueMessages;
1010
using ResQueue.Features.Messages.RequeueSpecificMessages;
11+
using ResQueue.Features.Subscriptions.GetSubscriptions;
1112
using ResQueue.Providers.DbConnectionProvider;
1213

1314
namespace ResQueue;
@@ -36,6 +37,7 @@ public static IServiceCollection AddResQueue(this IServiceCollection services,
3637
services.AddTransient<IGetMessagesFeature, GetMessagesFeature>();
3738
services.AddTransient<IGetSingleMessageFeature, GetSingleMessageFeature>();
3839
services.AddTransient<IPurgeQueueFeature, PurgeQueueFeature>();
40+
services.AddTransient<IGetSubscriptionsFeature, GetSubscriptionsFeature>();
3941

4042
return services;
4143
}
@@ -88,6 +90,7 @@ public static IApplicationBuilder UseResQueue(this WebApplication app, string pr
8890
api.MapQueueEndpoints();
8991
api.MapMessageEndpoints();
9092
api.MapJobsEndpoints();
93+
api.MapSubscriptionsEndpoints();
9194

9295
return app;
9396
}

backend/ResQueue/WebSample/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ public static void Main(string[] args)
9393
app.MapGet("/publish",
9494
async (IPublishEndpoint endpoint) => { await endpoint.Publish(new YourMessage(Guid.NewGuid())); });
9595

96-
app.MapGet("/schedule",
96+
app.MapGet("/start-job",
9797
async (IPublishEndpoint endpoint) =>
9898
{
9999
var jobId = await endpoint.AddOrUpdateRecurringJob(nameof(AwesomeConsumer), new AwesomeRequest(),

0 commit comments

Comments
 (0)