feat(rank): add permission and privilege reputation

This commit is contained in:
LinkinStars 2023-05-23 12:16:17 +08:00
parent 6efaf0857e
commit ba5aadf31b
8 changed files with 107 additions and 38 deletions

View File

@ -79,6 +79,8 @@ backend:
other: Downvote question
rank_answer_vote_down_label:
other: Downvote answer
rank_invite_someone_to_answer_label:
other: Invite someone to answer
rank_tag_add_label:
other: Create new tag
rank_tag_edit_label:

View File

@ -75,6 +75,8 @@ backend:
other: 问题点踩
rank_answer_vote_down_label:
other: 答案点踩
rank_invite_someone_to_answer_label:
other: 邀请回答
rank_tag_add_label:
other: 创建新标签
rank_tag_edit_label:

View File

@ -20,6 +20,7 @@ const (
RankAnswerAcceptKey = "rank.answer.accept"
RankAnswerVoteUpKey = "rank.answer.vote_up"
RankAnswerVoteDownKey = "rank.answer.vote_down"
RankInviteSomeoneToAnswerKey = "rank.answer.invite_someone_to_answer"
RankCommentAddKey = "rank.comment.add"
RankCommentEditKey = "rank.comment.edit"
RankCommentDeleteKey = "rank.comment.delete"
@ -55,6 +56,7 @@ var (
{Label: reason.RankAnswerVoteUpLabel, Key: RankAnswerVoteUpKey},
{Label: reason.RankQuestionVoteDownLabel, Key: RankQuestionVoteDownKey},
{Label: reason.RankAnswerVoteDownLabel, Key: RankAnswerVoteDownKey},
{Label: reason.RankInviteSomeoneToAnswerLabel, Key: RankInviteSomeoneToAnswerKey},
{Label: reason.RankTagAddLabel, Key: RankTagAddKey},
{Label: reason.RankTagEditLabel, Key: RankTagEditKey},
{Label: reason.RankQuestionEditLabel, Key: RankQuestionEditKey},

View File

@ -15,6 +15,7 @@ const (
RankAnswerVoteUpLabel = "privilege.rank_answer_vote_up_label"
RankQuestionVoteDownLabel = "privilege.rank_question_vote_down_label"
RankAnswerVoteDownLabel = "privilege.rank_answer_vote_down_label"
RankInviteSomeoneToAnswerLabel = "privilege.rank_invite_someone_to_answer_label"
RankTagAddLabel = "privilege.rank_tag_add_label"
RankTagEditLabel = "privilege.rank_tag_edit_label"
RankQuestionEditLabel = "privilege.rank_question_edit_label"

View File

@ -375,6 +375,7 @@ func initConfigTable(engine *xorm.Engine) error {
{ID: 124, Key: "rank.question.unpin", Value: `-1`},
{ID: 125, Key: "rank.question.show", Value: `-1`},
{ID: 126, Key: "rank.question.hide", Value: `-1`},
{ID: 127, Key: "rank.answer.invite_someone_to_answer", Value: `1000`},
}
_, err := engine.Insert(defaultConfigTable)
return err
@ -429,6 +430,7 @@ func initRolePower(engine *xorm.Engine) (err error) {
{ID: 35, Name: "question hide", PowerType: permission.QuestionHide, Description: "hide the question"},
{ID: 36, Name: "question unpin", PowerType: permission.QuestionUnPin, Description: "untop the question"},
{ID: 37, Name: "question show", PowerType: permission.QuestionShow, Description: "show the question"},
{ID: 38, Name: "invite someone to answer", PowerType: permission.AnswerInviteSomeoneToAnswer, Description: "invite someone to answer"},
}
_, err = engine.Insert(powers)
if err != nil {
@ -474,6 +476,7 @@ func initRolePower(engine *xorm.Engine) (err error) {
{RoleID: 2, PowerType: permission.QuestionHide},
{RoleID: 2, PowerType: permission.QuestionUnPin},
{RoleID: 2, PowerType: permission.QuestionShow},
{RoleID: 2, PowerType: permission.AnswerInviteSomeoneToAnswer},
{RoleID: 3, PowerType: permission.QuestionAdd},
{RoleID: 3, PowerType: permission.QuestionEdit},
@ -512,6 +515,7 @@ func initRolePower(engine *xorm.Engine) (err error) {
{RoleID: 3, PowerType: permission.QuestionHide},
{RoleID: 3, PowerType: permission.QuestionUnPin},
{RoleID: 3, PowerType: permission.QuestionShow},
{RoleID: 3, PowerType: permission.AnswerInviteSomeoneToAnswer},
}
_, err = engine.Insert(rolePowerRels)
if err != nil {

View File

@ -7,6 +7,7 @@ import (
"github.com/answerdev/answer/internal/base/constant"
"github.com/answerdev/answer/internal/entity"
"github.com/answerdev/answer/internal/schema"
"github.com/answerdev/answer/internal/service/permission"
"xorm.io/xorm"
)
@ -30,5 +31,60 @@ func addGravatarBaseURL(x *xorm.Engine) error {
return fmt.Errorf("update site info failed: %w", err)
}
}
// add rank for invite to answer
powers := []*entity.Power{
{ID: 38, Name: "invite someone to answer", PowerType: permission.AnswerInviteSomeoneToAnswer, Description: "invite someone to answer"},
}
for _, power := range powers {
exist, err := x.Get(&entity.Power{PowerType: power.PowerType})
if err != nil {
return err
}
if exist {
_, err = x.ID(power.ID).Update(power)
} else {
_, err = x.Insert(power)
}
if err != nil {
return err
}
}
rolePowerRels := []*entity.RolePowerRel{
{RoleID: 2, PowerType: permission.AnswerInviteSomeoneToAnswer},
{RoleID: 3, PowerType: permission.AnswerInviteSomeoneToAnswer},
}
for _, rel := range rolePowerRels {
exist, err := x.Get(&entity.RolePowerRel{RoleID: rel.RoleID, PowerType: rel.PowerType})
if err != nil {
return err
}
if exist {
continue
}
_, err = x.Insert(rel)
if err != nil {
return err
}
}
defaultConfigTable := []*entity.Config{
{ID: 127, Key: "rank.answer.invite_someone_to_answer", Value: `1000`},
}
for _, c := range defaultConfigTable {
exist, err := x.Get(&entity.Config{ID: c.ID})
if err != nil {
return fmt.Errorf("get config failed: %w", err)
}
if exist {
if _, err = x.Update(c, &entity.Config{ID: c.ID}); err != nil {
return fmt.Errorf("update config failed: %w", err)
}
continue
}
if _, err = x.Insert(&entity.Config{ID: c.ID, Key: c.Key, Value: c.Value}); err != nil {
return fmt.Errorf("add config failed: %w", err)
}
}
return nil
}

View File

@ -297,6 +297,7 @@ var (
constant.RankAnswerVoteUpKey: {1, 1, 15},
constant.RankQuestionVoteDownKey: {125, 125, 125},
constant.RankAnswerVoteDownKey: {125, 125, 125},
constant.RankInviteSomeoneToAnswerKey: {1, 500, 1000},
constant.RankTagAddKey: {1, 750, 1500},
constant.RankTagEditKey: {1, 50, 100},
constant.RankQuestionEditKey: {1, 100, 200},

View File

@ -1,44 +1,45 @@
package permission
const (
AdminAccess = "admin.access"
QuestionAdd = "question.add"
QuestionEdit = "question.edit"
QuestionEditWithoutReview = "question.edit_without_review"
QuestionDelete = "question.delete"
QuestionClose = "question.close"
QuestionReopen = "question.reopen"
QuestionVoteUp = "question.vote_up"
QuestionVoteDown = "question.vote_down"
QuestionPin = "question.pin"
QuestionUnPin = "question.unpin"
QuestionHide = "question.hide"
QuestionShow = "question.show"
AnswerAdd = "answer.add"
AnswerEdit = "answer.edit"
AnswerEditWithoutReview = "answer.edit_without_review"
AnswerDelete = "answer.delete"
AnswerAccept = "answer.accept"
AnswerVoteUp = "answer.vote_up"
AnswerVoteDown = "answer.vote_down"
CommentAdd = "comment.add"
CommentEdit = "comment.edit"
CommentDelete = "comment.delete"
CommentVoteUp = "comment.vote_up"
CommentVoteDown = "comment.vote_down"
ReportAdd = "report.add"
TagAdd = "tag.add"
TagEdit = "tag.edit"
TagEditSlugName = "tag.edit_slug_name"
TagEditWithoutReview = "tag.edit_without_review"
TagDelete = "tag.delete"
TagSynonym = "tag.synonym"
LinkUrlLimit = "link.url_limit"
VoteDetail = "vote.detail"
AnswerAudit = "answer.audit"
QuestionAudit = "question.audit"
TagAudit = "tag.audit"
TagUseReservedTag = "tag.use_reserved_tag"
AdminAccess = "admin.access"
QuestionAdd = "question.add"
QuestionEdit = "question.edit"
QuestionEditWithoutReview = "question.edit_without_review"
QuestionDelete = "question.delete"
QuestionClose = "question.close"
QuestionReopen = "question.reopen"
QuestionVoteUp = "question.vote_up"
QuestionVoteDown = "question.vote_down"
QuestionPin = "question.pin"
QuestionUnPin = "question.unpin"
QuestionHide = "question.hide"
QuestionShow = "question.show"
AnswerAdd = "answer.add"
AnswerEdit = "answer.edit"
AnswerEditWithoutReview = "answer.edit_without_review"
AnswerDelete = "answer.delete"
AnswerAccept = "answer.accept"
AnswerVoteUp = "answer.vote_up"
AnswerVoteDown = "answer.vote_down"
AnswerInviteSomeoneToAnswer = "answer.invite_someone_to_answer"
CommentAdd = "comment.add"
CommentEdit = "comment.edit"
CommentDelete = "comment.delete"
CommentVoteUp = "comment.vote_up"
CommentVoteDown = "comment.vote_down"
ReportAdd = "report.add"
TagAdd = "tag.add"
TagEdit = "tag.edit"
TagEditSlugName = "tag.edit_slug_name"
TagEditWithoutReview = "tag.edit_without_review"
TagDelete = "tag.delete"
TagSynonym = "tag.synonym"
LinkUrlLimit = "link.url_limit"
VoteDetail = "vote.detail"
AnswerAudit = "answer.audit"
QuestionAudit = "question.audit"
TagAudit = "tag.audit"
TagUseReservedTag = "tag.use_reserved_tag"
)
const (