using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using NewLife;
using NewLife.Cube;
using NewLife.Cube.ViewModels;
using NewLife.Log;
using Stardust.Web.Services;
namespace Stardust.Web.Areas.Deployment.Controllers;
/// <summary>æµæ°´çº¿ webhook æŽ¥å…¥ã€‚æ— é‰´æƒï¼Œä»…é token + å¯é€‰ secret。
/// 接收 git push JSON 负载,委托 PipelineService.HandleWebhookAsync 处ç†</summary>
[DeploymentArea]
[Route("[area]/[controller]/[action]")]
public class PipelineWebhookController(PipelineService pipelineService, ITracer tracer) : ControllerBaseX
{
/// <summary>接收 git push webhookã€‚å…¼å®¹æº MVC ç‰ˆå¯¹å¤–åœ°å€ /Deployment/Pipeline/Webhook</summary>
/// <param name="token">æµæ°´çº¿é‰´æƒ token</param>
[HttpPost]
[Route("/Deployment/Pipeline/Webhook")]
[AllowAnonymous]
public async Task<Object> Webhook(String token)
{
if (token.IsNullOrEmpty()) return new { result = "error", reason = "missing token" };
// 读å–原始 body 用于ç¾åæ ¡éªŒ
Request.EnableBuffering();
Request.Body.Position = 0;
using var reader = new StreamReader(Request.Body, leaveOpen: true);
var body = await reader.ReadToEndAsync();
Request.Body.Position = 0;
var signature = Request.Headers["X-Hub-Signature-256"].ToString();
using var span = tracer?.NewSpan("Pipeline-Webhook", new { token, len = body?.Length ?? 0 });
var rs = await pipelineService.HandleWebhookAsync(token, body, signature);
span?.AppendTag($"result={rs}");
return rs;
}
/// <summary>获å–å—æ®µä¿¡æ¯ã€‚webhook æŽ¥æ”¶å™¨æ— å…³è”实体,仅返回 token/secret 鉴æƒå‚数说明,供å‰ç«¯æž„é€ webhook URL 与ç¾åé…ç½®å‚考</summary>
/// <param name="kind">å—æ®µç±»åž‹ï¼š1-列表Listã€2-详情Detailã€3-æ·»åŠ AddFormã€4-编辑EditFormã€5-æœç´¢Search</param>
/// <returns></returns>
[AllowAnonymous]
[HttpGet]
public virtual List<DataField> GetFields(ViewKinds kind)
{
// webhook æŽ¥æ”¶å™¨æ— å…³è”实体,仅返回 token/secret 鉴æƒå‚数说明,
// ä¾›å‰ç«¯æž„é€ webhook URL 与ç¾åé…ç½®å‚考。返回统一 ApiResponse å¥‘çº¦çš„å—æ®µåˆ—表。
return new List<DataField>
{
new() { Name = "token", DisplayName = "Token", Description = "æµæ°´çº¿é‰´æƒ token,拼接到 webhook URL çš„ ?token= 傿•°" },
new() { Name = "secret", DisplayName = "Secret", Description = "å¯é€‰ï¼ŒHMAC-SHA256 ç¾å密钥(X-Hub-Signature-256)" },
};
}
}
|