Skip to content

Commit e5ed1d5

Browse files
committed
added a auto deletion method
1 parent 4eb995f commit e5ed1d5

File tree

5 files changed

+141
-9
lines changed

5 files changed

+141
-9
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
using DatabaseProjectAPI.DataContext;
2+
using Microsoft.EntityFrameworkCore;
3+
using Microsoft.Extensions.Logging;
4+
5+
namespace DatabaseProjectAPI.Actions;
6+
7+
8+
public interface IAutoDeleteService
9+
{
10+
Task DeleteOldStockHistory();
11+
Task DeleteOldApiCallLogs();
12+
}
13+
14+
15+
public class AutoDeleteAction : IAutoDeleteService
16+
{
17+
private readonly DpapiDbContext _dbContext;
18+
private readonly ILogger<AutoDeleteAction> _logger;
19+
20+
public AutoDeleteAction(DpapiDbContext dbContext, ILogger<AutoDeleteAction> logger)
21+
{
22+
_dbContext = dbContext;
23+
_logger = logger;
24+
}
25+
26+
public async Task DeleteOldStockHistory()
27+
{
28+
var ninetyDaysAgo = DateTime.UtcNow.AddDays(-90);
29+
30+
var oldStockHistories = await _dbContext.StockHistories
31+
.Where(sh => sh.Timestamp < ninetyDaysAgo)
32+
.ToListAsync();
33+
34+
if (oldStockHistories.Any())
35+
{
36+
_dbContext.StockHistories.RemoveRange(oldStockHistories);
37+
await _dbContext.SaveChangesAsync();
38+
_logger.LogInformation("{Count} old stock history records deleted.", oldStockHistories.Count);
39+
}
40+
else
41+
{
42+
_logger.LogInformation("No stock history records found to delete.");
43+
}
44+
}
45+
46+
public async Task DeleteOldApiCallLogs()
47+
{
48+
var ninetyDaysAgo = DateTime.UtcNow.AddDays(-90);
49+
50+
var oldApiCallLogs = await _dbContext.ApiCallLog
51+
.Where(log => log.CallDate < ninetyDaysAgo)
52+
.ToListAsync();
53+
54+
if (oldApiCallLogs.Any())
55+
{
56+
_dbContext.ApiCallLog.RemoveRange(oldApiCallLogs);
57+
await _dbContext.SaveChangesAsync();
58+
_logger.LogInformation("{Count} old API call log records deleted.", oldApiCallLogs.Count);
59+
}
60+
else
61+
{
62+
_logger.LogInformation("No API call log records found to delete.");
63+
}
64+
}
65+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using DatabaseProjectAPI.Actions;
2+
using Microsoft.AspNetCore.Mvc;
3+
4+
namespace DatabaseProjectAPI.Controllers
5+
{
6+
[Route("api/[controller]")]
7+
[ApiController]
8+
public class AutoDeleteController : ControllerBase
9+
{
10+
private readonly IAutoDeleteService _autoDeleteService;
11+
12+
public AutoDeleteController(IAutoDeleteService autoDeleteService)
13+
{
14+
_autoDeleteService = autoDeleteService;
15+
}
16+
17+
[HttpDelete("cleanup")]
18+
public async Task<IActionResult> CleanupOldData()
19+
{
20+
await _autoDeleteService.DeleteOldStockHistory();
21+
await _autoDeleteService.DeleteOldApiCallLogs();
22+
23+
return Ok(new { message = "Old data cleanup completed." });
24+
}
25+
}
26+
}

DatabaseProjectAPI/Program.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,9 @@
3939
builder.Services.AddTransient<ITrackedStockAction, TrackedStockAction>();
4040
builder.Services.AddTransient<IStockHistoryAction, StockHistoryAction>();
4141
builder.Services.AddTransient<IApiRequestLogger, ApiRequestLogger>();
42+
builder.Services.AddTransient<IAutoDeleteService, AutoDeleteAction>();
4243

43-
// Register background service
44+
builder.Services.AddHostedService<DataCleanupBackgroundService>();
4445
builder.Services.AddHostedService<StockQuoteBackgroundService>();
4546

4647
builder.Services.AddControllers();
@@ -49,11 +50,11 @@
4950

5051
var app = builder.Build();
5152

52-
//if (app.Environment.IsDevelopment())
53-
//{
53+
if (app.Environment.IsDevelopment())
54+
{
5455
app.UseSwagger();
5556
app.UseSwaggerUI();
56-
//}
57+
}
5758

5859
app.UseHttpsRedirection();
5960
app.UseAuthorization();
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using DatabaseProjectAPI.Actions;
2+
using Microsoft.Extensions.Hosting;
3+
using Microsoft.Extensions.Logging;
4+
5+
namespace DatabaseProjectAPI.Services
6+
{
7+
public class DataCleanupBackgroundService : BackgroundService
8+
{
9+
private readonly IServiceProvider _serviceProvider;
10+
private readonly ILogger<DataCleanupBackgroundService> _logger;
11+
12+
public DataCleanupBackgroundService(IServiceProvider serviceProvider, ILogger<DataCleanupBackgroundService> logger)
13+
{
14+
_serviceProvider = serviceProvider;
15+
_logger = logger;
16+
}
17+
18+
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
19+
{
20+
_logger.LogInformation("DataCleanupBackgroundService started at: {time}", DateTime.UtcNow);
21+
22+
while (!stoppingToken.IsCancellationRequested)
23+
{
24+
using (var scope = _serviceProvider.CreateScope())
25+
{
26+
var autoDeleteService = scope.ServiceProvider.GetRequiredService<IAutoDeleteService>();
27+
28+
await autoDeleteService.DeleteOldStockHistory();
29+
await autoDeleteService.DeleteOldApiCallLogs();
30+
31+
_logger.LogInformation("Data cleanup completed at: {time}", DateTime.UtcNow);
32+
}
33+
34+
await Task.Delay(TimeSpan.FromDays(1), stoppingToken);
35+
}
36+
}
37+
}
38+
}

DatabaseProjectAPI/Services/StockQuoteBackgroundService.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using DatabaseProjectAPI.DataContext;
1+
using DatabaseProjectAPI.Actions;
2+
using DatabaseProjectAPI.DataContext;
23
using DatabaseProjectAPI.Entities;
34
using DatabaseProjectAPI.Helpers;
45

@@ -14,7 +15,6 @@ public StockQuoteBackgroundService(IServiceProvider serviceProvider, ILogger<Sto
1415
_serviceProvider = serviceProvider;
1516
_logger = logger;
1617
}
17-
1818
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
1919
{
2020
_logger.LogInformation("StockQuoteBackgroundService started at: {time}", DateTime.UtcNow);
@@ -27,8 +27,11 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
2727
{
2828
var dbContext = scope.ServiceProvider.GetRequiredService<DpapiDbContext>();
2929
var apiRequestLogger = scope.ServiceProvider.GetRequiredService<IApiRequestLogger>();
30+
var autoDeleteService = scope.ServiceProvider.GetRequiredService<IAutoDeleteService>();
31+
32+
await autoDeleteService.DeleteOldStockHistory();
33+
await autoDeleteService.DeleteOldApiCallLogs();
3034

31-
// Check if API call has already been made today for market open or close
3235
if (IsMarketOpenTime(now) && !await apiRequestLogger.HasMadeApiCallToday("MarketOpen", "AAPL"))
3336
{
3437
await FetchAndSaveStockData(dbContext, apiRequestLogger, "MarketOpen", "AAPL");
@@ -38,8 +41,7 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken)
3841
await FetchAndSaveStockData(dbContext, apiRequestLogger, "MarketClose", "AAPL");
3942
}
4043
}
41-
42-
await Task.Delay(TimeSpan.FromMinutes(60), stoppingToken); // Delay for 1 hour
44+
await Task.Delay(TimeSpan.FromMinutes(60), stoppingToken);
4345
}
4446
}
4547
private async Task FetchAndSaveStockData(DpapiDbContext dbContext, IApiRequestLogger apiRequestLogger, string callType, string symbol)

0 commit comments

Comments
 (0)