Commit 276a4432 authored by AntekZ's avatar AntekZ

endpoints added

parent 104eeacd
namespace LcdLogger.Models
{
public sealed class LogFileInfo
{
public string Name { get; set; }
public long SizeBytes { get; set; }
}
}
using LcdLogger.Models;
using Microsoft.Extensions.Options;
using LcdLogger.Services;
using Microsoft.Extensions.Options;
using System.Xml.Linq;
var builder = WebApplication.CreateBuilder(args);
builder.Services.Configure<LogOptions>(builder.Configuration.GetSection("Log"));
builder.Services.AddSingleton<LogQueue>();
builder.Services.AddSingleton<LogFileManager>();
builder.Services.AddSingleton<LogFileBrowser>();
builder.Services.AddHostedService<LogWorker>();
var app = builder.Build();
//app.MapGet("/debug/options", (IOptions<LogOptions> options) =>
// Results.Ok(options.Value));
app.MapPost("/logs", (LogBatch batch, LogQueue queue, IOptions<LogOptions> opts) =>
{
if (batch.Logs.Length > opts.Value.MaxBatchEntries)
......@@ -23,6 +21,30 @@ app.MapPost("/logs", (LogBatch batch, LogQueue queue, IOptions<LogOptions> opts)
return Results.Accepted();
});
// return all files in json
// http://127.0.0.1:8082/files
app.MapGet("/files", (LogFileBrowser browser) =>
{
return Results.Ok(browser.List());
});
// downloads to working directory a single log file by name
// example: curl -OJ http://127.0.0.1:8082/files/download/lcd-2026-07-01_09-18-33.log
app.MapGet("/files/download/{name}", (string name, LogFileBrowser browser) =>
{
var path = browser.GetFilePath(name);
if (path is null) return Results.NotFound();
return Results.File(path, "application/octet-stream", fileDownloadName: name);
});
// example: curl -OJ http://127.0.0.1:8082/files/download-all
app.MapGet("/files/download-all", async (LogFileBrowser browser, CancellationToken ct) =>
{
var zipBytes = await browser.BuildZipAsync(ct);
var zipName = $"lcd-logs-{DateTime.Now:yyyy-MM-dd_HH-mm-ss}.zip";
return Results.File(zipBytes, "application/zip", fileDownloadName: zipName);
});
app.Run();
using LcdLogger.Models;
using Microsoft.Extensions.Options;
using System.IO.Compression;
namespace LcdLogger.Services
{
public sealed class LogFileBrowser
{
private readonly LogOptions _options;
private readonly ILogger<LogFileBrowser> _logger;
public LogFileBrowser(IOptions<LogOptions> options, ILogger<LogFileBrowser> logger)
{
_options = options.Value;
_logger = logger;
}
public IReadOnlyList<LogFileInfo> List()
{
var directoryInfo = new DirectoryInfo(_options.Directory);
if (!directoryInfo.Exists)
{
_logger.LogError("Directory {Directory} does not exist", _options.Directory);
return Array.Empty<LogFileInfo>();
}
return directoryInfo.GetFiles("lcd-*.log")
.OrderBy(f => f.Name)
.Select(f => new LogFileInfo
{
Name = f.Name,
SizeBytes = f.Length
})
.ToList();
}
public string? GetFilePath(string name)
{
var fullPath = Path.Combine(_options.Directory, name);
return File.Exists(fullPath) ? fullPath : null;
}
public async Task<byte[]> BuildZipAsync(CancellationToken cancellationToken = default)
{
var directoryInfo = new DirectoryInfo(_options.Directory);
if (!directoryInfo.Exists)
{
_logger.LogWarning("Directory {Directory} does not exist", _options.Directory);
return Array.Empty<byte>();
}
using var buffer = new MemoryStream();
using (var zip = new ZipArchive(buffer, ZipArchiveMode.Create, leaveOpen: true))
{
foreach (var file in directoryInfo.GetFiles("lcd-*.log").OrderBy(f => f.Name))
{
try
{
var entry = zip.CreateEntry(file.Name, CompressionLevel.Fastest);
using (var entryStream = entry.Open())
using (var fileStream = new FileStream(
file.FullName,
FileMode.Open,
FileAccess.Read,
FileShare.ReadWrite))
{
await fileStream.CopyToAsync(entryStream, cancellationToken);
}
}
catch (Exception e)
{
_logger.LogError(e, "Failed to add {FileName} to zip", file.Name);
}
}
}
// zip.Dispose() na końcu tego bloku → zapisuje footer do buffer (MemoryStream, sync OK)
return buffer.ToArray();
}
}
}
......@@ -66,14 +66,14 @@ namespace LcdLogger.Services
private Task PruneSurplusFilesAsync(CancellationToken cancellationToken = default)
{
var DirectoryInfo = new DirectoryInfo(_options.Directory);
if(!DirectoryInfo.Exists)
var directoryInfo = new DirectoryInfo(_options.Directory);
if(!directoryInfo.Exists)
{
_logger.LogError("Directory {Directory} does not exist", _options.Directory);
return Task.CompletedTask;
}
var files = DirectoryInfo.GetFiles("lcd-*.log").OrderBy(f => f.Name).ToList();
var files = directoryInfo.GetFiles("lcd-*.log").OrderBy(f => f.Name).ToList();
long totalBytes = files.Sum(f => f.Length);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment