You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@answer.apache.org by li...@apache.org on 2026/08/17 03:21:49 UTC

(answer) 03/06: fix: align question operation permissions

This is an automated email from the ASF dual-hosted git repository.

LinkinStars pushed a commit to branch fix/2.0.3/user
in repository https://gitbox.apache.org/repos/asf/answer.git

commit 21e0714a0876c6b2e3e8eee44178d97846c6bcb3
Author: LinkinStars <li...@foxmail.com>
AuthorDate: Fri Aug 14 17:03:23 2026 +0800

    fix: align question operation permissions
---
 internal/controller/question_controller.go      | 23 ++++++++----
 internal/controller/question_controller_test.go | 49 +++++++++++++++++++++++++
 2 files changed, 65 insertions(+), 7 deletions(-)

diff --git a/internal/controller/question_controller.go b/internal/controller/question_controller.go
index 05ad319a..644e3097 100644
--- a/internal/controller/question_controller.go
+++ b/internal/controller/question_controller.go
@@ -144,13 +144,7 @@ func (qc *QuestionController) OperationQuestion(ctx *gin.Context) {
 		handler.HandleResponse(ctx, err, nil)
 		return
 	}
-	req.CanPin = canList[0]
-	req.CanList = canList[1]
-	if (req.Operation == schema.QuestionOperationPin || req.Operation == schema.QuestionOperationUnPin) && !req.CanPin {
-		handler.HandleResponse(ctx, errors.Forbidden(reason.RankFailToMeetTheCondition), nil)
-		return
-	}
-	if (req.Operation == schema.QuestionOperationHide || req.Operation == schema.QuestionOperationShow) && !req.CanList {
+	if !canOperateQuestion(req.Operation, canList) {
 		handler.HandleResponse(ctx, errors.Forbidden(reason.RankFailToMeetTheCondition), nil)
 		return
 	}
@@ -158,6 +152,21 @@ func (qc *QuestionController) OperationQuestion(ctx *gin.Context) {
 	handler.HandleResponse(ctx, err, nil)
 }
 
+func canOperateQuestion(operation string, canList []bool) bool {
+	switch operation {
+	case schema.QuestionOperationPin:
+		return canList[0]
+	case schema.QuestionOperationUnPin:
+		return canList[1]
+	case schema.QuestionOperationHide:
+		return canList[2]
+	case schema.QuestionOperationShow:
+		return canList[3]
+	default:
+		return true
+	}
+}
+
 // CloseQuestion Close question
 // @Summary Close question
 // @Description Close question
diff --git a/internal/controller/question_controller_test.go b/internal/controller/question_controller_test.go
new file mode 100644
index 00000000..35d75f41
--- /dev/null
+++ b/internal/controller/question_controller_test.go
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package controller
+
+import (
+	"testing"
+
+	"github.com/apache/answer/internal/schema"
+)
+
+func TestCanOperateQuestionUsesMatchingPermission(t *testing.T) {
+	testCases := []struct {
+		name      string
+		operation string
+		canList   []bool
+		want      bool
+	}{
+		{"pin", schema.QuestionOperationPin, []bool{true, false, false, false}, true},
+		{"unpin", schema.QuestionOperationUnPin, []bool{false, true, false, false}, true},
+		{"hide", schema.QuestionOperationHide, []bool{false, false, true, false}, true},
+		{"show", schema.QuestionOperationShow, []bool{false, false, false, true}, true},
+		{"unpin does not authorize hide", schema.QuestionOperationHide, []bool{false, true, false, false}, false},
+	}
+
+	for _, testCase := range testCases {
+		t.Run(testCase.name, func(t *testing.T) {
+			if got := canOperateQuestion(testCase.operation, testCase.canList); got != testCase.want {
+				t.Fatalf("canOperateQuestion(%q, %v) = %v, want %v", testCase.operation, testCase.canList, got, testCase.want)
+			}
+		})
+	}
+}