feat(i18n): 完成 localized patch 发布回滚闭环
bat-rust / Build and test Rust (push) Canceled after 0s
bat-rust / Build and test Go API (push) Canceled after 0s

Closes #45
This commit is contained in:
2026-08-31 00:02:55 +08:00
parent f441f1810e
commit ab21344773
26 changed files with 1916 additions and 140 deletions
+22
View File
@@ -325,6 +325,20 @@ type TranslationWorkerRunResult struct {
Worker TranslationWorkerConfig `json:"worker"`
}
// LocalizedPublishParams selects the source of one localized release
// publication. TranslationFile and FromWorker are mutually exclusive.
type LocalizedPublishParams struct {
TranslationFile string `json:"translation_file,omitempty"`
FromWorker bool `json:"from_worker,omitempty"`
LocalizedReleaseID string `json:"localized_release_id,omitempty"`
Force bool `json:"force,omitempty"`
}
// LocalizedRollbackParams optionally restricts rollback to one current release.
type LocalizedRollbackParams struct {
LocalizedReleaseID string `json:"localized_release_id,omitempty"`
}
// TranslationProofread marks the current localized workflow as manual
// proofreading. Rust owns the persisted localized state.
func (c *Client) TranslationProofread(ctx context.Context) (json.RawMessage, error) {
@@ -568,6 +582,14 @@ func (c *Client) TranslationWorkerRun(ctx context.Context, params TranslationWor
return &out, err
}
func (c *Client) LocalizedPublish(ctx context.Context, params LocalizedPublishParams) (json.RawMessage, error) {
return c.rawData(ctx, "localized.publish", params)
}
func (c *Client) LocalizedRollback(ctx context.Context, params LocalizedRollbackParams) (json.RawMessage, error) {
return c.rawData(ctx, "localized.rollback", params)
}
func (c *Client) CatalogStatus(ctx context.Context) (json.RawMessage, error) {
return c.rawData(ctx, "catalog.status", nil)
}
+69
View File
@@ -561,6 +561,75 @@ func TestTranslationProofreadUsesRustMethod(t *testing.T) {
}
}
func TestLocalizedPublishSendsWorkerSourceAndReleaseOptions(t *testing.T) {
client := newTestClient(t, func(t *testing.T, req testRequest) testResponse {
if req.Method != "localized.publish" {
t.Fatalf("method = %s", req.Method)
}
var params LocalizedPublishParams
if err := json.Unmarshal(req.Params, &params); err != nil {
t.Fatalf("decode params: %v", err)
}
if !params.FromWorker || params.TranslationFile != "" ||
params.LocalizedReleaseID != "localized-1" || !params.Force {
t.Fatalf("params = %#v", params)
}
return testResponse{
Result: testEnvelope{
OK: true,
Status: "ok",
RequestID: "req-test-localized-publish",
Data: map[string]any{"status": "published"},
},
}
})
raw, err := client.LocalizedPublish(context.Background(), LocalizedPublishParams{
FromWorker: true,
LocalizedReleaseID: "localized-1",
Force: true,
})
if err != nil {
t.Fatalf("LocalizedPublish error: %v", err)
}
if !json.Valid(raw) {
t.Fatalf("invalid raw JSON: %s", string(raw))
}
}
func TestLocalizedRollbackSendsExpectedRelease(t *testing.T) {
client := newTestClient(t, func(t *testing.T, req testRequest) testResponse {
if req.Method != "localized.rollback" {
t.Fatalf("method = %s", req.Method)
}
var params LocalizedRollbackParams
if err := json.Unmarshal(req.Params, &params); err != nil {
t.Fatalf("decode params: %v", err)
}
if params.LocalizedReleaseID != "localized-1" {
t.Fatalf("params = %#v", params)
}
return testResponse{
Result: testEnvelope{
OK: true,
Status: "ok",
RequestID: "req-test-localized-rollback",
Data: map[string]any{"status": "rolled_back"},
},
}
})
raw, err := client.LocalizedRollback(context.Background(), LocalizedRollbackParams{
LocalizedReleaseID: "localized-1",
})
if err != nil {
t.Fatalf("LocalizedRollback error: %v", err)
}
if !json.Valid(raw) {
t.Fatalf("invalid raw JSON: %s", string(raw))
}
}
func TestApplicationErrorReturnsAPIError(t *testing.T) {
client := newTestClient(t, func(t *testing.T, req testRequest) testResponse {
if req.Method != "task.status" {