diff --git a/backend/app/rest/api/rest_public.go b/backend/app/rest/api/rest_public.go index c752256e..e91b5fbd 100644 --- a/backend/app/rest/api/rest_public.go +++ b/backend/app/rest/api/rest_public.go @@ -17,7 +17,7 @@ import ( "github.com/umputun/remark/backend/app/store" ) -// GET /find?site=siteID&url=post-url&format=[tree|plain]&sort=[+/-time|+/-score] +// GET /find?site=siteID&url=post-url&format=[tree|plain]&sort=[+/-time|+/-score|+/-controversy ] // find comments for given post. Returns in tree or plain formats, sorted func (s *Rest) findCommentsCtrl(w http.ResponseWriter, r *http.Request) { locator := store.Locator{SiteID: r.URL.Query().Get("site"), URL: r.URL.Query().Get("url")} diff --git a/backend/app/rest/tree.go b/backend/app/rest/tree.go index 58152217..5f439c63 100644 --- a/backend/app/rest/tree.go +++ b/backend/app/rest/tree.go @@ -151,6 +151,18 @@ func (t *Tree) sortNodes(sortType string) { } return t.Nodes[i].Comment.Score < t.Nodes[j].Comment.Score + case "+controversy", "-controversy", "controversy": + if strings.HasPrefix(sortType, "-") { + if t.Nodes[i].Comment.Controversy == t.Nodes[j].Comment.Controversy { + return t.Nodes[i].Comment.Timestamp.Before(t.Nodes[j].Comment.Timestamp) + } + return t.Nodes[i].Comment.Controversy > t.Nodes[j].Comment.Controversy + } + if t.Nodes[i].Comment.Controversy == t.Nodes[j].Comment.Controversy { + return t.Nodes[i].Comment.Timestamp.Before(t.Nodes[j].Comment.Timestamp) + } + return t.Nodes[i].Comment.Controversy < t.Nodes[j].Comment.Controversy + default: return t.Nodes[i].Comment.Timestamp.Before(t.Nodes[j].Comment.Timestamp) } diff --git a/backend/app/rest/tree_test.go b/backend/app/rest/tree_test.go index 114b533e..81daf834 100644 --- a/backend/app/rest/tree_test.go +++ b/backend/app/rest/tree_test.go @@ -96,15 +96,15 @@ func TestTreeSortNodes(t *testing.T) { comments := []store.Comment{ {ID: "14", ParentID: "1", Timestamp: time.Date(2017, 12, 25, 19, 46, 14, 0, time.UTC)}, {ID: "132", ParentID: "13", Timestamp: time.Date(2017, 12, 25, 19, 46, 32, 0, time.UTC)}, - {ID: "1", Timestamp: time.Date(2017, 12, 25, 19, 46, 1, 0, time.UTC), Score: 2}, - {ID: "2", Timestamp: time.Date(2017, 12, 25, 19, 47, 2, 0, time.UTC), Score: 3}, + {ID: "1", Timestamp: time.Date(2017, 12, 25, 19, 46, 1, 0, time.UTC), Score: 2, Controversy: 10}, + {ID: "2", Timestamp: time.Date(2017, 12, 25, 19, 47, 2, 0, time.UTC), Score: 3, Controversy: 5}, {ID: "11", ParentID: "1", Timestamp: time.Date(2017, 12, 25, 19, 46, 11, 0, time.UTC)}, {ID: "13", ParentID: "1", Timestamp: time.Date(2017, 12, 25, 19, 46, 13, 0, time.UTC)}, {ID: "12", ParentID: "1", Timestamp: time.Date(2017, 12, 25, 19, 46, 14, 0, time.UTC)}, {ID: "131", ParentID: "13", Timestamp: time.Date(2017, 12, 25, 19, 50, 31, 0, time.UTC)}, {ID: "21", ParentID: "2", Timestamp: time.Date(2017, 12, 25, 19, 47, 21, 0, time.UTC)}, {ID: "22", ParentID: "2", Timestamp: time.Date(2017, 12, 25, 19, 47, 22, 0, time.UTC)}, - {ID: "4", Timestamp: time.Date(2017, 12, 25, 19, 47, 22, 0, time.UTC), Score: -2}, + {ID: "4", Timestamp: time.Date(2017, 12, 25, 19, 47, 22, 0, time.UTC), Score: -2, Controversy: 7}, {ID: "3", Timestamp: time.Date(2017, 12, 25, 19, 47, 22, 100, time.UTC)}, {ID: "6", Timestamp: time.Date(2017, 12, 25, 19, 47, 22, 200, time.UTC)}, {ID: "5", Deleted: true, Timestamp: time.Date(2017, 12, 25, 19, 47, 22, 150, time.UTC)}, @@ -140,6 +140,19 @@ func TestTreeSortNodes(t *testing.T) { assert.Equal(t, "3", res.Nodes[2].Comment.ID) assert.Equal(t, "6", res.Nodes[3].Comment.ID) + res = MakeTree(comments, "+controversy", 0) + assert.Equal(t, "3", res.Nodes[0].Comment.ID) + assert.Equal(t, "6", res.Nodes[1].Comment.ID) + assert.Equal(t, "2", res.Nodes[2].Comment.ID) + assert.Equal(t, "4", res.Nodes[3].Comment.ID) + assert.Equal(t, "1", res.Nodes[4].Comment.ID) + + res = MakeTree(comments, "-controversy", 0) + assert.Equal(t, "1", res.Nodes[0].Comment.ID) + assert.Equal(t, "4", res.Nodes[1].Comment.ID) + assert.Equal(t, "2", res.Nodes[2].Comment.ID) + assert.Equal(t, "3", res.Nodes[3].Comment.ID) + res = MakeTree(comments, "undefined", 0) t.Log(res.Nodes[0].Comment.ID, res.Nodes[0].tsModified) assert.Equal(t, "1", res.Nodes[0].Comment.ID) diff --git a/backend/app/store/engine/engine.go b/backend/app/store/engine/engine.go index 7355a91c..b0e862b4 100644 --- a/backend/app/store/engine/engine.go +++ b/backend/app/store/engine/engine.go @@ -84,6 +84,18 @@ func sortComments(comments []store.Comment, sortFld string) []store.Comment { } return comments[i].Score < comments[j].Score + case "+controversy", "-controversy", "controversy": + if strings.HasPrefix(sortFld, "-") { + if comments[i].Controversy == comments[j].Controversy { + return comments[i].Timestamp.Before(comments[j].Timestamp) + } + return comments[i].Controversy > comments[j].Controversy + } + if comments[i].Controversy == comments[j].Controversy { + return comments[i].Timestamp.Before(comments[j].Timestamp) + } + return comments[i].Controversy < comments[j].Controversy + default: return comments[i].Timestamp.Before(comments[j].Timestamp) } diff --git a/backend/app/store/engine/engine_test.go b/backend/app/store/engine/engine_test.go index 68ef53d4..a17c35c4 100644 --- a/backend/app/store/engine/engine_test.go +++ b/backend/app/store/engine/engine_test.go @@ -11,10 +11,10 @@ import ( func TestEngine_sortComments(t *testing.T) { cc := []store.Comment{ - {ID: "1", Score: 5, Timestamp: time.Date(2018, 2, 5, 10, 1, 0, 0, time.Local)}, - {ID: "2", Score: 4, Timestamp: time.Date(2018, 2, 5, 10, 2, 0, 0, time.Local)}, - {ID: "3", Score: 6, Timestamp: time.Date(2018, 2, 5, 10, 3, 0, 0, time.Local)}, - {ID: "4", Score: 6, Timestamp: time.Date(2018, 2, 5, 10, 4, 0, 0, time.Local)}, + {ID: "1", Score: 5, Controversy: 1, Timestamp: time.Date(2018, 2, 5, 10, 1, 0, 0, time.Local)}, + {ID: "2", Score: 4, Controversy: 2, Timestamp: time.Date(2018, 2, 5, 10, 2, 0, 0, time.Local)}, + {ID: "3", Score: 6, Controversy: 3, Timestamp: time.Date(2018, 2, 5, 10, 3, 0, 0, time.Local)}, + {ID: "4", Score: 6, Controversy: 1, Timestamp: time.Date(2018, 2, 5, 10, 4, 0, 0, time.Local)}, } sortComments(cc, "+time") @@ -40,4 +40,16 @@ func TestEngine_sortComments(t *testing.T) { assert.Equal(t, "4", cc[1].ID) assert.Equal(t, "1", cc[2].ID) assert.Equal(t, "2", cc[3].ID) + + sortComments(cc, "controversy") + assert.Equal(t, "1", cc[0].ID) + assert.Equal(t, "4", cc[1].ID) + assert.Equal(t, "2", cc[2].ID) + assert.Equal(t, "3", cc[3].ID) + + sortComments(cc, "-controversy") + assert.Equal(t, "3", cc[0].ID) + assert.Equal(t, "2", cc[1].ID) + assert.Equal(t, "1", cc[2].ID) + assert.Equal(t, "4", cc[3].ID) }