init
This commit is contained in:
419
bbs-go/server/internal/controllers/api/user_controller.go
Normal file
419
bbs-go/server/internal/controllers/api/user_controller.go
Normal file
@@ -0,0 +1,419 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"bbs-go/internal/models/constants"
|
||||
"bbs-go/internal/pkg/errs"
|
||||
"bbs-go/internal/pkg/msg"
|
||||
"bbs-go/internal/pkg/validate"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/kataras/iris/v12"
|
||||
"github.com/mlogclub/simple/common/dates"
|
||||
"github.com/mlogclub/simple/common/strs"
|
||||
"github.com/mlogclub/simple/sqls"
|
||||
"github.com/mlogclub/simple/web"
|
||||
"github.com/mlogclub/simple/web/params"
|
||||
"github.com/spf13/cast"
|
||||
|
||||
"bbs-go/internal/cache"
|
||||
"bbs-go/internal/controllers/render"
|
||||
"bbs-go/internal/models"
|
||||
"bbs-go/internal/services"
|
||||
)
|
||||
|
||||
type UserController struct {
|
||||
Ctx iris.Context
|
||||
}
|
||||
|
||||
// 获取当前登录用户
|
||||
func (c *UserController) GetCurrent() *web.JsonResult {
|
||||
user := services.UserTokenService.GetCurrent(c.Ctx)
|
||||
if user != nil {
|
||||
return web.JsonData(render.BuildUserProfile(user))
|
||||
}
|
||||
return web.JsonSuccess()
|
||||
}
|
||||
|
||||
// 用户详情
|
||||
func (c *UserController) GetBy(userId int64) *web.JsonResult {
|
||||
user := cache.UserCache.Get(userId)
|
||||
if user != nil && user.Status != constants.StatusDeleted {
|
||||
return web.JsonData(render.BuildUserDetail(user))
|
||||
}
|
||||
return web.JsonErrorMsg("用户不存在")
|
||||
}
|
||||
|
||||
// 修改用户资料
|
||||
func (c *UserController) PostEditBy(userId int64) *web.JsonResult {
|
||||
user := services.UserTokenService.GetCurrent(c.Ctx)
|
||||
if user == nil {
|
||||
return web.JsonError(errs.NotLogin)
|
||||
}
|
||||
if user.Id != userId {
|
||||
return web.JsonErrorMsg("无权限")
|
||||
}
|
||||
var (
|
||||
nickname = strings.TrimSpace(params.FormValue(c.Ctx, "nickname"))
|
||||
homePage = params.FormValue(c.Ctx, "homePage")
|
||||
description = params.FormValue(c.Ctx, "description")
|
||||
gender = strings.TrimSpace(params.FormValue(c.Ctx, "gender"))
|
||||
birthdayStr = strings.TrimSpace(params.FormValue(c.Ctx, "birthday"))
|
||||
birthday *time.Time
|
||||
err error
|
||||
)
|
||||
|
||||
if len(nickname) == 0 {
|
||||
return web.JsonErrorMsg("昵称不能为空")
|
||||
}
|
||||
|
||||
if strs.IsNotBlank(gender) {
|
||||
if gender != string(constants.GenderMale) && gender != string(constants.GenderFemale) {
|
||||
return web.JsonErrorMsg("性别数据错误")
|
||||
}
|
||||
}
|
||||
if strs.IsNotBlank(birthdayStr) {
|
||||
*birthday, err = dates.Parse(birthdayStr, dates.FmtDate)
|
||||
if err != nil {
|
||||
return web.JsonError(err)
|
||||
}
|
||||
}
|
||||
|
||||
if len(homePage) > 0 && validate.IsURL(homePage) != nil {
|
||||
return web.JsonErrorMsg("个人主页地址错误")
|
||||
}
|
||||
|
||||
columns := map[string]interface{}{
|
||||
"nickname": nickname,
|
||||
"home_page": homePage,
|
||||
"description": description,
|
||||
"gender": gender,
|
||||
}
|
||||
if birthday != nil {
|
||||
columns["birthday"] = birthday
|
||||
}
|
||||
err = services.UserService.Updates(user.Id, columns)
|
||||
if err != nil {
|
||||
return web.JsonError(err)
|
||||
}
|
||||
return web.JsonSuccess()
|
||||
}
|
||||
|
||||
// 修改头像
|
||||
func (c *UserController) PostUpdateAvatar() *web.JsonResult {
|
||||
user := services.UserTokenService.GetCurrent(c.Ctx)
|
||||
if user == nil {
|
||||
return web.JsonError(errs.NotLogin)
|
||||
}
|
||||
avatar := strings.TrimSpace(params.FormValue(c.Ctx, "avatar"))
|
||||
if len(avatar) == 0 {
|
||||
return web.JsonErrorMsg("头像不能为空")
|
||||
}
|
||||
err := services.UserService.UpdateAvatar(user.Id, avatar)
|
||||
if err != nil {
|
||||
return web.JsonError(err)
|
||||
}
|
||||
return web.JsonSuccess()
|
||||
}
|
||||
|
||||
func (c *UserController) PostUpdateNickname() *web.JsonResult {
|
||||
user := services.UserTokenService.GetCurrent(c.Ctx)
|
||||
if user == nil {
|
||||
return web.JsonError(errs.NotLogin)
|
||||
}
|
||||
nickname := strings.TrimSpace(params.FormValue(c.Ctx, "nickname"))
|
||||
if len(nickname) == 0 {
|
||||
return web.JsonErrorMsg("Nickname cannot be empty")
|
||||
}
|
||||
err := services.UserService.UpdateNickname(user.Id, nickname)
|
||||
if err != nil {
|
||||
return web.JsonErrorMsg(err.Error())
|
||||
}
|
||||
return web.JsonSuccess()
|
||||
}
|
||||
|
||||
func (c *UserController) PostUpdateDescription() *web.JsonResult {
|
||||
user := services.UserTokenService.GetCurrent(c.Ctx)
|
||||
if user == nil {
|
||||
return web.JsonError(errs.NotLogin)
|
||||
}
|
||||
description := strings.TrimSpace(params.FormValue(c.Ctx, "description"))
|
||||
err := services.UserService.UpdateDescription(user.Id, description)
|
||||
if err != nil {
|
||||
return web.JsonErrorMsg(err.Error())
|
||||
}
|
||||
return web.JsonSuccess()
|
||||
}
|
||||
|
||||
func (c *UserController) PostUpdateGender() *web.JsonResult {
|
||||
user := services.UserTokenService.GetCurrent(c.Ctx)
|
||||
if user == nil {
|
||||
return web.JsonError(errs.NotLogin)
|
||||
}
|
||||
gender := strings.TrimSpace(params.FormValue(c.Ctx, "gender"))
|
||||
err := services.UserService.UpdateGender(user.Id, gender)
|
||||
if err != nil {
|
||||
return web.JsonErrorMsg(err.Error())
|
||||
}
|
||||
return web.JsonSuccess()
|
||||
}
|
||||
|
||||
func (c *UserController) PostUpdateBirthday() *web.JsonResult {
|
||||
user := services.UserTokenService.GetCurrent(c.Ctx)
|
||||
if user == nil {
|
||||
return web.JsonError(errs.NotLogin)
|
||||
}
|
||||
birthday := strings.TrimSpace(params.FormValue(c.Ctx, "birthday"))
|
||||
err := services.UserService.UpdateBirthday(user.Id, birthday)
|
||||
if err != nil {
|
||||
return web.JsonErrorMsg(err.Error())
|
||||
}
|
||||
return web.JsonSuccess()
|
||||
}
|
||||
|
||||
// 设置用户名
|
||||
func (c *UserController) PostSetUsername() *web.JsonResult {
|
||||
user := services.UserTokenService.GetCurrent(c.Ctx)
|
||||
if user == nil {
|
||||
return web.JsonError(errs.NotLogin)
|
||||
}
|
||||
username := strings.TrimSpace(params.FormValue(c.Ctx, "username"))
|
||||
err := services.UserService.SetUsername(user.Id, username)
|
||||
if err != nil {
|
||||
return web.JsonError(err)
|
||||
}
|
||||
return web.JsonSuccess()
|
||||
}
|
||||
|
||||
// 设置邮箱
|
||||
func (c *UserController) PostSetEmail() *web.JsonResult {
|
||||
user := services.UserTokenService.GetCurrent(c.Ctx)
|
||||
if user == nil {
|
||||
return web.JsonError(errs.NotLogin)
|
||||
}
|
||||
email := strings.TrimSpace(params.FormValue(c.Ctx, "email"))
|
||||
err := services.UserService.SetEmail(user.Id, email)
|
||||
if err != nil {
|
||||
return web.JsonError(err)
|
||||
}
|
||||
return web.JsonSuccess()
|
||||
}
|
||||
|
||||
// 设置密码
|
||||
func (c *UserController) PostSetPassword() *web.JsonResult {
|
||||
user := services.UserTokenService.GetCurrent(c.Ctx)
|
||||
if user == nil {
|
||||
return web.JsonError(errs.NotLogin)
|
||||
}
|
||||
password := params.FormValue(c.Ctx, "password")
|
||||
rePassword := params.FormValue(c.Ctx, "rePassword")
|
||||
err := services.UserService.SetPassword(user.Id, password, rePassword)
|
||||
if err != nil {
|
||||
return web.JsonError(err)
|
||||
}
|
||||
return web.JsonSuccess()
|
||||
}
|
||||
|
||||
// 修改密码
|
||||
func (c *UserController) PostUpdatePassword() *web.JsonResult {
|
||||
user := services.UserTokenService.GetCurrent(c.Ctx)
|
||||
if user == nil {
|
||||
return web.JsonError(errs.NotLogin)
|
||||
}
|
||||
var (
|
||||
oldPassword = params.FormValue(c.Ctx, "oldPassword")
|
||||
password = params.FormValue(c.Ctx, "password")
|
||||
rePassword = params.FormValue(c.Ctx, "rePassword")
|
||||
)
|
||||
if err := services.UserService.UpdatePassword(user.Id, oldPassword, password, rePassword); err != nil {
|
||||
return web.JsonError(err)
|
||||
}
|
||||
return web.JsonSuccess()
|
||||
}
|
||||
|
||||
// 设置背景图
|
||||
func (c *UserController) PostSet_background_image() *web.JsonResult {
|
||||
user := services.UserTokenService.GetCurrent(c.Ctx)
|
||||
if user == nil {
|
||||
return web.JsonError(errs.NotLogin)
|
||||
}
|
||||
backgroundImage := params.FormValue(c.Ctx, "backgroundImage")
|
||||
if strs.IsBlank(backgroundImage) {
|
||||
return web.JsonErrorMsg("请上传图片")
|
||||
}
|
||||
if err := services.UserService.UpdateBackgroundImage(user.Id, backgroundImage); err != nil {
|
||||
return web.JsonError(err)
|
||||
}
|
||||
return web.JsonSuccess()
|
||||
}
|
||||
|
||||
// 用户收藏
|
||||
func (c *UserController) GetFavorites() *web.JsonResult {
|
||||
user := services.UserTokenService.GetCurrent(c.Ctx)
|
||||
cursor := params.FormValueInt64Default(c.Ctx, "cursor", 0)
|
||||
|
||||
// 用户必须登录
|
||||
if user == nil {
|
||||
return web.JsonError(errs.NotLogin)
|
||||
}
|
||||
|
||||
// 查询列表
|
||||
limit := 20
|
||||
var favorites []models.Favorite
|
||||
if cursor > 0 {
|
||||
favorites = services.FavoriteService.Find(sqls.NewCnd().Where("user_id = ? and id < ?",
|
||||
user.Id, cursor).Desc("id").Limit(20))
|
||||
} else {
|
||||
favorites = services.FavoriteService.Find(sqls.NewCnd().Where("user_id = ?", user.Id).Desc("id").Limit(limit))
|
||||
}
|
||||
|
||||
hasMore := false
|
||||
if len(favorites) > 0 {
|
||||
cursor = favorites[len(favorites)-1].Id
|
||||
hasMore = len(favorites) >= limit
|
||||
}
|
||||
|
||||
return web.JsonCursorData(render.BuildFavorites(favorites), strconv.FormatInt(cursor, 10), hasMore)
|
||||
}
|
||||
|
||||
// 获取最近3条未读消息
|
||||
func (c *UserController) GetMsgrecent() *web.JsonResult {
|
||||
user := services.UserTokenService.GetCurrent(c.Ctx)
|
||||
var count int64 = 0
|
||||
var messages []models.Message
|
||||
if user != nil {
|
||||
count = services.MessageService.GetUnReadCount(user.Id)
|
||||
messages = services.MessageService.Find(sqls.NewCnd().Eq("user_id", user.Id).
|
||||
Eq("status", msg.StatusUnread).Limit(3).Desc("id"))
|
||||
}
|
||||
return web.NewEmptyRspBuilder().Put("count", count).Put("messages", render.BuildMessages(messages)).JsonResult()
|
||||
}
|
||||
|
||||
// 用户消息
|
||||
func (c *UserController) GetMessages() *web.JsonResult {
|
||||
user, err := services.UserTokenService.CheckLogin(c.Ctx)
|
||||
if err != nil {
|
||||
return web.JsonError(errs.NotLogin)
|
||||
}
|
||||
var (
|
||||
limit = 20
|
||||
cursor, _ = params.GetInt64(c.Ctx, "cursor")
|
||||
)
|
||||
|
||||
cnd := sqls.NewCnd().Eq("user_id", user.Id).Limit(limit).Desc("id")
|
||||
if cursor > 0 {
|
||||
cnd.Lt("id", cursor)
|
||||
}
|
||||
list := services.MessageService.Find(cnd)
|
||||
|
||||
var (
|
||||
nextCursor = cursor
|
||||
hasMore = false
|
||||
)
|
||||
if len(list) > 0 {
|
||||
nextCursor = list[len(list)-1].Id
|
||||
hasMore = len(list) == limit
|
||||
}
|
||||
|
||||
// 全部标记为已读
|
||||
services.MessageService.MarkRead(user.Id)
|
||||
|
||||
return web.JsonCursorData(render.BuildMessages(list), cast.ToString(nextCursor), hasMore)
|
||||
}
|
||||
|
||||
// 用户积分记录
|
||||
func (c *UserController) GetScore_logs() *web.JsonResult {
|
||||
user, err := services.UserTokenService.CheckLogin(c.Ctx)
|
||||
if err != nil {
|
||||
return web.JsonError(err)
|
||||
}
|
||||
var (
|
||||
limit = 20
|
||||
cursor, _ = params.GetInt64(c.Ctx, "cursor")
|
||||
)
|
||||
cnd := sqls.NewCnd().Eq("user_id", user.Id).Limit(limit).Desc("id")
|
||||
if cursor > 0 {
|
||||
cnd.Lt("id", cursor)
|
||||
}
|
||||
list := services.UserScoreLogService.Find(cnd)
|
||||
|
||||
var (
|
||||
nextCursor = cursor
|
||||
hasMore = false
|
||||
)
|
||||
if len(list) > 0 {
|
||||
nextCursor = list[len(list)-1].Id
|
||||
hasMore = len(list) == limit
|
||||
}
|
||||
|
||||
return web.JsonCursorData(list, cast.ToString(nextCursor), hasMore)
|
||||
}
|
||||
|
||||
// 积分排行
|
||||
func (c *UserController) GetScoreRank() *web.JsonResult {
|
||||
users := cache.UserCache.GetScoreRank()
|
||||
var results []*models.UserInfo
|
||||
for _, user := range users {
|
||||
results = append(results, render.BuildUserInfo(&user))
|
||||
}
|
||||
return web.JsonData(results)
|
||||
}
|
||||
|
||||
// 禁言
|
||||
func (c *UserController) PostForbidden() *web.JsonResult {
|
||||
user := services.UserTokenService.GetCurrent(c.Ctx)
|
||||
if user == nil {
|
||||
return web.JsonError(errs.NotLogin)
|
||||
}
|
||||
if !user.HasAnyRole(constants.RoleOwner, constants.RoleAdmin) {
|
||||
return web.JsonErrorMsg("无权限")
|
||||
}
|
||||
var (
|
||||
userId = params.FormValueInt64Default(c.Ctx, "userId", 0)
|
||||
days = params.FormValueIntDefault(c.Ctx, "days", 0)
|
||||
reason = params.FormValue(c.Ctx, "reason")
|
||||
)
|
||||
if userId < 0 {
|
||||
return web.JsonErrorMsg("请传入:userId")
|
||||
}
|
||||
if days == -1 && !user.HasRole(constants.RoleOwner) {
|
||||
return web.JsonErrorMsg("无永久禁言权限")
|
||||
}
|
||||
if days == 0 {
|
||||
services.UserService.RemoveForbidden(user.Id, userId, c.Ctx.Request())
|
||||
} else {
|
||||
if err := services.UserService.Forbidden(user.Id, userId, days, reason, c.Ctx.Request()); err != nil {
|
||||
return web.JsonError(err)
|
||||
}
|
||||
}
|
||||
return web.JsonSuccess()
|
||||
}
|
||||
|
||||
// PostEmailVerify 请求邮箱验证邮件
|
||||
func (c *UserController) PostSend_verify_email() *web.JsonResult {
|
||||
user := services.UserTokenService.GetCurrent(c.Ctx)
|
||||
if user == nil {
|
||||
return web.JsonError(errs.NotLogin)
|
||||
}
|
||||
if err := services.UserService.SendEmailVerifyEmail(user.Id); err != nil {
|
||||
return web.JsonError(err)
|
||||
}
|
||||
return web.JsonSuccess()
|
||||
}
|
||||
|
||||
// PostVerify_email 获取邮箱验证码
|
||||
func (c *UserController) PostVerify_email() *web.JsonResult {
|
||||
token := params.FormValue(c.Ctx, "token")
|
||||
if strs.IsBlank(token) {
|
||||
return web.JsonErrorMsg("Illegal request")
|
||||
}
|
||||
var (
|
||||
email string
|
||||
err error
|
||||
)
|
||||
if email, err = services.UserService.VerifyEmail(token); err != nil {
|
||||
return web.JsonError(err)
|
||||
}
|
||||
return web.NewEmptyRspBuilder().Put("email", email).JsonResult()
|
||||
}
|
||||
Reference in New Issue
Block a user