From f13ae8a2e72bc35c62eb05e585e7053846926dae Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Sun, 22 Feb 2026 20:20:50 -0800 Subject: [PATCH] adjustment --- models/project/workflows.go | 9 +++-- models/project/workflows_test.go | 12 +++--- routers/web/projects/workflows.go | 40 +++++++++---------- tests/integration/issue_test.go | 6 +-- tests/integration/project_workflow_test.go | 10 ++--- .../components/projects/ProjectWorkflow.vue | 8 +--- 6 files changed, 39 insertions(+), 46 deletions(-) diff --git a/models/project/workflows.go b/models/project/workflows.go index b3fbde9f6d..fcc84a49c9 100644 --- a/models/project/workflows.go +++ b/models/project/workflows.go @@ -204,15 +204,16 @@ func FindWorkflowsByProjectID(ctx context.Context, projectID int64) ([]*Workflow return workflows, nil } -func GetWorkflowByID(ctx context.Context, id int64) (*Workflow, error) { - p, exist, err := db.GetByID[Workflow](ctx, id) +func GetWorkflowByProjectAndID(ctx context.Context, projectID, workflowID int64) (*Workflow, error) { + var workflow Workflow + exist, err := db.GetEngine(ctx).Where("project_id=? AND id=?", projectID, workflowID).Get(&workflow) if err != nil { return nil, err } if !exist { - return nil, db.ErrNotExist{Resource: "ProjectWorkflow", ID: id} + return nil, db.ErrNotExist{Resource: "ProjectWorkflow", ID: workflowID} } - return p, nil + return &workflow, nil } func CreateWorkflow(ctx context.Context, wf *Workflow) error { diff --git a/models/project/workflows_test.go b/models/project/workflows_test.go index d75595f4cb..581199f8a7 100644 --- a/models/project/workflows_test.go +++ b/models/project/workflows_test.go @@ -126,7 +126,7 @@ func TestCreateWorkflow(t *testing.T) { assert.NotZero(t, workflow.ID, "Workflow ID should be set after creation") // Verify the workflow was created - createdWorkflow, err := GetWorkflowByID(t.Context(), workflow.ID) + createdWorkflow, err := GetWorkflowByProjectAndID(t.Context(), project.ID, workflow.ID) assert.NoError(t, err) assert.Equal(t, project.ID, createdWorkflow.ProjectID) assert.Equal(t, WorkflowEventItemOpened, createdWorkflow.WorkflowEvent) @@ -167,7 +167,7 @@ func TestUpdateWorkflow(t *testing.T) { assert.NoError(t, err) // Verify the update - updatedWorkflow, err := GetWorkflowByID(t.Context(), workflow.ID) + updatedWorkflow, err := GetWorkflowByProjectAndID(t.Context(), project.ID, workflow.ID) assert.NoError(t, err) assert.True(t, updatedWorkflow.Enabled) assert.Len(t, updatedWorkflow.WorkflowFilters, 1) @@ -198,7 +198,7 @@ func TestDeleteWorkflow(t *testing.T) { assert.NoError(t, err) // Verify it was deleted - _, err = GetWorkflowByID(t.Context(), workflowID) + _, err = GetWorkflowByProjectAndID(t.Context(), project.ID, workflowID) assert.Error(t, err) assert.True(t, db.IsErrNotExist(err), "Should return ErrNotExist") } @@ -224,7 +224,7 @@ func TestEnableDisableWorkflow(t *testing.T) { err = DisableWorkflow(t.Context(), workflow.ID) assert.NoError(t, err) - disabledWorkflow, err := GetWorkflowByID(t.Context(), workflow.ID) + disabledWorkflow, err := GetWorkflowByProjectAndID(t.Context(), project.ID, workflow.ID) assert.NoError(t, err) assert.False(t, disabledWorkflow.Enabled) @@ -232,7 +232,7 @@ func TestEnableDisableWorkflow(t *testing.T) { err = EnableWorkflow(t.Context(), workflow.ID) assert.NoError(t, err) - enabledWorkflow, err := GetWorkflowByID(t.Context(), workflow.ID) + enabledWorkflow, err := GetWorkflowByProjectAndID(t.Context(), project.ID, workflow.ID) assert.NoError(t, err) assert.True(t, enabledWorkflow.Enabled) } @@ -294,7 +294,7 @@ func TestWorkflowLoadProject(t *testing.T) { assert.NoError(t, err) // Get the workflow - loadedWorkflow, err := GetWorkflowByID(t.Context(), workflow.ID) + loadedWorkflow, err := GetWorkflowByProjectAndID(t.Context(), project.ID, workflow.ID) assert.NoError(t, err) assert.Nil(t, loadedWorkflow.Project) diff --git a/routers/web/projects/workflows.go b/routers/web/projects/workflows.go index f50e40047c..996e65c8d4 100644 --- a/routers/web/projects/workflows.go +++ b/routers/web/projects/workflows.go @@ -363,6 +363,10 @@ func Workflows(ctx *context.Context) { break } } + if curWorkflow == nil { + ctx.NotFound(nil) + return + } } } ctx.Data["CurWorkflow"] = curWorkflow @@ -455,13 +459,13 @@ func WorkflowsPost(ctx *context.Context) { } // Update an existing workflow - wf, err := project_model.GetWorkflowByID(ctx, eventID) + wf, err := project_model.GetWorkflowByProjectAndID(ctx, p.ID, eventID) if err != nil { - ctx.ServerError("GetWorkflowByID", err) - return - } - if wf.ProjectID != p.ID { - ctx.NotFound(nil) + if db.IsErrNotExist(err) { + ctx.NotFound(nil) + } else { + ctx.ServerError("GetWorkflowByID", err) + } return } @@ -494,14 +498,14 @@ func WorkflowsStatus(ctx *context.Context) { return } - workflowID, _ := strconv.ParseInt(ctx.PathParam("workflow_id"), 10, 64) - wf, err := project_model.GetWorkflowByID(ctx, workflowID) + workflowID := ctx.PathParamInt64("workflow_id") + wf, err := project_model.GetWorkflowByProjectAndID(ctx, p.ID, workflowID) if err != nil { - ctx.ServerError("GetWorkflowByID", err) - return - } - if wf.ProjectID != p.ID { - ctx.NotFound(nil) + if db.IsErrNotExist(err) { + ctx.NotFound(nil) + } else { + ctx.ServerError("GetWorkflowByID", err) + } return } @@ -534,8 +538,8 @@ func WorkflowsDelete(ctx *context.Context) { return } - workflowID, _ := strconv.ParseInt(ctx.PathParam("workflow_id"), 10, 64) - wf, err := project_model.GetWorkflowByID(ctx, workflowID) + workflowID := ctx.PathParamInt64("workflow_id") + wf, err := project_model.GetWorkflowByProjectAndID(ctx, p.ID, workflowID) if err != nil { if db.IsErrNotExist(err) { ctx.NotFound(nil) @@ -544,12 +548,8 @@ func WorkflowsDelete(ctx *context.Context) { } return } - if wf.ProjectID != p.ID { - ctx.NotFound(nil) - return - } - if err := project_model.DeleteWorkflow(ctx, workflowID); err != nil { + if err := project_model.DeleteWorkflow(ctx, wf.ID); err != nil { ctx.ServerError("DeleteWorkflow", err) return } diff --git a/tests/integration/issue_test.go b/tests/integration/issue_test.go index 7fb71dfe69..d85b337a33 100644 --- a/tests/integration/issue_test.go +++ b/tests/integration/issue_test.go @@ -20,7 +20,7 @@ import ( "code.gitea.io/gitea/models/unit" "code.gitea.io/gitea/models/unittest" user_model "code.gitea.io/gitea/models/user" - "code.gitea.io/gitea/modules/container" + "code.gitea.io/gitea/modules/base" "code.gitea.io/gitea/modules/indexer/issues" "code.gitea.io/gitea/modules/references" "code.gitea.io/gitea/modules/setting" @@ -138,9 +138,7 @@ func testNewIssue(t *testing.T, session *TestSession, user, repo string, opts ne link, exists := htmlDoc.doc.Find("form.ui.form").Attr("action") assert.True(t, exists, "The template has changed") - labelIDs := container.FilterSlice(opts.LabelIDs, func(id int64) (string, bool) { - return strconv.FormatInt(id, 10), id != 0 - }) + labelIDs := base.Int64sToStrings(opts.LabelIDs) req = NewRequestWithValues(t, "POST", link, map[string]string{ "title": opts.Title, diff --git a/tests/integration/project_workflow_test.go b/tests/integration/project_workflow_test.go index 1d55f396aa..68a428b945 100644 --- a/tests/integration/project_workflow_test.go +++ b/tests/integration/project_workflow_test.go @@ -275,7 +275,7 @@ func TestProjectWorkflowUpdate(t *testing.T) { assert.True(t, result["success"].(bool)) // Verify workflow was updated - updatedWorkflow, err := project_model.GetWorkflowByID(t.Context(), workflow.ID) + updatedWorkflow, err := project_model.GetWorkflowByProjectAndID(t.Context(), project.ID, workflow.ID) assert.NoError(t, err) assert.True(t, updatedWorkflow.Enabled) assert.Len(t, updatedWorkflow.WorkflowFilters, 1) @@ -327,7 +327,7 @@ func TestProjectWorkflowToggleStatus(t *testing.T) { assert.True(t, result["success"].(bool), "Response should indicate success") // Verify status was changed to disabled - updatedWorkflow, err := project_model.GetWorkflowByID(t.Context(), workflow.ID) + updatedWorkflow, err := project_model.GetWorkflowByProjectAndID(t.Context(), project.ID, workflow.ID) assert.NoError(t, err) assert.False(t, updatedWorkflow.Enabled, "Workflow should be disabled") }) @@ -348,7 +348,7 @@ func TestProjectWorkflowToggleStatus(t *testing.T) { assert.True(t, result["success"].(bool), "Response should indicate success") // Verify status was changed back to enabled - updatedWorkflow, err := project_model.GetWorkflowByID(t.Context(), workflow.ID) + updatedWorkflow, err := project_model.GetWorkflowByProjectAndID(t.Context(), project.ID, workflow.ID) assert.NoError(t, err) assert.True(t, updatedWorkflow.Enabled, "Workflow should be enabled") }) @@ -395,7 +395,7 @@ func TestProjectWorkflowDelete(t *testing.T) { assert.True(t, result["success"].(bool), "Delete response should indicate success") // Verify workflow was deleted - should return ErrNotExist - _, err = project_model.GetWorkflowByID(t.Context(), workflow.ID) + _, err = project_model.GetWorkflowByProjectAndID(t.Context(), project.ID, workflow.ID) assert.Error(t, err, "Should return an error when workflow doesn't exist") assert.True(t, db.IsErrNotExist(err), "Error should be ErrNotExist type") @@ -548,7 +548,7 @@ func TestProjectWorkflowValidation(t *testing.T) { assert.Equal(t, "At least one action must be configured", result["errorMessage"]) // Verify the workflow was not changed - unchangedWorkflow, err := project_model.GetWorkflowByID(t.Context(), workflow.ID) + unchangedWorkflow, err := project_model.GetWorkflowByProjectAndID(t.Context(), project.ID, workflow.ID) assert.NoError(t, err) assert.Len(t, unchangedWorkflow.WorkflowActions, 1, "Workflow should still have the original action") }) diff --git a/web_src/js/components/projects/ProjectWorkflow.vue b/web_src/js/components/projects/ProjectWorkflow.vue index 3590787afb..97948df626 100644 --- a/web_src/js/components/projects/ProjectWorkflow.vue +++ b/web_src/js/components/projects/ProjectWorkflow.vue @@ -698,7 +698,6 @@ onUnmounted(() => { class="ui small button" @click="toggleEditMode" > - {{ locale.cancel }} @@ -708,7 +707,6 @@ onUnmounted(() => { @click="saveWorkflow" :disabled="store.saving" > - {{ locale.save }} @@ -718,7 +716,6 @@ onUnmounted(() => { class="ui small red button" @click="deleteWorkflow" > - {{ locale.delete }} @@ -730,17 +727,15 @@ onUnmounted(() => { class="ui small primary button" @click="toggleEditMode" > - {{ locale.edit }} @@ -750,7 +745,6 @@ onUnmounted(() => { @click="cloneWorkflow(store.selectedWorkflow)" title="Clone this workflow" > - {{ locale.clone }}