235 lines
5.2 KiB
Go
235 lines
5.2 KiB
Go
|
package http
|
|||
|
|
|||
|
import (
|
|||
|
"io/ioutil"
|
|||
|
"mime/multipart"
|
|||
|
"net/http"
|
|||
|
"regexp"
|
|||
|
"strings"
|
|||
|
|
|||
|
"go-common/app/admin/main/vip/model"
|
|||
|
"go-common/library/ecode"
|
|||
|
bm "go-common/library/net/http/blademaster"
|
|||
|
"go-common/library/net/http/blademaster/binding"
|
|||
|
)
|
|||
|
|
|||
|
const (
|
|||
|
_maxnamelen = 30
|
|||
|
_maxtitlelen = 60
|
|||
|
_maxexplainlen = 1200
|
|||
|
)
|
|||
|
|
|||
|
// regexp utf8 char 0x0e0d~0e4A
|
|||
|
var (
|
|||
|
_emptyUnicodeReg = []*regexp.Regexp{
|
|||
|
regexp.MustCompile(`[\x{202e}]+`), // right-to-left override
|
|||
|
regexp.MustCompile(`[\x{200b}]+`), // zeroWithChar
|
|||
|
regexp.MustCompile(`[\x{1f6ab}]+`), // no_entry_sign
|
|||
|
}
|
|||
|
// trim
|
|||
|
returnReg = regexp.MustCompile(`[\n]{3,}`)
|
|||
|
returnReg2 = regexp.MustCompile(`(\r\n){3,}`)
|
|||
|
spaceReg = regexp.MustCompile(`[ ]{5,}`) // Chinese quanjiao space character
|
|||
|
)
|
|||
|
|
|||
|
func privileges(c *bm.Context) {
|
|||
|
var err error
|
|||
|
arg := new(struct {
|
|||
|
Langtype int8 `form:"lang_type"`
|
|||
|
})
|
|||
|
if err = c.Bind(arg); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
c.JSON(vipSvc.Privileges(c, arg.Langtype))
|
|||
|
}
|
|||
|
|
|||
|
func updatePrivilegeState(c *bm.Context) {
|
|||
|
var err error
|
|||
|
arg := new(model.ArgStatePrivilege)
|
|||
|
if err = c.Bind(arg); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
c.JSON(nil, vipSvc.UpdatePrivilegeState(c, &model.Privilege{
|
|||
|
ID: arg.ID,
|
|||
|
State: arg.Status,
|
|||
|
}))
|
|||
|
}
|
|||
|
|
|||
|
func deletePrivilege(c *bm.Context) {
|
|||
|
var err error
|
|||
|
arg := new(model.ArgPivilegeID)
|
|||
|
if err = c.Bind(arg); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
c.JSON(nil, vipSvc.DeletePrivilege(c, arg.ID))
|
|||
|
}
|
|||
|
|
|||
|
func updateOrder(c *bm.Context) {
|
|||
|
var err error
|
|||
|
arg := new(model.ArgOrder)
|
|||
|
if err = c.Bind(arg); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
c.JSON(nil, vipSvc.UpdateOrder(c, arg))
|
|||
|
}
|
|||
|
|
|||
|
func addPrivilege(c *bm.Context) {
|
|||
|
var err error
|
|||
|
arg := new(model.ArgAddPrivilege)
|
|||
|
username, ok := c.Get("username")
|
|||
|
if !ok {
|
|||
|
c.JSON(nil, ecode.AccessDenied)
|
|||
|
return
|
|||
|
}
|
|||
|
arg.Operator = username.(string)
|
|||
|
if err = c.BindWith(arg, binding.FormMultipart); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
if len(arg.Name) > _maxnamelen {
|
|||
|
c.JSON(nil, ecode.VipPrivilegeNameTooLongErr)
|
|||
|
return
|
|||
|
}
|
|||
|
if len(arg.Title) > _maxtitlelen {
|
|||
|
c.JSON(nil, ecode.VipPrivilegeTitleTooLongErr)
|
|||
|
return
|
|||
|
}
|
|||
|
if len(arg.Explain) > _maxexplainlen {
|
|||
|
c.JSON(nil, ecode.VipPrivilegeExplainTooLongErr)
|
|||
|
return
|
|||
|
}
|
|||
|
img := new(model.ArgImage)
|
|||
|
if img.IconBody, img.IconFileType, err = file(c, "icon"); err != nil {
|
|||
|
c.JSON(nil, err)
|
|||
|
return
|
|||
|
}
|
|||
|
if img.IconFileType == "" {
|
|||
|
c.JSON(nil, ecode.VipFileImgEmptyErr)
|
|||
|
return
|
|||
|
}
|
|||
|
if img.IconGrayBody, img.IconGrayFileType, err = file(c, "gray_icon"); err != nil {
|
|||
|
c.JSON(nil, err)
|
|||
|
return
|
|||
|
}
|
|||
|
if img.IconGrayFileType == "" {
|
|||
|
c.JSON(nil, ecode.VipFileImgEmptyErr)
|
|||
|
return
|
|||
|
}
|
|||
|
if img.WebImageBody, img.WebImageFileType, err = file(c, "web_image"); err != nil {
|
|||
|
c.JSON(nil, err)
|
|||
|
return
|
|||
|
}
|
|||
|
if img.AppImageBody, img.AppImageFileType, err = file(c, "app_image"); err != nil {
|
|||
|
c.JSON(nil, err)
|
|||
|
return
|
|||
|
}
|
|||
|
arg.Explain = filterContent(arg.Explain)
|
|||
|
c.JSON(nil, vipSvc.AddPrivilege(c, arg, img))
|
|||
|
}
|
|||
|
|
|||
|
func updatePrivilege(c *bm.Context) {
|
|||
|
var (
|
|||
|
err error
|
|||
|
)
|
|||
|
arg := new(model.ArgUpdatePrivilege)
|
|||
|
username, ok := c.Get("username")
|
|||
|
if !ok {
|
|||
|
c.JSON(nil, ecode.AccessDenied)
|
|||
|
return
|
|||
|
}
|
|||
|
arg.Operator = username.(string)
|
|||
|
if err = c.BindWith(arg, binding.FormMultipart); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
if len(arg.Name) > _maxnamelen {
|
|||
|
c.JSON(nil, ecode.VipPrivilegeNameTooLongErr)
|
|||
|
return
|
|||
|
}
|
|||
|
if len(arg.Title) > _maxtitlelen {
|
|||
|
c.JSON(nil, ecode.VipPrivilegeTitleTooLongErr)
|
|||
|
return
|
|||
|
}
|
|||
|
if len(arg.Explain) > _maxexplainlen {
|
|||
|
c.JSON(nil, ecode.VipPrivilegeExplainTooLongErr)
|
|||
|
return
|
|||
|
}
|
|||
|
img := new(model.ArgImage)
|
|||
|
if img.IconBody, img.IconFileType, err = file(c, "icon"); err != nil {
|
|||
|
c.JSON(nil, err)
|
|||
|
return
|
|||
|
}
|
|||
|
if img.IconGrayBody, img.IconGrayFileType, err = file(c, "gray_icon"); err != nil {
|
|||
|
c.JSON(nil, err)
|
|||
|
return
|
|||
|
}
|
|||
|
if img.WebImageBody, img.WebImageFileType, err = file(c, "web_image"); err != nil {
|
|||
|
c.JSON(nil, err)
|
|||
|
return
|
|||
|
}
|
|||
|
if img.AppImageBody, img.AppImageFileType, err = file(c, "app_image"); err != nil {
|
|||
|
c.JSON(nil, err)
|
|||
|
return
|
|||
|
}
|
|||
|
arg.Explain = filterContent(arg.Explain)
|
|||
|
c.JSON(nil, vipSvc.UpdatePrivilege(c, arg, img))
|
|||
|
}
|
|||
|
|
|||
|
func file(c *bm.Context, name string) (body []byte, filetype string, err error) {
|
|||
|
var file multipart.File
|
|||
|
if file, _, err = c.Request.FormFile(name); err != nil {
|
|||
|
if err == http.ErrMissingFile {
|
|||
|
err = nil
|
|||
|
return
|
|||
|
}
|
|||
|
err = ecode.RequestErr
|
|||
|
return
|
|||
|
}
|
|||
|
if file == nil {
|
|||
|
return
|
|||
|
}
|
|||
|
defer file.Close()
|
|||
|
if body, err = ioutil.ReadAll(file); err != nil {
|
|||
|
err = ecode.RequestErr
|
|||
|
return
|
|||
|
}
|
|||
|
filetype = http.DetectContentType(body)
|
|||
|
if err = checkImgFileType(filetype); err != nil {
|
|||
|
return
|
|||
|
}
|
|||
|
err = checkFileBody(body)
|
|||
|
return
|
|||
|
}
|
|||
|
|
|||
|
func checkImgFileType(filetype string) error {
|
|||
|
switch filetype {
|
|||
|
case "image/jpeg", "image/jpg":
|
|||
|
case "image/png":
|
|||
|
default:
|
|||
|
return ecode.VipFileTypeErr
|
|||
|
}
|
|||
|
return nil
|
|||
|
}
|
|||
|
|
|||
|
func checkFileBody(body []byte) error {
|
|||
|
if len(body) == 0 {
|
|||
|
return ecode.FileNotExists
|
|||
|
}
|
|||
|
if len(body) > cf.Bfs.MaxFileSize {
|
|||
|
return ecode.FileTooLarge
|
|||
|
}
|
|||
|
return nil
|
|||
|
}
|
|||
|
|
|||
|
func filterContent(str string) string {
|
|||
|
tmp := str
|
|||
|
// check params
|
|||
|
tmp = strings.TrimSpace(tmp)
|
|||
|
tmp = spaceReg.ReplaceAllString(tmp, " ")
|
|||
|
tmp = returnReg.ReplaceAllString(tmp, "\n\n\n")
|
|||
|
tmp = returnReg2.ReplaceAllString(tmp, "\n\n\n")
|
|||
|
// checkout empty
|
|||
|
for _, reg := range _emptyUnicodeReg {
|
|||
|
tmp = reg.ReplaceAllString(tmp, "")
|
|||
|
}
|
|||
|
return tmp
|
|||
|
}
|