summaryrefslogtreecommitdiffstats
path: root/api4
diff options
context:
space:
mode:
Diffstat (limited to 'api4')
-rw-r--r--api4/api.go5
-rw-r--r--api4/service_terms.go59
-rw-r--r--api4/service_terms_test.go44
-rw-r--r--api4/user.go22
-rw-r--r--api4/user_test.go25
5 files changed, 155 insertions, 0 deletions
diff --git a/api4/api.go b/api4/api.go
index 02b884db7..ed3dda054 100644
--- a/api4/api.go
+++ b/api4/api.go
@@ -107,6 +107,8 @@ type Routes struct {
ReactionByNameForPostForUser *mux.Router // 'api/v4/users/{user_id:[A-Za-z0-9]+}/posts/{post_id:[A-Za-z0-9]+}/reactions/{emoji_name:[A-Za-z0-9_-+]+}'
Webrtc *mux.Router // 'api/v4/webrtc'
+
+ ServiceTerms *mux.Router // 'api/v4/service_terms
}
type API struct {
@@ -203,6 +205,8 @@ func Init(a *app.App, root *mux.Router) *API {
api.BaseRoutes.Image = api.BaseRoutes.ApiRoot.PathPrefix("/image").Subrouter()
+ api.BaseRoutes.ServiceTerms = api.BaseRoutes.ApiRoot.PathPrefix("/terms_of_service").Subrouter()
+
api.InitUser()
api.InitTeam()
api.InitChannel()
@@ -231,6 +235,7 @@ func Init(a *app.App, root *mux.Router) *API {
api.InitRole()
api.InitScheme()
api.InitImage()
+ api.InitServiceTerms()
root.Handle("/api/v4/{anything:.*}", http.HandlerFunc(api.Handle404))
diff --git a/api4/service_terms.go b/api4/service_terms.go
new file mode 100644
index 000000000..549bad0a1
--- /dev/null
+++ b/api4/service_terms.go
@@ -0,0 +1,59 @@
+// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+package api4
+
+import (
+ "github.com/mattermost/mattermost-server/app"
+ "github.com/mattermost/mattermost-server/model"
+ "net/http"
+)
+
+func (api *API) InitServiceTerms() {
+ api.BaseRoutes.ServiceTerms.Handle("", api.ApiSessionRequired(getServiceTerms)).Methods("GET")
+ api.BaseRoutes.ServiceTerms.Handle("", api.ApiSessionRequired(createServiceTerms)).Methods("POST")
+}
+
+func getServiceTerms(c *Context, w http.ResponseWriter, r *http.Request) {
+ serviceTerms, err := c.App.GetLatestServiceTerms()
+ if err != nil {
+ c.Err = err
+ return
+ }
+
+ w.Write([]byte(serviceTerms.ToJson()))
+}
+
+func createServiceTerms(c *Context, w http.ResponseWriter, r *http.Request) {
+ if license := c.App.License(); license == nil || !*license.Features.CustomTermsOfService {
+ c.Err = model.NewAppError("createServiceTerms", "api.create_service_terms.custom_service_terms_disabled.app_error", nil, "", http.StatusBadRequest)
+ return
+ }
+
+ props := model.MapFromJson(r.Body)
+ text := props["text"]
+ userId := c.Session.UserId
+
+ if text == "" {
+ c.Err = model.NewAppError("Config.IsValid", "api.create_service_terms.empty_text.app_error", nil, "", http.StatusBadRequest)
+ return
+ }
+
+ oldServiceTerms, err := c.App.GetLatestServiceTerms()
+ if err != nil && err.Id != app.ERROR_SERVICE_TERMS_NO_ROWS_FOUND {
+ c.Err = err
+ return
+ }
+
+ if oldServiceTerms == nil || oldServiceTerms.Text != text {
+ serviceTerms, err := c.App.CreateServiceTerms(text, userId)
+ if err != nil {
+ c.Err = err
+ return
+ }
+
+ w.Write([]byte(serviceTerms.ToJson()))
+ } else {
+ w.Write([]byte(oldServiceTerms.ToJson()))
+ }
+}
diff --git a/api4/service_terms_test.go b/api4/service_terms_test.go
new file mode 100644
index 000000000..693388376
--- /dev/null
+++ b/api4/service_terms_test.go
@@ -0,0 +1,44 @@
+package api4
+
+import (
+ "github.com/mattermost/mattermost-server/model"
+ "github.com/stretchr/testify/assert"
+ "testing"
+)
+
+func TestGetServiceTerms(t *testing.T) {
+ th := Setup().InitBasic()
+ defer th.TearDown()
+ Client := th.Client
+
+ _, err := th.App.CreateServiceTerms("abc", th.BasicUser.Id)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ serviceTerms, resp := Client.GetServiceTerms("")
+ CheckNoError(t, resp)
+
+ assert.NotNil(t, serviceTerms)
+ assert.Equal(t, "abc", serviceTerms.Text)
+ assert.NotEmpty(t, serviceTerms.Id)
+ assert.NotEmpty(t, serviceTerms.CreateAt)
+}
+
+func TestCreateServiceTerms(t *testing.T) {
+ th := Setup().InitBasic()
+ defer th.TearDown()
+ Client := th.Client
+
+ serviceTerms, resp := Client.CreateServiceTerms("service terms new", th.BasicUser.Id)
+ CheckErrorMessage(t, resp, "api.create_service_terms.custom_service_terms_disabled.app_error")
+
+ th.App.SetLicense(model.NewTestLicense("EnableCustomServiceTerms"))
+
+ serviceTerms, resp = Client.CreateServiceTerms("service terms new", th.BasicUser.Id)
+ CheckNoError(t, resp)
+ assert.NotEmpty(t, serviceTerms.Id)
+ assert.NotEmpty(t, serviceTerms.CreateAt)
+ assert.Equal(t, "service terms new", serviceTerms.Text)
+ assert.Equal(t, th.BasicUser.Id, serviceTerms.UserId)
+}
diff --git a/api4/user.go b/api4/user.go
index 5e97122d7..3d203fbec 100644
--- a/api4/user.go
+++ b/api4/user.go
@@ -39,6 +39,7 @@ func (api *API) InitUser() {
api.BaseRoutes.Users.Handle("/password/reset/send", api.ApiHandler(sendPasswordReset)).Methods("POST")
api.BaseRoutes.Users.Handle("/email/verify", api.ApiHandler(verifyUserEmail)).Methods("POST")
api.BaseRoutes.Users.Handle("/email/verify/send", api.ApiHandler(sendVerificationEmail)).Methods("POST")
+ api.BaseRoutes.User.Handle("/terms_of_service", api.ApiSessionRequired(registerServiceTermsAction)).Methods("POST")
api.BaseRoutes.User.Handle("/auth", api.ApiSessionRequiredTrustRequester(updateUserAuth)).Methods("PUT")
@@ -1544,3 +1545,24 @@ func enableUserAccessToken(c *Context, w http.ResponseWriter, r *http.Request) {
c.LogAudit("success - token_id=" + accessToken.Id)
ReturnStatusOK(w)
}
+
+func registerServiceTermsAction(c *Context, w http.ResponseWriter, r *http.Request) {
+ props := model.StringInterfaceFromJson(r.Body)
+
+ userId := c.Session.UserId
+ serviceTermsId := props["serviceTermsId"].(string)
+ accepted := props["accepted"].(bool)
+
+ if _, err := c.App.GetServiceTerms(serviceTermsId); err != nil {
+ c.Err = err
+ return
+ }
+
+ if err := c.App.RecordUserServiceTermsAction(userId, serviceTermsId, accepted); err != nil {
+ c.Err = err
+ return
+ }
+
+ c.LogAudit("ServiceTermsId=" + serviceTermsId + ", accepted=" + strconv.FormatBool(accepted))
+ ReturnStatusOK(w)
+}
diff --git a/api4/user_test.go b/api4/user_test.go
index 6b8b14951..010f49e73 100644
--- a/api4/user_test.go
+++ b/api4/user_test.go
@@ -3019,3 +3019,28 @@ func TestGetUsersByStatus(t *testing.T) {
}
})
}
+
+func TestRegisterServiceTermsAction(t *testing.T) {
+ th := Setup().InitBasic()
+ defer th.TearDown()
+ Client := th.Client
+
+ success, resp := Client.RegisterServiceTermsAction(th.BasicUser.Id, "st_1", true)
+ CheckErrorMessage(t, resp, "store.sql_service_terms_store.get.no_rows.app_error")
+
+ serviceTerms, err := th.App.CreateServiceTerms("service terms", th.BasicUser.Id)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ success, resp = Client.RegisterServiceTermsAction(th.BasicUser.Id, serviceTerms.Id, true)
+ CheckNoError(t, resp)
+
+ assert.True(t, *success)
+ user, err := th.App.GetUser(th.BasicUser.Id)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ assert.Equal(t, user.AcceptedServiceTermsId, serviceTerms.Id)
+}