276 lines
7.2 KiB
Go
276 lines
7.2 KiB
Go
|
package controller
|
||
|
|
||
|
import (
|
||
|
"bbs-backend/api/reply"
|
||
|
"bbs-backend/api/request"
|
||
|
"bbs-backend/common/errcode"
|
||
|
"bbs-backend/common/response"
|
||
|
"bbs-backend/logic/appservice"
|
||
|
"github.com/dgrijalva/jwt-go"
|
||
|
"github.com/gin-gonic/gin"
|
||
|
"io"
|
||
|
"net/http"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
func Register(c *gin.Context) {
|
||
|
var req request.RegisterRequest
|
||
|
if err := c.ShouldBindJSON(&req); err != nil {
|
||
|
response.Error(c, http.StatusBadRequest, errcode.ErrBadRequest)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
user, err := appservice.RegisterUser(req)
|
||
|
if err != nil {
|
||
|
switch err {
|
||
|
case errcode.ErrInvalidUsername:
|
||
|
response.Error(c, http.StatusBadRequest, errcode.ErrInvalidUsername)
|
||
|
case errcode.ErrInvalidPassword:
|
||
|
response.Error(c, http.StatusBadRequest, errcode.ErrInvalidPassword)
|
||
|
case errcode.ErrUserAlreadyExists:
|
||
|
response.Error(c, http.StatusBadRequest, errcode.ErrUserAlreadyExists)
|
||
|
case errcode.ErrEmailExists:
|
||
|
response.Error(c, http.StatusBadRequest, errcode.ErrEmailExists)
|
||
|
default:
|
||
|
response.Error(c, http.StatusInternalServerError, errcode.ErrInternalServerError)
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
reply := &reply.RegisterReply{}
|
||
|
reply.FromModel(user)
|
||
|
response.Success(c, reply)
|
||
|
}
|
||
|
|
||
|
func Login(c *gin.Context) {
|
||
|
var req request.LoginRequest
|
||
|
if err := c.ShouldBindJSON(&req); err != nil {
|
||
|
response.Error(c, http.StatusBadRequest, errcode.ErrBadRequest)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
token, err := appservice.LoginUser(req)
|
||
|
if err != nil {
|
||
|
switch err {
|
||
|
case errcode.ErrInvalidUsername:
|
||
|
response.Error(c, http.StatusBadRequest, errcode.ErrInvalidUsername)
|
||
|
case errcode.ErrInvalidPassword:
|
||
|
response.Error(c, http.StatusBadRequest, errcode.ErrInvalidPassword)
|
||
|
case errcode.ErrUserNotFound:
|
||
|
response.Error(c, http.StatusUnauthorized, errcode.ErrUserNotFound)
|
||
|
default:
|
||
|
response.Error(c, http.StatusUnauthorized, errcode.ErrUnauthorized)
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
response.Success(c, reply.LoginReply{Token: token})
|
||
|
}
|
||
|
|
||
|
func GetUserInfo(c *gin.Context) {
|
||
|
authHeader := c.GetHeader("Authorization")
|
||
|
if authHeader == "" {
|
||
|
response.Error(c, http.StatusUnauthorized, errcode.ErrUnauthorized)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
tokenString := strings.Replace(authHeader, "Bearer ", "", 1)
|
||
|
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
|
||
|
return []byte("your_secret_key"), nil
|
||
|
})
|
||
|
|
||
|
if err != nil {
|
||
|
response.Error(c, http.StatusUnauthorized, errcode.ErrInvalidToken)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
claims, ok := token.Claims.(jwt.MapClaims)
|
||
|
if !ok || !token.Valid {
|
||
|
response.Error(c, http.StatusUnauthorized, errcode.ErrInvalidToken)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
userID, ok := claims["user_id"].(float64)
|
||
|
if !ok {
|
||
|
response.Error(c, http.StatusUnauthorized, errcode.ErrInvalidToken)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
user, err := appservice.GetUserInfo(uint(userID))
|
||
|
if err != nil {
|
||
|
switch err {
|
||
|
case errcode.ErrUserNotFound:
|
||
|
response.Error(c, http.StatusNotFound, errcode.ErrUserNotFound)
|
||
|
default:
|
||
|
response.Error(c, http.StatusInternalServerError, errcode.ErrInternalServerError)
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
reply := &reply.UserInfoReply{}
|
||
|
reply.FromModel(user)
|
||
|
response.Success(c, reply)
|
||
|
}
|
||
|
|
||
|
func UpdateUserInfo(c *gin.Context) {
|
||
|
authHeader := c.GetHeader("Authorization")
|
||
|
if authHeader == "" {
|
||
|
response.Error(c, http.StatusUnauthorized, errcode.ErrUnauthorized)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
tokenString := strings.Replace(authHeader, "Bearer ", "", 1)
|
||
|
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
|
||
|
return []byte("your_secret_key"), nil
|
||
|
})
|
||
|
|
||
|
if err != nil {
|
||
|
response.Error(c, http.StatusUnauthorized, errcode.ErrInvalidToken)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
claims, ok := token.Claims.(jwt.MapClaims)
|
||
|
if !ok || !token.Valid {
|
||
|
response.Error(c, http.StatusUnauthorized, errcode.ErrInvalidToken)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
userID, ok := claims["user_id"].(float64)
|
||
|
if !ok {
|
||
|
response.Error(c, http.StatusUnauthorized, errcode.ErrInvalidToken)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
var req request.UpdateUserInfoRequest
|
||
|
if err := c.ShouldBindJSON(&req); err != nil {
|
||
|
response.Error(c, http.StatusBadRequest, errcode.ErrBadRequest)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
err = appservice.UpdateUserInfo(uint(userID), req)
|
||
|
if err != nil {
|
||
|
response.Error(c, http.StatusInternalServerError, errcode.ErrInternalServerError)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
response.Success(c, gin.H{"message": "User info updated successfully"})
|
||
|
}
|
||
|
|
||
|
func UploadAvatar(c *gin.Context) {
|
||
|
authHeader := c.GetHeader("Authorization")
|
||
|
if authHeader == "" {
|
||
|
response.Error(c, http.StatusUnauthorized, errcode.ErrUnauthorized)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
tokenString := strings.Replace(authHeader, "Bearer ", "", 1)
|
||
|
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
|
||
|
return []byte("your_secret_key"), nil
|
||
|
})
|
||
|
|
||
|
if err != nil {
|
||
|
response.Error(c, http.StatusUnauthorized, errcode.ErrInvalidToken)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
claims, ok := token.Claims.(jwt.MapClaims)
|
||
|
if !ok || !token.Valid {
|
||
|
response.Error(c, http.StatusUnauthorized, errcode.ErrInvalidToken)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
userID, ok := claims["user_id"].(float64)
|
||
|
if !ok {
|
||
|
response.Error(c, http.StatusUnauthorized, errcode.ErrInvalidToken)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// 处理图片上传
|
||
|
file, err := c.FormFile("avatar")
|
||
|
if err != nil {
|
||
|
response.Error(c, http.StatusBadRequest, errcode.ErrBadRequest)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
avatarFile, err := file.Open()
|
||
|
if err != nil {
|
||
|
response.Error(c, http.StatusInternalServerError, errcode.ErrInternalServerError)
|
||
|
return
|
||
|
}
|
||
|
defer avatarFile.Close()
|
||
|
|
||
|
avatar, err := io.ReadAll(avatarFile)
|
||
|
if err != nil {
|
||
|
response.Error(c, http.StatusInternalServerError, errcode.ErrInternalServerError)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
err = appservice.UploadAvatar(uint(userID), avatar)
|
||
|
if err != nil {
|
||
|
response.Error(c, http.StatusInternalServerError, errcode.ErrInternalServerError)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
response.Success(c, gin.H{"message": "Avatar uploaded successfully"})
|
||
|
}
|
||
|
|
||
|
func SendVerificationCode(c *gin.Context) {
|
||
|
var req request.SendVerificationCodeRequest
|
||
|
if err := c.ShouldBindJSON(&req); err != nil {
|
||
|
response.Error(c, http.StatusBadRequest, errcode.ErrBadRequest)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
err := appservice.SendVerificationCode(req.Email)
|
||
|
if err != nil {
|
||
|
response.Error(c, http.StatusInternalServerError, errcode.ErrInternalServerError)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
response.Success(c, gin.H{"message": "Verification code sent successfully"})
|
||
|
}
|
||
|
|
||
|
func VerifyEmail(c *gin.Context) {
|
||
|
authHeader := c.GetHeader("Authorization")
|
||
|
if authHeader == "" {
|
||
|
response.Error(c, http.StatusUnauthorized, errcode.ErrUnauthorized)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
tokenString := strings.Replace(authHeader, "Bearer ", "", 1)
|
||
|
token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
|
||
|
return []byte("your_secret_key"), nil
|
||
|
})
|
||
|
|
||
|
if err != nil {
|
||
|
response.Error(c, http.StatusUnauthorized, errcode.ErrInvalidToken)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
claims, ok := token.Claims.(jwt.MapClaims)
|
||
|
if !ok || !token.Valid {
|
||
|
response.Error(c, http.StatusUnauthorized, errcode.ErrInvalidToken)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
userID, ok := claims["user_id"].(float64)
|
||
|
if !ok {
|
||
|
response.Error(c, http.StatusUnauthorized, errcode.ErrInvalidToken)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
var req request.VerifyEmailRequest
|
||
|
if err := c.ShouldBindJSON(&req); err != nil {
|
||
|
response.Error(c, http.StatusBadRequest, errcode.ErrBadRequest)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
err = appservice.VerifyEmail(uint(userID), req.Email, req.Code)
|
||
|
if err != nil {
|
||
|
response.Error(c, http.StatusInternalServerError, errcode.ErrInternalServerError)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
response.Success(c, gin.H{"message": "Email verified successfully"})
|
||
|
}
|