From b534a5164fe13dc41aa2996239c2dff4f109dee0 Mon Sep 17 00:00:00 2001
From: 6543 <6543@obermui.de>
Date: Thu, 4 Jun 2020 11:16:53 +0200
Subject: [PATCH] [API] Expose allowed Reactions (#11735)

* [API] Expose allowed Reactions

* dont be in soutch a rush

* add TEST

* use ElementsMatch

Co-authored-by: Lauris BH <lauris@nix.lv>
---
 integrations/api_issue_reaction_test.go | 16 +++++++++++++++
 routers/api/v1/api.go                   |  3 +++
 routers/api/v1/misc/settings.go         | 23 ++++++++++++++++++++++
 routers/api/v1/swagger/misc.go          |  7 +++++++
 templates/swagger/v1_json.tmpl          | 26 +++++++++++++++++++++++++
 5 files changed, 75 insertions(+)
 create mode 100644 routers/api/v1/misc/settings.go

diff --git a/integrations/api_issue_reaction_test.go b/integrations/api_issue_reaction_test.go
index 1906b8d090..ab3de7c116 100644
--- a/integrations/api_issue_reaction_test.go
+++ b/integrations/api_issue_reaction_test.go
@@ -11,11 +11,27 @@ import (
 	"time"
 
 	"code.gitea.io/gitea/models"
+	"code.gitea.io/gitea/modules/setting"
 	api "code.gitea.io/gitea/modules/structs"
 
 	"github.com/stretchr/testify/assert"
 )
 
+func TestAPIAllowedReactions(t *testing.T) {
+	defer prepareTestEnv(t)()
+
+	type allowed []string
+
+	a := new(allowed)
+
+	req := NewRequest(t, "GET", "/api/v1/settings/allowed_reactions")
+	resp := MakeRequest(t, req, http.StatusOK)
+
+	DecodeJSON(t, resp, &a)
+	assert.Len(t, *a, len(setting.UI.Reactions))
+	assert.ElementsMatch(t, setting.UI.Reactions, *a)
+}
+
 func TestAPIIssuesReactions(t *testing.T) {
 	defer prepareTestEnv(t)()
 
diff --git a/routers/api/v1/api.go b/routers/api/v1/api.go
index 2eb39f6070..0f8a0326e9 100644
--- a/routers/api/v1/api.go
+++ b/routers/api/v1/api.go
@@ -512,6 +512,9 @@ func RegisterRoutes(m *macaron.Macaron) {
 		m.Get("/signing-key.gpg", misc.SigningKey)
 		m.Post("/markdown", bind(api.MarkdownOption{}), misc.Markdown)
 		m.Post("/markdown/raw", misc.MarkdownRaw)
+		m.Group("/settings", func() {
+			m.Get("/allowed_reactions", misc.SettingGetsAllowedReactions)
+		})
 
 		// Notifications
 		m.Group("/notifications", func() {
diff --git a/routers/api/v1/misc/settings.go b/routers/api/v1/misc/settings.go
new file mode 100644
index 0000000000..11c7eef726
--- /dev/null
+++ b/routers/api/v1/misc/settings.go
@@ -0,0 +1,23 @@
+// Copyright 2020 The Gitea Authors. All rights reserved.
+// Use of this source code is governed by a MIT-style
+// license that can be found in the LICENSE file.
+
+package misc
+
+import (
+	"code.gitea.io/gitea/modules/context"
+	"code.gitea.io/gitea/modules/setting"
+)
+
+// SettingGetsAllowedReactions return allowed reactions
+func SettingGetsAllowedReactions(ctx *context.APIContext) {
+	// swagger:operation GET /settings/allowed_reactions miscellaneous getAllowedReactions
+	// ---
+	// summary: Returns string array of allowed reactions
+	// produces:
+	// - application/json
+	// responses:
+	//   "200":
+	//     "$ref": "#/responses/StringSlice"
+	ctx.JSON(200, setting.UI.Reactions)
+}
diff --git a/routers/api/v1/swagger/misc.go b/routers/api/v1/swagger/misc.go
index 9fd0ab5b00..1d3c257efa 100644
--- a/routers/api/v1/swagger/misc.go
+++ b/routers/api/v1/swagger/misc.go
@@ -14,3 +14,10 @@ type swaggerResponseServerVersion struct {
 	// in:body
 	Body api.ServerVersion `json:"body"`
 }
+
+// StringSlice
+// swagger:response StringSlice
+type swaggerResponseStringSlice struct {
+	// in:body
+	Body []string `json:"body"`
+}
diff --git a/templates/swagger/v1_json.tmpl b/templates/swagger/v1_json.tmpl
index 1f159d64a0..687a6bc5e4 100644
--- a/templates/swagger/v1_json.tmpl
+++ b/templates/swagger/v1_json.tmpl
@@ -8343,6 +8343,23 @@
         }
       }
     },
+    "/settings/allowed_reactions": {
+      "get": {
+        "produces": [
+          "application/json"
+        ],
+        "tags": [
+          "miscellaneous"
+        ],
+        "summary": "Returns string array of allowed reactions",
+        "operationId": "getAllowedReactions",
+        "responses": {
+          "200": {
+            "$ref": "#/responses/StringSlice"
+          }
+        }
+      }
+    },
     "/signing-key.gpg": {
       "get": {
         "produces": [
@@ -15042,6 +15059,15 @@
         }
       }
     },
+    "StringSlice": {
+      "description": "StringSlice",
+      "schema": {
+        "type": "array",
+        "items": {
+          "type": "string"
+        }
+      }
+    },
     "Tag": {
       "description": "Tag",
       "schema": {