diff --git a/dao/acme_user.go b/dao/acme_user.go new file mode 100644 index 0000000..7262bc6 --- /dev/null +++ b/dao/acme_user.go @@ -0,0 +1,69 @@ +package dao + +import ( + "acme-mana-server-go/db" + "acme-mana-server-go/model" + "acme-mana-server-go/vo" +) + +type AcmeUserDao struct { +} + +func (dao *AcmeUserDao) Add(user *model.AcmeUser) *model.AcmeUser { + conn := db.Db() + conn.Create(user) + return user +} + +func (dao *AcmeUserDao) Get(id int) *model.AcmeUser { + res := &model.AcmeUser{} + conn := db.Db() + tx := conn.First(res, id) + if tx.Error != nil { + panic(tx.Error) + } + return res +} + +func (dao *AcmeUserDao) List() *[]model.AcmeUser { + conn := db.Db() + var res []model.AcmeUser + conn.Find(&res) + return &res +} + +func (dao *AcmeUserDao) Edit(acmeUser *model.AcmeUser) *model.AcmeUser { + conn := db.Db() + conn.Save(acmeUser) + return acmeUser +} + +func (dao *AcmeUserDao) Delete(id int) { + conn := db.Db() + conn.Delete(&model.AcmeUser{}, id) +} + +func (dao *AcmeUserDao) Page(req *vo.AcmeUserPageReq) (int64, *[]model.AcmeUser) { + var total int64 + var list []model.AcmeUser + + conn := db.Db() + bean := req.Bean + + query := conn.Model(&model.Domain{}) + + if bean.Email != "" { + query = query.Where("email like ?", "%"+bean.Email+"%") + } + + query.Count(&total) + if total == 0 { + return total, &list + } + + page := req.Page + query.Offset(page.Size * (page.Page - 1)).Limit(page.Size) + + query.Find(&list) + return total, &list +} diff --git a/dao/domain.go b/dao/domain.go index cddc137..4e796aa 100644 --- a/dao/domain.go +++ b/dao/domain.go @@ -25,11 +25,11 @@ func (_ *DomainDao) Get(id int) *model.Domain { return res } -func (_ *DomainDao) List() []*model.Domain { +func (_ *DomainDao) List() *[]model.Domain { conn := db.Db() - res := make([]*model.Domain, 0) + var res []model.Domain conn.Find(&res) - return res + return &res } func (_ *DomainDao) Edit(newDomain *model.Domain) *model.Domain { diff --git a/db/db.go b/db/db.go index ccff6d5..c46da41 100644 --- a/db/db.go +++ b/db/db.go @@ -24,7 +24,7 @@ func initDb() { if err != nil { panic("failed to connect database") } - err = conn.AutoMigrate(&model.Domain{}) + err = conn.AutoMigrate(&model.Domain{}, &model.AcmeUser{}) if err != nil { panic(err) } diff --git a/handler/acme_user.go b/handler/acme_user.go new file mode 100644 index 0000000..906afea --- /dev/null +++ b/handler/acme_user.go @@ -0,0 +1,72 @@ +package handler + +import ( + "acme-mana-server-go/model" + "acme-mana-server-go/service" + "acme-mana-server-go/vo" + "github.com/gin-gonic/gin" + "strconv" +) + +var acmeUserService = &service.AcmeUserService{} + +type AcmeUserHandler struct { +} + +func (a *AcmeUserHandler) Register(r *gin.RouterGroup) { + group := r.Group("/acme_user") + group.GET("/", a.List) + group.POST("/", a.Add) + group.GET("/:id", a.Get) + group.DELETE("/:id", a.Delete) + group.POST("/page", a.Page) +} + +func (a *AcmeUserHandler) List(c *gin.Context) { + acmeUsers := acmeUserService.List() + c.JSON(200, vo.Success(acmeUsers)) +} + +func (a *AcmeUserHandler) Add(c *gin.Context) { + acmeUser := &model.AcmeUser{} + err := c.BindJSON(acmeUser) + if err != nil { + panic(err) + } + acmeUser = acmeUserService.Add(acmeUser) + c.JSON(200, vo.Success(acmeUser)) +} + +func (a *AcmeUserHandler) Get(c *gin.Context) { + idStr := c.Param("id") + id, err := strconv.Atoi(idStr) + if err != nil { + panic(err) + } + acmeUser := acmeUserService.Get(id) + c.JSON(200, vo.Success(acmeUser)) +} + +func (a *AcmeUserHandler) Delete(c *gin.Context) { + idStr := c.Param("id") + id, err := strconv.Atoi(idStr) + if err != nil { + panic(err) + } + acmeUserService.Delete(id) + c.JSON(200, vo.Success("")) +} + +func (a *AcmeUserHandler) Page(c *gin.Context) { + req := &vo.AcmeUserPageReq{} + err := c.BindJSON(req) + if err != nil { + panic(err) + } + total, acmeUsers := acmeUserService.Page(req) + result := vo.PageResult{ + Total: total, + List: acmeUsers, + } + c.JSON(200, vo.Success(&result)) +} diff --git a/handler/error.go b/handler/error.go index a4b5294..91457ba 100644 --- a/handler/error.go +++ b/handler/error.go @@ -3,12 +3,15 @@ package handler import ( "acme-mana-server-go/vo" "github.com/gin-gonic/gin" + "github.com/go-acme/lego/v4/log" ) func GlobalPanicHandler() gin.HandlerFunc { return func(ctx *gin.Context) { defer func() { if err := recover(); err != nil { + //debug.PrintStack() + log.Infof("panic: %v", err) ctx.JSON(500, vo.Fail(err.(error).Error())) ctx.Abort() } @@ -21,13 +24,9 @@ func GlobalErrorHandler() gin.HandlerFunc { return func(c *gin.Context) { c.Next() if len(c.Errors) > 0 { + log.Printf("error: %v", c.Errors) c.JSON(500, vo.Fail(c.Errors.String())) c.Abort() } - err := recover() - if err != nil { - c.JSON(500, vo.Fail(err.(error).Error())) - c.Abort() - } } } diff --git a/handler/handler.go b/handler/handler.go index 76868c9..869d946 100644 --- a/handler/handler.go +++ b/handler/handler.go @@ -10,4 +10,7 @@ func RegisterRouter(r *gin.Engine) { api := r.Group("/api/v1") domainHandler := DomainHandler{} domainHandler.Register(api) + + acmeUserHandler := AcmeUserHandler{} + acmeUserHandler.Register(api) } diff --git a/model/domain.go b/model/domain.go index 7fe430d..55ba1ed 100644 --- a/model/domain.go +++ b/model/domain.go @@ -4,10 +4,7 @@ type Domain struct { Id uint `gorm:"primary_key;auto_increment"` Name string `gorm:"type:varchar(255);not null"` Hosts string `gorm:"type:varchar(255);not null"` - Provider string `gorm:"type:varchar(32);not null"` - ProviderConf string `gorm:"type:text;not null"` - AcmeEmail string `gorm:"type:varchar(255);not null"` - AcmePriKey string `gorm:"type:text;not null"` - Registration string `gorm:"type:text;not null"` - Resource string `gorm:"type:text;not null"` + Provider string `gorm:"type:varchar(32);not null;default:''"` + ProviderConf string `gorm:"type:text;not null;default:''"` + Resource string `gorm:"type:text;not null;default:''"` } diff --git a/model/user.go b/model/user.go new file mode 100644 index 0000000..cc17030 --- /dev/null +++ b/model/user.go @@ -0,0 +1,9 @@ +package model + +type AcmeUser struct { + Id uint `gorm:"primary_key;auto_increment"` + Email string `gorm:"type:varchar(255);not null;index:idx_email,unique"` + PrivateKey string `gorm:"type:text;not null"` + Registration string `gorm:"type:text;not null"` + Status int `gorm:"type:int;not null"` +} diff --git a/service/acme_user.go b/service/acme_user.go new file mode 100644 index 0000000..1d3edc2 --- /dev/null +++ b/service/acme_user.go @@ -0,0 +1,41 @@ +package service + +import ( + "acme-mana-server-go/dao" + "acme-mana-server-go/model" + "acme-mana-server-go/vo" +) + +var acmeUserDao = &dao.AcmeUserDao{} + +type AcmeUserService struct { +} + +func (_ *AcmeUserService) Get(id int) *model.AcmeUser { + return acmeUserDao.Get(id) +} +func (_ *AcmeUserService) List() *[]model.AcmeUser { + return acmeUserDao.List() +} +func (service *AcmeUserService) Add(acmeUser *model.AcmeUser) *model.AcmeUser { + acmeUser = &model.AcmeUser{ + Email: acmeUser.Email, + Status: 0, + } + acmeUser = acmeUserDao.Add(acmeUser) + acmeUser.PrivateKey = "PrivateKey" + acmeUser.Registration = "Registration" + acmeUser.Status = 1 + service.Edit(acmeUser) + return acmeUser +} +func (_ *AcmeUserService) Edit(acmeUser *model.AcmeUser) *model.AcmeUser { + return acmeUserDao.Edit(acmeUser) +} +func (_ *AcmeUserService) Delete(id int) { + acmeUserDao.Delete(id) +} + +func (_ *AcmeUserService) Page(req *vo.AcmeUserPageReq) (int64, *[]model.AcmeUser) { + return acmeUserDao.Page(req) +} diff --git a/service/domian.go b/service/domian.go index ebc7074..e5ecfac 100644 --- a/service/domian.go +++ b/service/domian.go @@ -14,7 +14,7 @@ var domainDao = &dao.DomainDao{} func (_ *DomainService) Get(id int) *model.Domain { return domainDao.Get(id) } -func (_ *DomainService) List() []*model.Domain { +func (_ *DomainService) List() *[]model.Domain { return domainDao.List() } func (_ *DomainService) Add(domain *model.Domain) *model.Domain { diff --git a/vo/acme_user.go b/vo/acme_user.go new file mode 100644 index 0000000..e95676a --- /dev/null +++ b/vo/acme_user.go @@ -0,0 +1,8 @@ +package vo + +type AcmeUserPageReq struct { + Bean struct { + Email string `json:"email"` + } + Page Page +}