77 lines
3.1 KiB
C#
77 lines
3.1 KiB
C#
using Microsoft.EntityFrameworkCore;
|
|
using w4c_workflows.Data;
|
|
using w4c_workflows.Models;
|
|
|
|
namespace w4c_workflows.Services;
|
|
|
|
/// <summary>
|
|
/// Reads and updates the tenant's selected workflow repository name. The repo name
|
|
/// is a basename (e.g. <c>workflows</c> by default, or a user-selected repo like
|
|
/// <c>wiz4apps</c>). The full repo is <c>{login}/{repoName}</c>; its local clone dir
|
|
/// is <c>{CopiesRoot}/{tenantId}/{login}_{repoName}</c> (see
|
|
/// <see cref="ForgejoWorkflowRepoService.ResolveWorkflowRepo"/>).
|
|
///
|
|
/// The selection is durable per tenant (table <c>WorkflowRepos</c>) and falls back
|
|
/// to <c>WorkflowSource:WorkflowRepoName</c> (default <c>workflows</c>) when no row
|
|
/// exists — so a fresh tenant automatically uses the repository named "workflow".
|
|
/// </summary>
|
|
public sealed class WorkflowRepoStore
|
|
{
|
|
private readonly WorkflowsDbContext _db;
|
|
private readonly string _defaultName;
|
|
|
|
public WorkflowRepoStore(WorkflowsDbContext db, Microsoft.Extensions.Configuration.IConfiguration config)
|
|
{
|
|
_db = db;
|
|
var configured = config["WorkflowSource:WorkflowRepoName"]?.Trim();
|
|
_defaultName = string.IsNullOrWhiteSpace(configured) ? "workflows" : configured;
|
|
}
|
|
|
|
/// <summary>The configured default repo name (used when no per-tenant row exists).</summary>
|
|
public string DefaultName => _defaultName;
|
|
|
|
/// <summary>Resolves the tenant's current workflow repo name (stored or default).</summary>
|
|
public async Task<string> GetNameAsync(string tenantId, CancellationToken ct = default)
|
|
{
|
|
if (string.IsNullOrWhiteSpace(tenantId)) return _defaultName;
|
|
var row = await _db.WorkflowRepos.AsNoTracking().FirstOrDefaultAsync(r => r.TenantId == tenantId, ct);
|
|
return string.IsNullOrWhiteSpace(row?.RepoName) ? _defaultName : row!.RepoName;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Persists the tenant's workflow repo name. Returns the normalized name (trimmed,
|
|
/// no leading/trailing slashes).
|
|
/// </summary>
|
|
public async Task<string> SetNameAsync(string tenantId, string repoName, CancellationToken ct = default)
|
|
{
|
|
var clean = (repoName ?? string.Empty).Trim().Trim('/');
|
|
if (string.IsNullOrWhiteSpace(clean))
|
|
throw new ArgumentException("Workflow repo name is required", nameof(repoName));
|
|
|
|
var row = await _db.WorkflowRepos.FirstOrDefaultAsync(r => r.TenantId == tenantId, ct);
|
|
if (row == null)
|
|
{
|
|
_db.WorkflowRepos.Add(new TenantWorkflowRepo
|
|
{
|
|
TenantId = tenantId,
|
|
RepoName = clean,
|
|
UpdatedAt = DateTime.UtcNow,
|
|
});
|
|
}
|
|
else
|
|
{
|
|
row.RepoName = clean;
|
|
row.UpdatedAt = DateTime.UtcNow;
|
|
}
|
|
await _db.SaveChangesAsync(ct);
|
|
return clean;
|
|
}
|
|
|
|
/// <summary>Validates a repo basename (letters/digits/._-), returns normalized or null.</summary>
|
|
public static string NormalizeName(string? repoName)
|
|
{
|
|
var clean = (repoName ?? string.Empty).Trim().Trim('/');
|
|
return string.IsNullOrWhiteSpace(clean) ? "workflows" : clean;
|
|
}
|
|
}
|