520MianXiangDuiXiang520/JuneGoBlog

View on GitHub
src/dao/auth.go

Summary

Maintainability
A
1 hr
Test Coverage
package dao

import (
    "JuneGoBlog/src/consts"
    "fmt"
    juneDao "github.com/520MianXiangDuiXiang520/GinTools/dao"
    juneLog "github.com/520MianXiangDuiXiang520/GinTools/log"
    "time"
)

/**
* WiKi: 通过用户名和密码查询用户,如果用户不存在第二个参数返回 false
* Author: JuneBao
* Time: 2020/9/15 20:17
**/
func GetUser(username, password string) (*User, bool) {
    var user User
    err := juneDao.GetDB().Where("username = ? AND password = ?", username, password).First(&user).Error
    return &user, err == nil
}

func GetUserByToken(token string) (*User, bool) {
    var ut UserToken
    var user User
    err := juneDao.GetDB().Where("token = ?", token).First(&ut).Error
    if err != nil {
        return nil, false
    }
    if ut.ExpireTime.Unix() < time.Now().Unix() {
        err = DeleteUserTokenByID(ut.ID)
        return nil, false
    }
    // 快过期时更新 Token
    if ut.ExpireTime.Unix()-time.Now().Unix() < consts.TenMinutes {
        err = UpdateTokenExpireTime(ut.ID)
        if err != nil {
            return nil, false
        }
    }
    err = juneDao.GetDB().Where("id = ?", ut.UserID).First(&user).Error
    return &user, err == nil
}

func DeleteUserTokenByUID(uid int) error {
    tx := juneDao.GetDB().Begin()
    var err error
    defer func() {
        if err != nil {
            tx.Rollback()
        }
        tx.Commit()
    }()
    err = tx.Where("user_id = ?", uid).Delete(&UserToken{}).Error
    return err
}

func DeleteUserTokenByID(id int) error {
    tx := juneDao.GetDB().Begin()
    var err error
    defer func() {
        if err != nil {
            tx.Rollback()
        }
        tx.Commit()
    }()
    err = tx.Where("id = ?", id).Delete(&UserToken{}).Error
    return err
}

func UpdateTokenExpireTime(id int) (err error) {
    tx := juneDao.GetDB().Begin()
    defer func() {
        if err != nil {
            msg := fmt.Sprintf("Fail to update token expire time, token id = %v", id)
            juneLog.ExceptionLog(err, msg)
            tx.Rollback()
        }
        tx.Commit()
    }()
    return tx.Model(&UserToken{}).Select("expire_time").Updates(map[string]interface{}{
        "expire_time": time.Now().Add(consts.ExpireDuration),
    }).Error
}

func InsertUserToken(user *User, token string, expire time.Time) error {
    tx := juneDao.GetDB().Begin()
    var err error
    defer func() {
        if err != nil {
            tx.Rollback()
        }
        tx.Commit()
    }()
    err = DeleteUserTokenByUID(user.ID)
    if err != nil {
        return err
    }
    err = tx.Create(&UserToken{
        Token:      token,
        UserID:     user.ID,
        ExpireTime: expire,
    }).Error
    return err
}