Compare commits

..

4 Commits

Author SHA1 Message Date
khwezi b343dbe668 Merge pull request 'Refactored manifest' (#24) from payments into master
Reviewed-on: #24
2026-06-02 08:11:17 +02:00
Khwezi Mngoma d4c005602e Refactored manifest
continuous-integration/drone/pr Build is passing
2026-06-02 08:09:35 +02:00
khwezi 783ca2e9c5 Merge pull request 'Stable run' (#23) from payments into master
Reviewed-on: #23
2026-06-02 00:30:13 +02:00
Khwezi Mngoma 3d506cffd1 Stable run
continuous-integration/drone/pr Build is passing
2026-06-02 00:29:02 +02:00
5 changed files with 64 additions and 43 deletions
@@ -8,6 +8,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="LiteCharms.Features.MidrandBooks" Version="1.64.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="10.0.8" />
<PackageReference Include="Mediator.SourceGenerator" Version="3.0.2">
<PrivateAssets>all</PrivateAssets>
@@ -17,7 +18,7 @@
<!-- Lite Charms Libraries -->
<ItemGroup>
<PackageReference Include="LiteCharms.Features" Version="1.34.0" />
<PackageReference Include="LiteCharms.Features" Version="1.64.0" />
</ItemGroup>
<!-- Shared Global Usings -->
+8 -12
View File
@@ -1,15 +1,12 @@
using LiteCharms.Features.Extensions;
using LiteCharms.Features.Mediator;
using LiteCharms.Features.MidrandBooks.Extensions;
using LiteCharmsScheduler.Workers;
using static LiteCharms.Features.Email.Extensions.Constants;
using static LiteCharms.Features.Extensions.Quartz;
var builder = Host.CreateApplicationBuilder(args);
builder.Services.AddMediator(options => options.Assemblies = new List<AssemblyReference>
{
typeof(Program).Assembly,
typeof(LiteCharms.Features.Shop.Notifications.Events.ProcessEmailNotificationsEvent).Assembly
}.AsReadOnly());
builder.Services.AddMediator();
builder.Services.AddScoped(typeof(IPipelineBehavior<,>), typeof(TelemetryPipelineBehavior<,>));
builder.Services.AddScoped(typeof(IPipelineBehavior<,>), typeof(LoggingPipelineBehavior<,>));
@@ -17,19 +14,18 @@ builder.Services.AddScoped(typeof(IPipelineBehavior<,>), typeof(LoggingPipelineB
builder.Services.AddEmailServices(builder.Configuration);
builder.Services.AddEmailServiceBus();
builder.Services.AddSalesServiceBus();
builder.Services.AddGeneralServiceBus();
builder.Services.AddQuartzScheduler(ShopSchedulerName, builder.Configuration);
builder.Services.AddShopServices();
builder.Services.AddShopDatabase(builder.Configuration);
builder.Services.AddHashServices(builder.Configuration);
builder.Services.AddMidrandShopDatabase(builder.Configuration);
builder.Services.AddQuartzScheduler(MidrandShopSchedulerName, builder.Configuration);
builder.Services.AddHostedService<JobWorker>();
var host = builder.Build();
var schedulerFactory = host.Services.GetRequiredService<ISchedulerFactory>();
var scheduler = await schedulerFactory.GetScheduler(ShopSchedulerName);
var scheduler = await schedulerFactory.GetScheduler(MidrandShopSchedulerName);
if (!scheduler!.IsStarted)
await scheduler.Start();
+2 -13
View File
@@ -1,21 +1,10 @@
using LiteCharms.Features.Quartz.Abstractions;
using LiteCharms.Features.Shop.Notifications.Events;
namespace LiteCharmsScheduler.Workers
{
public class JobWorker(IJobOrchestrator jobOrchestrator, ILogger<JobWorker> logger, IConfiguration configuration) : BackgroundService
{
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
string? emailProcessorCron = !string.IsNullOrWhiteSpace(configuration.GetSection("EmailProcessorCron").Value)
? configuration.GetSection("EmailProcessorCron").Value
: "0 */4 * * * ?";
var emailProcessorJob = ProcessEmailNotificationsEvent.Create();
await jobOrchestrator.ScheduleAsync(emailProcessorJob, emailProcessorCron!, stoppingToken);
logger.LogInformation("Startup jobs scheduled");
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken) =>
logger.LogInformation("Midrand Books jobs initialized");
}
}
+10 -9
View File
@@ -1,18 +1,19 @@
{
"Email": {
"Credentials": {
"Username": "shop@litecharms.co.za"
},
"Port": 465,
"Host": "mail.litecharms.co.za",
"UseSsl": true
"HasherSettings": {
"MinHashLength": 11
},
"BookshopS3Settings": {
"ServiceUrl": "http://192.168.1.177:30900",
"Region": "garage",
"BucketName": "bookshop",
"CdnBaseUrl": "https://bookshop.cdn.khongisa.co.za"
},
"EmailProcessorCron": "0 */5 * * * ?",
"Monitoring": {
"ApiKey": "",
"Address": "http://aspire-dashboard-service.aspire.svc.cluster.local:18889",
"ServiceName": "LiteCharms.LeadGenerator"
"ServiceName": "MidrandBooks.DEV"
},
"EmailProcessorCron": "0 */5 * * * ?",
"Logging": {
"LogLevel": {
"Default": "Information",
+42 -8
View File
@@ -18,6 +18,11 @@ data:
Email__Port: "465"
Email__UseSsl: "true"
EmailProcessorCron: "0 */5 * * * ?"
HasherSettings__MinHashLength: "11"
BookshopS3Settings__ServiceUrl: "http://garage.garage.svc.cluster.local:3900"
BookshopS3Settings__Region: "garage"
BookshopS3Settings__BucketName: "bookshop"
BookshopS3Settings__CdnBaseUrl: "https://bookshop.cdn.khongisa.co.za"
---
apiVersion: v1
kind: Secret
@@ -27,10 +32,14 @@ metadata:
type: Opaque
data:
connection-string-quartz: SG9zdD0xOTIuMTY4LjEuMTcwO0RhdGFiYXNlPXNjaGVkdWxlci1kZXY7VXNlcm5hbWU9c2NoZWR1bGVyLWRldi11c2VyO1Bhc3N3b3JkPWtWVm1vV0tKM3h6Z1FYO1BlcnNpc3QgU2VjdXJpdHkgSW5mbz1UcnVl
connection-string: SG9zdD0xOTIuMTY4LjEuMTcwO0RhdGFiYXNlPXNob3AtZGV2O1VzZXJuYW1lPXNob3AtZGV2LXVzZXI7UGFzc3dvcmQ9a1ZWbW9XS0ozeHpnUVg7UGVyc2lzdCBTZWN1cml0eSBJbmZvPVRydWU=
connection-string: SG9zdD0xOTIuMTY4LjEuMTcwO0RhdGFiYXNlPW1pZHJhbmRzaG9wLWRldjtVc2VybmFtZT1taWRyYW5kc2hvcC1kZXYtdXNlcjtQYXNzd29yZD1hUFh5a0tnM3RTOWNtRDtQZXJzaXN0IFNlY3VyaXR5IEluZm89VHJ1ZQ==
discord-webhook: aHR0cHM6Ly9kaXNjb3JkLmNvbS9hcGkvd2ViaG9va3MvMTUwMDIzMzEyOTYwNzAzNjk3MC9KYzc5endwMjlxYWpLbmoyYkR3cm5GR0RJci11ZGIyV2JIUDZTYjdpT0hCTWpQSUY3Vkw5eUVHTkJUSXpSOVVWVzI0bQ==
aspire-apikey: bWMzRzYzSzJqNVpPRXNpMEFqTW9qTFRYbTFLRVpGY3R6SUlqU3dEaVRHdXQ4cUdTa1B1V3d4R1AxUmJzY0pVbw==
email-password: JFpTLWVJQGlYbTVNUCRhfg==
hasher-salt: VEdsbmFIUWdRMmhoY20xekxDQk5hV1J5WVc1a1FtOXZhM01nYldGclpTQnNiM1J6SUc5bUlHMXZibVY1SUdGdVpDQmhjbVVnWVNCemRXTmpaWE56Wm5Wc0lIWnBjbUZzSUhOMGIzSjVJR2x1SUZOdmRYUm9JRUZtY21sallRPT0=
hasher-payfastpassphrase: OUdBSVIwdFdwaFgwcU8=
bookshop-s3-accesskey: R0s1MTRkMmNlOGRjNjkyMzdhMDVjMDFlZWY=
bookshop-s3-secretkey: ZWFhZmVkYTFhZWQ0MDllY2ZlNjA3MTRlY2RhNTQ5YjgyYmRmNWEzZGFmOWYxOGRkNjFmNjZiNDk3M2E2NDgyZQ==
---
apiVersion: v1
kind: Service
@@ -75,7 +84,37 @@ spec:
envFrom:
- configMapRef:
name: scheduler-config
env:
env:
- name: BookshopS3Settings__AccessKey
valueFrom:
secretKeyRef:
name: scheduler-secrets
key: bookshop-s3-accesskey
- name: BookshopS3Settings__SecretKey
valueFrom:
secretKeyRef:
name: scheduler-secrets
key: bookshop-s3-secretkey
- name: HasherSettings__Salt
valueFrom:
secretKeyRef:
name: scheduler-secrets
key: hasher-salt
- name: HasherSettings__PayfastPassphrase
valueFrom:
secretKeyRef:
name: scheduler-secrets
key: hasher-payfastpassphrase
- name: ConnectionStrings__PostgresMidrandBooks
valueFrom:
secretKeyRef:
name: scheduler-secrets
key: connection-string
- name: Monitoring__ApiKey
valueFrom:
secretKeyRef:
name: scheduler-secrets
key: aspire-apikey
- name: Email__Credentials__Password
valueFrom:
secretKeyRef:
@@ -85,12 +124,7 @@ spec:
valueFrom:
secretKeyRef:
name: scheduler-secrets
key: connection-string-quartz
- name: ConnectionStrings__PostgresShop
valueFrom:
secretKeyRef:
name: scheduler-secrets
key: connection-string
key: connection-string-quartz
- name: ConnectionStrings__DiscordShop
valueFrom:
secretKeyRef: