Initial import into Gitea
This commit is contained in:
120
Management/Controllers/Admin/AdminObjectiveMappingController.cs
Normal file
120
Management/Controllers/Admin/AdminObjectiveMappingController.cs
Normal file
@@ -0,0 +1,120 @@
|
||||
using Management.Data;
|
||||
using Management.Security;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using System.Text.Json;
|
||||
|
||||
namespace Management.Controllers.Admin;
|
||||
|
||||
/// <summary>
|
||||
/// Admin endpoints for objective-to-channel mapping management.
|
||||
/// Table: dbo.tbObjectiveMapping
|
||||
/// Maps platform objectives to provider-specific objectives with capability flags.
|
||||
///
|
||||
/// ENDPOINTS:
|
||||
/// GET /api/admin/objectives - List mappings (filterable)
|
||||
/// GET /api/admin/objectives/{id} - Get mapping
|
||||
/// POST /api/admin/objectives - Create mapping
|
||||
/// PUT /api/admin/objectives/{id} - Update mapping
|
||||
/// DELETE /api/admin/objectives/{id} - Delete mapping
|
||||
/// </summary>
|
||||
[ApiController]
|
||||
[Route("api/admin/objectives")]
|
||||
public sealed class AdminObjectiveMappingController : AdminControllerBase
|
||||
{
|
||||
public AdminObjectiveMappingController(SqlService sql, ClientContext client, ILogger<AdminObjectiveMappingController> log)
|
||||
: base(sql, client, log) { }
|
||||
|
||||
[HttpPost("list")]
|
||||
public Task<IActionResult> List([FromBody] JsonElement body, CancellationToken ct)
|
||||
=> CallProc("spAdminObjectiveMapping", "list", body.ToString(), ct);
|
||||
|
||||
[HttpGet("{mappingId:int}")]
|
||||
public Task<IActionResult> Get(int mappingId, CancellationToken ct)
|
||||
=> CallProc("spAdminObjectiveMapping", "get", new { mappingId }, ct);
|
||||
|
||||
[HttpPost]
|
||||
public Task<IActionResult> Create([FromBody] CreateMappingRequest request, CancellationToken ct)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(request?.ChannelType))
|
||||
return Task.FromResult(ValidationError("channelType is required"));
|
||||
if (string.IsNullOrWhiteSpace(request?.PlatformObjective))
|
||||
return Task.FromResult(ValidationError("platformObjective is required"));
|
||||
if (string.IsNullOrWhiteSpace(request?.ProviderObjective))
|
||||
return Task.FromResult(ValidationError("providerObjective is required"));
|
||||
if (string.IsNullOrWhiteSpace(request?.ProviderObjectiveLabel))
|
||||
return Task.FromResult(ValidationError("providerObjectiveLabel is required"));
|
||||
|
||||
Logger.LogWarning("[Admin] CreateObjectiveMapping | {Objective} → {Channel}/{Provider} | By={User}",
|
||||
request.PlatformObjective, request.ChannelType, request.ProviderObjective, Client.Email);
|
||||
|
||||
return CallProc("spAdminObjectiveMapping", "create", new
|
||||
{
|
||||
channelType = request.ChannelType.Trim(),
|
||||
platformObjective = request.PlatformObjective.Trim(),
|
||||
providerObjective = request.ProviderObjective.Trim(),
|
||||
providerObjectiveLabel = request.ProviderObjectiveLabel.Trim(),
|
||||
supportsObjectiveChange = request.SupportsObjectiveChange ?? false,
|
||||
supportsBudgetChange = request.SupportsBudgetChange ?? true,
|
||||
supportsTargetingChange = request.SupportsTargetingChange ?? true,
|
||||
supportsStatusToggle = request.SupportsStatusToggle ?? true,
|
||||
notes = request.Notes?.Trim()
|
||||
}, ct);
|
||||
}
|
||||
|
||||
[HttpPut("{mappingId:int}")]
|
||||
public Task<IActionResult> Update(int mappingId, [FromBody] UpdateMappingRequest request, CancellationToken ct)
|
||||
{
|
||||
Logger.LogWarning("[Admin] UpdateObjectiveMapping | Id={Id} | By={User}", mappingId, Client.Email);
|
||||
|
||||
return CallProc("spAdminObjectiveMapping", "update", new
|
||||
{
|
||||
mappingId,
|
||||
channelType = request?.ChannelType?.Trim(),
|
||||
platformObjective = request?.PlatformObjective?.Trim(),
|
||||
providerObjective = request?.ProviderObjective?.Trim(),
|
||||
providerObjectiveLabel = request?.ProviderObjectiveLabel?.Trim(),
|
||||
supportsObjectiveChange = request?.SupportsObjectiveChange,
|
||||
supportsBudgetChange = request?.SupportsBudgetChange,
|
||||
supportsTargetingChange = request?.SupportsTargetingChange,
|
||||
supportsStatusToggle = request?.SupportsStatusToggle,
|
||||
notes = request?.Notes?.Trim(),
|
||||
isActive = request?.IsActive
|
||||
}, ct);
|
||||
}
|
||||
|
||||
[HttpDelete("{mappingId:int}")]
|
||||
public Task<IActionResult> Delete(int mappingId, CancellationToken ct)
|
||||
{
|
||||
Logger.LogWarning("[Admin] DeleteObjectiveMapping | Id={Id} | By={User}", mappingId, Client.Email);
|
||||
return CallProc("spAdminObjectiveMapping", "delete", new { mappingId }, ct);
|
||||
}
|
||||
}
|
||||
|
||||
// DTOs
|
||||
|
||||
public sealed class CreateMappingRequest
|
||||
{
|
||||
public string? ChannelType { get; set; }
|
||||
public string? PlatformObjective { get; set; }
|
||||
public string? ProviderObjective { get; set; }
|
||||
public string? ProviderObjectiveLabel { get; set; }
|
||||
public bool? SupportsObjectiveChange { get; set; }
|
||||
public bool? SupportsBudgetChange { get; set; }
|
||||
public bool? SupportsTargetingChange { get; set; }
|
||||
public bool? SupportsStatusToggle { get; set; }
|
||||
public string? Notes { get; set; }
|
||||
}
|
||||
|
||||
public sealed class UpdateMappingRequest
|
||||
{
|
||||
public string? ChannelType { get; set; }
|
||||
public string? PlatformObjective { get; set; }
|
||||
public string? ProviderObjective { get; set; }
|
||||
public string? ProviderObjectiveLabel { get; set; }
|
||||
public bool? SupportsObjectiveChange { get; set; }
|
||||
public bool? SupportsBudgetChange { get; set; }
|
||||
public bool? SupportsTargetingChange { get; set; }
|
||||
public bool? SupportsStatusToggle { get; set; }
|
||||
public string? Notes { get; set; }
|
||||
public bool? IsActive { get; set; }
|
||||
}
|
||||
Reference in New Issue
Block a user