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

linkinstar pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/answer.git


The following commit(s) were added to refs/heads/dev by this push:
     new 670aa323 refactor(lint): add new linters and fix their issues
670aa323 is described below

commit 670aa323254ca8f2a5d3927353afb83b7724e424
Author: ferhat elmas <[email protected]>
AuthorDate: Mon Dec 1 21:22:18 2025 +0100

    refactor(lint): add new linters and fix their issues
    
    * gocritic
    * misspell
    * modernize (aside, bumping go would be nice)
    * testifylint
    * unconvert
    * unparam
    * whitespace
    
    related to #1432
    
    Signed-off-by: ferhat elmas <[email protected]>
---
 .golangci.yaml                                     |  7 +++
 i18n/cs_CZ.yaml                                    |  2 +-
 i18n/cy_GB.yaml                                    |  2 +-
 i18n/da_DK.yaml                                    |  2 +-
 i18n/de_DE.yaml                                    |  2 +-
 i18n/en_US.yaml                                    |  2 +-
 i18n/es_ES.yaml                                    |  2 +-
 i18n/fa_IR.yaml                                    |  2 +-
 i18n/fr_FR.yaml                                    |  2 +-
 i18n/hi_IN.yaml                                    |  2 +-
 i18n/id_ID.yaml                                    |  2 +-
 i18n/it_IT.yaml                                    |  2 +-
 i18n/ja_JP.yaml                                    |  2 +-
 i18n/ko_KR.yaml                                    |  2 +-
 i18n/ml_IN.yaml                                    |  2 +-
 i18n/pl_PL.yaml                                    |  2 +-
 i18n/pt_PT.yaml                                    |  2 +-
 i18n/ro_RO.yaml                                    |  2 +-
 i18n/ru_RU.yaml                                    |  2 +-
 i18n/sk_SK.yaml                                    |  2 +-
 i18n/sv_SE.yaml                                    | 10 ++--
 i18n/te_IN.yaml                                    |  2 +-
 i18n/tr_TR.yaml                                    |  2 +-
 i18n/uk_UA.yaml                                    |  2 +-
 i18n/vi_VN.yaml                                    |  2 +-
 i18n/zh_CN.yaml                                    |  2 +-
 i18n/zh_TW.yaml                                    |  2 +-
 internal/base/middleware/avatar.go                 |  1 -
 internal/base/reason/reason.go                     |  2 +-
 internal/base/server/http.go                       |  1 -
 internal/base/server/http_funcmap.go               |  4 +-
 internal/controller/question_controller.go         |  3 +-
 internal/controller/template_controller.go         |  8 ++-
 internal/controller/template_render/comment.go     |  1 -
 internal/controller/template_render/controller.go  | 10 ++--
 internal/controller/user_controller.go             |  1 -
 internal/entity/collection_entity.go               |  4 +-
 internal/install/install_req.go                    |  9 ++--
 internal/migrations/v12.go                         |  1 -
 internal/migrations/v13.go                         |  4 +-
 internal/repo/activity/follow_repo.go              |  2 +-
 internal/repo/activity_common/follow.go            |  6 +--
 internal/repo/answer/answer_repo.go                |  2 +-
 internal/repo/collection/collection_repo.go        |  4 +-
 internal/repo/question/question_repo.go            |  8 +--
 internal/repo/rank/user_rank_repo.go               |  2 +-
 internal/repo/repo_test/auth_test.go               | 31 ++++++------
 internal/repo/repo_test/captcha_test.go            | 11 ++--
 internal/repo/repo_test/comment_repo_test.go       | 27 +++++-----
 internal/repo/repo_test/email_repo_test.go         |  5 +-
 internal/repo/repo_test/meta_repo_test.go          | 31 ++++++------
 internal/repo/repo_test/notification_repo_test.go  | 33 ++++++------
 internal/repo/repo_test/reason_repo_test.go        |  5 +-
 internal/repo/repo_test/recommend_test.go          | 27 +++++-----
 internal/repo/repo_test/repo_main_test.go          |  2 +-
 internal/repo/repo_test/revision_repo_test.go      | 17 ++++---
 internal/repo/repo_test/siteinfo_repo_test.go      |  9 ++--
 internal/repo/repo_test/tag_rel_repo_test.go       | 25 +++++-----
 internal/repo/repo_test/tag_repo_test.go           | 33 ++++++------
 internal/repo/repo_test/user_backyard_repo_test.go | 15 +++---
 internal/repo/repo_test/user_repo_test.go          | 35 ++++++-------
 internal/repo/search_common/search_repo.go         |  4 +-
 internal/schema/backyard_user_schema.go            |  2 +-
 internal/schema/meta_schema.go                     | 16 ++----
 internal/schema/notification_schema.go             |  6 +--
 internal/schema/revision_schema.go                 |  2 +-
 internal/schema/siteinfo_schema.go                 |  2 +-
 internal/schema/tag_schema.go                      |  2 +-
 internal/service/action/captcha_strategy.go        | 21 ++++----
 internal/service/auth/auth.go                      |  2 +-
 internal/service/comment/comment_service.go        | 15 +++---
 internal/service/content/answer_service.go         | 13 +++--
 .../service/content/question_hottest_service.go    |  1 -
 internal/service/content/question_service.go       | 58 ++++++++++------------
 internal/service/content/revision_service.go       |  1 -
 internal/service/content/search_service.go         | 14 +++---
 internal/service/content/user_service.go           |  7 ++-
 internal/service/dashboard/dashboard_service.go    | 18 +++----
 .../notification/invite_answer_notification.go     |  3 +-
 .../notification/new_answer_notification.go        |  3 +-
 .../notification/new_comment_notification.go       |  3 +-
 .../notification/new_question_notification.go      |  3 +-
 .../service/notification/notification_service.go   | 13 ++---
 .../service/notification_common/notification.go    |  2 +-
 .../service/plugin_common/plugin_common_service.go |  1 -
 internal/service/question_common/question.go       | 11 ++--
 .../siteinfo_common/siteinfo_service_test.go       |  5 +-
 internal/service/tag/tag_service.go                |  4 +-
 internal/service/tag_common/tag_common.go          |  8 ++-
 internal/service/uploader/upload.go                |  2 -
 internal/service/user_admin/user_backyard.go       | 23 +++++----
 internal/service/user_common/user.go               |  4 +-
 .../user_notification_config_service.go            |  2 +-
 pkg/checker/file_type.go                           |  8 +--
 pkg/checker/path_ignore.go                         | 15 ++----
 pkg/checker/question_link.go                       | 11 ++--
 pkg/converter/markdown.go                          | 18 +++----
 pkg/day/day.go                                     |  7 +--
 pkg/dir/dir.go                                     | 16 +++---
 pkg/htmltext/htmltext.go                           | 14 +++---
 pkg/htmltext/htmltext_test.go                      |  4 +-
 plugin/plugin_test/plugin_main_test.go             | 13 ++---
 102 files changed, 392 insertions(+), 431 deletions(-)

diff --git a/.golangci.yaml b/.golangci.yaml
index 611b49bc..09fca51c 100644
--- a/.golangci.yaml
+++ b/.golangci.yaml
@@ -29,6 +29,13 @@ linters:
     - bodyclose # checks whether HTTP response body is closed successfully
     - canonicalheader # checks whether net/http.Header uses canonical header
     - copyloopvar # detects places where loop variables are copied (Go 1.22+)
+    - gocritic # provides diagnostics that check for bugs, performance and 
style issues
+    - misspell # finds commonly misspelled English words in comments and 
strings
+    - modernize # detects code that can be modernized to use newer Go features
+    - testifylint # checks usage of github.com/stretchr/testify
+    - unconvert # removes unnecessary type conversions
+    - unparam # reports unused function parameters
+    - whitespace # detects leading and trailing whitespace
 
 formatters:
   enable:
diff --git a/i18n/cs_CZ.yaml b/i18n/cs_CZ.yaml
index d9f972a6..ab53cb63 100644
--- a/i18n/cs_CZ.yaml
+++ b/i18n/cs_CZ.yaml
@@ -234,7 +234,7 @@ backend:
         other: Nemáte oprávnění pro aktualizaci.
       content_cannot_empty:
         other: Content cannot be empty.
-      content_less_than_minumum:
+      content_less_than_minimum:
         other: Not enough content entered.
     rank:
       fail_to_meet_the_condition:
diff --git a/i18n/cy_GB.yaml b/i18n/cy_GB.yaml
index 267070a0..5a5b9a65 100644
--- a/i18n/cy_GB.yaml
+++ b/i18n/cy_GB.yaml
@@ -234,7 +234,7 @@ backend:
         other: Dim caniatâd i ddiweddaru.
       content_cannot_empty:
         other: Content cannot be empty.
-      content_less_than_minumum:
+      content_less_than_minimum:
         other: Not enough content entered.
     rank:
       fail_to_meet_the_condition:
diff --git a/i18n/da_DK.yaml b/i18n/da_DK.yaml
index d3f410e4..37adc7db 100644
--- a/i18n/da_DK.yaml
+++ b/i18n/da_DK.yaml
@@ -234,7 +234,7 @@ backend:
         other: Ingen tilladelse til at opdatere.
       content_cannot_empty:
         other: Content cannot be empty.
-      content_less_than_minumum:
+      content_less_than_minimum:
         other: Not enough content entered.
     rank:
       fail_to_meet_the_condition:
diff --git a/i18n/de_DE.yaml b/i18n/de_DE.yaml
index d7683f03..542dca9b 100644
--- a/i18n/de_DE.yaml
+++ b/i18n/de_DE.yaml
@@ -234,7 +234,7 @@ backend:
         other: Keine Berechtigung zum Aktualisieren.
       content_cannot_empty:
         other: Der Inhalt darf nicht leer sein.
-      content_less_than_minumum:
+      content_less_than_minimum:
         other: Not enough content entered.
     rank:
       fail_to_meet_the_condition:
diff --git a/i18n/en_US.yaml b/i18n/en_US.yaml
index 40017b75..6ff6ef3c 100644
--- a/i18n/en_US.yaml
+++ b/i18n/en_US.yaml
@@ -235,7 +235,7 @@ backend:
         other: No permission to update.
       content_cannot_empty:
         other: Content cannot be empty.
-      content_less_than_minumum:
+      content_less_than_minimum:
         other: Not enough content entered.
     rank:
       fail_to_meet_the_condition:
diff --git a/i18n/es_ES.yaml b/i18n/es_ES.yaml
index 99071e2f..f53a2810 100644
--- a/i18n/es_ES.yaml
+++ b/i18n/es_ES.yaml
@@ -234,7 +234,7 @@ backend:
         other: Sin permiso para actualizar.
       content_cannot_empty:
         other: Content cannot be empty.
-      content_less_than_minumum:
+      content_less_than_minimum:
         other: Not enough content entered.
     rank:
       fail_to_meet_the_condition:
diff --git a/i18n/fa_IR.yaml b/i18n/fa_IR.yaml
index 600d5cc1..d013d017 100644
--- a/i18n/fa_IR.yaml
+++ b/i18n/fa_IR.yaml
@@ -234,7 +234,7 @@ backend:
         other: اجازه بروزرسانی ندارید.
       content_cannot_empty:
         other: Content cannot be empty.
-      content_less_than_minumum:
+      content_less_than_minimum:
         other: Not enough content entered.
     rank:
       fail_to_meet_the_condition:
diff --git a/i18n/fr_FR.yaml b/i18n/fr_FR.yaml
index ecb87bef..879906fa 100644
--- a/i18n/fr_FR.yaml
+++ b/i18n/fr_FR.yaml
@@ -234,7 +234,7 @@ backend:
         other: Pas de permission pour mettre à jour.
       content_cannot_empty:
         other: Le contenu ne peut pas être vide.
-      content_less_than_minumum:
+      content_less_than_minimum:
         other: Not enough content entered.
     rank:
       fail_to_meet_the_condition:
diff --git a/i18n/hi_IN.yaml b/i18n/hi_IN.yaml
index 09be6201..eb0cb50b 100644
--- a/i18n/hi_IN.yaml
+++ b/i18n/hi_IN.yaml
@@ -234,7 +234,7 @@ backend:
         other: No permission to update.
       content_cannot_empty:
         other: Content cannot be empty.
-      content_less_than_minumum:
+      content_less_than_minimum:
         other: Not enough content entered.
     rank:
       fail_to_meet_the_condition:
diff --git a/i18n/id_ID.yaml b/i18n/id_ID.yaml
index f8a4a8a8..43c0d70d 100644
--- a/i18n/id_ID.yaml
+++ b/i18n/id_ID.yaml
@@ -234,7 +234,7 @@ backend:
         other: Tidak diizinkan untuk memperbarui.
       content_cannot_empty:
         other: Content cannot be empty.
-      content_less_than_minumum:
+      content_less_than_minimum:
         other: Not enough content entered.
     rank:
       fail_to_meet_the_condition:
diff --git a/i18n/it_IT.yaml b/i18n/it_IT.yaml
index 29cd1f52..50f60aa6 100644
--- a/i18n/it_IT.yaml
+++ b/i18n/it_IT.yaml
@@ -234,7 +234,7 @@ backend:
         other: Nessun permesso per l'aggiornamento.
       content_cannot_empty:
         other: Il contenuto non può essere vuoto.
-      content_less_than_minumum:
+      content_less_than_minimum:
         other: Not enough content entered.
     rank:
       fail_to_meet_the_condition:
diff --git a/i18n/ja_JP.yaml b/i18n/ja_JP.yaml
index 8e2fb52c..4bfe45c9 100644
--- a/i18n/ja_JP.yaml
+++ b/i18n/ja_JP.yaml
@@ -234,7 +234,7 @@ backend:
         other: 更新する権限がありません。
       content_cannot_empty:
         other: Content cannot be empty.
-      content_less_than_minumum:
+      content_less_than_minimum:
         other: Not enough content entered.
     rank:
       fail_to_meet_the_condition:
diff --git a/i18n/ko_KR.yaml b/i18n/ko_KR.yaml
index be180745..0ddefa61 100644
--- a/i18n/ko_KR.yaml
+++ b/i18n/ko_KR.yaml
@@ -234,7 +234,7 @@ backend:
         other: 업데이트 권한이 없습니다.
       content_cannot_empty:
         other: 내용은 비워둘 수 없습니다.
-      content_less_than_minumum:
+      content_less_than_minimum:
         other: Not enough content entered.
     rank:
       fail_to_meet_the_condition:
diff --git a/i18n/ml_IN.yaml b/i18n/ml_IN.yaml
index 42135031..e2cac0e0 100644
--- a/i18n/ml_IN.yaml
+++ b/i18n/ml_IN.yaml
@@ -234,7 +234,7 @@ backend:
         other: No permission to update.
       content_cannot_empty:
         other: Content cannot be empty.
-      content_less_than_minumum:
+      content_less_than_minimum:
         other: Not enough content entered.
     rank:
       fail_to_meet_the_condition:
diff --git a/i18n/pl_PL.yaml b/i18n/pl_PL.yaml
index ae26c6d1..e5972d9b 100644
--- a/i18n/pl_PL.yaml
+++ b/i18n/pl_PL.yaml
@@ -234,7 +234,7 @@ backend:
         other: Brak uprawnień do edycji.
       content_cannot_empty:
         other: Content cannot be empty.
-      content_less_than_minumum:
+      content_less_than_minimum:
         other: Not enough content entered.
     rank:
       fail_to_meet_the_condition:
diff --git a/i18n/pt_PT.yaml b/i18n/pt_PT.yaml
index 997bb055..5989071e 100644
--- a/i18n/pt_PT.yaml
+++ b/i18n/pt_PT.yaml
@@ -234,7 +234,7 @@ backend:
         other: Sem permissão para atualizar.
       content_cannot_empty:
         other: Content cannot be empty.
-      content_less_than_minumum:
+      content_less_than_minimum:
         other: Not enough content entered.
     rank:
       fail_to_meet_the_condition:
diff --git a/i18n/ro_RO.yaml b/i18n/ro_RO.yaml
index cd0afb8a..43af2180 100644
--- a/i18n/ro_RO.yaml
+++ b/i18n/ro_RO.yaml
@@ -234,7 +234,7 @@ backend:
         other: Nu aveți permisiunea de a actualiza.
       content_cannot_empty:
         other: Conținutul nu poate fi gol.
-      content_less_than_minumum:
+      content_less_than_minimum:
         other: Not enough content entered.
     rank:
       fail_to_meet_the_condition:
diff --git a/i18n/ru_RU.yaml b/i18n/ru_RU.yaml
index c554ac8d..458fd2e6 100644
--- a/i18n/ru_RU.yaml
+++ b/i18n/ru_RU.yaml
@@ -234,7 +234,7 @@ backend:
         other: Нет разрешения на обновление.
       content_cannot_empty:
         other: Content cannot be empty.
-      content_less_than_minumum:
+      content_less_than_minimum:
         other: Not enough content entered.
     rank:
       fail_to_meet_the_condition:
diff --git a/i18n/sk_SK.yaml b/i18n/sk_SK.yaml
index 72bd4726..cd629fc9 100644
--- a/i18n/sk_SK.yaml
+++ b/i18n/sk_SK.yaml
@@ -234,7 +234,7 @@ backend:
         other: Žiadne povolenie na aktualizáciu.
       content_cannot_empty:
         other: Content cannot be empty.
-      content_less_than_minumum:
+      content_less_than_minimum:
         other: Not enough content entered.
     rank:
       fail_to_meet_the_condition:
diff --git a/i18n/sv_SE.yaml b/i18n/sv_SE.yaml
index 243703ce..abf58112 100644
--- a/i18n/sv_SE.yaml
+++ b/i18n/sv_SE.yaml
@@ -162,7 +162,7 @@ backend:
       cannot_modify_self_status:
         other: Du får inte ändra din status.
       email_or_password_wrong:
-        other: Fel e-post eller lösenord. 
+        other: Fel e-post eller lösenord.
     answer:
       not_found:
         other: Svar hittades inte.
@@ -189,12 +189,12 @@ backend:
       need_to_be_verified:
         other: E-postadressen ska vara verifierad.
       verify_url_expired:
-        other: Länken för att verifiera e-postadressen har gått ut. Vänligen 
skicka igen. 
+        other: Länken för att verifiera e-postadressen har gått ut. Vänligen 
skicka igen.
       illegal_email_domain_error:
-        other: E-post från den domänen tillåts inte. Vänligen använt en annan. 
+        other: E-post från den domänen tillåts inte. Vänligen använt en annan.
     lang:
       not_found:
-        other: Språkfilen hittas inte. 
+        other: Språkfilen hittas inte.
     object:
       captcha_verification_failed:
         other: Fel Captcha.
