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 }}