/
create_rank.go
84 lines (69 loc) · 2.11 KB
/
create_rank.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package api
import (
"github.com/Ptt-official-app/go-openbbsmiddleware/apitypes"
"github.com/Ptt-official-app/go-openbbsmiddleware/schema"
"github.com/Ptt-official-app/go-openbbsmiddleware/types"
"github.com/Ptt-official-app/go-pttbbs/bbs"
"github.com/gin-gonic/gin"
)
const CREATE_RANK_R = "/board/:bid/article/:aid/rank"
type CreateRankParams struct {
Rank int `json:"rank" form:"rank" url:"rank"`
}
type CreateRankPath struct {
FBoardID apitypes.FBoardID `uri:"bid" binding:"required"`
FArticleID apitypes.FArticleID `uri:"aid" binding:"required"`
}
type CreateRankResult struct {
Rank int `json:"rank"`
TokenUser bbs.UUserID `json:"tokenuser"`
}
func CreateRankWrapper(c *gin.Context) {
params := &CreateRankParams{}
path := &CreateRankPath{}
LoginRequiredPathJSON(CreateRank, params, path, c)
}
func CreateRank(remoteAddr string, userID bbs.UUserID, params interface{}, path interface{}, c *gin.Context) (result interface{}, statusCode int, err error) {
theParams, ok := params.(*CreateRankParams)
if !ok {
return nil, 400, ErrInvalidParams
}
thePath, ok := path.(*CreateRankPath)
if !ok {
return nil, 400, ErrInvalidPath
}
boardID, err := toBoardID(thePath.FBoardID, remoteAddr, userID, c)
if err != nil {
return nil, 500, err
}
articleID := thePath.FArticleID.ToArticleID()
// check permission
articleSummary, err := schema.GetArticleSummary(boardID, articleID)
if err != nil {
return nil, 500, err
}
if articleSummary == nil {
return nil, 400, ErrNoArticle
}
if articleSummary.Owner == userID {
return nil, 403, ErrInvalidUser
}
isValid, statusCode, err := isBoardValidUser(boardID, c)
if err != nil {
return nil, statusCode, err
}
if !isValid {
return nil, 403, ErrInvalidUser
}
// update rank
updateNanoTS := types.NowNanoTS()
origRank, err := schema.UpdateRank(boardID, articleID, userID, theParams.Rank, updateNanoTS)
if err != nil {
return nil, 500, err
}
newRank, err := schema.UpdateArticleRank(boardID, articleID, theParams.Rank-origRank, updateNanoTS)
if err != nil {
return nil, 500, err
}
return &CreateRankResult{Rank: newRank, TokenUser: userID}, 200, nil
}