using System.Reflection; using JobTrackerApi.Data; using JobTrackerApi.Services; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; namespace JobTrackerApi.Controllers; [ApiController] [Route("api/admin/system")] [Authorize(Roles = "Admin")] public sealed class AdminSystemController : ControllerBase { private readonly IConfiguration _cfg; private readonly AppPaths _paths; private readonly JobTrackerContext _db; private readonly ISummarizerService _summarizer; private readonly IWebHostEnvironment _env; public AdminSystemController(IConfiguration cfg, AppPaths paths, JobTrackerContext db, ISummarizerService summarizer, IWebHostEnvironment env) { _cfg = cfg; _paths = paths; _db = db; _summarizer = summarizer; _env = env; } public sealed record StorageStatusDto(string DataRoot, string DbPath, bool DbExists, long? DbSizeBytes, int CompanyCount, int JobCount, int DeletedCount); public sealed record EmailStatusDto(bool Enabled, string? Host, int Port, bool EnableSsl, string? From, string? FromName); public sealed record SystemStatusDto( string Environment, string ContentRoot, string Version, string? CommitSha, string? BuildStamp, StorageStatusDto Storage, EmailStatusDto Email, SummarizerMetrics Summarizer ); [HttpGet] public async Task> Get(CancellationToken cancellationToken) { var dbPath = _paths.GetDbPath(); var dbFile = new FileInfo(dbPath); var jobs = await _db.JobApplications.AsNoTracking().ToListAsync(cancellationToken); var companies = await _db.Companies.AsNoTracking().CountAsync(cancellationToken); var summarizer = await _summarizer.GetMetricsAsync(cancellationToken); var version = (_cfg["App:Version"] ?? "").Trim(); if (string.IsNullOrWhiteSpace(version)) { version = Assembly.GetExecutingAssembly().GetName().Version?.ToString() ?? "unknown"; } var commitSha = (_cfg["App:CommitSha"] ?? "").Trim(); var buildStamp = (_cfg["App:BuildStamp"] ?? "").Trim(); return Ok(new SystemStatusDto( Environment: _env.EnvironmentName, ContentRoot: _env.ContentRootPath, Version: version, CommitSha: string.IsNullOrWhiteSpace(commitSha) ? null : commitSha, BuildStamp: string.IsNullOrWhiteSpace(buildStamp) ? null : buildStamp, Storage: new StorageStatusDto( DataRoot: _paths.DataRoot, DbPath: dbPath, DbExists: dbFile.Exists, DbSizeBytes: dbFile.Exists ? dbFile.Length : null, CompanyCount: companies, JobCount: jobs.Count, DeletedCount: jobs.Count(x => x.IsDeleted) ), Email: new EmailStatusDto( Enabled: _cfg.GetValue("Email:Enabled", false), Host: (_cfg["Email:SmtpHost"] ?? "").Trim(), Port: _cfg.GetValue("Email:SmtpPort", 587), EnableSsl: _cfg.GetValue("Email:SmtpEnableSsl", true), From: (_cfg["Email:From"] ?? "").Trim(), FromName: (_cfg["Email:FromName"] ?? "").Trim() ), Summarizer: summarizer )); } }