diff --git a/backend/controllers/admin.go b/backend/controllers/admin.go new file mode 100644 index 0000000..02c7657 --- /dev/null +++ b/backend/controllers/admin.go @@ -0,0 +1,99 @@ +package controllers + +import ( + "encoding/json" + + "github.com/jinzhu/gorm" + + "github.com/Jsharkc/TechTree/backend/general" + "github.com/Jsharkc/TechTree/backend/models" + "github.com/Jsharkc/TechTree/backend/utils" + "github.com/Jsharkc/TechTree/lib/log" +) + +type AdminController struct { + BaseController +} + +func (ac *AdminController) Add() { + var ( + err error + admin models.Admin + flag bool + ) + + err = json.Unmarshal(ac.Ctx.Input.RequestBody, &admin) + if err != nil { + log.Logger.Error("Add admin json unmarshal err:", err) + ac.Data["json"] = map[string]interface{}{general.RespKeyStatus: general.ErrInvalidParams} + goto finish + } + + flag, err = utils.GlobalValid.Valid(&admin) + if !flag { + for _, err := range utils.GlobalValid.Errors { + log.Logger.Error("the user key "+err.Key+" has err:", err) + } + + ac.Data["json"] = map[string]interface{}{general.RespKeyStatus: general.ErrInvalidParams} + goto finish + } + + err = models.AdminService.Add(&admin) + if err != nil { + log.Logger.Error("create user err:", err) + ac.Data["json"] = map[string]interface{}{general.RespKeyStatus: general.ErrMysql} + goto finish + } + + ac.SetSession(general.SessionUserID, admin.UserName) + ac.Data["json"] = map[string]interface{}{general.RespKeyStatus: general.ErrSucceed} + log.Logger.Info("Login: Admin ID:%s", admin.UserName) +finish: + ac.ServeJSON(true) +} + +func (ac *AdminController) Login() { + var ( + err error + login models.Admin + userID string + flag bool + ) + + err = json.Unmarshal(ac.Ctx.Input.RequestBody, &login) + if err != nil { + log.Logger.Error("Admin login json unmarshal err:", err) + ac.Data["json"] = map[string]interface{}{general.RespKeyStatus: general.ErrInvalidParams} + goto finish + } + + flag, err = utils.GlobalValid.Valid(&login) + if !flag { + for _, err := range utils.GlobalValid.Errors { + log.Logger.Error("the user key "+err.Key+" has err:", err) + } + + ac.Data["json"] = map[string]interface{}{general.RespKeyStatus: general.ErrInvalidParams} + goto finish + } + + userID, err = models.AdminService.Login(&login.UserName, &login.Password) + if err != nil { + if err == gorm.ErrRecordNotFound { + log.Logger.Error("Admin doesn't exist:", err) + ac.Data["json"] = map[string]interface{}{general.RespKeyStatus: general.ErrNotFound} + goto finish + } + + log.Logger.Error("Admin login mysql err:", err) + ac.Data["json"] = map[string]interface{}{general.RespKeyStatus: general.ErrMysql} + goto finish + } + + ac.SetSession(general.SessionUserID, userID) + ac.Data["json"] = map[string]interface{}{general.RespKeyStatus: general.ErrSucceed} + log.Logger.Info("Login: Admin ID:%s", userID) +finish: + ac.ServeJSON(true) +} \ No newline at end of file diff --git a/backend/models/admin.go b/backend/models/admin.go new file mode 100644 index 0000000..1a2aa83 --- /dev/null +++ b/backend/models/admin.go @@ -0,0 +1,77 @@ +package models + +import ( + "errors" + "time" + + "github.com/Jsharkc/TechTree/backend/general" + "github.com/Jsharkc/TechTree/backend/tidb" + "github.com/Jsharkc/TechTree/backend/utils" +) + +type AdminServiceProvider struct { +} + +var AdminService *AdminServiceProvider = &AdminServiceProvider{} + +type Admin struct { + UserName string `json:"name" gorm:"column:name" valid:"Required; MinSize(6);MaxSize(128)"` + Password string `json:"pass" gorm:"column:pass" valid:"Required; MinSize(6);MaxSize(16)"` + Created time.Time `json:"created"` + Status int `json:"status"` +} + +func (a Admin) TableName() string { + return "admin" +} + +func (as *AdminServiceProvider) Add(a *Admin) error { + var ( + db = tidb.Conn + tx = db.Begin() + err error + ) + + defer func() { + if err != nil { + err = tx.Rollback().Error + } else { + err = tx.Commit().Error + } + }() + + err = tx.Create(&a).Error + if err != nil { + return err + } + + hashcode, err := utils.GenerateHash(a.Password) + if err != nil { + return err + } + + a.Password = string(hashcode) + a.Status = general.Active + a.Created = time.Now() + + return err +} + +func (as *AdminServiceProvider) Login(name, pass *string) (string, error) { + var ( + a Admin + err error + ) + + db := tidb.Conn + err = db.Model(&Admin{}).Where("name = ?", *name).First(&a).Error + if err != nil { + return "", err + } + + if !utils.CompareHash([]byte(a.Password), *pass) { + return "", errors.New("Password not right!") + } + + return a.UserName, nil +} diff --git a/backend/models/user.go b/backend/models/user.go index 4e3307b..0040ccb 100644 --- a/backend/models/user.go +++ b/backend/models/user.go @@ -91,7 +91,7 @@ func (us *UserServiceProvider) Login(name, pass *string) (string, error) { ) db := tidb.Conn - err = db.Where("name = ?", *name).First(&u).Error + err = db.Model(&User{}).Where("name = ?", *name).First(&u).Error if err != nil { return "", err }