@@ -234,7 +234,7 @@ backend:
         other: No permission to update.
       content_cannot_empty:
         other: Content cannot be empty.
-      content_less_than_minumum:
+      content_less_than_minimum:
         other: Not enough content entered.
     rank:
       fail_to_meet_the_condition:
diff --git a/i18n/te_IN.yaml b/i18n/te_IN.yaml
index dbf4acb1..9e80aa8d 100644
--- a/i18n/te_IN.yaml
+++ b/i18n/te_IN.yaml
@@ -234,7 +234,7 @@ backend:
         other: No permission to update.
       content_cannot_empty:
         other: Content cannot be empty.
-      content_less_than_minumum:
+      content_less_than_minimum:
         other: Not enough content entered.
     rank:
       fail_to_meet_the_condition:
diff --git a/i18n/tr_TR.yaml b/i18n/tr_TR.yaml
index fdecee53..92d97ebe 100644
--- a/i18n/tr_TR.yaml
+++ b/i18n/tr_TR.yaml
@@ -234,7 +234,7 @@ backend:
         other: Güncelleme izni yok.
       content_cannot_empty:
         other: İçerik boş olamaz.
-      content_less_than_minumum:
+      content_less_than_minimum:
         other: Not enough content entered.
     rank:
       fail_to_meet_the_condition:
diff --git a/i18n/uk_UA.yaml b/i18n/uk_UA.yaml
index ea0e4591..67496262 100644
--- a/i18n/uk_UA.yaml
+++ b/i18n/uk_UA.yaml
@@ -234,7 +234,7 @@ backend:
         other: Немає дозволу на оновлення.
       content_cannot_empty:
         other: Content cannot be empty.
-      content_less_than_minumum:
+      content_less_than_minimum:
         other: Not enough content entered.
     rank:
       fail_to_meet_the_condition:
diff --git a/i18n/vi_VN.yaml b/i18n/vi_VN.yaml
index 6f5e5cbb..af01b1da 100644
--- a/i18n/vi_VN.yaml
+++ b/i18n/vi_VN.yaml
@@ -234,7 +234,7 @@ backend:
         other: Không có quyền cập nhật.
       content_cannot_empty:
         other: Content cannot be empty.
-      content_less_than_minumum:
+      content_less_than_minimum:
         other: Not enough content entered.
     rank:
       fail_to_meet_the_condition:
diff --git a/i18n/zh_CN.yaml b/i18n/zh_CN.yaml
index 0f7a2515..35321ac1 100644
--- a/i18n/zh_CN.yaml
+++ b/i18n/zh_CN.yaml
@@ -234,7 +234,7 @@ backend:
         other: 没有更新权限。
       content_cannot_empty:
         other: 内容不能为空。
-      content_less_than_minumum:
+      content_less_than_minimum:
         other: 输入的内容不足。
     rank:
       fail_to_meet_the_condition:
diff --git a/i18n/zh_TW.yaml b/i18n/zh_TW.yaml
index cc362ea1..4b239c1e 100644
--- a/i18n/zh_TW.yaml
+++ b/i18n/zh_TW.yaml
@@ -234,7 +234,7 @@ backend:
         other: 無更新權限。
       content_cannot_empty:
         other: Content cannot be empty.
-      content_less_than_minumum:
+      content_less_than_minimum:
         other: Not enough content entered.
     rank:
       fail_to_meet_the_condition:
diff --git a/internal/base/middleware/avatar.go 
b/internal/base/middleware/avatar.go
index 98430638..42b28da9 100644
--- a/internal/base/middleware/avatar.go
+++ b/internal/base/middleware/avatar.go
@@ -80,7 +80,6 @@ func (am *AvatarMiddleware) AvatarThumb() gin.HandlerFunc {
                        }
                        ctx.Abort()
                        return
