qinglong-go/api/user/user.go

158 lines
4.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package user
import (
_ "embed"
"encoding/json"
"fmt"
"github.com/gin-gonic/gin"
"github.com/huoxue1/qinglong-go/models"
"github.com/huoxue1/qinglong-go/service/notification"
"github.com/huoxue1/qinglong-go/service/user"
"github.com/huoxue1/qinglong-go/utils"
"github.com/huoxue1/qinglong-go/utils/res"
"os"
"path"
"time"
)
//go:embed config_sample.sh
var sample []byte
//go:embed package_sample.json
var pack []byte
func Api(group *gin.RouterGroup) {
group.GET("/", get())
group.PUT("/init", appInit())
group.POST("/login", login())
group.POST("/logout", logout())
group.PUT("/notification", putNotification())
group.GET("/notification", getNotification())
}
func logout() gin.HandlerFunc {
return func(ctx *gin.Context) {
ctx.JSON(200, res.Ok(true))
}
}
func get() gin.HandlerFunc {
return func(ctx *gin.Context) {
info, err := user.GetUserInfo()
if err != nil {
return
}
ctx.JSON(200, res.Ok(gin.H{"username": info.Username}))
}
}
func appInit() gin.HandlerFunc {
return func(ctx *gin.Context) {
_, err := os.Stat(path.Join("data", "config", "auth.json"))
exist := os.IsExist(err)
if exist {
ctx.JSON(400, res.Err(400, err))
return
}
_ = os.MkdirAll(path.Join("data", "config"), 0666)
_ = os.MkdirAll(path.Join("data", "log"), 0666)
_ = os.MkdirAll(path.Join("data", "repo"), 0666)
_ = os.MkdirAll(path.Join("data", "scripts"), 0666)
_ = os.MkdirAll(path.Join("data", "deps"), 0666)
_ = os.MkdirAll(path.Join("data", "raw"), 0666)
_ = os.WriteFile(path.Join("data", "config", "config.sh"), sample, 0666)
_ = os.WriteFile(path.Join("data", "scripts", "package.json"), pack, 0666)
_ = os.WriteFile(path.Join("data", "config", "config.sample.sh"), sample, 0666)
type Req struct {
UserName string `json:"username"`
Password string `json:"password"`
}
r := new(Req)
err = ctx.ShouldBindJSON(r)
if err != nil {
ctx.JSON(502, res.ErrMessage(502, err.Error()))
return
}
m := new(models.AuthFile)
m.Username = r.UserName
m.Password = r.Password
m.Tokens.Mobile = ""
m.Tokens.Desktop = ""
data, _ := json.Marshal(m)
_ = os.WriteFile(path.Join("data", "config", "auth.json"), data, 0666)
ctx.JSON(200, res.Ok(true))
}
}
func login() gin.HandlerFunc {
return func(ctx *gin.Context) {
type Req struct {
UserName string `json:"username"`
Password string `json:"password"`
}
r := new(Req)
err := ctx.ShouldBindJSON(r)
if err != nil {
ctx.JSON(502, res.Err(502, err))
return
}
data, err := os.ReadFile(path.Join("data", "config", "auth.json"))
if err != nil {
ctx.Abort()
return
}
auth := new(models.AuthFile)
_ = json.Unmarshal(data, auth)
if auth.Username == r.UserName && auth.Password == r.Password {
token, err := utils.GenerateToken(r.UserName, 48)
if err != nil {
ctx.JSON(503, res.Err(503, err))
return
}
mobile := utils.IsMobile(ctx.GetHeader("User-Agent"))
if mobile {
auth.Tokens.Mobile = token
auth.Token = token
file, _ := json.Marshal(auth)
err := os.WriteFile(path.Join("data", "config", "auth.json"), file, 0666)
if err != nil {
ctx.JSON(503, res.Err(503, err))
return
}
notification.Push.Send("登录通知", fmt.Sprintf("你于%s登录mobile端登录成功ip地址 %s", time.Now().Format("2006-01-02 15:04:05"), ctx.ClientIP()))
ctx.JSON(200, res.Ok(gin.H{
"token": token,
"platform": "mobile",
"retries": 0,
"lastip": "",
"lastaddr": "",
"lastlogon": time.Now().UnixNano(),
}))
} else {
auth.Tokens.Desktop = token
auth.Token = token
file, _ := json.Marshal(auth)
err := os.WriteFile(path.Join("data", "config", "auth.json"), file, 0666)
if err != nil {
ctx.JSON(503, res.Err(503, err))
return
}
notification.Push.Send("登录通知", fmt.Sprintf("你于%s登录pc端登录成功ip地址 %s", time.Now().Format("2006-01-02 15:04:05"), ctx.ClientIP()))
ctx.JSON(200, res.Ok(gin.H{
"token": token,
"platform": "desktop",
"retries": 0,
"lastip": "",
"lastaddr": "",
"lastlogon": time.Now().UnixNano(),
}))
}
} else {
ctx.JSON(400, res.ErrMessage(400, "账号密码错误!"))
}
}
}