mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-10-10 17:26:38 +08:00
[优化] 更新 PublishConfigVersion 函数以支持强制发布选项,并调整相关调用
This commit is contained in:
@@ -142,7 +142,8 @@ func DiffConfigVersion(c *gin.Context) {
|
|||||||
// @Router /api/config-versions/publish [post]
|
// @Router /api/config-versions/publish [post]
|
||||||
func PublishConfigVersion(c *gin.Context) {
|
func PublishConfigVersion(c *gin.Context) {
|
||||||
username := c.GetString("username")
|
username := c.GetString("username")
|
||||||
result, err := service.PublishConfigVersion(username)
|
force := c.Query("force") == "true"
|
||||||
|
result, err := service.PublishConfigVersion(username, force)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, gin.H{
|
||||||
"success": false,
|
"success": false,
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ func TestGetActiveConfigForAgentIncludesPoWConfig(t *testing.T) {
|
|||||||
t.Fatalf("CreateProxyRoute failed: %v", err)
|
t.Fatalf("CreateProxyRoute failed: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := PublishConfigVersion("root"); err != nil {
|
if _, err := PublishConfigVersion("root", false); err != nil {
|
||||||
t.Fatalf("PublishConfigVersion failed: %v", err)
|
t.Fatalf("PublishConfigVersion failed: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,7 +57,7 @@ func TestGetActiveConfigForAgentUsesTenMinutePoWSessionDefault(t *testing.T) {
|
|||||||
t.Fatalf("CreateProxyRoute failed: %v", err)
|
t.Fatalf("CreateProxyRoute failed: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := PublishConfigVersion("root"); err != nil {
|
if _, err := PublishConfigVersion("root", false); err != nil {
|
||||||
t.Fatalf("PublishConfigVersion failed: %v", err)
|
t.Fatalf("PublishConfigVersion failed: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -333,7 +333,7 @@ func HasConfigChanges() (bool, error) {
|
|||||||
return activeVersion.Checksum != bundle.Checksum, nil
|
return activeVersion.Checksum != bundle.Checksum, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func PublishConfigVersion(createdBy string) (*ReleaseResult, error) {
|
func PublishConfigVersion(createdBy string, force bool) (*ReleaseResult, error) {
|
||||||
bundle, err := buildCurrentConfigBundle(true)
|
bundle, err := buildCurrentConfigBundle(true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -342,7 +342,7 @@ func PublishConfigVersion(createdBy string) (*ReleaseResult, error) {
|
|||||||
return nil, errors.New("没有可发布的启用规则")
|
return nil, errors.New("没有可发布的启用规则")
|
||||||
}
|
}
|
||||||
activeVersion, err := model.GetActiveConfigVersion()
|
activeVersion, err := model.GetActiveConfigVersion()
|
||||||
if err == nil && activeVersion.Checksum == bundle.Checksum {
|
if !force && err == nil && activeVersion.Checksum == bundle.Checksum {
|
||||||
return nil, errors.New("当前规则没有变更,不能重复发布")
|
return nil, errors.New("当前规则没有变更,不能重复发布")
|
||||||
}
|
}
|
||||||
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
|
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ func TestCreateTLSCertificateAndRenderHTTPSConfig(t *testing.T) {
|
|||||||
t.Fatal("expected https fields to be persisted")
|
t.Fatal("expected https fields to be persisted")
|
||||||
}
|
}
|
||||||
|
|
||||||
result, err := PublishConfigVersion("root")
|
result, err := PublishConfigVersion("root", false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("PublishConfigVersion failed: %v", err)
|
t.Fatalf("PublishConfigVersion failed: %v", err)
|
||||||
}
|
}
|
||||||
@@ -158,7 +158,7 @@ func TestPublishConfigVersionRendersCustomHeaders(t *testing.T) {
|
|||||||
t.Fatalf("CreateProxyRoute failed: %v", err)
|
t.Fatalf("CreateProxyRoute failed: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
result, err := PublishConfigVersion("root")
|
result, err := PublishConfigVersion("root", false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("PublishConfigVersion failed: %v", err)
|
t.Fatalf("PublishConfigVersion failed: %v", err)
|
||||||
}
|
}
|
||||||
@@ -238,7 +238,7 @@ func TestPublishConfigVersionRendersRouteLevelCachePolicy(t *testing.T) {
|
|||||||
t.Fatalf("CreateProxyRoute uncached failed: %v", err)
|
t.Fatalf("CreateProxyRoute uncached failed: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
result, err := PublishConfigVersion("root")
|
result, err := PublishConfigVersion("root", false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("PublishConfigVersion failed: %v", err)
|
t.Fatalf("PublishConfigVersion failed: %v", err)
|
||||||
}
|
}
|
||||||
@@ -297,7 +297,7 @@ func TestPublishConfigVersionRendersMultipleUpstreams(t *testing.T) {
|
|||||||
t.Fatalf("expected route upstreams to persist, got %s", route.Upstreams)
|
t.Fatalf("expected route upstreams to persist, got %s", route.Upstreams)
|
||||||
}
|
}
|
||||||
|
|
||||||
result, err := PublishConfigVersion("root")
|
result, err := PublishConfigVersion("root", false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("PublishConfigVersion failed: %v", err)
|
t.Fatalf("PublishConfigVersion failed: %v", err)
|
||||||
}
|
}
|
||||||
@@ -354,7 +354,7 @@ func TestPublishConfigVersionRendersMultiDomainWebsite(t *testing.T) {
|
|||||||
t.Fatalf("CreateProxyRoute failed: %v", err)
|
t.Fatalf("CreateProxyRoute failed: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
result, err := PublishConfigVersion("root")
|
result, err := PublishConfigVersion("root", false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("PublishConfigVersion failed: %v", err)
|
t.Fatalf("PublishConfigVersion failed: %v", err)
|
||||||
}
|
}
|
||||||
@@ -424,7 +424,7 @@ func TestPublishConfigVersionRendersMultipleCertificatesForMultiDomainWebsite(t
|
|||||||
t.Fatalf("expected domain_cert_ids to persist per domain, got %#v", route.DomainCertIDs)
|
t.Fatalf("expected domain_cert_ids to persist per domain, got %#v", route.DomainCertIDs)
|
||||||
}
|
}
|
||||||
|
|
||||||
result, err := PublishConfigVersion("root")
|
result, err := PublishConfigVersion("root", false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("PublishConfigVersion failed: %v", err)
|
t.Fatalf("PublishConfigVersion failed: %v", err)
|
||||||
}
|
}
|
||||||
@@ -480,7 +480,7 @@ func TestPublishConfigVersionSkipsHTTPSForDomainsWithoutCertificate(t *testing.T
|
|||||||
t.Fatalf("expected domain_cert_ids to preserve unassigned domains, got %#v", route.DomainCertIDs)
|
t.Fatalf("expected domain_cert_ids to preserve unassigned domains, got %#v", route.DomainCertIDs)
|
||||||
}
|
}
|
||||||
|
|
||||||
result, err := PublishConfigVersion("root")
|
result, err := PublishConfigVersion("root", false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("PublishConfigVersion failed: %v", err)
|
t.Fatalf("PublishConfigVersion failed: %v", err)
|
||||||
}
|
}
|
||||||
@@ -510,7 +510,7 @@ func TestDiffConfigVersionTracksAddedDomainWithinWebsite(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("CreateProxyRoute failed: %v", err)
|
t.Fatalf("CreateProxyRoute failed: %v", err)
|
||||||
}
|
}
|
||||||
if _, err := PublishConfigVersion("root"); err != nil {
|
if _, err := PublishConfigVersion("root", false); err != nil {
|
||||||
t.Fatalf("PublishConfigVersion failed: %v", err)
|
t.Fatalf("PublishConfigVersion failed: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -578,7 +578,7 @@ func TestPublishConfigVersionRendersRouteRateLimits(t *testing.T) {
|
|||||||
t.Fatalf("CreateProxyRoute failed: %v", err)
|
t.Fatalf("CreateProxyRoute failed: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
result, err := PublishConfigVersion("root")
|
result, err := PublishConfigVersion("root", false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("PublishConfigVersion failed: %v", err)
|
t.Fatalf("PublishConfigVersion failed: %v", err)
|
||||||
}
|
}
|
||||||
@@ -615,7 +615,7 @@ func TestPublishConfigVersionRendersHostnameLoadBalancingUpstream(t *testing.T)
|
|||||||
t.Fatalf("CreateProxyRoute failed: %v", err)
|
t.Fatalf("CreateProxyRoute failed: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
result, err := PublishConfigVersion("root")
|
result, err := PublishConfigVersion("root", false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("PublishConfigVersion failed: %v", err)
|
t.Fatalf("PublishConfigVersion failed: %v", err)
|
||||||
}
|
}
|
||||||
@@ -649,7 +649,7 @@ func TestPublishConfigVersionOverridesOriginHostHeader(t *testing.T) {
|
|||||||
t.Fatalf("CreateProxyRoute failed: %v", err)
|
t.Fatalf("CreateProxyRoute failed: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
result, err := PublishConfigVersion("root")
|
result, err := PublishConfigVersion("root", false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("PublishConfigVersion failed: %v", err)
|
t.Fatalf("PublishConfigVersion failed: %v", err)
|
||||||
}
|
}
|
||||||
@@ -685,7 +685,7 @@ func TestPublishConfigVersionUsesNamedUpstreamForOriginBasePath(t *testing.T) {
|
|||||||
t.Fatalf("CreateProxyRoute failed: %v", err)
|
t.Fatalf("CreateProxyRoute failed: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
result, err := PublishConfigVersion("root")
|
result, err := PublishConfigVersion("root", false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("PublishConfigVersion failed: %v", err)
|
t.Fatalf("PublishConfigVersion failed: %v", err)
|
||||||
}
|
}
|
||||||
@@ -709,7 +709,7 @@ func TestPublishConfigVersionUsesNamedUpstreamForHostnameOrigins(t *testing.T) {
|
|||||||
t.Fatalf("CreateProxyRoute failed: %v", err)
|
t.Fatalf("CreateProxyRoute failed: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
result, err := PublishConfigVersion("root")
|
result, err := PublishConfigVersion("root", false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("PublishConfigVersion failed: %v", err)
|
t.Fatalf("PublishConfigVersion failed: %v", err)
|
||||||
}
|
}
|
||||||
@@ -736,7 +736,7 @@ func TestPublishConfigVersionUsesNamedUpstreamForIPOrigins(t *testing.T) {
|
|||||||
t.Fatalf("CreateProxyRoute failed: %v", err)
|
t.Fatalf("CreateProxyRoute failed: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
result, err := PublishConfigVersion("root")
|
result, err := PublishConfigVersion("root", false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("PublishConfigVersion failed: %v", err)
|
t.Fatalf("PublishConfigVersion failed: %v", err)
|
||||||
}
|
}
|
||||||
@@ -810,7 +810,7 @@ func TestPreviewAndDiffConfigVersion(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("CreateProxyRoute removed failed: %v", err)
|
t.Fatalf("CreateProxyRoute removed failed: %v", err)
|
||||||
}
|
}
|
||||||
if _, err = PublishConfigVersion("root"); err != nil {
|
if _, err = PublishConfigVersion("root", false); err != nil {
|
||||||
t.Fatalf("initial PublishConfigVersion failed: %v", err)
|
t.Fatalf("initial PublishConfigVersion failed: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -936,7 +936,7 @@ func TestPublishConfigVersionDetectsPoWChanges(t *testing.T) {
|
|||||||
t.Fatalf("CreateProxyRoute failed: %v", err)
|
t.Fatalf("CreateProxyRoute failed: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
firstRelease, err := PublishConfigVersion("root")
|
firstRelease, err := PublishConfigVersion("root", false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("initial PublishConfigVersion failed: %v", err)
|
t.Fatalf("initial PublishConfigVersion failed: %v", err)
|
||||||
}
|
}
|
||||||
@@ -967,7 +967,7 @@ func TestPublishConfigVersionDetectsPoWChanges(t *testing.T) {
|
|||||||
t.Fatalf("expected PoW change to mark site as modified, got %#v", diff.ModifiedSites)
|
t.Fatalf("expected PoW change to mark site as modified, got %#v", diff.ModifiedSites)
|
||||||
}
|
}
|
||||||
|
|
||||||
secondRelease, err := PublishConfigVersion("root")
|
secondRelease, err := PublishConfigVersion("root", false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("PublishConfigVersion after PoW change failed: %v", err)
|
t.Fatalf("PublishConfigVersion after PoW change failed: %v", err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,8 +27,9 @@ export function getConfigVersionDiff() {
|
|||||||
return apiRequest<ConfigDiffResult>('/config-versions/diff');
|
return apiRequest<ConfigDiffResult>('/config-versions/diff');
|
||||||
}
|
}
|
||||||
|
|
||||||
export function publishConfigVersion() {
|
export function publishConfigVersion(force?: boolean) {
|
||||||
return apiRequest<ConfigVersionDetail>('/config-versions/publish', {
|
const query = force ? '?force=true' : '';
|
||||||
|
return apiRequest<ConfigVersionDetail>(`/config-versions/publish${query}`, {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -435,7 +435,7 @@ export function ConfigVersionsPage() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const publishMutation = useMutation({
|
const publishMutation = useMutation({
|
||||||
mutationFn: publishConfigVersion,
|
mutationFn: (force?: boolean) => publishConfigVersion(force),
|
||||||
onSuccess: async (version) => {
|
onSuccess: async (version) => {
|
||||||
setFeedback({
|
setFeedback({
|
||||||
tone: 'success',
|
tone: 'success',
|
||||||
@@ -517,13 +517,26 @@ export function ConfigVersionsPage() {
|
|||||||
title="配置版本"
|
title="配置版本"
|
||||||
description="查看历史快照、预览待发布配置差异,并在需要时重新激活旧版本。"
|
description="查看历史快照、预览待发布配置差异,并在需要时重新激活旧版本。"
|
||||||
action={
|
action={
|
||||||
<PrimaryButton
|
<div className="flex gap-2">
|
||||||
type="button"
|
<SecondaryButton
|
||||||
onClick={handleOpenPublishPreview}
|
type="button"
|
||||||
disabled={isPreviewLoading}
|
onClick={() => {
|
||||||
>
|
if (window.confirm('确认强制重新发布吗?这会忽略配置变化检查并立即生成一个新版本。')) {
|
||||||
{isPreviewLoading ? '加载预览中...' : '预览并发布'}
|
publishMutation.mutate(true);
|
||||||
</PrimaryButton>
|
}
|
||||||
|
}}
|
||||||
|
disabled={publishMutation.isPending}
|
||||||
|
>
|
||||||
|
重新发布
|
||||||
|
</SecondaryButton>
|
||||||
|
<PrimaryButton
|
||||||
|
type="button"
|
||||||
|
onClick={handleOpenPublishPreview}
|
||||||
|
disabled={isPreviewLoading || publishMutation.isPending}
|
||||||
|
>
|
||||||
|
{isPreviewLoading ? '加载预览中...' : '预览并发布'}
|
||||||
|
</PrimaryButton>
|
||||||
|
</div>
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
@@ -544,7 +557,7 @@ export function ConfigVersionsPage() {
|
|||||||
: null
|
: null
|
||||||
}
|
}
|
||||||
isPublishing={publishMutation.isPending}
|
isPublishing={publishMutation.isPending}
|
||||||
onConfirm={() => publishMutation.mutate()}
|
onConfirm={() => publishMutation.mutate(false)}
|
||||||
onCancel={() => setPublishPreview(null)}
|
onCancel={() => setPublishPreview(null)}
|
||||||
/>
|
/>
|
||||||
) : null}
|
) : null}
|
||||||
|
|||||||
@@ -167,7 +167,7 @@ export function ProxyRoutesPage() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
setFeedback(null);
|
setFeedback(null);
|
||||||
publishMutation.mutate();
|
publishMutation.mutate(false);
|
||||||
};
|
};
|
||||||
|
|
||||||
if (routesQuery.isLoading) {
|
if (routesQuery.isLoading) {
|
||||||
|
|||||||
Reference in New Issue
Block a user