github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/modules/apis/version2/version2.go (about)

     1  package version2
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  	"time"
     7  
     8  	"github.com/insionng/makross"
     9  	"github.com/insionng/makross/jwt"
    10  	"github.com/insionng/yougam/helper"
    11  	"github.com/insionng/yougam/models"
    12  )
    13  
    14  var herr = new(makross.HTTPError)
    15  
    16  //Handler命名规范 请求方法+请求对象
    17  
    18  // GetVersion 获取版本
    19  func GetVersionHandler(self *makross.Context) error {
    20  	var m = map[string]interface{}{}
    21  	m["version"] = "2.0.0" //当服务端版本迭代产生不兼容时修改此版本号
    22  	return self.JSON(m)
    23  }
    24  
    25  // GetPongHandler 乒乓 心跳Handler
    26  func GetPongHandler(self *makross.Context) error {
    27  	var m = map[string]interface{}{}
    28  	if tokenString, okay := self.Get("TokenString").(string); okay && (len(tokenString) > 0) {
    29  		m["Authorization"] = fmt.Sprintf("%v %v", jwt.Bearer, tokenString)
    30  	}
    31  	return self.JSON(m)
    32  }
    33  
    34  // PostSignupHandler 注册用户
    35  func PostSignupHandler(self *makross.Context) error {
    36  
    37  	username := self.Args("username").String()
    38  	nickname := self.Args("nickname").String()
    39  	password := self.Args("password").String()
    40  	mobile := self.Args("mobile").String()
    41  	gender := self.Args("gender").MustInt64()
    42  	email := self.Args("email").String()
    43  	content := self.Args("content").String() //个人简介 个人签名 个性说明之类
    44  	group := self.Args("group").String()
    45  	role := self.Args("role").MustInt64()
    46  
    47  	herr.Message = "ErrServiceUnavailable"
    48  	herr.Status = makross.StatusServiceUnavailable
    49  
    50  	if len(password) > 0 {
    51  		if helper.CheckPassword(password) == false {
    52  			herr.Message = "密码含有非法字符或密码过短(至少4~30位密码)!"
    53  			return self.JSON(herr, makross.StatusServiceUnavailable)
    54  
    55  		}
    56  	} else {
    57  		herr.Message = "密码为空!"
    58  		return self.JSON(herr, makross.StatusServiceUnavailable)
    59  
    60  	}
    61  
    62  	if len(username) == 0 {
    63  		herr.Message = "用户名是为永久性设定,不能少于4个字或多于30个字,请慎重考虑,不能为空!"
    64  		return self.JSON(herr, makross.StatusServiceUnavailable)
    65  
    66  	}
    67  
    68  	if len(email) > 0 {
    69  		if helper.CheckEmail(email) == false {
    70  			herr.Message = "Email格式错误!"
    71  			return self.JSON(herr, makross.StatusServiceUnavailable)
    72  		}
    73  	} else {
    74  		herr.Message = "Email地址为空!"
    75  		return self.JSON(herr, makross.StatusServiceUnavailable)
    76  	}
    77  
    78  	if len(email) > 0 {
    79  		if usrinfo, err := models.GetUserByEmail(email); usrinfo != nil {
    80  
    81  			if usrinfo, err := models.GetUserByUsername(username); usrinfo != nil {
    82  				herr.Message = "此用户名不能使用!"
    83  				return self.JSON(herr, makross.StatusServiceUnavailable)
    84  
    85  			} else if err != nil {
    86  
    87  				herr.Message = "检索用户名账号期间出错!"
    88  				return self.JSON(herr, makross.StatusServiceUnavailable)
    89  
    90  			}
    91  
    92  			herr.Message = "此Email不能使用!"
    93  			return self.JSON(herr, makross.StatusServiceUnavailable)
    94  
    95  		} else if err != nil {
    96  
    97  			herr.Message = "检索EMAIL账号期间出错!"
    98  			return self.JSON(herr, makross.StatusServiceUnavailable)
    99  
   100  		}
   101  	} else {
   102  		if usrinfo, err := models.GetUserByUsername(username); usrinfo != nil {
   103  
   104  			herr.Message = "此用户名已经被注册,请重新命名!"
   105  			return self.JSON(herr, makross.StatusServiceUnavailable)
   106  
   107  		} else if err != nil {
   108  
   109  			herr.Message = "检索账号数据期间出错!"
   110  			return self.JSON(herr, makross.StatusServiceUnavailable)
   111  
   112  		}
   113  	}
   114  
   115  	if role == 0 {
   116  		role = 1
   117  	}
   118  
   119  	if usrid, err := models.AddUser(email, username, nickname, "", helper.EncryptHash(password, nil), group, content, mobile, gender, role); err != nil && usrid <= 0 {
   120  
   121  		herr.Message = "用户注册信息写入数据库时发生错误!"
   122  		return self.JSON(herr, makross.StatusServiceUnavailable)
   123  
   124  	} else {
   125  
   126  		if usrinfo, err := models.GetUser(usrid); err == nil && usrinfo != nil {
   127  			///注册成功
   128  			models.PutSignin2User(usrinfo.Id, time.Now().Unix(), usrinfo.SigninCount+1, self.RealIP())
   129  
   130  			//返回数据
   131  			return self.JSON(usrinfo)
   132  
   133  		} else {
   134  
   135  			herr.Message = "获取用户数据出错!"
   136  			return self.JSON(herr, makross.StatusServiceUnavailable)
   137  
   138  		}
   139  
   140  	}
   141  }
   142  
   143  // PostSignin 用户登录
   144  func PostSigninHandler(self *makross.Context) error {
   145  	herr.Message = "ErrUnauthorized"
   146  	herr.Status = makross.StatusUnauthorized
   147  
   148  	password := self.Args("password").String()
   149  	if len(password) == 0 {
   150  		herr.Message = "密码为空~"
   151  		return self.JSON(herr, makross.StatusUnauthorized)
   152  	}
   153  
   154  	if helper.CheckPassword(password) == false {
   155  		herr.Message = "密码含有非法字符或密码过短(至少4~30位密码)!"
   156  		return self.JSON(herr, makross.StatusUnauthorized)
   157  	}
   158  
   159  	var err error
   160  	var usr = new(models.User)
   161  	var email, username string
   162  	uoe := self.Args("username").String()
   163  	mobile := self.Args("mobile").String()
   164  
   165  	if (len(uoe) == 0) && (len(mobile) == 0) {
   166  		herr.Message = "用户名不能少于4个字或多于30个字,登录账号至少有email或手机以及用户名之一进行登录,不能都为空!"
   167  		return self.JSON(herr, makross.StatusUnauthorized)
   168  	}
   169  
   170  	switch {
   171  	//mobile账号校验分支
   172  	case len(mobile) > 0:
   173  		{
   174  			if helper.CheckUsername(mobile) == false {
   175  				herr.Message = "手机号码不能包含非法字符,不能少于4个字或多于30个字!"
   176  				return self.JSON(herr, makross.StatusUnauthorized)
   177  			}
   178  
   179  			if usr, err = models.GetUserByMobile(mobile); usr != nil && err == nil {
   180  				if !helper.ValidateHash(usr.Password, password) {
   181  					herr.Message = "密码无法通过校验!"
   182  					return self.JSON(herr, makross.StatusUnauthorized)
   183  
   184  				}
   185  			} else {
   186  				herr.Message = "该手机号码不存在!"
   187  				return self.JSON(herr, makross.StatusUnauthorized)
   188  
   189  			}
   190  		}
   191  
   192  	//默认账号校验分支
   193  	default:
   194  		if isEmail := strings.Contains(uoe, "@"); isEmail {
   195  			email = uoe
   196  			if len(email) == 0 {
   197  				herr.Message = "EMAIL为空~"
   198  				return self.JSON(herr, makross.StatusUnauthorized)
   199  			}
   200  
   201  			if helper.CheckEmail(email) == false {
   202  				herr.Message = "Email格式不合符规格~"
   203  				return self.JSON(herr, makross.StatusUnauthorized)
   204  			}
   205  
   206  			usr, err = models.GetUserByEmail(email)
   207  		} else {
   208  			username = uoe
   209  			if len(username) == 0 {
   210  				herr.Message = "用户名称为空~"
   211  				return self.JSON(herr, makross.StatusUnauthorized)
   212  			}
   213  
   214  			if helper.CheckUsername(username) == false {
   215  				herr.Message = "用户名称格式不合符规格~"
   216  				return self.JSON(herr, makross.StatusUnauthorized)
   217  			}
   218  
   219  			usr, err = models.GetUserByUsername(username)
   220  		}
   221  
   222  	}
   223  
   224  	if (usr != nil) && (err == nil) {
   225  		if helper.ValidateHash(usr.Password, password) {
   226  			models.PutSignin2User(usr.Id, time.Now().Unix(), usr.SigninCount+1, self.RealIP())
   227  			claims := jwt.NewMapClaims()
   228  			claims["IsRoot"] = (usr.Role == -1000)
   229  			claims["UserId"] = usr.Id
   230  			claims["Username"] = usr.Username
   231  			claims["exp"] = time.Now().Add(jwt.DefaultJWTConfig.Expires).Unix()
   232  			var data = map[string]interface{}{}
   233  			var secret string
   234  			if signingKey, okay := jwt.DefaultJWTConfig.SigningKey.(string); okay {
   235  				secret = signingKey
   236  			}
   237  			data["token"], _ = jwt.NewTokenString(secret, "HS256", claims)
   238  			data["user"] = usr
   239  			return self.JSON(data)
   240  		} else {
   241  			herr.Message = "密码无法通过校验~"
   242  			return self.JSON(herr, makross.StatusUnauthorized)
   243  		}
   244  	} else {
   245  		herr.Message = "该账号不存在~"
   246  		return self.JSON(herr, makross.StatusUnauthorized)
   247  	}
   248  }
   249  
   250  // GetSignout 客户端执行清除 cookie 或 local storage时触发GetSignout进行记录动作
   251  func GetSignoutHandler(self *makross.Context) error {
   252  	claims := jwt.GetMapClaims(self)
   253  	var uid int64
   254  	if jwtUserId, okay := claims["UserId"].(float64); okay {
   255  		uid = int64(jwtUserId)
   256  		if uid <= 0 {
   257  			return self.JSON(nil)
   258  		}
   259  	}
   260  	_, e := models.PutSignout2User(uid, time.Now().Unix(), self.RealIP())
   261  	return self.JSON(e)
   262  }
   263  
   264  // PostComment 发布评论
   265  func PostCommentHandler(self *makross.Context) error {
   266  
   267  	herr.Message = "ErrServiceUnavailable"
   268  	herr.Status = makross.StatusServiceUnavailable
   269  
   270  	claims := jwt.GetMapClaims(self)
   271  	var uid int64
   272  	if jwtUserId, okay := claims["UserId"].(float64); okay {
   273  		uid = int64(jwtUserId)
   274  		if uid <= 0 {
   275  			herr.Message = "尚未登录"
   276  			return self.JSON(herr, makross.StatusServiceUnavailable)
   277  		}
   278  	}
   279  
   280  	var author string
   281  	if jwtUsername, okay := claims["Username"].(string); okay {
   282  		author = jwtUsername
   283  	}
   284  
   285  	rid := self.Param("id").MustInt64() //reply id
   286  	if rid <= 0 {
   287  		rid = self.Args("id").MustInt64()
   288  	}
   289  
   290  	var rpy models.Reply
   291  	self.Bind(&rpy)
   292  
   293  	if usrinfo, err := models.GetUser(uid); (err == nil) && (usrinfo != nil) {
   294  
   295  		rpy.Uid = uid
   296  		rpy.Author = author
   297  
   298  		if rid <= 0 {
   299  			//全新发布
   300  			if rid, err := models.PostReply(rpy.Tid, &rpy); err != nil || rid <= 0 {
   301  				herr.Message = "回复内容写入数据库时发生错误"
   302  				return self.JSON(herr, makross.StatusServiceUnavailable)
   303  
   304  			} else {
   305  
   306  				if rp, err := models.GetReply(rid); err == nil {
   307  					return self.JSON(rp)
   308  
   309  				} else {
   310  					herr.Message = "获取回复内容数据出错"
   311  					return self.JSON(herr, makross.StatusServiceUnavailable)
   312  
   313  				}
   314  
   315  			}
   316  		} else {
   317  			//对指定的回复内容进行更新
   318  			if row, err := models.PutReply(rid, &rpy); err != nil || row <= 0 {
   319  				herr.Message = "更新回复写入数据库时发生错误"
   320  				return self.JSON(herr, makross.StatusServiceUnavailable)
   321  
   322  			} else {
   323  
   324  				if rp, err := models.GetReply(rid); err == nil {
   325  					return self.JSON(rp)
   326  
   327  				} else {
   328  					herr.Message = "获取回复内容数据出错"
   329  					return self.JSON(herr, makross.StatusServiceUnavailable)
   330  
   331  				}
   332  
   333  			}
   334  		}
   335  
   336  	} else {
   337  		herr.Message = "获取用户数据出错"
   338  		return self.JSON(herr, makross.StatusServiceUnavailable)
   339  
   340  	}
   341  }
   342  
   343  // GetComment 获取评论
   344  func GetCommentHandler(self *makross.Context) error {
   345  
   346  	herr.Message = "ErrServiceUnavailable"
   347  	herr.Status = makross.StatusServiceUnavailable
   348  
   349  	tid := self.Args("tid").MustInt64()
   350  
   351  	if tid > 0 {
   352  		if rps := models.GetReplysByTid(tid, 0, 0, 0, "id"); rps != nil {
   353  			return self.JSON(rps)
   354  		}
   355  
   356  	}
   357  	return self.JSON(herr, makross.StatusServiceUnavailable)
   358  
   359  }
   360  
   361  // PostReport 举报或反馈
   362  func PostReportHandler(self *makross.Context) error {
   363  
   364  	herr.Message = "ErrServiceUnavailable"
   365  	herr.Status = makross.StatusServiceUnavailable
   366  
   367  	id := self.Args("contentid").MustInt64()
   368  	rid := self.Args("commentid").MustInt64()
   369  	tid := self.Args("topicid").MustInt64()
   370  	userid := self.Args("userid").MustInt64()
   371  	content := self.Args("content").String()
   372  	ctype := self.Args("ctype").MustInt64()
   373  
   374  	if usrinfo, err := models.GetUser(userid); err == nil && usrinfo != nil {
   375  
   376  		claims := jwt.GetMapClaims(self)
   377  		jwtUserId := claims["UserId"].(float64)
   378  		if suid := int64(jwtUserId); (suid > 0) && (usrinfo.Id == suid) {
   379  			if id <= 0 {
   380  
   381  				if rid <= 0 && tid > 0 {
   382  					id = tid
   383  					ctype = 1
   384  				} else if rid > 0 && tid <= 0 {
   385  					id = rid
   386  					ctype = -1
   387  				} else {
   388  					return self.JSON(herr, makross.StatusUnauthorized)
   389  				}
   390  			}
   391  
   392  			//如果已经举报过..
   393  			d := map[string]int64{}
   394  			if models.IsReportMark(userid, id, ctype) {
   395  
   396  				d["id"] = id
   397  				return self.JSON(d)
   398  
   399  			} else {
   400  				//保存举报内容
   401  				if row, err := models.SetReportMark(userid, id, ctype, content); err != nil || row <= 0 {
   402  					herr.Message = err.Error()
   403  					return self.JSON(herr, makross.StatusServiceUnavailable)
   404  				} else {
   405  					d["id"] = id
   406  					return self.JSON(d)
   407  				}
   408  
   409  			}
   410  
   411  		} else {
   412  			herr.Message = "不是当前用户无权操作!"
   413  			return self.JSON(herr, makross.StatusServiceUnavailable)
   414  		}
   415  
   416  	} else {
   417  		herr.Message = "获取用户数据出错!"
   418  		return self.JSON(herr, makross.StatusServiceUnavailable)
   419  
   420  	}
   421  }