-
                } else {
                        urlInfo, err := url.Parse(uri)
                        if err != nil {
diff --git a/internal/base/reason/reason.go b/internal/base/reason/reason.go
index 42e29f4c..97aaa75a 100644
--- a/internal/base/reason/reason.go
+++ b/internal/base/reason/reason.go
@@ -47,7 +47,7 @@ const (
        QuestionAlreadyDeleted           = "error.question.already_deleted"
        QuestionUnderReview              = "error.question.under_review"
        QuestionContentCannotEmpty       = "error.question.content_cannot_empty"
-       QuestionContentLessThanMinimum   = 
"error.question.content_less_than_minumum"
+       QuestionContentLessThanMinimum   = 
"error.question.content_less_than_minimum"
        AnswerNotFound                   = "error.answer.not_found"
        AnswerCannotDeleted              = "error.answer.cannot_deleted"
        AnswerCannotUpdate               = "error.answer.cannot_update"
diff --git a/internal/base/server/http.go b/internal/base/server/http.go
index 088bbc9e..4fbb04cb 100644
--- a/internal/base/server/http.go
+++ b/internal/base/server/http.go
@@ -44,7 +44,6 @@ func NewHTTPServer(debug bool,
        pluginAPIRouter *router.PluginAPIRouter,
        uiConf *UI,
 ) *gin.Engine {
-
        if debug {
                gin.SetMode(gin.DebugMode)
        } else {
diff --git a/internal/base/server/http_funcmap.go 
b/internal/base/server/http_funcmap.go
index db460457..a5d530b5 100644
--- a/internal/base/server/http_funcmap.go
+++ b/internal/base/server/http_funcmap.go
@@ -134,9 +134,7 @@ var funcMap = template.FuncMap{
                        "timezone": tz,
                }
        },
-       "urlTitle": func(title string) string {
-               return htmltext.UrlTitle(title)
-       },
+       "urlTitle": htmltext.UrlTitle,
 }
 
 func FormatLinkNofollow(html string) string {
diff --git a/internal/controller/question_controller.go 
b/internal/controller/question_controller.go
index 4b1869fa..581cf548 100644
--- a/internal/controller/question_controller.go
+++ b/internal/controller/question_controller.go
@@ -287,7 +287,6 @@ func (qc *QuestionController) GetQuestionInviteUserInfo(ctx 
*gin.Context) {
        questionID := uid.DeShortID(ctx.Query("id"))
        resp, err := qc.questionService.InviteUserInfo(ctx, questionID)
        handler.HandleResponse(ctx, err, resp)
-
 }
 
 // SimilarQuestion godoc
@@ -578,7 +577,7 @@ func (qc *QuestionController) AddQuestionByAnswer(ctx 
*gin.Context) {
                handler.HandleResponse(ctx, 
errors.BadRequest(reason.RequestFormatError), errFields)
                return
        }
-       //add the question id to the answer
+       // add the question id to the answer
        questionInfo, ok := resp.(*schema.QuestionInfoResp)
        if ok {
                answerReq := &schema.AnswerAddReq{}
diff --git a/internal/controller/template_controller.go 
b/internal/controller/template_controller.go
index 801e129c..f6a442c2 100644
--- a/internal/controller/template_controller.go
+++ b/internal/controller/template_controller.go
@@ -263,14 +263,13 @@ func (tc *TemplateController) QuestionInfoRedirect(ctx 
*gin.Context, siteInfo *s
                if needChangeShortID {
                        return true, url
                }
-               //not have title
+               // not have title
                if titleIsAnswerID || len(title) == 0 {
                        return false, ""
                }
 
                return true, url
        } else {
-
                detail, err := tc.templateRenderController.QuestionDetail(ctx, 
questionID)
                if err != nil {
                        tc.Page404(ctx)
@@ -284,7 +283,7 @@ func (tc *TemplateController) QuestionInfoRedirect(ctx 
*gin.Context, siteInfo *s
                if len(ctx.Request.URL.Query()) > 0 {
                        url = fmt.Sprintf("%s?%s", url, 
ctx.Request.URL.RawQuery)
                }
-               //have title
+               // have title
                if len(title) > 0 && !titleIsAnswerID && correctTitle {
                        if needChangeShortID {
                                return true, url
@@ -370,7 +369,7 @@ func (tc *TemplateController) QuestionInfo(ctx 
*gin.Context) {
        UrlUseTitle := siteInfo.SiteSeo.Permalink == 
constant.PermalinkQuestionIDAndTitle ||
                siteInfo.SiteSeo.Permalink == 
constant.PermalinkQuestionIDAndTitleByShortID
 
-       //related question
+       // related question
        userID := middleware.GetLoginUserIDFromContext(ctx)
        relatedQuestion, _, _ := tc.questionService.SimilarQuestion(ctx, id, 
userID)
 
@@ -553,7 +552,6 @@ func (tc *TemplateController) UserInfo(ctx *gin.Context) {
                "topQuestions": questionList,
                "topAnswers":   answerList,
        })
-
 }
 
 func (tc *TemplateController) Page404(ctx *gin.Context) {
diff --git a/internal/controller/template_render/comment.go 
b/internal/controller/template_render/comment.go
index 2862ad8d..c1265bd0 100644
--- a/internal/controller/template_render/comment.go
+++ b/internal/controller/template_render/comment.go
@@ -33,7 +33,6 @@ func (t *TemplateRenderController) CommentList(
        comments map[string][]*schema.GetCommentResp,
        err error,
 ) {
-
        comments = make(map[string][]*schema.GetCommentResp, len(objectIDs))
 
        for _, objectID := range objectIDs {
diff --git a/internal/controller/template_render/controller.go 
b/internal/controller/template_render/controller.go
index 3412010d..297b3f9a 100644
--- a/internal/controller/template_render/controller.go
+++ b/internal/controller/template_render/controller.go
@@ -78,10 +78,10 @@ func Paginator(page, pageSize int, nums int64) 
*schema.Paginator {
                pageSize = 10
        }
 
-       var prevpage int //Previous page address
-       var nextpage int //Address on the last page
-       //Generate the total number of pages based on the total number of nums 
and the number of prepage pages
-       totalpages := int(math.Ceil(float64(nums) / float64(pageSize))) //Total 
number of Pages
+       var prevpage int // Previous page address
+       var nextpage int // Address on the last page
+       // Generate the total number of pages based on the total number of nums 
and the number of prepage pages
+       totalpages := int(math.Ceil(float64(nums) / float64(pageSize))) // 
Total number of Pages
        if page > totalpages {
                page = totalpages
        }
@@ -90,7 +90,7 @@ func Paginator(page, pageSize int, nums int64) 
*schema.Paginator {
        }
        var pages []int
        switch {
-       case page >= totalpages-5 && totalpages > 5: //The last 5 pages
+       case page >= totalpages-5 && totalpages > 5: // The last 5 pages
                start := totalpages - 5 + 1
                prevpage = page - 1
                nextpage = int(math.Min(float64(totalpages), float64(page+1)))
diff --git a/internal/controller/user_controller.go 
b/internal/controller/user_controller.go
index e4a3b3d3..cc89caf1 100644
--- a/internal/controller/user_controller.go
+++ b/internal/controller/user_controller.go
@@ -509,7 +509,6 @@ func (uc *UserController) ActionRecord(ctx *gin.Context) {
                resp, err := uc.actionService.ActionRecord(ctx, req)
                handler.HandleResponse(ctx, err, resp)
        }
-
 }
 
 // GetUserNotificationConfig get user's notification config
diff --git a/internal/entity/collection_entity.go 
b/internal/entity/collection_entity.go
index 5fbd5b0e..24ae232f 100644
--- a/internal/entity/collection_entity.go
+++ b/internal/entity/collection_entity.go
@@ -33,8 +33,8 @@ type Collection struct {
 
 type CollectionSearch struct {
        Collection
-       Page     int `json:"page" form:"page"`           //Query number of pages
-       PageSize int `json:"page_size" form:"page_size"` //Search page size
+       Page     int `json:"page" form:"page"`           // Query number of 
pages
+       PageSize int `json:"page_size" form:"page_size"` // Search page size
 }
 
 // TableName collection table name
diff --git a/internal/install/install_req.go b/internal/install/install_req.go
index e5b8839e..39657a54 100644
--- a/internal/install/install_req.go
+++ b/internal/install/install_req.go
@@ -65,13 +65,14 @@ func (r *CheckDatabaseReq) GetConnection() string {
        }
        if r.DbType == string(schemas.POSTGRES) {
                host, port := parsePgSQLHostPort(r.DbHost)
-               if !r.Ssl {
+               switch {
+               case !r.Ssl:
                        return fmt.Sprintf("host=%s port=%s user=%s password=%s 
dbname=%s sslmode=disable",
                                host, port, r.DbUsername, r.DbPassword, 
r.DbName)
-               } else if r.SslMode == "require" {
+               case r.SslMode == "require":
                        return fmt.Sprintf("host=%s port=%s user=%s password=%s 
dbname=%s sslmode=%s",
                                host, port, r.DbUsername, r.DbPassword, 
r.DbName, r.SslMode)
-               } else if r.SslMode == "verify-ca" || r.SslMode == 
"verify-full" {
+               case r.SslMode == "verify-ca" || r.SslMode == "verify-full":
                        connection := fmt.Sprintf("host=%s port=%s user=%s 
password=%s dbname=%s sslmode=%s",
                                host, port, r.DbUsername, r.DbPassword, 
r.DbName, r.SslMode)
                        if len(r.SslRootCert) > 0 && 
dir.CheckFileExist(r.SslRootCert) {
@@ -150,7 +151,7 @@ func (r *InitBaseInfoReq) FormatSiteUrl() {
        }
        r.SiteURL = fmt.Sprintf("%s://%s", parsedUrl.Scheme, parsedUrl.Host)
        if len(parsedUrl.Path) > 0 {
-               r.SiteURL = r.SiteURL + parsedUrl.Path
+               r.SiteURL += parsedUrl.Path
                r.SiteURL = strings.TrimSuffix(r.SiteURL, "/")
        }
 }
diff --git a/internal/migrations/v12.go b/internal/migrations/v12.go
index 2dd3ce71..23e8acdc 100644
--- a/internal/migrations/v12.go
+++ b/internal/migrations/v12.go
@@ -75,7 +75,6 @@ func updateQuestionPostTime(ctx context.Context, x 
*xorm.Engine) error {
                                return fmt.Errorf("update question failed: %w", 
err)
                        }
                }
-
        }
 
        return nil
diff --git a/internal/migrations/v13.go b/internal/migrations/v13.go
index 57d24848..16ba177e 100644
--- a/internal/migrations/v13.go
+++ b/internal/migrations/v13.go
@@ -136,7 +136,7 @@ func addPrivilegeForInviteSomeoneToAnswer(ctx 
context.Context, x *xorm.Engine) e
 }
 
 func updateQuestionCount(ctx context.Context, x *xorm.Engine) error {
-       //question answer count
+       // question answer count
        answers := make([]AnswerV13, 0)
        err := x.Context(ctx).Find(&answers, &AnswerV13{Status: 
entity.AnswerStatusAvailable})
        if err != nil {
@@ -216,7 +216,7 @@ func updateTagCount(ctx context.Context, x *xorm.Engine) 
error {
                }
        }
 
-       //select tag count
+       // select tag count
        newTagRelList := make([]entity.TagRel, 0)
        err = x.Context(ctx).Find(&newTagRelList, &entity.TagRel{Status: 
entity.TagRelStatusAvailable})
        if err != nil {
diff --git a/internal/repo/activity/follow_repo.go 
b/internal/repo/activity/follow_repo.go
index 7af2189a..4c6fc431 100644
--- a/internal/repo/activity/follow_repo.go
+++ b/internal/repo/activity/follow_repo.go
@@ -168,7 +168,7 @@ func (ar *FollowRepo) FollowCancel(ctx context.Context, 
objectID, userID string)
        return err
 }
 
-func (ar *FollowRepo) updateFollows(ctx context.Context, session 
*xorm.Session, objectID string, follows int) error {
+func (ar *FollowRepo) updateFollows(_ context.Context, session *xorm.Session, 
objectID string, follows int) error {
        objectType, err := obj.GetObjectTypeStrByObjectID(objectID)
        if err != nil {
                return err
diff --git a/internal/repo/activity_common/follow.go 
b/internal/repo/activity_common/follow.go
index 99e5a6e6..a185c3d8 100644
--- a/internal/repo/activity_common/follow.go
+++ b/internal/repo/activity_common/follow.go
@@ -66,19 +66,19 @@ func (ar *FollowRepo) GetFollowAmount(ctx context.Context, 
objectID string) (fol
                model := &entity.Question{}
                _, err = ar.data.DB.Context(ctx).Where("id = ?", 
objectID).Cols("`follow_count`").Get(model)
                if err == nil {
-                       follows = int(model.FollowCount)
+                       follows = model.FollowCount
                }
        case "user":
                model := &entity.User{}
                _, err = ar.data.DB.Context(ctx).Where("id = ?", 
objectID).Cols("`follow_count`").Get(model)
                if err == nil {
-                       follows = int(model.FollowCount)
+                       follows = model.FollowCount
                }
        case "tag":
                model := &entity.Tag{}
                _, err = ar.data.DB.Context(ctx).Where("id = ?", 
objectID).Cols("`follow_count`").Get(model)
                if err == nil {
-                       follows = int(model.FollowCount)
+                       follows = model.FollowCount
                }
        default:
                err = 
errors.InternalServer(reason.DisallowFollow).WithMsg("this object can't be 
followed")
diff --git a/internal/repo/answer/answer_repo.go 
b/internal/repo/answer/answer_repo.go
index 0f1ae814..52963c44 100644
--- a/internal/repo/answer/answer_repo.go
+++ b/internal/repo/answer/answer_repo.go
@@ -335,7 +335,7 @@ func (ar *answerRepo) SearchList(ctx context.Context, 
search *entity.AnswerSearc
        var err error
        rows := make([]*entity.Answer, 0)
        if search.Page > 0 {
-               search.Page = search.Page - 1
+               search.Page--
        } else {
                search.Page = 0
        }
diff --git a/internal/repo/collection/collection_repo.go 
b/internal/repo/collection/collection_repo.go
index f30692c9..482cb075 100644
--- a/internal/repo/collection/collection_repo.go
+++ b/internal/repo/collection/collection_repo.go
@@ -167,7 +167,7 @@ func (cr *collectionRepo) GetCollectionPage(ctx 
context.Context, page, pageSize
 
 // SearchObjectCollected check object is collected or not
 func (cr *collectionRepo) SearchObjectCollected(ctx context.Context, userID 
string, objectIds []string) (map[string]bool, error) {
-       for i := 0; i < len(objectIds); i++ {
+       for i := range objectIds {
                objectIds[i] = uid.DeShortID(objectIds[i])
        }
 
@@ -193,7 +193,7 @@ func (cr *collectionRepo) SearchList(ctx context.Context, 
search *entity.Collect
        var err error
        rows := make([]*entity.Collection, 0)
        if search.Page > 0 {
-               search.Page = search.Page - 1
+               search.Page--
        } else {
                search.Page = 0
        }
diff --git a/internal/repo/question/question_repo.go 
b/internal/repo/question/question_repo.go
index 3935e610..3449efb8 100644
--- a/internal/repo/question/question_repo.go
+++ b/internal/repo/question/question_repo.go
@@ -89,9 +89,9 @@ func (qr *questionRepo) RemoveQuestion(ctx context.Context, 
id string) (err erro
 }
 
 // UpdateQuestion update question
-func (qr *questionRepo) UpdateQuestion(ctx context.Context, question 
*entity.Question, Cols []string) (err error) {
+func (qr *questionRepo) UpdateQuestion(ctx context.Context, question 
*entity.Question, cols []string) (err error) {
        question.ID = uid.DeShortID(question.ID)
-       _, err = qr.data.DB.Context(ctx).Where("id =?", 
question.ID).Cols(Cols...).Update(question)
+       _, err = qr.data.DB.Context(ctx).Where("id =?", 
question.ID).Cols(cols...).Update(question)
        if err != nil {
                return 
errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
        }
@@ -344,7 +344,7 @@ func (qr *questionRepo) GetUserQuestionCount(ctx 
context.Context, userID string,
 
 func (qr *questionRepo) SitemapQuestions(ctx context.Context, page, pageSize 
int) (
        questionIDList []*schema.SiteMapQuestionInfo, err error) {
-       page = page - 1
+       page--
        questionIDList = make([]*schema.SiteMapQuestionInfo, 0)
 
        // try to get sitemap data from cache
@@ -524,7 +524,7 @@ func (qr *questionRepo) AdminQuestionPage(ctx 
context.Context, search *schema.Ad
 
        rows := make([]*entity.Question, 0)
        if search.Page > 0 {
-               search.Page = search.Page - 1
+               search.Page--
        } else {
                search.Page = 0
        }
diff --git a/internal/repo/rank/user_rank_repo.go 
b/internal/repo/rank/user_rank_repo.go
index cb9ca1b3..5e86f592 100644
--- a/internal/repo/rank/user_rank_repo.go
+++ b/internal/repo/rank/user_rank_repo.go
@@ -141,7 +141,7 @@ func (ur *UserRankRepo) TriggerUserRank(ctx context.Context,
        return false, nil
 }
 
-func (ur *UserRankRepo) checkUserMinRank(ctx context.Context, session 
*xorm.Session, userID string, deltaRank int) (
+func (ur *UserRankRepo) checkUserMinRank(_ context.Context, session 
*xorm.Session, userID string, deltaRank int) (
        isReachStandard bool, err error,
 ) {
        bean := &entity.User{ID: userID}
diff --git a/internal/repo/repo_test/auth_test.go 
b/internal/repo/repo_test/auth_test.go
index 38733239..0c991902 100644
--- a/internal/repo/repo_test/auth_test.go
+++ b/internal/repo/repo_test/auth_test.go
@@ -26,6 +26,7 @@ import (
        "github.com/apache/answer/internal/entity"
        "github.com/apache/answer/internal/repo/auth"
        "github.com/stretchr/testify/assert"
+       "github.com/stretchr/testify/require"
 )
 
 var (
@@ -38,10 +39,10 @@ func Test_authRepo_SetUserCacheInfo(t *testing.T) {
        authRepo := auth.NewAuthRepo(testDataSource)
 
        err := authRepo.SetUserCacheInfo(context.TODO(), accessToken, 
visitToken, &entity.UserCacheInfo{UserID: userID})
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        cacheInfo, err := authRepo.GetUserCacheInfo(context.TODO(), accessToken)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.Equal(t, userID, cacheInfo.UserID)
 }
 
@@ -49,13 +50,13 @@ func Test_authRepo_RemoveUserCacheInfo(t *testing.T) {
        authRepo := auth.NewAuthRepo(testDataSource)
 
        err := authRepo.SetUserCacheInfo(context.TODO(), accessToken, 
visitToken, &entity.UserCacheInfo{UserID: userID})
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        err = authRepo.RemoveUserCacheInfo(context.TODO(), accessToken)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        userInfo, err := authRepo.GetUserCacheInfo(context.TODO(), accessToken)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.Nil(t, userInfo)
 }
 
@@ -63,23 +64,23 @@ func Test_authRepo_SetUserStatus(t *testing.T) {
        authRepo := auth.NewAuthRepo(testDataSource)
 
        err := authRepo.SetUserStatus(context.TODO(), userID, 
&entity.UserCacheInfo{UserID: userID})
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        cacheInfo, err := authRepo.GetUserStatus(context.TODO(), userID)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.Equal(t, userID, cacheInfo.UserID)
 }
 func Test_authRepo_RemoveUserStatus(t *testing.T) {
        authRepo := auth.NewAuthRepo(testDataSource)
 
        err := authRepo.SetUserStatus(context.TODO(), userID, 
&entity.UserCacheInfo{UserID: userID})
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        err = authRepo.RemoveUserStatus(context.TODO(), userID)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        userInfo, err := authRepo.GetUserStatus(context.TODO(), userID)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.Nil(t, userInfo)
 }
 
@@ -87,10 +88,10 @@ func Test_authRepo_SetAdminUserCacheInfo(t *testing.T) {
        authRepo := auth.NewAuthRepo(testDataSource)
 
        err := authRepo.SetAdminUserCacheInfo(context.TODO(), accessToken, 
&entity.UserCacheInfo{UserID: userID})
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        cacheInfo, err := authRepo.GetAdminUserCacheInfo(context.TODO(), 
accessToken)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.Equal(t, userID, cacheInfo.UserID)
 }
 
@@ -98,12 +99,12 @@ func Test_authRepo_RemoveAdminUserCacheInfo(t *testing.T) {
        authRepo := auth.NewAuthRepo(testDataSource)
 
        err := authRepo.SetAdminUserCacheInfo(context.TODO(), accessToken, 
&entity.UserCacheInfo{UserID: userID})
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        err = authRepo.RemoveAdminUserCacheInfo(context.TODO(), accessToken)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        userInfo, err := authRepo.GetAdminUserCacheInfo(context.TODO(), 
accessToken)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.Nil(t, userInfo)
 }
diff --git a/internal/repo/repo_test/captcha_test.go 
b/internal/repo/repo_test/captcha_test.go
index 48e9dd80..e6954a23 100644
--- a/internal/repo/repo_test/captcha_test.go
+++ b/internal/repo/repo_test/captcha_test.go
@@ -25,6 +25,7 @@ import (
 
        "github.com/apache/answer/internal/repo/captcha"
        "github.com/stretchr/testify/assert"
+       "github.com/stretchr/testify/require"
 )
 
 var (
@@ -36,23 +37,23 @@ var (
 func Test_captchaRepo_DelActionType(t *testing.T) {
        captchaRepo := captcha.NewCaptchaRepo(testDataSource)
        err := captchaRepo.SetActionType(context.TODO(), ip, actionType, "", 
amount)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        actionInfo, err := captchaRepo.GetActionType(context.TODO(), ip, 
actionType)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.Equal(t, amount, actionInfo.Num)
 
        err = captchaRepo.DelActionType(context.TODO(), ip, actionType)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 }
 
 func Test_captchaRepo_SetCaptcha(t *testing.T) {
        captchaRepo := captcha.NewCaptchaRepo(testDataSource)
        key, capt := "key", "1234"
        err := captchaRepo.SetCaptcha(context.TODO(), key, capt)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        gotCaptcha, err := captchaRepo.GetCaptcha(context.TODO(), key)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.Equal(t, capt, gotCaptcha)
 }
diff --git a/internal/repo/repo_test/comment_repo_test.go 
b/internal/repo/repo_test/comment_repo_test.go
index 3de15481..41ba0446 100644
--- a/internal/repo/repo_test/comment_repo_test.go
+++ b/internal/repo/repo_test/comment_repo_test.go
@@ -29,6 +29,7 @@ import (
        "github.com/apache/answer/internal/repo/unique"
        commentService "github.com/apache/answer/internal/service/comment"
        "github.com/stretchr/testify/assert"
+       "github.com/stretchr/testify/require"
 )
 
 func buildCommentEntity() *entity.Comment {
@@ -48,10 +49,10 @@ func Test_commentRepo_AddComment(t *testing.T) {
        commentRepo := comment.NewCommentRepo(testDataSource, uniqueIDRepo)
        testCommentEntity := buildCommentEntity()
        err := commentRepo.AddComment(context.TODO(), testCommentEntity)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        err = commentRepo.RemoveComment(context.TODO(), testCommentEntity.ID)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 }
 
 func Test_commentRepo_GetCommentPage(t *testing.T) {
@@ -59,7 +60,7 @@ func Test_commentRepo_GetCommentPage(t *testing.T) {
        commentRepo := comment.NewCommentRepo(testDataSource, uniqueIDRepo)
        testCommentEntity := buildCommentEntity()
        err := commentRepo.AddComment(context.TODO(), testCommentEntity)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        resp, total, err := commentRepo.GetCommentPage(context.TODO(), 
&commentService.CommentQuery{
                PageCond: pager.PageCond{
@@ -67,12 +68,12 @@ func Test_commentRepo_GetCommentPage(t *testing.T) {
                        PageSize: 10,
                },
        })
-       assert.NoError(t, err)
-       assert.Equal(t, total, int64(1))
+       require.NoError(t, err)
+       assert.Equal(t, int64(1), total)
        assert.Equal(t, resp[0].ID, testCommentEntity.ID)
 
        err = commentRepo.RemoveComment(context.TODO(), testCommentEntity.ID)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 }
 
 func Test_commentRepo_UpdateComment(t *testing.T) {
@@ -81,19 +82,19 @@ func Test_commentRepo_UpdateComment(t *testing.T) {
        commonCommentRepo := comment.NewCommentCommonRepo(testDataSource, 
uniqueIDRepo)
        testCommentEntity := buildCommentEntity()
        err := commentRepo.AddComment(context.TODO(), testCommentEntity)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        testCommentEntity.ParsedText = "test"
        err = commentRepo.UpdateCommentContent(context.TODO(), 
testCommentEntity.ID, "test", "test")
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        newComment, exist, err := commonCommentRepo.GetComment(context.TODO(), 
testCommentEntity.ID)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, exist)
        assert.Equal(t, testCommentEntity.ParsedText, newComment.ParsedText)
 
        err = commentRepo.RemoveComment(context.TODO(), testCommentEntity.ID)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 }
 
 func Test_commentRepo_CannotGetDeletedComment(t *testing.T) {
@@ -102,12 +103,12 @@ func Test_commentRepo_CannotGetDeletedComment(t 
*testing.T) {
        testCommentEntity := buildCommentEntity()
 
        err := commentRepo.AddComment(context.TODO(), testCommentEntity)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        err = commentRepo.RemoveComment(context.TODO(), testCommentEntity.ID)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        _, exist, err := commentRepo.GetComment(context.TODO(), 
testCommentEntity.ID)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.False(t, exist)
 }
diff --git a/internal/repo/repo_test/email_repo_test.go 
b/internal/repo/repo_test/email_repo_test.go
index 82fc6c57..03ca9efe 100644
--- a/internal/repo/repo_test/email_repo_test.go
+++ b/internal/repo/repo_test/email_repo_test.go
@@ -26,15 +26,16 @@ import (
 
        "github.com/apache/answer/internal/repo/export"
        "github.com/stretchr/testify/assert"
+       "github.com/stretchr/testify/require"
 )
 
 func Test_emailRepo_VerifyCode(t *testing.T) {
        emailRepo := export.NewEmailRepo(testDataSource)
        code, content := "1111", 
"{\"source_type\":\"\",\"e_mail\":\"\",\"user_id\":\"1\",\"skip_validation_latest_code\":false}"
        err := emailRepo.SetCode(context.TODO(), "1", code, content, 
time.Minute)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        verifyContent, err := emailRepo.VerifyCode(context.TODO(), code)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.Equal(t, content, verifyContent)
 }
diff --git a/internal/repo/repo_test/meta_repo_test.go 
b/internal/repo/repo_test/meta_repo_test.go
index e910dab3..68965f22 100644
--- a/internal/repo/repo_test/meta_repo_test.go
+++ b/internal/repo/repo_test/meta_repo_test.go
@@ -26,6 +26,7 @@ import (
        "github.com/apache/answer/internal/entity"
        "github.com/apache/answer/internal/repo/meta"
        "github.com/stretchr/testify/assert"
+       "github.com/stretchr/testify/require"
 )
 
 func buildMetaEntity() *entity.Meta {
@@ -41,15 +42,15 @@ func Test_metaRepo_GetMetaByObjectIdAndKey(t *testing.T) {
        metaEnt := buildMetaEntity()
 
        err := metaRepo.AddMeta(context.TODO(), metaEnt)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        gotMeta, exist, err := metaRepo.GetMetaByObjectIdAndKey(context.TODO(), 
metaEnt.ObjectID, metaEnt.Key)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, exist)
        assert.Equal(t, metaEnt.ID, gotMeta.ID)
 
        err = metaRepo.RemoveMeta(context.TODO(), metaEnt.ID)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 }
 
 func Test_metaRepo_GetMetaList(t *testing.T) {
@@ -57,15 +58,15 @@ func Test_metaRepo_GetMetaList(t *testing.T) {
        metaEnt := buildMetaEntity()
 
        err := metaRepo.AddMeta(context.TODO(), metaEnt)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        gotMetaList, err := metaRepo.GetMetaList(context.TODO(), metaEnt)
-       assert.NoError(t, err)
-       assert.Equal(t, len(gotMetaList), 1)
+       require.NoError(t, err)
+       assert.Len(t, gotMetaList, 1)
        assert.Equal(t, gotMetaList[0].ID, metaEnt.ID)
 
        err = metaRepo.RemoveMeta(context.TODO(), metaEnt.ID)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 }
 
 func Test_metaRepo_GetMetaPage(t *testing.T) {
@@ -73,15 +74,15 @@ func Test_metaRepo_GetMetaPage(t *testing.T) {
        metaEnt := buildMetaEntity()
 
        err := metaRepo.AddMeta(context.TODO(), metaEnt)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        gotMetaList, err := metaRepo.GetMetaList(context.TODO(), metaEnt)
-       assert.NoError(t, err)
-       assert.Equal(t, len(gotMetaList), 1)
+       require.NoError(t, err)
+       assert.Len(t, gotMetaList, 1)
        assert.Equal(t, gotMetaList[0].ID, metaEnt.ID)
 
        err = metaRepo.RemoveMeta(context.TODO(), metaEnt.ID)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 }
 
 func Test_metaRepo_UpdateMeta(t *testing.T) {
@@ -89,17 +90,17 @@ func Test_metaRepo_UpdateMeta(t *testing.T) {
        metaEnt := buildMetaEntity()
 
        err := metaRepo.AddMeta(context.TODO(), metaEnt)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        metaEnt.Value = "testing"
        err = metaRepo.UpdateMeta(context.TODO(), metaEnt)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        gotMeta, exist, err := metaRepo.GetMetaByObjectIdAndKey(context.TODO(), 
metaEnt.ObjectID, metaEnt.Key)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, exist)
        assert.Equal(t, gotMeta.Value, metaEnt.Value)
 
        err = metaRepo.RemoveMeta(context.TODO(), metaEnt.ID)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 }
diff --git a/internal/repo/repo_test/notification_repo_test.go 
b/internal/repo/repo_test/notification_repo_test.go
index a05913ba..4f843e77 100644
--- a/internal/repo/repo_test/notification_repo_test.go
+++ b/internal/repo/repo_test/notification_repo_test.go
@@ -27,6 +27,7 @@ import (
        "github.com/apache/answer/internal/repo/notification"
        "github.com/apache/answer/internal/schema"
        "github.com/stretchr/testify/assert"
+       "github.com/stretchr/testify/require"
 )
 
 func buildNotificationEntity() *entity.Notification {
@@ -44,13 +45,13 @@ func Test_notificationRepo_ClearIDUnRead(t *testing.T) {
        notificationRepo := notification.NewNotificationRepo(testDataSource)
        ent := buildNotificationEntity()
        err := notificationRepo.AddNotification(context.TODO(), ent)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        err = notificationRepo.ClearIDUnRead(context.TODO(), ent.UserID, ent.ID)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        got, exists, err := notificationRepo.GetById(context.TODO(), ent.ID)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, exists)
        assert.Equal(t, schema.NotificationRead, got.IsRead)
 }
@@ -59,13 +60,13 @@ func Test_notificationRepo_ClearUnRead(t *testing.T) {
        notificationRepo := notification.NewNotificationRepo(testDataSource)
        ent := buildNotificationEntity()
        err := notificationRepo.AddNotification(context.TODO(), ent)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        err = notificationRepo.ClearUnRead(context.TODO(), ent.UserID, ent.Type)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        got, exists, err := notificationRepo.GetById(context.TODO(), ent.ID)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, exists)
        assert.Equal(t, schema.NotificationRead, got.IsRead)
 }
@@ -74,10 +75,10 @@ func Test_notificationRepo_GetById(t *testing.T) {
        notificationRepo := notification.NewNotificationRepo(testDataSource)
        ent := buildNotificationEntity()
        err := notificationRepo.AddNotification(context.TODO(), ent)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        got, exists, err := notificationRepo.GetById(context.TODO(), ent.ID)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, exists)
        assert.Equal(t, got.ID, ent.ID)
 }
@@ -86,10 +87,10 @@ func Test_notificationRepo_GetByUserIdObjectIdTypeId(t 
*testing.T) {
        notificationRepo := notification.NewNotificationRepo(testDataSource)
        ent := buildNotificationEntity()
        err := notificationRepo.AddNotification(context.TODO(), ent)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        got, exists, err := 
notificationRepo.GetByUserIdObjectIdTypeId(context.TODO(), ent.UserID, 
ent.ObjectID, ent.Type)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, exists)
        assert.Equal(t, got.ObjectID, ent.ObjectID)
 }
@@ -98,11 +99,11 @@ func Test_notificationRepo_GetNotificationPage(t 
*testing.T) {
        notificationRepo := notification.NewNotificationRepo(testDataSource)
        ent := buildNotificationEntity()
        err := notificationRepo.AddNotification(context.TODO(), ent)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        notificationPage, total, err := 
notificationRepo.GetNotificationPage(context.TODO(), 
&schema.NotificationSearch{UserID: ent.UserID})
-       assert.NoError(t, err)
-       assert.True(t, total > 0)
+       require.NoError(t, err)
+       assert.Positive(t, total)
        assert.Equal(t, notificationPage[0].UserID, ent.UserID)
 }
 
@@ -110,14 +111,14 @@ func Test_notificationRepo_UpdateNotificationContent(t 
*testing.T) {
        notificationRepo := notification.NewNotificationRepo(testDataSource)
        ent := buildNotificationEntity()
        err := notificationRepo.AddNotification(context.TODO(), ent)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        ent.Content = "test"
        err = notificationRepo.UpdateNotificationContent(context.TODO(), ent)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        got, exists, err := notificationRepo.GetById(context.TODO(), ent.ID)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, exists)
        assert.Equal(t, got.Content, ent.Content)
 }
diff --git a/internal/repo/repo_test/reason_repo_test.go 
b/internal/repo/repo_test/reason_repo_test.go
index 636f8d27..acb8c861 100644
--- a/internal/repo/repo_test/reason_repo_test.go
+++ b/internal/repo/repo_test/reason_repo_test.go
@@ -28,12 +28,13 @@ import (
 
        "github.com/apache/answer/internal/repo/reason"
        "github.com/stretchr/testify/assert"
+       "github.com/stretchr/testify/require"
 )
 
 func Test_reasonRepo_ListReasons(t *testing.T) {
        configRepo := config.NewConfigRepo(testDataSource)
        reasonRepo := 
reason.NewReasonRepo(serviceconfig.NewConfigService(configRepo))
        reasonItems, err := reasonRepo.ListReasons(context.TODO(), "question", 
"close")
-       assert.NoError(t, err)
-       assert.Equal(t, 4, len(reasonItems))
+       require.NoError(t, err)
+       assert.Len(t, reasonItems, 4)
 }
diff --git a/internal/repo/repo_test/recommend_test.go 
b/internal/repo/repo_test/recommend_test.go
index a2169388..7675aa20 100644
--- a/internal/repo/repo_test/recommend_test.go
+++ b/internal/repo/repo_test/recommend_test.go
@@ -34,6 +34,7 @@ import (
        "github.com/apache/answer/internal/repo/user"
        config2 "github.com/apache/answer/internal/service/config"
        "github.com/stretchr/testify/assert"
+       "github.com/stretchr/testify/require"
 )
 
 func Test_questionRepo_GetRecommend(t *testing.T) {
@@ -61,8 +62,8 @@ func Test_questionRepo_GetRecommend(t *testing.T) {
                IsAdmin:     false,
        }
        err := userRepo.AddUser(context.TODO(), user)
-       assert.NoError(t, err)
-       assert.NotEqual(t, "", user.ID)
+       require.NoError(t, err)
+       assert.NotEmpty(t, user.ID)
 
        questions := make([]*entity.Question, 0)
        // tag, unjoin, unfollow
@@ -140,8 +141,8 @@ func Test_questionRepo_GetRecommend(t *testing.T) {
 
        for _, question := range questions {
                err = questionRepo.AddQuestion(context.TODO(), question)
-               assert.NoError(t, err)
-               assert.NotEqual(t, "", question.ID)
+               require.NoError(t, err)
+               assert.NotEmpty(t, question.ID)
        }
 
        tags := []*entity.Tag{
@@ -161,7 +162,7 @@ func Test_questionRepo_GetRecommend(t *testing.T) {
                },
        }
        err = tagCommenRepo.AddTagList(context.TODO(), tags)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        tagRels := make([]*entity.TagRel, 0)
        for i, question := range questions {
@@ -173,7 +174,7 @@ func Test_questionRepo_GetRecommend(t *testing.T) {
                tagRels = append(tagRels, tagRel)
        }
        err = tagRelRepo.AddTagRelList(context.TODO(), tagRels)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        followQuestionIDs := make([]string, 0)
        for i := range questions {
@@ -181,15 +182,15 @@ func Test_questionRepo_GetRecommend(t *testing.T) {
                        continue
                }
                err = followRepo.Follow(context.TODO(), questions[i].ID, 
user.ID)
-               assert.NoError(t, err)
+               require.NoError(t, err)
                followQuestionIDs = append(followQuestionIDs, questions[i].ID)
        }
 
        // get recommend
        questionList, total, err := 
questionRepo.GetRecommendQuestionPageByTags(context.TODO(), user.ID, 
[]string{tags[0].ID}, followQuestionIDs, 1, 20)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.Equal(t, int64(5), total)
-       assert.Equal(t, 5, len(questionList))
+       assert.Len(t, questionList, 5)
 
        // recovery
        t.Cleanup(func() {
@@ -197,19 +198,19 @@ func Test_questionRepo_GetRecommend(t *testing.T) {
                for i, tagRel := range tagRels {
                        if i%2 == 1 {
                                err = followRepo.FollowCancel(context.TODO(), 
questions[i].ID, user.ID)
-                               assert.NoError(t, err)
+                               require.NoError(t, err)
                        }
                        tagRelIDs = append(tagRelIDs, tagRel.ID)
                }
                err = tagRelRepo.RemoveTagRelListByIDs(context.TODO(), 
tagRelIDs)
-               assert.NoError(t, err)
+               require.NoError(t, err)
                for _, tag := range tags {
                        err = tagRepo.RemoveTag(context.TODO(), tag.ID)
-                       assert.NoError(t, err)
+                       require.NoError(t, err)
                }
                for _, q := range questions {
                        err = questionRepo.RemoveQuestion(context.TODO(), q.ID)
-                       assert.NoError(t, err)
+                       require.NoError(t, err)
                }
        })
 }
diff --git a/internal/repo/repo_test/repo_main_test.go 
b/internal/repo/repo_test/repo_main_test.go
index 919ca94e..e2f40f27 100644
--- a/internal/repo/repo_test/repo_main_test.go
+++ b/internal/repo/repo_test/repo_main_test.go
@@ -153,7 +153,7 @@ func initDatabaseImage(dbSetting TestDBSetting) (connection 
string, cleanup func
                return "", nil, fmt.Errorf("could not connect to docker: %s", 
err)
        }
 
-       //resource, err := pool.Run(dbSetting.ImageName, 
dbSetting.ImageVersion, dbSetting.ENV)
+       // resource, err := pool.Run(dbSetting.ImageName, 
dbSetting.ImageVersion, dbSetting.ENV)
        resource, err := pool.RunWithOptions(&dockertest.RunOptions{
                Repository: dbSetting.ImageName,
                Tag:        dbSetting.ImageVersion,
diff --git a/internal/repo/repo_test/revision_repo_test.go 
b/internal/repo/repo_test/revision_repo_test.go
index 01d262d2..6fd067b3 100644
--- a/internal/repo/repo_test/revision_repo_test.go
+++ b/internal/repo/repo_test/revision_repo_test.go
@@ -29,6 +29,7 @@ import (
        "github.com/apache/answer/internal/repo/revision"
        "github.com/apache/answer/internal/repo/unique"
        "github.com/stretchr/testify/assert"
+       "github.com/stretchr/testify/require"
 )
 
 var q = &entity.Question{
@@ -69,29 +70,29 @@ func Test_revisionRepo_AddRevision(t *testing.T) {
 
        // create question
        err := questionRepo.AddQuestion(context.TODO(), q)
-       assert.NoError(t, err)
-       assert.NotEqual(t, "", q.ID)
+       require.NoError(t, err)
+       assert.NotEmpty(t, q.ID)
 
        content, err := json.Marshal(q)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        // auto update false
        rev := getRev(q.ID, q.Title, string(content))
        err = revisionRepo.AddRevision(context.TODO(), rev, false)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        qr, _, _ := questionRepo.GetQuestion(context.TODO(), q.ID)
        assert.NotEqual(t, rev.ID, qr.RevisionID)
 
        // auto update false
        rev = getRev(q.ID, q.Title, string(content))
        err = revisionRepo.AddRevision(context.TODO(), rev, true)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        qr, _, _ = questionRepo.GetQuestion(context.TODO(), q.ID)
        assert.Equal(t, rev.ID, qr.RevisionID)
 
        // recovery
        t.Cleanup(func() {
                err = questionRepo.RemoveQuestion(context.TODO(), q.ID)
-               assert.NoError(t, err)
+               require.NoError(t, err)
        })
 }
 
@@ -103,7 +104,7 @@ func Test_revisionRepo_GetLastRevisionByObjectID(t 
*testing.T) {
 
        Test_revisionRepo_AddRevision(t)
        rev, exists, err := 
revisionRepo.GetLastRevisionByObjectID(context.TODO(), q.ID)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, exists)
        assert.NotNil(t, rev)
 }
@@ -115,6 +116,6 @@ func Test_revisionRepo_GetRevisionList(t *testing.T) {
        )
        Test_revisionRepo_AddRevision(t)
        revs, err := revisionRepo.GetRevisionList(context.TODO(), 
&entity.Revision{ObjectID: q.ID})
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.GreaterOrEqual(t, len(revs), 1)
 }
diff --git a/internal/repo/repo_test/siteinfo_repo_test.go 
b/internal/repo/repo_test/siteinfo_repo_test.go
index cb5d8fc0..9fa59d17 100644
--- a/internal/repo/repo_test/siteinfo_repo_test.go
+++ b/internal/repo/repo_test/siteinfo_repo_test.go
@@ -26,6 +26,7 @@ import (
        "github.com/apache/answer/internal/entity"
        "github.com/apache/answer/internal/repo/site_info"
        "github.com/stretchr/testify/assert"
+       "github.com/stretchr/testify/require"
 )
 
 func Test_siteInfoRepo_SaveByType(t *testing.T) {
@@ -34,19 +35,19 @@ func Test_siteInfoRepo_SaveByType(t *testing.T) {
        data := &entity.SiteInfo{Content: "site_info", Type: "test"}
 
        err := siteInfoRepo.SaveByType(context.TODO(), data.Type, data)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        got, exist, err := siteInfoRepo.GetByType(context.TODO(), data.Type)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, exist)
        assert.Equal(t, data.Content, got.Content)
 
        data.Content = "new site_info"
        err = siteInfoRepo.SaveByType(context.TODO(), data.Type, data)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        got, exist, err = siteInfoRepo.GetByType(context.TODO(), data.Type)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, exist)
        assert.Equal(t, data.Content, got.Content)
 }
diff --git a/internal/repo/repo_test/tag_rel_repo_test.go 
b/internal/repo/repo_test/tag_rel_repo_test.go
index e3af67a1..47c09a6a 100644
--- a/internal/repo/repo_test/tag_rel_repo_test.go
+++ b/internal/repo/repo_test/tag_rel_repo_test.go
@@ -30,6 +30,7 @@ import (
        "github.com/apache/answer/internal/entity"
        "github.com/apache/answer/internal/repo/tag"
        "github.com/stretchr/testify/assert"
+       "github.com/stretchr/testify/require"
 )
 
 var (
@@ -61,15 +62,15 @@ func Test_tagListRepo_BatchGetObjectTagRelList(t 
*testing.T) {
        tagRelRepo := tag.NewTagRelRepo(testDataSource, 
unique.NewUniqueIDRepo(testDataSource))
        relList, err :=
                tagRelRepo.BatchGetObjectTagRelList(context.TODO(), 
[]string{testTagRelList[0].ObjectID, testTagRelList[1].ObjectID})
-       assert.NoError(t, err)
-       assert.Equal(t, 2, len(relList))
+       require.NoError(t, err)
+       assert.Len(t, relList, 2)
 }
 
 func Test_tagListRepo_CountTagRelByTagID(t *testing.T) {
        tagRelOnce.Do(addTagRelList)
        tagRelRepo := tag.NewTagRelRepo(testDataSource, 
unique.NewUniqueIDRepo(testDataSource))
        count, err := tagRelRepo.CountTagRelByTagID(context.TODO(), 
"10030000000000101")
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.Equal(t, int64(1), count)
 }
 
@@ -79,8 +80,8 @@ func Test_tagListRepo_GetObjectTagRelList(t *testing.T) {
 
        relList, err :=
                tagRelRepo.GetObjectTagRelList(context.TODO(), 
testTagRelList[0].ObjectID)
-       assert.NoError(t, err)
-       assert.Equal(t, 1, len(relList))
+       require.NoError(t, err)
+       assert.Len(t, relList, 1)
 }
 
 func Test_tagListRepo_GetObjectTagRelWithoutStatus(t *testing.T) {
@@ -89,25 +90,25 @@ func Test_tagListRepo_GetObjectTagRelWithoutStatus(t 
*testing.T) {
 
        relList, err :=
                tagRelRepo.BatchGetObjectTagRelList(context.TODO(), 
[]string{testTagRelList[0].ObjectID, testTagRelList[1].ObjectID})
-       assert.NoError(t, err)
-       assert.Equal(t, 2, len(relList))
+       require.NoError(t, err)
+       assert.Len(t, relList, 2)
 
        ids := []int64{relList[0].ID, relList[1].ID}
        err = tagRelRepo.RemoveTagRelListByIDs(context.TODO(), ids)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        count, err := tagRelRepo.CountTagRelByTagID(context.TODO(), 
"10030000000000101")
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.Equal(t, int64(0), count)
 
        _, exist, err := 
tagRelRepo.GetObjectTagRelWithoutStatus(context.TODO(), relList[0].ObjectID, 
relList[0].TagID)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, exist)
 
        err = tagRelRepo.EnableTagRelByIDs(context.TODO(), ids, false)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        count, err = tagRelRepo.CountTagRelByTagID(context.TODO(), 
"10030000000000101")
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.Equal(t, int64(1), count)
 }
diff --git a/internal/repo/repo_test/tag_repo_test.go 
b/internal/repo/repo_test/tag_repo_test.go
index b2475a22..aa1ec1a2 100644
--- a/internal/repo/repo_test/tag_repo_test.go
+++ b/internal/repo/repo_test/tag_repo_test.go
@@ -32,6 +32,7 @@ import (
        "github.com/apache/answer/internal/repo/unique"
        "github.com/apache/answer/pkg/converter"
        "github.com/stretchr/testify/assert"
+       "github.com/stretchr/testify/require"
 )
 
 var (
@@ -75,7 +76,7 @@ func Test_tagRepo_GetTagByID(t *testing.T) {
        tagCommonRepo := tag_common.NewTagCommonRepo(testDataSource, 
unique.NewUniqueIDRepo(testDataSource))
 
        gotTag, exist, err := tagCommonRepo.GetTagByID(context.TODO(), 
testTagList[0].ID, true)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, exist)
        assert.Equal(t, testTagList[0].SlugName, gotTag.SlugName)
 }
@@ -85,7 +86,7 @@ func Test_tagRepo_GetTagBySlugName(t *testing.T) {
        tagCommonRepo := tag_common.NewTagCommonRepo(testDataSource, 
unique.NewUniqueIDRepo(testDataSource))
 
        gotTag, exist, err := tagCommonRepo.GetTagBySlugName(context.TODO(), 
testTagList[0].SlugName)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, exist)
        assert.Equal(t, testTagList[0].SlugName, gotTag.SlugName)
 }
@@ -95,7 +96,7 @@ func Test_tagRepo_GetTagList(t *testing.T) {
        tagRepo := tag.NewTagRepo(testDataSource, 
unique.NewUniqueIDRepo(testDataSource))
 
        gotTags, err := tagRepo.GetTagList(context.TODO(), &entity.Tag{ID: 
testTagList[0].ID})
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.Equal(t, testTagList[0].SlugName, gotTags[0].SlugName)
 }
 
@@ -104,7 +105,7 @@ func Test_tagRepo_GetTagListByIDs(t *testing.T) {
        tagCommonRepo := tag_common.NewTagCommonRepo(testDataSource, 
unique.NewUniqueIDRepo(testDataSource))
 
        gotTags, err := tagCommonRepo.GetTagListByIDs(context.TODO(), 
[]string{testTagList[0].ID})
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.Equal(t, testTagList[0].SlugName, gotTags[0].SlugName)
 }
 
@@ -113,7 +114,7 @@ func Test_tagRepo_GetTagListByName(t *testing.T) {
        tagCommonRepo := tag_common.NewTagCommonRepo(testDataSource, 
unique.NewUniqueIDRepo(testDataSource))
 
        gotTags, err := tagCommonRepo.GetTagListByName(context.TODO(), 
testTagList[0].SlugName, false, false)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.Equal(t, testTagList[0].SlugName, gotTags[0].SlugName)
 }
 
@@ -122,7 +123,7 @@ func Test_tagRepo_GetTagListByNames(t *testing.T) {
        tagCommonRepo := tag_common.NewTagCommonRepo(testDataSource, 
unique.NewUniqueIDRepo(testDataSource))
 
        gotTags, err := tagCommonRepo.GetTagListByNames(context.TODO(), 
[]string{testTagList[0].SlugName})
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.Equal(t, testTagList[0].SlugName, gotTags[0].SlugName)
 }
 
@@ -131,7 +132,7 @@ func Test_tagRepo_GetTagPage(t *testing.T) {
        tagCommonRepo := tag_common.NewTagCommonRepo(testDataSource, 
unique.NewUniqueIDRepo(testDataSource))
 
        gotTags, _, err := tagCommonRepo.GetTagPage(context.TODO(), 1, 1, 
&entity.Tag{SlugName: testTagList[0].SlugName}, "")
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.Equal(t, testTagList[0].SlugName, gotTags[0].SlugName)
 }
 
@@ -140,12 +141,12 @@ func Test_tagRepo_RemoveTag(t *testing.T) {
        uniqueIDRepo := unique.NewUniqueIDRepo(testDataSource)
        tagRepo := tag.NewTagRepo(testDataSource, uniqueIDRepo)
        err := tagRepo.RemoveTag(context.TODO(), testTagList[1].ID)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        tagCommonRepo := tag_common.NewTagCommonRepo(testDataSource, 
unique.NewUniqueIDRepo(testDataSource))
 
        _, exist, err := tagCommonRepo.GetTagBySlugName(context.TODO(), 
testTagList[1].SlugName)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.False(t, exist)
 }
 
@@ -155,12 +156,12 @@ func Test_tagRepo_UpdateTag(t *testing.T) {
 
        testTagList[0].DisplayName = "golang"
        err := tagRepo.UpdateTag(context.TODO(), testTagList[0])
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        tagCommonRepo := tag_common.NewTagCommonRepo(testDataSource, 
unique.NewUniqueIDRepo(testDataSource))
 
        gotTag, exist, err := tagCommonRepo.GetTagByID(context.TODO(), 
testTagList[0].ID, true)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, exist)
        assert.Equal(t, testTagList[0].DisplayName, gotTag.DisplayName)
 }
@@ -170,10 +171,10 @@ func Test_tagRepo_UpdateTagQuestionCount(t *testing.T) {
 
        testTagList[0].DisplayName = "golang"
        err := tagCommonRepo.UpdateTagQuestionCount(context.TODO(), 
testTagList[0].ID, 100)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        gotTag, exist, err := tagCommonRepo.GetTagByID(context.TODO(), 
testTagList[0].ID, true)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, exist)
        assert.Equal(t, 100, gotTag.QuestionCount)
 }
@@ -184,16 +185,16 @@ func Test_tagRepo_UpdateTagSynonym(t *testing.T) {
 
        testTagList[0].DisplayName = "golang"
        err := tagRepo.UpdateTag(context.TODO(), testTagList[0])
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        err = tagRepo.UpdateTagSynonym(context.TODO(), 
[]string{testTagList[2].SlugName},
                converter.StringToInt64(testTagList[0].ID), 
testTagList[0].SlugName)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        tagCommonRepo := tag_common.NewTagCommonRepo(testDataSource, 
unique.NewUniqueIDRepo(testDataSource))
 
        gotTag, exist, err := tagCommonRepo.GetTagByID(context.TODO(), 
testTagList[2].ID, true)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, exist)
        assert.Equal(t, testTagList[0].ID, fmt.Sprintf("%d", gotTag.MainTagID))
 }
diff --git a/internal/repo/repo_test/user_backyard_repo_test.go 
b/internal/repo/repo_test/user_backyard_repo_test.go
index 073a600c..eb4db102 100644
--- a/internal/repo/repo_test/user_backyard_repo_test.go
+++ b/internal/repo/repo_test/user_backyard_repo_test.go
@@ -28,12 +28,13 @@ import (
        "github.com/apache/answer/internal/repo/auth"
        "github.com/apache/answer/internal/repo/user"
        "github.com/stretchr/testify/assert"
+       "github.com/stretchr/testify/require"
 )
 
 func Test_userAdminRepo_GetUserInfo(t *testing.T) {
        userAdminRepo := user.NewUserAdminRepo(testDataSource, 
auth.NewAuthRepo(testDataSource))
        got, exist, err := userAdminRepo.GetUserInfo(context.TODO(), "1")
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, exist)
        assert.Equal(t, "1", got.ID)
 }
@@ -41,7 +42,7 @@ func Test_userAdminRepo_GetUserInfo(t *testing.T) {
 func Test_userAdminRepo_GetUserPage(t *testing.T) {
        userAdminRepo := user.NewUserAdminRepo(testDataSource, 
auth.NewAuthRepo(testDataSource))
        got, total, err := userAdminRepo.GetUserPage(context.TODO(), 1, 1, 
&entity.User{Username: "admin"}, "", false)
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.Equal(t, int64(1), total)
        assert.Equal(t, "1", got[0].ID)
 }
@@ -49,25 +50,25 @@ func Test_userAdminRepo_GetUserPage(t *testing.T) {
 func Test_userAdminRepo_UpdateUserStatus(t *testing.T) {
        userAdminRepo := user.NewUserAdminRepo(testDataSource, 
auth.NewAuthRepo(testDataSource))
        got, exist, err := userAdminRepo.GetUserInfo(context.TODO(), "1")
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, exist)
        assert.Equal(t, entity.UserStatusAvailable, got.Status)
 
        err = userAdminRepo.UpdateUserStatus(context.TODO(), "1", 
entity.UserStatusSuspended, entity.EmailStatusAvailable,
                "[email protected]", time.Now().Add(time.Minute*5))
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        got, exist, err = userAdminRepo.GetUserInfo(context.TODO(), "1")
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, exist)
        assert.Equal(t, entity.UserStatusSuspended, got.Status)
 
        err = userAdminRepo.UpdateUserStatus(context.TODO(), "1", 
entity.UserStatusAvailable, entity.EmailStatusAvailable,
                "[email protected]", time.Time{})
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        got, exist, err = userAdminRepo.GetUserInfo(context.TODO(), "1")
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, exist)
        assert.Equal(t, entity.UserStatusAvailable, got.Status)
 }
diff --git a/internal/repo/repo_test/user_repo_test.go 
b/internal/repo/repo_test/user_repo_test.go
index 7b18833d..95a85ab9 100644
--- a/internal/repo/repo_test/user_repo_test.go
+++ b/internal/repo/repo_test/user_repo_test.go
@@ -26,6 +26,7 @@ import (
        "github.com/apache/answer/internal/entity"
        "github.com/apache/answer/internal/repo/user"
        "github.com/stretchr/testify/assert"
+       "github.com/stretchr/testify/require"
 )
 
 func Test_userRepo_AddUser(t *testing.T) {
@@ -40,21 +41,21 @@ func Test_userRepo_AddUser(t *testing.T) {
                IsAdmin:     false,
        }
        err := userRepo.AddUser(context.TODO(), userInfo)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 }
 
 func Test_userRepo_BatchGetByID(t *testing.T) {
        userRepo := user.NewUserRepo(testDataSource)
        got, err := userRepo.BatchGetByID(context.TODO(), []string{"1"})
-       assert.NoError(t, err)
-       assert.Equal(t, 1, len(got))
+       require.NoError(t, err)
+       assert.Len(t, got, 1)
        assert.Equal(t, "admin", got[0].Username)
 }
 
 func Test_userRepo_GetByEmail(t *testing.T) {
        userRepo := user.NewUserRepo(testDataSource)
        got, exist, err := userRepo.GetByEmail(context.TODO(), 
"[email protected]")
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, exist)
        assert.Equal(t, "admin", got.Username)
 }
@@ -62,7 +63,7 @@ func Test_userRepo_GetByEmail(t *testing.T) {
 func Test_userRepo_GetByUserID(t *testing.T) {
        userRepo := user.NewUserRepo(testDataSource)
        got, exist, err := userRepo.GetByUserID(context.TODO(), "1")
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, exist)
        assert.Equal(t, "admin", got.Username)
 }
@@ -70,7 +71,7 @@ func Test_userRepo_GetByUserID(t *testing.T) {
 func Test_userRepo_GetByUsername(t *testing.T) {
        userRepo := user.NewUserRepo(testDataSource)
        got, exist, err := userRepo.GetByUsername(context.TODO(), "admin")
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, exist)
        assert.Equal(t, "admin", got.Username)
 }
@@ -78,10 +79,10 @@ func Test_userRepo_GetByUsername(t *testing.T) {
 func Test_userRepo_IncreaseAnswerCount(t *testing.T) {
        userRepo := user.NewUserRepo(testDataSource)
        err := userRepo.IncreaseAnswerCount(context.TODO(), "1", 1)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        got, exist, err := userRepo.GetByUserID(context.TODO(), "1")
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, exist)
        assert.Equal(t, 1, got.AnswerCount)
 }
@@ -89,10 +90,10 @@ func Test_userRepo_IncreaseAnswerCount(t *testing.T) {
 func Test_userRepo_IncreaseQuestionCount(t *testing.T) {
        userRepo := user.NewUserRepo(testDataSource)
        err := userRepo.IncreaseQuestionCount(context.TODO(), "1", 1)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        got, exist, err := userRepo.GetByUserID(context.TODO(), "1")
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, exist)
        assert.Equal(t, 1, got.AnswerCount)
 }
@@ -100,22 +101,22 @@ func Test_userRepo_IncreaseQuestionCount(t *testing.T) {
 func Test_userRepo_UpdateEmail(t *testing.T) {
        userRepo := user.NewUserRepo(testDataSource)
        err := userRepo.UpdateEmail(context.TODO(), "1", "[email protected]")
-       assert.NoError(t, err)
+       require.NoError(t, err)
 }
 
 func Test_userRepo_UpdateEmailStatus(t *testing.T) {
        userRepo := user.NewUserRepo(testDataSource)
        err := userRepo.UpdateEmailStatus(context.TODO(), "1", 
entity.EmailStatusToBeVerified)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 }
 
 func Test_userRepo_UpdateInfo(t *testing.T) {
        userRepo := user.NewUserRepo(testDataSource)
        err := userRepo.UpdateInfo(context.TODO(), &entity.User{ID: "1", Bio: 
"test"})
-       assert.NoError(t, err)
+       require.NoError(t, err)
 
        got, exist, err := userRepo.GetByUserID(context.TODO(), "1")
-       assert.NoError(t, err)
+       require.NoError(t, err)
        assert.True(t, exist)
        assert.Equal(t, "test", got.Bio)
 }
@@ -123,17 +124,17 @@ func Test_userRepo_UpdateInfo(t *testing.T) {
 func Test_userRepo_UpdateLastLoginDate(t *testing.T) {
        userRepo := user.NewUserRepo(testDataSource)
        err := userRepo.UpdateLastLoginDate(context.TODO(), "1")
-       assert.NoError(t, err)
+       require.NoError(t, err)
 }
 
 func Test_userRepo_UpdateNoticeStatus(t *testing.T) {
        userRepo := user.NewUserRepo(testDataSource)
        err := userRepo.UpdateNoticeStatus(context.TODO(), "1", 1)
-       assert.NoError(t, err)
+       require.NoError(t, err)
 }
 
 func Test_userRepo_UpdatePass(t *testing.T) {
        userRepo := user.NewUserRepo(testDataSource)
        err := userRepo.UpdatePass(context.TODO(), "1", "admin")
-       assert.NoError(t, err)
+       require.NoError(t, err)
 }
diff --git a/internal/repo/search_common/search_repo.go 
b/internal/repo/search_common/search_repo.go
index 80651723..a56b8edb 100644
--- a/internal/repo/search_common/search_repo.go
+++ b/internal/repo/search_common/search_repo.go
@@ -190,7 +190,7 @@ func (sr *searchRepo) SearchContents(ctx context.Context, 
words []string, tagIDs
                argsA = append(argsA, votes)
        }
 
-       //b = b.Union("all", ub)
+       // b = b.Union("all", ub)
        ubSQL, _, err := ub.ToSQL()
        if err != nil {
                return
@@ -447,7 +447,7 @@ func (sr *searchRepo) SearchAnswers(ctx context.Context, 
words []string, tagIDs
        return
 }
 
-func (sr *searchRepo) parseOrder(ctx context.Context, order string) (res 
string) {
+func (sr *searchRepo) parseOrder(_ context.Context, order string) (res string) 
{
        switch order {
        case "newest":
                res = "created_at desc"
diff --git a/internal/schema/backyard_user_schema.go 
b/internal/schema/backyard_user_schema.go
index 6ec84872..d36ff808 100644
--- a/internal/schema/backyard_user_schema.go
+++ b/internal/schema/backyard_user_schema.go
@@ -222,7 +222,7 @@ func (req *AddUsersReq) ParseUsers(ctx context.Context) 
(errFields []*validator.
        }
 
        // check users amount
-       if len(req.Users) <= 0 || len(req.Users) > constant.DefaultBulkUser {
+       if len(req.Users) == 0 || len(req.Users) > constant.DefaultBulkUser {
                errFields = append([]*validator.FormErrorField{}, 
&validator.FormErrorField{
                        ErrorField: "users",
                        ErrorMsg: 
translator.TrWithData(handler.GetLangByCtx(ctx), reason.AddBulkUsersAmountError,
diff --git a/internal/schema/meta_schema.go b/internal/schema/meta_schema.go
index 286e2e7d..e5a07252 100644
--- a/internal/schema/meta_schema.go
+++ b/internal/schema/meta_schema.go
@@ -19,6 +19,8 @@
 
 package schema
 
+import "slices"
+
 type UpdateReactionReq struct {
        ObjectID string `validate:"required" json:"object_id"`
        Emoji    string `validate:"required,oneof=heart smile frown" 
json:"emoji"`
@@ -48,13 +50,7 @@ func (r *ReactionsSummaryMeta) AddReactionSummary(emoji, 
userID string) {
                if reaction.Emoji != emoji {
                        continue
                }
-               exist := false
-               for _, id := range reaction.UserIDs {
-                       if id == userID {
-                               exist = true
-                               break
-                       }
-               }
+               exist := slices.Contains(reaction.UserIDs, userID)
                if !exist {
                        reaction.UserIDs = append(reaction.UserIDs, userID)
                }
@@ -94,10 +90,8 @@ func (r *ReactionsSummaryMeta) 
CheckUserInReactionSummary(emoji, userID string)
                if reaction.Emoji != emoji {
                        continue
                }
-               for _, id := range reaction.UserIDs {
-                       if id == userID {
-                               return true
-                       }
+               if slices.Contains(reaction.UserIDs, userID) {
+                       return true
                }
        }
        return false
diff --git a/internal/schema/notification_schema.go 
b/internal/schema/notification_schema.go
index e5d60615..b9e02938 100644
--- a/internal/schema/notification_schema.go
+++ b/internal/schema/notification_schema.go
@@ -53,7 +53,7 @@ var NotificationInboxType = map[string]int{
 
 type NotificationContent struct {
        ID                 string         `json:"id"`
-       TriggerUserID      string         `json:"-"` //show userid
+       TriggerUserID      string         `json:"-"` // show userid
        ReceiverUserID     string         `json:"-"` // receiver userid
        UserInfo           *UserBasicInfo `json:"user_info,omitempty"`
        ObjectInfo         ObjectInfo     `json:"object_info"`
@@ -169,8 +169,8 @@ func (r *RedDotBadgeAwardCache) 
RemoveBadgeAward(notificationID string) {
 }
 
 type NotificationSearch struct {
-       Page         int    `json:"page" form:"page"`           //Query number 
of pages
-       PageSize     int    `json:"page_size" form:"page_size"` //Search page 
size
+       Page         int    `json:"page" form:"page"`           // Query number 
of pages
+       PageSize     int    `json:"page_size" form:"page_size"` // Search page 
size
        Type         int    `json:"-" form:"-"`
        TypeStr      string `json:"type" form:"type"`             // inbox 
achievement
        InboxTypeStr string `json:"inbox_type" form:"inbox_type"` // inbox 
achievement
diff --git a/internal/schema/revision_schema.go 
b/internal/schema/revision_schema.go
index b3ac0aad..6f3246e5 100644
--- a/internal/schema/revision_schema.go
+++ b/internal/schema/revision_schema.go
@@ -53,7 +53,7 @@ const RevisionAuditReject = "reject"
 type RevisionAuditReq struct {
        // object id
        ID                string `validate:"required" comment:"id" form:"id"`
-       Operation         string `validate:"required" comment:"operation" 
form:"operation"` //approve or reject
+       Operation         string `validate:"required" comment:"operation" 
form:"operation"` // approve or reject
        UserID            string `json:"-"`
        CanReviewQuestion bool   `json:"-"`
        CanReviewAnswer   bool   `json:"-"`
diff --git a/internal/schema/siteinfo_schema.go 
b/internal/schema/siteinfo_schema.go
index 0e43bb42..7ab65751 100644
--- a/internal/schema/siteinfo_schema.go
+++ b/internal/schema/siteinfo_schema.go
@@ -52,7 +52,7 @@ func (r *SiteGeneralReq) FormatSiteUrl() {
        }
        r.SiteUrl = fmt.Sprintf("%s://%s", parsedUrl.Scheme, parsedUrl.Host)
        if len(parsedUrl.Path) > 0 {
-               r.SiteUrl = r.SiteUrl + parsedUrl.Path
+               r.SiteUrl += parsedUrl.Path
                r.SiteUrl = strings.TrimSuffix(r.SiteUrl, "/")
        }
 }
diff --git a/internal/schema/tag_schema.go b/internal/schema/tag_schema.go
index a51b2d2d..8eb3212c 100644
--- a/internal/schema/tag_schema.go
+++ b/internal/schema/tag_schema.go
@@ -109,7 +109,7 @@ type GetTagPageResp struct {
        DisplayName string `json:"display_name"`
        // excerpt
        Excerpt string `json:"excerpt"`
-       //description
+       // description
        Description string `json:"description"`
        // original text
        OriginalText string `json:"original_text"`
diff --git a/internal/service/action/captcha_strategy.go 
b/internal/service/action/captcha_strategy.go
index b423b583..edda7325 100644
--- a/internal/service/action/captcha_strategy.go
+++ b/internal/service/action/captcha_strategy.go
@@ -67,9 +67,8 @@ func (cs *CaptchaService) ValidationStrategy(ctx 
context.Context, unit, actionTy
                return cs.CaptchaActionDelete(ctx, unit, info)
        case entity.CaptchaActionVote:
                return cs.CaptchaActionVote(ctx, unit, info)
-
        }
-       //actionType not found
+       // actionType not found
        return false
 }
 
@@ -83,7 +82,7 @@ func (cs *CaptchaService) CaptchaActionPassword(ctx 
context.Context, unit string
                return true
        }
        setNum := 3
-       setTime := int64(60 * 30) //seconds
+       setTime := int64(60 * 30) // seconds
        now := time.Now().Unix()
        if now-actionInfo.LastTime <= setTime && actionInfo.Num >= setNum {
                return false
@@ -101,7 +100,7 @@ func (cs *CaptchaService) CaptchaActionEditUserinfo(ctx 
context.Context, unit st
                return true
        }
        setNum := 3
-       setTime := int64(60 * 30) //seconds
+       setTime := int64(60 * 30) // seconds
        now := time.Now().Unix()
        if now-actionInfo.LastTime <= setTime && actionInfo.Num >= setNum {
                return false
@@ -119,7 +118,7 @@ func (cs *CaptchaService) CaptchaActionQuestion(ctx 
context.Context, unit string
                return true
        }
        setNum := 10
-       setTime := int64(5) //seconds
+       setTime := int64(5) // seconds
        now := time.Now().Unix()
        if now-actionInfo.LastTime <= setTime || actionInfo.Num >= setNum {
                return false
@@ -132,7 +131,7 @@ func (cs *CaptchaService) CaptchaActionAnswer(ctx 
context.Context, unit string,
                return true
        }
        setNum := 10
-       setTime := int64(5) //seconds
+       setTime := int64(5) // seconds
        now := time.Now().Unix()
        if now-actionInfo.LastTime <= setTime || actionInfo.Num >= setNum {
                return false
@@ -145,7 +144,7 @@ func (cs *CaptchaService) CaptchaActionComment(ctx 
context.Context, unit string,
                return true
        }
        setNum := 30
-       setTime := int64(1) //seconds
+       setTime := int64(1) // seconds
        now := time.Now().Unix()
        if now-actionInfo.LastTime <= setTime || actionInfo.Num >= setNum {
                return false
@@ -175,8 +174,8 @@ func (cs *CaptchaService) CaptchaActionSearch(ctx 
context.Context, unit string,
        }
        now := time.Now().Unix()
        setNum := 20
-       setTime := int64(60) //seconds
-       if now-int64(actionInfo.LastTime) <= setTime && actionInfo.Num >= 
setNum {
+       setTime := int64(60) // seconds
+       if now-actionInfo.LastTime <= setTime && actionInfo.Num >= setNum {
                return false
        }
        if now-actionInfo.LastTime > setTime {
@@ -192,7 +191,7 @@ func (cs *CaptchaService) CaptchaActionReport(ctx 
context.Context, unit string,
                return true
        }
        setNum := 30
-       setTime := int64(1) //seconds
+       setTime := int64(1) // seconds
        now := time.Now().Unix()
        if now-actionInfo.LastTime <= setTime || actionInfo.Num >= setNum {
                return false
@@ -205,7 +204,7 @@ func (cs *CaptchaService) CaptchaActionDelete(ctx 
context.Context, unit string,
                return true
        }
        setNum := 5
-       setTime := int64(5) //seconds
+       setTime := int64(5) // seconds
        now := time.Now().Unix()
        if now-actionInfo.LastTime <= setTime || actionInfo.Num >= setNum {
                return false
diff --git a/internal/service/auth/auth.go b/internal/service/auth/auth.go
index 9ee5f3ee..b94f7912 100644
--- a/internal/service/auth/auth.go
+++ b/internal/service/auth/auth.go
@@ -138,7 +138,7 @@ func (as *AuthService) RemoveTokensExceptCurrentUser(ctx 
context.Context, userID
        as.authRepo.RemoveUserTokens(ctx, userID, accessToken)
 }
 
-//Admin
+// Admin
 
 func (as *AuthService) GetAdminUserCacheInfo(ctx context.Context, accessToken 
string) (userInfo *entity.UserCacheInfo, err error) {
        return as.authRepo.GetAdminUserCacheInfo(ctx, accessToken)
diff --git a/internal/service/comment/comment_service.go 
b/internal/service/comment/comment_service.go
index 3a5b3e6c..dc599e6d 100644
--- a/internal/service/comment/comment_service.go
+++ b/internal/service/comment/comment_service.go
@@ -178,9 +178,8 @@ func (cs *CommentService) AddComment(ctx context.Context, 
req *schema.AddComment
                time.Now(), req.CanEdit, req.CanDelete)
 
        if comment.Status == entity.CommentStatusAvailable {
-               commentResp, err := cs.addCommentNotification(ctx, req, resp, 
comment, objInfo)
-               if err != nil {
-                       return commentResp, err
+               if err := cs.addCommentNotification(ctx, req, resp, comment, 
objInfo); err != nil {
+                       return nil, err
                }
        }
 
@@ -220,7 +219,7 @@ func (cs *CommentService) AddComment(ctx context.Context, 
req *schema.AddComment
 
 func (cs *CommentService) addCommentNotification(
        ctx context.Context, req *schema.AddCommentReq, resp 
*schema.GetCommentResp,
-       comment *entity.Comment, objInfo *schema.SimpleObjectInfo) 
(*schema.GetCommentResp, error) {
+       comment *entity.Comment, objInfo *schema.SimpleObjectInfo) error {
        // The priority of the notification
        // 1. reply to user
        // 2. comment mention to user
@@ -231,7 +230,7 @@ func (cs *CommentService) addCommentNotification(
        if len(resp.ReplyUserID) > 0 && resp.ReplyUserID != req.UserID {
                replyUser, exist, err := 
cs.userCommon.GetUserBasicInfoByID(ctx, resp.ReplyUserID)
                if err != nil {
-                       return nil, err
+                       return err
                }
                if exist {
                        resp.ReplyUsername = replyUser.Username
@@ -241,7 +240,7 @@ func (cs *CommentService) addCommentNotification(
                cs.notificationCommentReply(ctx, replyUser.ID, comment.ID, 
req.UserID,
                        objInfo.QuestionID, objInfo.Title, 
htmltext.FetchExcerpt(comment.ParsedText, "...", 240))
                alreadyNotifiedUserID[replyUser.ID] = true
-               return nil, nil
+               return nil
        }
 
        if len(req.MentionUsernameList) > 0 {
@@ -250,7 +249,7 @@ func (cs *CommentService) addCommentNotification(
                for _, userID := range alreadyNotifiedUserIDs {
                        alreadyNotifiedUserID[userID] = true
                }
-               return nil, nil
+               return nil
        }
 
        if objInfo.ObjectType == constant.QuestionObjectType && 
!alreadyNotifiedUserID[objInfo.ObjectCreatorUserID] {
@@ -260,7 +259,7 @@ func (cs *CommentService) addCommentNotification(
                cs.notificationAnswerComment(ctx, objInfo.QuestionID, 
objInfo.Title, objInfo.AnswerID,
                        objInfo.ObjectCreatorUserID, comment.ID, req.UserID, 
htmltext.FetchExcerpt(comment.ParsedText, "...", 240))
        }
-       return nil, nil
+       return nil
 }
 
 // RemoveComment delete comment
diff --git a/internal/service/content/answer_service.go 
b/internal/service/content/answer_service.go
index 982bbf88..f904b82f 100644
--- a/internal/service/content/answer_service.go
+++ b/internal/service/content/answer_service.go
@@ -146,7 +146,6 @@ func (as *AnswerService) RemoveAnswer(ctx context.Context, 
req *schema.RemoveAns
                if !exist {
                        return errors.BadRequest(reason.AnswerCannotDeleted)
                }
-
        }
 
        err = as.answerRepo.RemoveAnswer(ctx, req.ID)
@@ -180,10 +179,10 @@ func (as *AnswerService) RemoveAnswer(ctx 
context.Context, req *schema.RemoveAns
 
        // #2372 In order to simplify the process and complexity, as well as to 
consider if it is in-house,
        // facing the problem of recovery.
-       //err = as.answerActivityService.DeleteAnswer(ctx, answerInfo.ID, 
answerInfo.CreatedAt, answerInfo.VoteCount)
-       //if err != nil {
-       //      log.Errorf("delete answer activity change failed: %s", 
err.Error())
-       //}
+       // err = as.answerActivityService.DeleteAnswer(ctx, answerInfo.ID, 
answerInfo.CreatedAt, answerInfo.VoteCount)
+       // if err != nil {
+       //      log.Errorf("delete answer activity change failed: %s", 
err.Error())
+       // }
        as.activityQueueService.Send(ctx, &schema.ActivityMsg{
                UserID:           req.UserID,
                TriggerUserID:    converter.StringToInt64(req.UserID),
@@ -264,7 +263,7 @@ func (as *AnswerService) Insert(ctx context.Context, req 
*schema.AnswerAddReq) (
        insertData.RevisionID = "0"
        insertData.LastEditUserID = "0"
        insertData.Status = entity.AnswerStatusPending
-       //insertData.UpdatedAt = now
+       // insertData.UpdatedAt = now
        if err = as.answerRepo.AddAnswer(ctx, insertData); err != nil {
                return "", err
        }
@@ -365,7 +364,7 @@ func (as *AnswerService) Update(ctx context.Context, req 
*schema.AnswerUpdateReq
                return "", errors.BadRequest(reason.QuestionNotFound)
        }
 
-       //If the content is the same, ignore it
+       // If the content is the same, ignore it
        if answerInfo.OriginalText == req.Content {
                return "", nil
        }
diff --git a/internal/service/content/question_hottest_service.go 
b/internal/service/content/question_hottest_service.go
index 085b3670..b73e7a30 100644
--- a/internal/service/content/question_hottest_service.go
+++ b/internal/service/content/question_hottest_service.go
@@ -30,7 +30,6 @@ import (
 )
 
 func (q *QuestionService) RefreshHottestCron(ctx context.Context) {
-
        var (
                page     = 1
                pageSize = 100
diff --git a/internal/service/content/question_service.go 
b/internal/service/content/question_service.go
index da15fae5..b8372a72 100644
--- a/internal/service/content/question_service.go
+++ b/internal/service/content/question_service.go
@@ -216,9 +216,9 @@ func (qs *QuestionService) ReopenQuestion(ctx 
context.Context, req *schema.Reope
        return nil
 }
 
-func (qs *QuestionService) AddQuestionCheckTags(ctx context.Context, Tags 
[]*entity.Tag) ([]string, error) {
+func (qs *QuestionService) AddQuestionCheckTags(ctx context.Context, tags 
[]*entity.Tag) ([]string, error) {
        list := make([]string, 0)
-       for _, tag := range Tags {
+       for _, tag := range tags {
                if tag.Reserved {
                        list = append(list, tag.DisplayName)
                }
@@ -374,14 +374,14 @@ func (qs *QuestionService) AddQuestion(ctx 
context.Context, req *schema.Question
        question.AcceptedAnswerID = "0"
        question.LastAnswerID = "0"
        question.LastEditUserID = "0"
-       //question.PostUpdateTime = nil
+       // question.PostUpdateTime = nil
        question.Status = entity.QuestionStatusPending
        question.RevisionID = "0"
        question.CreatedAt = now
        question.PostUpdateTime = now
        question.Pin = entity.QuestionUnPin
        question.Show = entity.QuestionShow
-       //question.UpdatedAt = nil
+       // question.UpdatedAt = nil
        err = qs.questionRepo.AddQuestion(ctx, question)
        if err != nil {
                return
@@ -416,10 +416,7 @@ func (qs *QuestionService) AddQuestion(ctx 
context.Context, req *schema.Question
                Title:    question.Title,
        }
 
-       questionWithTagsRevision, err := qs.changeQuestionToRevision(ctx, 
question, tags)
-       if err != nil {
-               return nil, err
-       }
+       questionWithTagsRevision := qs.changeQuestionToRevision(ctx, question, 
tags)
        infoJSON, _ := json.Marshal(questionWithTagsRevision)
        revisionDTO.Content = string(infoJSON)
        revisionID, err := qs.revisionService.AddRevision(ctx, revisionDTO, 
true)
@@ -554,7 +551,7 @@ func (qs *QuestionService) RemoveQuestion(ctx 
context.Context, req *schema.Remov
        if err != nil {
                return err
        }
-       //if the status is deleted, return directly
+       // if the status is deleted, return directly
        if questionInfo.Status == entity.QuestionStatusDeleted {
                return nil
        }
@@ -613,7 +610,7 @@ func (qs *QuestionService) RemoveQuestion(ctx 
context.Context, req *schema.Remov
                }
        }
 
-       //tag count
+       // tag count
        tagIDs := make([]string, 0)
        Tags, tagerr := qs.tagCommon.GetObjectEntityTag(ctx, req.ID)
        if tagerr != nil {
@@ -684,7 +681,7 @@ func (qs *QuestionService) UpdateQuestionCheckTags(ctx 
context.Context, req *sch
 
        isChange := qs.tagCommon.CheckTagsIsChange(ctx, tagNameList, 
oldtagNameList)
 
-       //If the content is the same, ignore it
+       // If the content is the same, ignore it
        if dbinfo.Title == req.Title && dbinfo.OriginalText == req.Content && 
!isChange {
                return
        }
@@ -798,7 +795,7 @@ func (qs *QuestionService) UpdateQuestionInviteUser(ctx 
context.Context, req *sc
                return errors.BadRequest(reason.QuestionNotFound)
        }
 
-       //verify invite user
+       // verify invite user
        inviteUserInfoList, err := 
qs.userCommon.BatchGetUserBasicInfoByUserNames(ctx, req.InviteUser)
        if err != nil {
                log.Error("BatchGetUserBasicInfoByUserNames error", err.Error())
@@ -826,7 +823,7 @@ func (qs *QuestionService) UpdateQuestionInviteUser(ctx 
context.Context, req *sc
        if saveerr != nil {
                return saveerr
        }
-       //send notification
+       // send notification
        oldInviteUserIDsStr := originQuestion.InviteUserID
        oldInviteUserIDs := make([]string, 0)
        needSendNotificationUserIDs := make([]string, 0)
@@ -964,7 +961,7 @@ func (qs *QuestionService) UpdateQuestion(ctx 
context.Context, req *schema.Quest
 
        isChange := qs.tagCommon.CheckTagsIsChange(ctx, tagNameList, 
oldtagNameList)
 
-       //If the content is the same, ignore it
+       // If the content is the same, ignore it
        if dbinfo.Title == req.Title && dbinfo.OriginalText == req.Content && 
!isChange {
                return
        }
@@ -1015,7 +1012,7 @@ func (qs *QuestionService) UpdateQuestion(ctx 
context.Context, req *schema.Quest
                return errorlist, err
        }
 
-       //Administrators and themselves do not need to be audited
+       // Administrators and themselves do not need to be audited
 
        revisionDTO := &schema.AddRevisionDTO{
                UserID:   question.UserID,
@@ -1031,11 +1028,11 @@ func (qs *QuestionService) UpdateQuestion(ctx 
context.Context, req *schema.Quest
        // It's not you or the administrator that needs to be reviewed
        if !canUpdate {
                revisionDTO.Status = entity.RevisionUnreviewedStatus
-               revisionDTO.UserID = req.UserID //use revision userid
+               revisionDTO.UserID = req.UserID // use revision userid
        } else {
-               //Direct modification
+               // Direct modification
                revisionDTO.Status = entity.RevisionReviewPassStatus
-               //update question to db
+               // update question to db
                question.ParsedText, err = 
qs.questioncommon.UpdateQuestionLink(ctx, question.ID, "", question.ParsedText, 
question.OriginalText)
                if err != nil {
                        return questionInfo, err
@@ -1054,10 +1051,7 @@ func (qs *QuestionService) UpdateQuestion(ctx 
context.Context, req *schema.Quest
                }
        }
 
-       questionWithTagsRevision, err := qs.changeQuestionToRevision(ctx, 
question, Tags)
-       if err != nil {
-               return nil, err
-       }
+       questionWithTagsRevision := qs.changeQuestionToRevision(ctx, question, 
Tags)
        infoJSON, _ := json.Marshal(questionWithTagsRevision)
        revisionDTO.Content = string(infoJSON)
        revisionID, err := qs.revisionService.AddRevision(ctx, revisionDTO, 
true)
@@ -1165,7 +1159,6 @@ func (qs *QuestionService) CheckChangeReservedTag(ctx 
context.Context, oldobject
 // PersonalQuestionPage get question list by user
 func (qs *QuestionService) PersonalQuestionPage(ctx context.Context, req 
*schema.PersonalQuestionPageReq) (
        pageModel *pager.PageModel, err error) {
-
        userinfo, exist, err := qs.userCommon.GetUserBasicInfoByUserName(ctx, 
req.Username)
        if err != nil {
                return nil, err
@@ -1250,7 +1243,6 @@ func (qs *QuestionService) PersonalAnswerPage(ctx 
context.Context, req *schema.P
                info.QuestionID = item.QuestionID
                if item.QuestionInfo.Status == entity.QuestionStatusDeleted {
                        info.QuestionInfo.Title = "Deleted question"
-
                }
                userAnswerlist = append(userAnswerlist, info)
        }
@@ -1489,7 +1481,8 @@ func (qs *QuestionService) GetQuestionPage(ctx 
context.Context, req *schema.Ques
                        if err != nil {
                                return nil, 0, err
                        }
-                       tagIDs = append(synTagIds, tagInfo.ID)
+                       tagIDs = append(tagIDs, synTagIds...)
+                       tagIDs = append(tagIDs, tagInfo.ID)
                } else {
                        return questions, 0, nil
                }
@@ -1585,10 +1578,10 @@ func (qs *QuestionService) AdminSetQuestionStatus(ctx 
context.Context, req *sche
        if setStatus == entity.QuestionStatusDeleted {
                // #2372 In order to simplify the process and complexity, as 
well as to consider if it is in-house,
                // facing the problem of recovery.
-               //err = qs.answerActivityService.DeleteQuestion(ctx, 
questionInfo.ID, questionInfo.CreatedAt, questionInfo.VoteCount)
-               //if err != nil {
-               //      log.Errorf("admin delete question then rank rollback 
error %s", err.Error())
-               //}
+               // err = qs.answerActivityService.DeleteQuestion(ctx, 
questionInfo.ID, questionInfo.CreatedAt, questionInfo.VoteCount)
+               // if err != nil {
+               //      log.Errorf("admin delete question then rank rollback 
error %s", err.Error())
+               // }
                qs.activityQueueService.Send(ctx, &schema.ActivityMsg{
                        UserID:           questionInfo.UserID,
                        TriggerUserID:    converter.StringToInt64(req.UserID),
@@ -1642,7 +1635,6 @@ func (qs *QuestionService) AdminSetQuestionStatus(ctx 
context.Context, req *sche
 func (qs *QuestionService) AdminQuestionPage(
        ctx context.Context, req *schema.AdminQuestionPageReq) (
        resp *pager.PageModel, err error) {
-
        list := make([]*schema.AdminQuestionInfo, 0)
        questionList, count, err := qs.questionRepo.AdminQuestionPage(ctx, req)
        if err != nil {
@@ -1708,8 +1700,8 @@ func (qs *QuestionService) AdminAnswerPage(ctx 
context.Context, req *schema.Admi
        return pager.NewPageModel(count, answerResp), nil
 }
 
-func (qs *QuestionService) changeQuestionToRevision(ctx context.Context, 
questionInfo *entity.Question, tags []*entity.Tag) (
-       questionRevision *entity.QuestionWithTagsRevision, err error) {
+func (qs *QuestionService) changeQuestionToRevision(_ context.Context, 
questionInfo *entity.Question, tags []*entity.Tag) (
+       questionRevision *entity.QuestionWithTagsRevision) {
        questionRevision = &entity.QuestionWithTagsRevision{}
        questionRevision.Question = *questionInfo
 
@@ -1718,7 +1710,7 @@ func (qs *QuestionService) changeQuestionToRevision(ctx 
context.Context, questio
                _ = copier.Copy(item, tag)
                questionRevision.Tags = append(questionRevision.Tags, item)
        }
-       return questionRevision, nil
+       return questionRevision
 }
 
 func (qs *QuestionService) SitemapCron(ctx context.Context) {
diff --git a/internal/service/content/revision_service.go 
b/internal/service/content/revision_service.go
index a5cefeb4..4ac08e76 100644
--- a/internal/service/content/revision_service.go
+++ b/internal/service/content/revision_service.go
@@ -235,7 +235,6 @@ func (rs *RevisionService) revisionAuditQuestion(ctx 
context.Context, revisionit
 func (rs *RevisionService) revisionAuditAnswer(ctx context.Context, 
revisionitem *schema.GetRevisionResp) (err error) {
        answerinfo, ok := revisionitem.ContentParsed.(*schema.AnswerInfo)
        if ok {
-
                var PostUpdateTime time.Time
                dbquestion, exist, dberr := rs.questionRepo.GetQuestion(ctx, 
answerinfo.QuestionID)
                if dberr != nil || !exist {
diff --git a/internal/service/content/search_service.go 
b/internal/service/content/search_service.go
index ccafcd82..866f1c6e 100644
--- a/internal/service/content/search_service.go
+++ b/internal/service/content/search_service.go
@@ -68,13 +68,14 @@ func (ss *SearchService) Search(ctx context.Context, dto 
*schema.SearchDTO) (res
        resp = &schema.SearchResp{}
        // search plugin is not found, call system search
        if finder == nil {
-               if cond.SearchAll() {
+               switch {
+               case cond.SearchAll():
                        resp.SearchResults, resp.Total, err =
                                ss.searchRepo.SearchContents(ctx, cond.Words, 
cond.Tags, cond.UserID, cond.VoteAmount, dto.Page, dto.Size, dto.Order)
-               } else if cond.SearchQuestion() {
+               case cond.SearchQuestion():
                        resp.SearchResults, resp.Total, err =
                                ss.searchRepo.SearchQuestions(ctx, cond.Words, 
cond.Tags, cond.NotAccepted, cond.Views, cond.AnswerAmount, dto.Page, dto.Size, 
dto.Order)
-               } else if cond.SearchAnswer() {
+               case cond.SearchAnswer():
                        resp.SearchResults, resp.Total, err =
                                ss.searchRepo.SearchAnswers(ctx, cond.Words, 
cond.Tags, cond.Accepted, cond.QuestionID, dto.Page, dto.Size, dto.Order)
                }
@@ -86,11 +87,12 @@ func (ss *SearchService) Search(ctx context.Context, dto 
*schema.SearchDTO) (res
 func (ss *SearchService) searchByPlugin(ctx context.Context, finder 
plugin.Search, cond *schema.SearchCondition, dto *schema.SearchDTO) (resp 
*schema.SearchResp, err error) {
        var res []plugin.SearchResult
        resp = &schema.SearchResp{}
-       if cond.SearchAll() {
+       switch {
+       case cond.SearchAll():
                res, resp.Total, err = finder.SearchContents(ctx, 
cond.Convert2PluginSearchCond(dto.Page, dto.Size, dto.Order))
-       } else if cond.SearchQuestion() {
+       case cond.SearchQuestion():
                res, resp.Total, err = finder.SearchQuestions(ctx, 
cond.Convert2PluginSearchCond(dto.Page, dto.Size, dto.Order))
-       } else if cond.SearchAnswer() {
+       case cond.SearchAnswer():
                res, resp.Total, err = finder.SearchAnswers(ctx, 
cond.Convert2PluginSearchCond(dto.Page, dto.Size, dto.Order))
        }
        if err != nil {
diff --git a/internal/service/content/user_service.go 
b/internal/service/content/user_service.go
index 81f7ac82..e9cc3578 100644
--- a/internal/service/content/user_service.go
+++ b/internal/service/content/user_service.go
@@ -314,7 +314,6 @@ func (us *UserService) UserModifyPassword(ctx 
context.Context, req *schema.UserM
 // UpdateInfo update user info
 func (us *UserService) UpdateInfo(ctx context.Context, req 
*schema.UpdateInfoRequest) (
        errFields []*validator.FormErrorField, err error) {
-
        if len(req.Username) > 0 {
                if checker.IsInvalidUsername(req.Username) {
                        return append(errFields, &validator.FormErrorField{
@@ -598,7 +597,7 @@ func (us *UserService) UserVerifyEmail(ctx context.Context, 
req *schema.UserVeri
 
 // verifyPassword
 // Compare whether the password is correct
-func (us *UserService) verifyPassword(ctx context.Context, loginPass, userPass 
string) bool {
+func (us *UserService) verifyPassword(_ context.Context, loginPass, userPass 
string) bool {
        if len(loginPass) == 0 && len(userPass) == 0 {
                return true
        }
@@ -608,8 +607,8 @@ func (us *UserService) verifyPassword(ctx context.Context, 
loginPass, userPass s
 
 // encryptPassword
 // The password does irreversible encryption.
-func (us *UserService) encryptPassword(ctx context.Context, Pass string) 
(string, error) {
-       hashPwd, err := bcrypt.GenerateFromPassword([]byte(Pass), 
bcrypt.DefaultCost)
+func (us *UserService) encryptPassword(_ context.Context, pass string) 
(string, error) {
+       hashPwd, err := bcrypt.GenerateFromPassword([]byte(pass), 
bcrypt.DefaultCost)
        // This encrypted string can be saved to the database and can be used 
as password matching verification
        return string(hashPwd), err
 }
diff --git a/internal/service/dashboard/dashboard_service.go 
b/internal/service/dashboard/dashboard_service.go
index 91f0e338..8b08ba02 100644
--- a/internal/service/dashboard/dashboard_service.go
+++ b/internal/service/dashboard/dashboard_service.go
@@ -264,7 +264,7 @@ func (ds *dashboardService) voteCount(ctx context.Context) 
int64 {
        return voteCount
 }
 
-func (ds *dashboardService) remoteVersion(ctx context.Context) string {
+func (ds *dashboardService) remoteVersion(_ context.Context) string {
        req, _ := http.NewRequest("GET", 
"https://answer.apache.org/data/latest.json?from_version="+constant.Version, 
nil)
        req.Header.Set("User-Agent", "Answer/"+constant.Version)
        httpClient := &http.Client{}
@@ -359,11 +359,9 @@ func (ds *dashboardService) GetDatabaseSize() (dbSize 
string) {
                res, err := ds.data.DB.QueryInterface(sql)
                if err != nil {
                        log.Warnf("get db size failed: %s", err)
-               } else {
-                       if len(res) > 0 && res[0]["db_size"] != nil {
-                               dbSizeStr, _ := res[0]["db_size"].(string)
-                               dbSize = 
dir.FormatFileSize(converter.StringToInt64(dbSizeStr))
-                       }
+               } else if len(res) > 0 && res[0]["db_size"] != nil {
+                       dbSizeStr, _ := res[0]["db_size"].(string)
+                       dbSize = 
dir.FormatFileSize(converter.StringToInt64(dbSizeStr))
                }
        case schemas.POSTGRES:
                sql := fmt.Sprintf("SELECT pg_database_size('%s') AS db_size",
@@ -371,11 +369,9 @@ func (ds *dashboardService) GetDatabaseSize() (dbSize 
string) {
                res, err := ds.data.DB.QueryInterface(sql)
                if err != nil {
                        log.Warnf("get db size failed: %s", err)
-               } else {
-                       if len(res) > 0 && res[0]["db_size"] != nil {
-                               dbSizeStr, _ := res[0]["db_size"].(int32)
-                               dbSize = dir.FormatFileSize(int64(dbSizeStr))
-                       }
+               } else if len(res) > 0 && res[0]["db_size"] != nil {
+                       dbSizeStr, _ := res[0]["db_size"].(int32)
+                       dbSize = dir.FormatFileSize(int64(dbSizeStr))
                }
        case schemas.SQLITE:
                dirSize, err := dir.DirSize(ds.data.DB.DataSourceName())
diff --git a/internal/service/notification/invite_answer_notification.go 
b/internal/service/notification/invite_answer_notification.go
index f68feb06..6b0407f9 100644
--- a/internal/service/notification/invite_answer_notification.go
+++ b/internal/service/notification/invite_answer_notification.go
@@ -45,8 +45,7 @@ func (ns *ExternalNotificationService) 
handleInviteAnswerNotification(ctx contex
                if !channel.Enable {
                        continue
                }
-               switch channel.Key {
-               case constant.EmailChannel:
+               if channel.Key == constant.EmailChannel {
                        ns.sendInviteAnswerNotificationEmail(ctx, 
msg.ReceiverUserID, msg.ReceiverEmail, msg.ReceiverLang, 
msg.NewInviteAnswerTemplateRawData)
                }
        }
diff --git a/internal/service/notification/new_answer_notification.go 
b/internal/service/notification/new_answer_notification.go
index c54fd961..4ae9ca9e 100644
--- a/internal/service/notification/new_answer_notification.go
+++ b/internal/service/notification/new_answer_notification.go
@@ -45,8 +45,7 @@ func (ns *ExternalNotificationService) 
handleNewAnswerNotification(ctx context.C
                if !channel.Enable {
                        continue
                }
-               switch channel.Key {
-               case constant.EmailChannel:
+               if channel.Key == constant.EmailChannel {
                        ns.sendNewAnswerNotificationEmail(ctx, 
msg.ReceiverUserID, msg.ReceiverEmail, msg.ReceiverLang, 
msg.NewAnswerTemplateRawData)
                }
        }
diff --git a/internal/service/notification/new_comment_notification.go 
b/internal/service/notification/new_comment_notification.go
index e622ed4f..9734e54e 100644
--- a/internal/service/notification/new_comment_notification.go
+++ b/internal/service/notification/new_comment_notification.go
@@ -45,8 +45,7 @@ func (ns *ExternalNotificationService) 
handleNewCommentNotification(ctx context.
                if !channel.Enable {
                        continue
                }
-               switch channel.Key {
-               case constant.EmailChannel:
+               if channel.Key == constant.EmailChannel {
                        ns.sendNewCommentNotificationEmail(ctx, 
msg.ReceiverUserID, msg.ReceiverEmail, msg.ReceiverLang, 
msg.NewCommentTemplateRawData)
                }
        }
diff --git a/internal/service/notification/new_question_notification.go 
b/internal/service/notification/new_question_notification.go
index debfb8c2..2f83042b 100644
--- a/internal/service/notification/new_question_notification.go
+++ b/internal/service/notification/new_question_notification.go
@@ -55,8 +55,7 @@ func (ns *ExternalNotificationService) 
handleNewQuestionNotification(ctx context
                        if !channel.Enable {
                                continue
                        }
-                       switch channel.Key {
-                       case constant.EmailChannel:
+                       if channel.Key == constant.EmailChannel {
                                ns.sendNewQuestionNotificationEmail(ctx, 
subscriber.UserID, &schema.NewQuestionTemplateRawData{
                                        QuestionTitle:   
msg.NewQuestionTemplateRawData.QuestionTitle,
                                        QuestionID:      
msg.NewQuestionTemplateRawData.QuestionID,
diff --git a/internal/service/notification/notification_service.go 
b/internal/service/notification/notification_service.go
index 0369d455..6a69cbae 100644
--- a/internal/service/notification/notification_service.go
+++ b/internal/service/notification/notification_service.go
@@ -226,15 +226,12 @@ func (ns *NotificationService) GetNotificationPage(ctx 
context.Context, searchCo
        if err != nil {
                return nil, err
        }
-       resp, err = ns.formatNotificationPage(ctx, notifications)
-       if err != nil {
-               return nil, err
-       }
+       resp = ns.formatNotificationPage(ctx, notifications)
        return pager.NewPageModel(total, resp), nil
 }
 
 func (ns *NotificationService) formatNotificationPage(ctx context.Context, 
notifications []*entity.Notification) (
-       resp []*schema.NotificationContent, err error) {
+       resp []*schema.NotificationContent) {
        lang := handler.GetLangByCtx(ctx)
        enableShortID := handler.GetEnableShortID(ctx)
        userIDs := make([]string, 0)
@@ -287,13 +284,13 @@ func (ns *NotificationService) formatNotificationPage(ctx 
context.Context, notif
        }
 
        if len(userIDs) == 0 {
-               return resp, nil
+               return resp
        }
 
        users, err := ns.userRepo.BatchGetByID(ctx, userIDs)
        if err != nil {
                log.Error(err)
-               return resp, nil
+               return resp
        }
        userIDMapping := make(map[string]*entity.User, len(users))
        for _, user := range users {
@@ -314,5 +311,5 @@ func (ns *NotificationService) formatNotificationPage(ctx 
context.Context, notif
                        }
                }
        }
-       return resp, nil
+       return resp
 }
diff --git a/internal/service/notification_common/notification.go 
b/internal/service/notification_common/notification.go
index 55d63842..0bbd1865 100644
--- a/internal/service/notification_common/notification.go
+++ b/internal/service/notification_common/notification.go
@@ -155,7 +155,7 @@ func (ns *NotificationCommon) AddNotification(ctx 
context.Context, msg *schema.N
                }
                req.Rank = rank
                if exist {
-                       //modify notification
+                       // modify notification
                        updateContent := &schema.NotificationContent{}
                        err := json.Unmarshal([]byte(notificationInfo.Content), 
updateContent)
                        if err != nil {
diff --git a/internal/service/plugin_common/plugin_common_service.go 
b/internal/service/plugin_common/plugin_common_service.go
index d3aa839b..7d39a5aa 100644
--- a/internal/service/plugin_common/plugin_common_service.go
+++ b/internal/service/plugin_common/plugin_common_service.go
@@ -69,7 +69,6 @@ func NewPluginCommonService(
        data *data.Data,
        importerService *importer.ImporterService,
 ) *PluginCommonService {
-
        p := &PluginCommonService{
                configService:        configService,
                pluginConfigRepo:     pluginConfigRepo,
diff --git a/internal/service/question_common/question.go 
b/internal/service/question_common/question.go
index 33380644..846dea89 100644
--- a/internal/service/question_common/question.go
+++ b/internal/service/question_common/question.go
@@ -179,17 +179,17 @@ func (qs *QuestionCommon) UpdateCollectionCount(ctx 
context.Context, questionID
        return qs.questionRepo.UpdateCollectionCount(ctx, questionID)
 }
 
-func (qs *QuestionCommon) UpdateAccepted(ctx context.Context, questionID, 
AnswerID string) error {
+func (qs *QuestionCommon) UpdateAccepted(ctx context.Context, questionID, 
answerID string) error {
        question := &entity.Question{}
        question.ID = questionID
-       question.AcceptedAnswerID = AnswerID
+       question.AcceptedAnswerID = answerID
        return qs.questionRepo.UpdateAccepted(ctx, question)
 }
 
-func (qs *QuestionCommon) UpdateLastAnswer(ctx context.Context, questionID, 
AnswerID string) error {
+func (qs *QuestionCommon) UpdateLastAnswer(ctx context.Context, questionID, 
answerID string) error {
        question := &entity.Question{}
        question.ID = questionID
-       question.LastAnswerID = AnswerID
+       question.LastAnswerID = answerID
        return qs.questionRepo.UpdateLastAnswer(ctx, question)
 }
 
@@ -232,7 +232,7 @@ func (qs *QuestionCommon) InviteUserInfo(ctx 
context.Context, questionID string)
        if !has {
                return InviteUserInfo, errors.NotFound(reason.QuestionNotFound)
        }
-       //InviteUser
+       // InviteUser
        if dbinfo.InviteUserID != "" {
                InviteUserIDs := make([]string, 0)
                err := json.Unmarshal([]byte(dbinfo.InviteUserID), 
&InviteUserIDs)
@@ -681,7 +681,6 @@ func (qs *QuestionCommon) ShowFormat(ctx context.Context, 
data *entity.Question)
                                info.LastAnsweredUserID = answerInfo.UserID
                        }
                }
-
        }
        info.Tags = make([]*schema.TagResp, 0)
        return &info
diff --git a/internal/service/siteinfo_common/siteinfo_service_test.go 
b/internal/service/siteinfo_common/siteinfo_service_test.go
index 3a567dcb..a87d427f 100644
--- a/internal/service/siteinfo_common/siteinfo_service_test.go
+++ b/internal/service/siteinfo_common/siteinfo_service_test.go
@@ -27,6 +27,7 @@ import (
        "github.com/apache/answer/internal/entity"
        "github.com/apache/answer/internal/service/mock"
        "github.com/stretchr/testify/assert"
+       "github.com/stretchr/testify/require"
        "go.uber.org/mock/gomock"
 )
 
@@ -46,6 +47,6 @@ func TestSiteInfoCommonService_GetSiteGeneral(t *testing.T) {
        mockInit(ctl)
        siteInfoCommonService := NewSiteInfoCommonService(mockSiteInfoRepo)
        resp, err := siteInfoCommonService.GetSiteGeneral(context.TODO())
-       assert.NoError(t, err)
-       assert.Equal(t, resp.Name, "name")
+       require.NoError(t, err)
+       assert.Equal(t, "name", resp.Name)
 }
diff --git a/internal/service/tag/tag_service.go 
b/internal/service/tag/tag_service.go
index 577199ec..e61bfa06 100644
--- a/internal/service/tag/tag_service.go
+++ b/internal/service/tag/tag_service.go
@@ -74,7 +74,7 @@ func NewTagService(
 
 // RemoveTag delete tag
 func (ts *TagService) RemoveTag(ctx context.Context, req *schema.RemoveTagReq) 
(err error) {
-       //If the tag has associated problems, it cannot be deleted
+       // If the tag has associated problems, it cannot be deleted
        tagCount, err := ts.tagCommonService.CountTagRelByTagID(ctx, req.TagID)
        if err != nil {
                return err
@@ -83,7 +83,7 @@ func (ts *TagService) RemoveTag(ctx context.Context, req 
*schema.RemoveTagReq) (
                return errors.BadRequest(reason.TagIsUsedCannotDelete)
        }
 
-       //If the tag has associated problems, it cannot be deleted
+       // If the tag has associated problems, it cannot be deleted
        tagSynonymCount, err := ts.tagRepo.GetTagSynonymCount(ctx, req.TagID)
        if err != nil {
                return err
diff --git a/internal/service/tag_common/tag_common.go 
b/internal/service/tag_common/tag_common.go
index fed5dfbf..87c10bcc 100644
--- a/internal/service/tag_common/tag_common.go
+++ b/internal/service/tag_common/tag_common.go
@@ -591,7 +591,6 @@ func (ts *TagCommonService) CheckTag(ctx context.Context, 
tags []string, userID
                err = 
errors.BadRequest(reason.TagNotFound).WithMsg(fmt.Sprintf("tag [%s] does not 
exist",
                        strings.Join(addTagMsgList, ",")))
                return err
-
        }
 
        return nil
@@ -660,9 +659,8 @@ func (ts *TagCommonService) CheckChangeReservedTag(ctx 
context.Context, oldobjec
 
 // ObjectChangeTag change object tag list
 func (ts *TagCommonService) ObjectChangeTag(ctx context.Context, objectTagData 
*schema.TagChange, minimumTags int) (errorlist []*validator.FormErrorField, err 
error) {
-       //checks if the tags sent in the put req are less than the minimum, if 
so, tag changes are not applied
+       // checks if the tags sent in the put req are less than the minimum, if 
so, tag changes are not applied
        if len(objectTagData.Tags) < minimumTags {
-
                errorlist := make([]*validator.FormErrorField, 0)
                errorlist = append(errorlist, &validator.FormErrorField{
                        ErrorField: "tags",
@@ -884,11 +882,11 @@ func (ts *TagCommonService) UpdateTag(ctx 
context.Context, req *schema.UpdateTag
                return errors.BadRequest(reason.TagNotFound)
        }
 
-       //Adding equivalent slug formatting for tag update
+       // Adding equivalent slug formatting for tag update
        slugName := strings.ReplaceAll(req.SlugName, " ", "-")
        slugName = strings.ToLower(slugName)
 
-       //If the content is the same, ignore it
+       // If the content is the same, ignore it
        if tagInfo.OriginalText == req.OriginalText &&
                tagInfo.DisplayName == req.DisplayName &&
                tagInfo.SlugName == slugName {
diff --git a/internal/service/uploader/upload.go 
b/internal/service/uploader/upload.go
index 30029193..8dea746c 100644
--- a/internal/service/uploader/upload.go
+++ b/internal/service/uploader/upload.go
@@ -135,7 +135,6 @@ func (us *uploaderService) UploadAvatarFile(ctx 
*gin.Context, userID string) (ur
        }
        us.fileRecordService.AddFileRecord(ctx, userID, avatarFilePath, url, 
string(plugin.UserAvatar))
        return url, nil
-
 }
 
 func (us *uploaderService) AvatarThumbFile(ctx *gin.Context, fileName string, 
size int) (url string, err error) {
@@ -304,7 +303,6 @@ func (us *uploaderService) UploadBrandingFile(ctx 
*gin.Context, userID string) (
        }
        us.fileRecordService.AddFileRecord(ctx, userID, avatarFilePath, url, 
string(plugin.AdminBranding))
        return url, nil
-
 }
 
 func (us *uploaderService) uploadImageFile(ctx *gin.Context, file 
*multipart.FileHeader, fileSubPath string) (
diff --git a/internal/service/user_admin/user_backyard.go 
b/internal/service/user_admin/user_backyard.go
index 6fce161c..fcced1c8 100644
--- a/internal/service/user_admin/user_backyard.go
+++ b/internal/service/user_admin/user_backyard.go
@@ -470,14 +470,15 @@ func (us *UserAdminService) GetUserPage(ctx 
context.Context, req *schema.GetUser
        user := &entity.User{}
        _ = copier.Copy(user, req)
 
-       if req.IsInactive() {
+       switch {
+       case req.IsInactive():
                user.MailStatus = entity.EmailStatusToBeVerified
                user.Status = entity.UserStatusAvailable
-       } else if req.IsSuspended() {
+       case req.IsSuspended():
                user.Status = entity.UserStatusSuspended
-       } else if req.IsDeleted() {
+       case req.IsDeleted():
                user.Status = entity.UserStatusDeleted
-       } else {
+       default:
                user.MailStatus = entity.EmailStatusAvailable
                user.Status = entity.UserStatusAvailable
        }
@@ -486,8 +487,8 @@ func (us *UserAdminService) GetUserPage(ctx 
context.Context, req *schema.GetUser
                if email, e := mail.ParseAddress(req.Query); e == nil {
                        user.EMail = email.Address
                        req.Query = ""
-               } else if strings.HasPrefix(req.Query, "user:") {
-                       id := strings.TrimSpace(strings.TrimPrefix(req.Query, 
"user:"))
+               } else if after, ok := strings.CutPrefix(req.Query, "user:"); 
ok {
+                       id := strings.TrimSpace(after)
                        idSearch := true
                        for _, r := range id {
                                if !unicode.IsDigit(r) {
@@ -521,18 +522,19 @@ func (us *UserAdminService) GetUserPage(ctx 
context.Context, req *schema.GetUser
                        DisplayName: u.DisplayName,
                        Avatar:      avatarMapping[u.ID].GetURL(),
                }
-               if u.Status == entity.UserStatusDeleted {
+               switch {
+               case u.Status == entity.UserStatusDeleted:
                        t.Status = constant.UserDeleted
                        t.DeletedAt = u.DeletedAt.Unix()
-               } else if u.Status == entity.UserStatusSuspended {
+               case u.Status == entity.UserStatusSuspended:
                        t.Status = constant.UserSuspended
                        t.SuspendedAt = u.SuspendedAt.Unix()
                        if !u.SuspendedUntil.IsZero() {
                                t.SuspendedUntil = u.SuspendedUntil.Unix()
                        }
-               } else if u.MailStatus == entity.EmailStatusToBeVerified {
+               case u.MailStatus == entity.EmailStatusToBeVerified:
                        t.Status = constant.UserInactive
-               } else {
+               default:
                        t.Status = constant.UserNormal
                }
                resp = append(resp, t)
@@ -646,7 +648,6 @@ func (us *UserAdminService) 
CheckAndUnsuspendExpiredUsers(ctx context.Context) e
                if user.Status == entity.UserStatusSuspended &&
                        !user.SuspendedUntil.IsZero() &&
                        user.SuspendedUntil.Before(now) {
-
                        log.Infof("Unsuspending user %s (ID: %s) - suspension 
expired at %v",
                                user.Username, user.ID, user.SuspendedUntil)
 
diff --git a/internal/service/user_common/user.go 
b/internal/service/user_common/user.go
index 124972a1..2e777f14 100644
--- a/internal/service/user_common/user.go
+++ b/internal/service/user_common/user.go
@@ -85,9 +85,9 @@ func NewUserCommon(
        }
 }
 
-func (us *UserCommon) GetUserBasicInfoByID(ctx context.Context, ID string) (
+func (us *UserCommon) GetUserBasicInfoByID(ctx context.Context, id string) (
        userBasicInfo *schema.UserBasicInfo, exist bool, err error) {
-       userInfo, exist, err := us.userRepo.GetByUserID(ctx, ID)
+       userInfo, exist, err := us.userRepo.GetByUserID(ctx, id)
        if err != nil {
                return nil, exist, err
        }
diff --git 
a/internal/service/user_notification_config/user_notification_config_service.go 
b/internal/service/user_notification_config/user_notification_config_service.go
index c40df55c..8ab72fa9 100644
--- 
a/internal/service/user_notification_config/user_notification_config_service.go
+++ 
b/internal/service/user_notification_config/user_notification_config_service.go
@@ -96,7 +96,7 @@ func (us *UserNotificationConfigService) 
SetDefaultUserNotificationConfig(ctx co
                string(constant.InboxSource), `[{"key":"email","enable":true}]`)
 }
 
-func (us *UserNotificationConfigService) convertToEntity(ctx context.Context, 
userID string,
+func (us *UserNotificationConfigService) convertToEntity(_ context.Context, 
userID string,
        source constant.NotificationSource, channel 
schema.NotificationChannelConfig) (c *entity.UserNotificationConfig) {
        var channels schema.NotificationChannels
        channels = append(channels, &channel)
diff --git a/pkg/checker/file_type.go b/pkg/checker/file_type.go
index ac1fbcaf..8eaabcbf 100644
--- a/pkg/checker/file_type.go
+++ b/pkg/checker/file_type.go
@@ -28,6 +28,7 @@ import (
        "io"
        "os"
        "path/filepath"
+       "slices"
        "strings"
 
        "github.com/segmentfault/pacman/log"
@@ -38,12 +39,7 @@ import (
 // WANING Only checks the file extension is not reliable, but 
`http.DetectContentType` and `mimetype` are not reliable for all file types.
 func IsUnAuthorizedExtension(fileName string, allowedExtensions []string) bool 
{
        ext := strings.ToLower(strings.Trim(filepath.Ext(fileName), "."))
-       for _, extension := range allowedExtensions {
-               if extension == ext {
-                       return false
-               }
-       }
-       return true
+       return !slices.Contains(allowedExtensions, ext)
 }
 
 // DecodeAndCheckImageFile currently answers support image type is
diff --git a/pkg/checker/path_ignore.go b/pkg/checker/path_ignore.go
index 8be757be..24b092f7 100644
--- a/pkg/checker/path_ignore.go
+++ b/pkg/checker/path_ignore.go
@@ -20,6 +20,7 @@
 package checker
 
 import (
+       "slices"
        "sync"
 
        "github.com/apache/answer/configs"
@@ -46,21 +47,11 @@ func initPathIgnore() {
 // IsUsersIgnorePath checks whether the username is in ignore path
 func IsUsersIgnorePath(username string) bool {
        ignorePathInit.Do(initPathIgnore)
-       for _, u := range pathIgnore.Users {
-               if u == username {
-                       return true
-               }
-       }
-       return false
+       return slices.Contains(pathIgnore.Users, username)
 }
 
 // IsQuestionsIgnorePath checks whether the questionID is in ignore path
 func IsQuestionsIgnorePath(questionID string) bool {
        ignorePathInit.Do(initPathIgnore)
-       for _, u := range pathIgnore.Questions {
-               if u == questionID {
-                       return true
-               }
-       }
-       return false
+       return slices.Contains(pathIgnore.Questions, questionID)
 }
diff --git a/pkg/checker/question_link.go b/pkg/checker/question_link.go
index 41b246c3..efd19b3c 100644
--- a/pkg/checker/question_link.go
+++ b/pkg/checker/question_link.go
@@ -44,15 +44,16 @@ func GetQuestionLink(content string) []QuestionLink {
        left, right := 0, 0
        for right < len(content) {
                // find "/questions/" or "#"
-               if right+11 < len(content) && content[right:right+11] == 
"/questions/" {
+               switch {
+               case right+11 < len(content) && content[right:right+11] == 
"/questions/":
                        left = right
                        right += 11
                        processURL(content, &left, &right, uniqueIDs, 
&questionLinks)
-               } else if content[right] == '#' {
+               case content[right] == '#':
                        left = right + 1
                        right = left
                        processID(content, &left, &right, uniqueIDs, 
&questionLinks)
-               } else {
+               default:
                        right++
                }
        }
@@ -101,9 +102,7 @@ func addUniqueID(questionID, answerID string, linkType int, 
uniqueIDs map[string
                objectType, err := 
obj.GetObjectTypeStrByObjectID(uid.DeShortID(answerID))
                if err != nil {
                        answerID = ""
-               }
-
-               if objectType == constant.AnswerObjectType {
+               } else if objectType == constant.AnswerObjectType {
                        if _, ok := uniqueIDs[answerID]; !ok {
                                uniqueIDs[answerID] = struct{}{}
                                isAdd = true
diff --git a/pkg/converter/markdown.go b/pkg/converter/markdown.go
index d16915a8..adae3faf 100644
--- a/pkg/converter/markdown.go
+++ b/pkg/converter/markdown.go
@@ -107,7 +107,7 @@ func (r *DangerousHTMLRenderer) renderRawHTML(w 
util.BufWriter, source []byte, n
        }
        n := node.(*ast.RawHTML)
        l := n.Segments.Len()
-       for i := 0; i < l; i++ {
+       for i := range l {
                segment := n.Segments.At(i)
                if string(source[segment.Start:segment.Stop]) == "<kbd>" || 
string(source[segment.Start:segment.Stop]) == "</kbd>" {
                        _, _ = w.Write(segment.Value(source))
@@ -122,15 +122,13 @@ func (r *DangerousHTMLRenderer) renderHTMLBlock(w 
util.BufWriter, source []byte,
        n := node.(*ast.HTMLBlock)
        if entering {
                l := n.Lines().Len()
-               for i := 0; i < l; i++ {
+               for i := range l {
                        line := n.Lines().At(i)
                        r.Writer.SecureWrite(w, line.Value(source))
                }
-       } else {
-               if n.HasClosure() {
-                       closure := n.ClosureLine
-                       r.Writer.SecureWrite(w, closure.Value(source))
-               }
+       } else if n.HasClosure() {
+               closure := n.ClosureLine
+               r.Writer.SecureWrite(w, closure.Value(source))
        }
        return ast.WalkContinue, nil
 }
@@ -184,8 +182,8 @@ func (r *DangerousHTMLRenderer) renderAutoLink(w 
util.BufWriter, source []byte,
        return ast.WalkContinue, nil
 }
 
-func (r *DangerousHTMLRenderer) renderLinkIsUrl(verifyUrl string) bool {
-       isURL := govalidator.IsURL(verifyUrl)
-       isPath, _ := regexp.MatchString(`^/`, verifyUrl)
+func (r *DangerousHTMLRenderer) renderLinkIsUrl(verifyURL string) bool {
+       isURL := govalidator.IsURL(verifyURL)
+       isPath, _ := regexp.MatchString(`^/`, verifyURL)
        return isURL || isPath
 }
diff --git a/pkg/day/day.go b/pkg/day/day.go
index 90afac0a..2fd86a6c 100644
--- a/pkg/day/day.go
+++ b/pkg/day/day.go
@@ -20,6 +20,7 @@
 package day
 
 import (
+       "strings"
        "time"
 )
 
@@ -50,16 +51,16 @@ func Format(unix int64, format, tz string) (formatted 
string) {
        for i := l; i >= 0; i-- {
                format = strings.ReplaceAll(format, placeholders[i].old, 
placeholders[i].new)
        }*/
-       toFormat := ""
+       var toFormat strings.Builder
        from := []rune(format)
        for len(from) > 0 {
                to, suffix := nextStdChunk(from)
-               toFormat += string(to)
+               toFormat.WriteString(string(to))
                from = suffix
        }
 
        _, _ = time.LoadLocation(tz)
-       formatted = time.Unix(unix, 0).Format(toFormat)
+       formatted = time.Unix(unix, 0).Format(toFormat.String())
        return
 }
 
diff --git a/pkg/dir/dir.go b/pkg/dir/dir.go
index 928883c2..09591f6c 100644
--- a/pkg/dir/dir.go
+++ b/pkg/dir/dir.go
@@ -51,19 +51,19 @@ func DirSize(path string) (int64, error) {
 }
 
 func FormatFileSize(fileSize int64) (size string) {
-       if fileSize < 1024 {
-               //return strconv.FormatInt(fileSize, 10) + "B"
+       switch {
+       case fileSize < 1024:
+               // return strconv.FormatInt(fileSize, 10) + "B"
                return fmt.Sprintf("%.2f B", float64(fileSize)/float64(1))
-       } else if fileSize < (1024 * 1024) {
+       case fileSize < (1024 * 1024):
                return fmt.Sprintf("%.2f KB", float64(fileSize)/float64(1024))
-       } else if fileSize < (1024 * 1024 * 1024) {
+       case fileSize < (1024 * 1024 * 1024):
                return fmt.Sprintf("%.2f MB", 
float64(fileSize)/float64(1024*1024))
-       } else if fileSize < (1024 * 1024 * 1024 * 1024) {
+       case fileSize < (1024 * 1024 * 1024 * 1024):
                return fmt.Sprintf("%.2f GB", 
float64(fileSize)/float64(1024*1024*1024))
-       } else if fileSize < (1024 * 1024 * 1024 * 1024 * 1024) {
+       case fileSize < (1024 * 1024 * 1024 * 1024 * 1024):
                return fmt.Sprintf("%.2f TB", 
float64(fileSize)/float64(1024*1024*1024*1024))
-       } else { //if fileSize < (1024 * 1024 * 1024 * 1024 * 1024 * 1024)
+       default: // if fileSize < (1024 * 1024 * 1024 * 1024 * 1024 * 1024)
                return fmt.Sprintf("%.2f EB", 
float64(fileSize)/float64(1024*1024*1024*1024*1024))
        }
-
 }
diff --git a/pkg/htmltext/htmltext.go b/pkg/htmltext/htmltext.go
index 56db4d2b..e2e017c8 100644
--- a/pkg/htmltext/htmltext.go
+++ b/pkg/htmltext/htmltext.go
@@ -77,14 +77,14 @@ func UrlTitle(title string) (text string) {
 }
 
 func clearEmoji(s string) string {
-       ret := ""
+       var ret strings.Builder
        rs := []rune(s)
-       for i := 0; i < len(rs); i++ {
+       for i := range rs {
                if len(string(rs[i])) != 4 {
-                       ret += string(rs[i])
+                       ret.WriteString(string(rs[i]))
                }
        }
-       return ret
+       return ret.String()
 }
 
 func convertChinese(content string) string {
@@ -164,7 +164,7 @@ func FetchRangedExcerpt(html, trimMarker string, offset 
int, limit int) (text st
                text = trimMarker + text
        }
        if end < len(runeText) {
-               text = text + trimMarker
+               text += trimMarker
        }
 
        return
@@ -189,8 +189,8 @@ func FetchMatchedExcerpt(html string, words []string, 
trimMarker string, trimLen
        return FetchRangedExcerpt(html, trimMarker, runeOffset, runeLimit)
 }
 
-func GetPicByUrl(Url string) string {
-       res, err := http.Get(Url)
+func GetPicByUrl(url string) string {
+       res, err := http.Get(url)
        if err != nil {
                return ""
        }
diff --git a/pkg/htmltext/htmltext_test.go b/pkg/htmltext/htmltext_test.go
index 63866eb2..39de9e96 100644
--- a/pkg/htmltext/htmltext_test.go
+++ b/pkg/htmltext/htmltext_test.go
@@ -186,11 +186,11 @@ func TestCutLongTitle(t *testing.T) {
 
        // Exactly max bytes, no cutting needed
        exact150 := strings.Repeat("a", 150)
-       assert.Equal(t, 150, len(cutLongTitle(exact150)))
+       assert.Len(t, cutLongTitle(exact150), 150)
 
        // Just over max bytes, should be cut
        exact151 := strings.Repeat("a", 151)
-       assert.Equal(t, 150, len(cutLongTitle(exact151)))
+       assert.Len(t, cutLongTitle(exact151), 150)
 
        // Multi-byte rune at boundary gets removed properly
        asciiPart := strings.Repeat("a", 149) // 149 bytes
diff --git a/plugin/plugin_test/plugin_main_test.go 
b/plugin/plugin_test/plugin_main_test.go
index fd9015c8..7ba6f8ae 100644
--- a/plugin/plugin_test/plugin_main_test.go
+++ b/plugin/plugin_test/plugin_main_test.go
@@ -81,19 +81,16 @@ func TestMain(t *testing.M) {
                _ = os.RemoveAll(dbSetting.Connection)
        }
 
-       defer func() {
-               if tearDown != nil {
-                       tearDown()
-               }
-       }()
        if err := initTestDataSource(dbSetting); err != nil {
                panic(err)
        }
        log.Info("init test database successfully")
 
-       if ret := t.Run(); ret != 0 {
-               os.Exit(ret)
+       ret := t.Run()
+       if tearDown != nil {
+               tearDown()
        }
+       os.Exit(ret)
 }
 
 type TestDBSetting struct {
@@ -155,7 +152,7 @@ func initDatabaseImage(dbSetting TestDBSetting) (connection 
string, cleanup func
                return "", nil, fmt.Errorf("could not connect to docker: %s", 
err)
        }
 
-       //resource, err := pool.Run(dbSetting.ImageName, 
dbSetting.ImageVersion, dbSetting.ENV)
+       // resource, err := pool.Run(dbSetting.ImageName, 
dbSetting.ImageVersion, dbSetting.ENV)
        resource, err := pool.RunWithOptions(&dockertest.RunOptions{
                Repository: dbSetting.ImageName,
                Tag:        dbSetting.ImageVersion,

Reply via email to