diff --git a/config.yaml.sample b/config.yaml.sample index 1126bcec..2c6c1ae1 100644 --- a/config.yaml.sample +++ b/config.yaml.sample @@ -19,6 +19,7 @@ Features: Base: ["Redis", "PhoneBind"] Docs: ["Docs:OpenAPI"] Deprecated: ["Deprecated:OldWeb"] + Service: ["Admin", "SpaceX", "Bot", "LocalOSS"] Option: ["SimpleCacheIndex"] Sms: "SmsJuhe" WebServer: # Web服务 @@ -26,6 +27,26 @@ WebServer: # Web服务 HttpPort: 8010 ReadTimeout: 60 WriteTimeout: 60 +AdminServer: # Admin后台运维服务 + HttpIp: 0.0.0.0 + HttpPort: 8014 + ReadTimeout: 60 + WriteTimeout: 60 +SpaceXServer: # SpaceX服务 + HttpIp: 0.0.0.0 + HttpPort: 8012 + ReadTimeout: 60 + WriteTimeout: 60 +BotServer: # Bot服务 + HttpIp: 0.0.0.0 + HttpPort: 8016 + ReadTimeout: 60 + WriteTimeout: 60 +LocalossServer: # Localoss服务 + HttpIp: 0.0.0.0 + HttpPort: 8018 + ReadTimeout: 60 + WriteTimeout: 60 DocsServer: # 开发文档服务 HttpIp: 0.0.0.0 HttpPort: 8011 diff --git a/internal/conf/conf.go b/internal/conf/conf.go index 1cffa824..75d363e7 100644 --- a/internal/conf/conf.go +++ b/internal/conf/conf.go @@ -23,9 +23,13 @@ var ( MysqlSetting *MySQLSettingS PostgresSetting *PostgresSettingS Sqlite3Setting *Sqlite3SettingS - ServerSetting *ServerSettingS - WebServerSetting *ServerSettingS - DocsServerSetting *ServerSettingS + ServerSetting *HttpServerSettingS + WebServerSetting *HttpServerSettingS + AdminServerSetting *HttpServerSettingS + SpaceXServerSetting *HttpServerSettingS + BotServerSetting *HttpServerSettingS + LocalossServerSetting *HttpServerSettingS + DocsServerSetting *HttpServerSettingS AppSetting *AppSettingS CacheIndexSetting *CacheIndexSettingS SimpleCacheIndexSetting *SimpleCacheIndexSettingS @@ -63,6 +67,10 @@ func setupSetting(suite []string, noDefault bool) error { "App": &AppSetting, "Server": &ServerSetting, "WebServer": &WebServerSetting, + "AdminServer": &AdminServerSetting, + "SpaceXServer": &SpaceXServerSetting, + "BotServer": &BotServerSetting, + "LocalossServer": &LocalossServerSetting, "DocsServer": &DocsServerSetting, "CacheIndex": &CacheIndexSetting, "SimpleCacheIndex": &SimpleCacheIndexSetting, diff --git a/internal/conf/settting.go b/internal/conf/settting.go index e5841c51..7067d18e 100644 --- a/internal/conf/settting.go +++ b/internal/conf/settting.go @@ -45,7 +45,7 @@ type LoggerMeiliSettingS struct { MinWorker int } -type ServerSettingS struct { +type HttpServerSettingS struct { RunMode string HttpIp string HttpPort string diff --git a/internal/mirc/README.md b/internal/mirc/README.md index 5b2162a2..064cbe21 100644 --- a/internal/mirc/README.md +++ b/internal/mirc/README.md @@ -1 +1,2 @@ -### RESTful API for paopao-ce use [go-mir](https://github.com/alimy/mir) to generate service interface code automatic. +### Mirc for paopao-ce +RESTful API for paopao-ce use [go-mir](https://github.com/alimy/mir) to generate service interface code automatic. diff --git a/internal/mirc/auto/api/r/v1/user.go b/internal/mirc/auto/api/r/v1/user.go new file mode 100644 index 00000000..ae9dd9cd --- /dev/null +++ b/internal/mirc/auto/api/r/v1/user.go @@ -0,0 +1,127 @@ +// Code generated by go-mir. DO NOT EDIT. + +package v1 + +import ( + "net/http" + + "github.com/alimy/mir/v3" + "github.com/gin-gonic/gin" +) + +type LoginReq struct { + AgentInfo AgentInfo `json:"agent_info"` + Name string `json:"name"` + Passwd string `json:"passwd"` +} + +type AgentInfo struct { + Platform string `json:"platform"` + UserAgent string `json:"user_agent"` +} + +type LoginResp struct { + UserInfo + ServerInfo ServerInfo `json:"server_info"` + JwtToken string `json:"jwt_token"` +} + +type ServerInfo struct { + ApiVer string `json:"api_ver"` +} + +type UserInfo struct { + Name string `json:"name"` +} + +type User interface { + // Chain provide handlers chain for gin + Chain() gin.HandlersChain + + Logout(c *gin.Context) mir.Error + Login(c *gin.Context, req *LoginReq) (*LoginResp, mir.Error) + + mustEmbedUnimplementedUserServant() +} + +type UserBinding interface { + BindLogin(c *gin.Context) (*LoginReq, mir.Error) + + mustEmbedUnimplementedUserBinding() +} + +type UserRender interface { + RenderLogout(c *gin.Context, err mir.Error) + RenderLogin(c *gin.Context, data *LoginResp, err mir.Error) + + mustEmbedUnimplementedUserRender() +} + +// RegisterUserServant register User servant to gin +func RegisterUserServant(e *gin.Engine, s User, b UserBinding, r UserRender) { + router := e.Group("r/v1") + // use chain for router + middlewares := s.Chain() + router.Use(middlewares...) + + // register routes info to router + router.Handle("POST", "/user/logout/", func(c *gin.Context) { + r.RenderLogout(c, s.Logout(c)) + }) + + router.Handle("POST", "/user/login/", func(c *gin.Context) { + req, err := b.BindLogin(c) + if err != nil { + r.RenderLogin(c, nil, err) + } + resp, err := s.Login(c, req) + r.RenderLogin(c, resp, err) + }) + +} + +// UnimplementedUserServant can be embedded to have forward compatible implementations. +type UnimplementedUserServant struct { +} + +func (UnimplementedUserServant) Chain() gin.HandlersChain { + return nil +} + +func (UnimplementedUserServant) Logout(c *gin.Context) mir.Error { + return mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedUserServant) Login(c *gin.Context, req *LoginReq) (*LoginResp, mir.Error) { + return nil, mir.Errorln(http.StatusNotImplemented, http.StatusText(http.StatusNotImplemented)) +} + +func (UnimplementedUserServant) mustEmbedUnimplementedUserServant() {} + +// UnimplementedUserRender can be embedded to have forward compatible implementations. +type UnimplementedUserRender struct { + RenderAny func(*gin.Context, any, mir.Error) +} + +func (r *UnimplementedUserRender) RenderLogout(c *gin.Context, err mir.Error) { + r.RenderAny(c, nil, err) +} + +func (r *UnimplementedUserRender) RenderLogin(c *gin.Context, data *LoginResp, err mir.Error) { + r.RenderAny(c, data, err) +} + +func (r *UnimplementedUserRender) mustEmbedUnimplementedUserRender() {} + +// UnimplementedUserBinding can be embedded to have forward compatible implementations. +type UnimplementedUserBinding struct { + BindAny func(*gin.Context, any) mir.Error +} + +func (b *UnimplementedUserBinding) BindLogin(c *gin.Context) (*LoginReq, mir.Error) { + obj := new(LoginReq) + err := b.BindAny(c, obj) + return obj, err +} + +func (b *UnimplementedUserBinding) mustEmbedUnimplementedUserBinding() {} diff --git a/internal/mirc/auto/api/v1/web_core.go b/internal/mirc/auto/api/v1/web_core.go index 3e7d3d65..6f1efce6 100644 --- a/internal/mirc/auto/api/v1/web_core.go +++ b/internal/mirc/auto/api/v1/web_core.go @@ -86,8 +86,8 @@ func RegisterWebCoreServant(e *gin.Engine, s WebCore, b WebCoreBinding, r WebCor h := func(c *gin.Context) { r.RenderArticles(c, s.Articles(c)) } - router.Handle("HEAD", "/articles/:category/", h) router.Handle("GET", "/articles/:category/", h) + router.Handle("HEAD", "/articles/:category/", h) } router.Handle("GET", "/index/", func(c *gin.Context) { diff --git a/internal/mirc/main.go b/internal/mirc/main.go index 5bef4944..34120f36 100644 --- a/internal/mirc/main.go +++ b/internal/mirc/main.go @@ -11,6 +11,7 @@ import ( . "github.com/alimy/mir/v3/engine" _ "github.com/rocboss/paopao-ce/internal/mirc/routes/m/v1" + _ "github.com/rocboss/paopao-ce/internal/mirc/routes/r/v1" _ "github.com/rocboss/paopao-ce/internal/mirc/routes/s/v1" _ "github.com/rocboss/paopao-ce/internal/mirc/routes/v1" _ "github.com/rocboss/paopao-ce/internal/mirc/routes/x/v1" diff --git a/internal/mirc/routes/README.md b/internal/mirc/routes/README.md index fb8728e2..d7d0b9fb 100644 --- a/internal/mirc/routes/README.md +++ b/internal/mirc/routes/README.md @@ -2,6 +2,7 @@ 本目录包含所有RESTful API相关定义文件 * v1 - Web系列 v1版本 相关RESTful API相关定义文件 -* m - Manager系列相关RESTful API相关定义文件 +* m - Admin后台运维系列相关RESTful API相关定义文件 * x - SpaceX系列相关RESTful API相关定义文件 * s - LocalOSS OBS系列RESTful API相关定义文件 +* r - Bot系列相关RESTful API相关定义文件 diff --git a/internal/mirc/routes/m/README.md b/internal/mirc/routes/m/README.md index 2c6a4431..c9fa71b9 100644 --- a/internal/mirc/routes/m/README.md +++ b/internal/mirc/routes/m/README.md @@ -1,4 +1,4 @@ -### Manager系列RESTful API相关定义文件 -本目录包含 Manager后台运维相关API定义文件。 +### Admin系列RESTful API相关定义文件 +本目录包含 Admin后台运维相关API定义文件。 * v1 - v1版本API diff --git a/internal/mirc/routes/r/README.md b/internal/mirc/routes/r/README.md new file mode 100644 index 00000000..a1aa83ac --- /dev/null +++ b/internal/mirc/routes/r/README.md @@ -0,0 +1,4 @@ +### Bot系列RESTful API相关定义文件 +本目录包含 Bot相关API定义文件。 + +* v1 - v1版本API diff --git a/internal/mirc/routes/r/v1/user.go b/internal/mirc/routes/r/v1/user.go new file mode 100644 index 00000000..a4839673 --- /dev/null +++ b/internal/mirc/routes/r/v1/user.go @@ -0,0 +1,42 @@ +package v1 + +import ( + . "github.com/alimy/mir/v3" + . "github.com/alimy/mir/v3/engine" +) + +func init() { + AddEntry(new(User)) +} + +type AgentInfo struct { + Platform string `json:"platform"` + UserAgent string `json:"user_agent"` +} + +type ServerInfo struct { + ApiVer string `json:"api_ver"` +} + +type UserInfo struct { + Name string `json:"name"` +} + +type LoginReq struct { + AgentInfo AgentInfo `json:"agent_info"` + Name string `json:"name"` + Passwd string `json:"passwd"` +} + +type LoginResp struct { + UserInfo + ServerInfo ServerInfo `json:"server_info"` + JwtToken string `json:"jwt_token"` +} + +type User struct { + Chain Chain `mir:"-"` + Group Group `mir:"r/v1"` + Login func(Post, LoginReq) LoginResp `mir:"/user/login/"` + Logout func(Post) `mir:"/user/logout/"` +} diff --git a/internal/servants/admin/admin.go b/internal/servants/admin/admin.go new file mode 100644 index 00000000..3fa2a7cf --- /dev/null +++ b/internal/servants/admin/admin.go @@ -0,0 +1,15 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package admin + +import ( + "github.com/gin-gonic/gin" + api "github.com/rocboss/paopao-ce/internal/mirc/auto/api/m/v1" +) + +// RouteWeb register Manager route +func RouteManager(e *gin.Engine) { + api.RegisterUserServant(e, newUserSrv(), newUserBinding(), newUserRender()) +} diff --git a/internal/servants/admin/user.go b/internal/servants/admin/user.go new file mode 100644 index 00000000..6c3f11ab --- /dev/null +++ b/internal/servants/admin/user.go @@ -0,0 +1,51 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package admin + +import ( + api "github.com/rocboss/paopao-ce/internal/mirc/auto/api/m/v1" + "github.com/rocboss/paopao-ce/internal/servants/base" +) + +var ( + _ api.User = (*userSrv)(nil) + _ api.UserBinding = (*userBinding)(nil) + _ api.UserRender = (*userRender)(nil) +) + +type userSrv struct { + base.BaseServant + api.UnimplementedUserServant +} + +type userBinding struct { + base.BaseBinding + *api.UnimplementedUserBinding +} + +type userRender struct { + base.BaseRender + *api.UnimplementedUserRender +} + +func newUserSrv() api.User { + return &userSrv{} +} + +func newUserBinding() api.UserBinding { + return &userBinding{ + UnimplementedUserBinding: &api.UnimplementedUserBinding{ + BindAny: base.BindAny, + }, + } +} + +func newUserRender() api.UserRender { + return &userRender{ + UnimplementedUserRender: &api.UnimplementedUserRender{ + RenderAny: base.RenderAny, + }, + } +} diff --git a/internal/servants/bot/bot.go b/internal/servants/bot/bot.go new file mode 100644 index 00000000..6ddd6846 --- /dev/null +++ b/internal/servants/bot/bot.go @@ -0,0 +1,15 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package bot + +import ( + "github.com/gin-gonic/gin" + api "github.com/rocboss/paopao-ce/internal/mirc/auto/api/r/v1" +) + +// RouteBot register Bot route +func RouteBot(e *gin.Engine) { + api.RegisterUserServant(e, newUserSrv(), newUserBinding(), newUserRender()) +} diff --git a/internal/servants/bot/user.go b/internal/servants/bot/user.go new file mode 100644 index 00000000..9f17a6e8 --- /dev/null +++ b/internal/servants/bot/user.go @@ -0,0 +1,51 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package bot + +import ( + api "github.com/rocboss/paopao-ce/internal/mirc/auto/api/r/v1" + "github.com/rocboss/paopao-ce/internal/servants/base" +) + +var ( + _ api.User = (*userSrv)(nil) + _ api.UserBinding = (*userBinding)(nil) + _ api.UserRender = (*userRender)(nil) +) + +type userSrv struct { + base.BaseServant + api.UnimplementedUserServant +} + +type userBinding struct { + base.BaseBinding + *api.UnimplementedUserBinding +} + +type userRender struct { + base.BaseRender + *api.UnimplementedUserRender +} + +func newUserSrv() api.User { + return &userSrv{} +} + +func newUserBinding() api.UserBinding { + return &userBinding{ + UnimplementedUserBinding: &api.UnimplementedUserBinding{ + BindAny: base.BindAny, + }, + } +} + +func newUserRender() api.UserRender { + return &userRender{ + UnimplementedUserRender: &api.UnimplementedUserRender{ + RenderAny: base.RenderAny, + }, + } +} diff --git a/internal/servants/localoss/localoss.go b/internal/servants/localoss/localoss.go index 828b3be2..721f0407 100644 --- a/internal/servants/localoss/localoss.go +++ b/internal/servants/localoss/localoss.go @@ -9,13 +9,10 @@ import ( "github.com/gin-gonic/gin" "github.com/rocboss/paopao-ce/internal/conf" + api "github.com/rocboss/paopao-ce/internal/mirc/auto/api/s/v1" "github.com/sirupsen/logrus" ) -type localossSrv struct { - // TODO -} - // RouteLocalOSS register LocalOSS route if needed func RouteLocalOSS(e *gin.Engine) { savePath, err := filepath.Abs(conf.LocalOSSSetting.SavePath) @@ -26,3 +23,8 @@ func RouteLocalOSS(e *gin.Engine) { logrus.Infof("register LocalOSS route in /oss on save path: %s", savePath) } + +// RouteLocaloss register LocalOSS route if needed +func RouteLocaloss(e *gin.Engine) { + api.RegisterUserServant(e, newUserSrv(), newUserBinding(), newUserRender()) +} diff --git a/internal/servants/localoss/user.go b/internal/servants/localoss/user.go new file mode 100644 index 00000000..b8d2309a --- /dev/null +++ b/internal/servants/localoss/user.go @@ -0,0 +1,51 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package localoss + +import ( + api "github.com/rocboss/paopao-ce/internal/mirc/auto/api/s/v1" + "github.com/rocboss/paopao-ce/internal/servants/base" +) + +var ( + _ api.User = (*userSrv)(nil) + _ api.UserBinding = (*userBinding)(nil) + _ api.UserRender = (*userRender)(nil) +) + +type userSrv struct { + base.BaseServant + api.UnimplementedUserServant +} + +type userBinding struct { + base.BaseBinding + *api.UnimplementedUserBinding +} + +type userRender struct { + base.BaseRender + *api.UnimplementedUserRender +} + +func newUserSrv() api.User { + return &userSrv{} +} + +func newUserBinding() api.UserBinding { + return &userBinding{ + UnimplementedUserBinding: &api.UnimplementedUserBinding{ + BindAny: base.BindAny, + }, + } +} + +func newUserRender() api.UserRender { + return &userRender{ + UnimplementedUserRender: &api.UnimplementedUserRender{ + RenderAny: base.RenderAny, + }, + } +} diff --git a/internal/servants/servants.go b/internal/servants/servants.go index 9ae3d0a7..496a60c1 100644 --- a/internal/servants/servants.go +++ b/internal/servants/servants.go @@ -6,8 +6,11 @@ package servants import ( "github.com/gin-gonic/gin" + "github.com/rocboss/paopao-ce/internal/servants/admin" + "github.com/rocboss/paopao-ce/internal/servants/bot" "github.com/rocboss/paopao-ce/internal/servants/docs" "github.com/rocboss/paopao-ce/internal/servants/localoss" + "github.com/rocboss/paopao-ce/internal/servants/space" "github.com/rocboss/paopao-ce/internal/servants/statick" "github.com/rocboss/paopao-ce/internal/servants/web" "github.com/rocboss/paopao-ce/pkg/cfg" @@ -24,3 +27,23 @@ func RegisterWebServants(e *gin.Engine) { web.RouteWeb(e) } + +// RegisterAdminServants register all the servants to gin.Engine +func RegisterAdminServants(e *gin.Engine) { + admin.RouteManager(e) +} + +// RegisterSpaceXServants register all the servants to gin.Engine +func RegisterSpaceXServants(e *gin.Engine) { + space.RouteSpaceX(e) +} + +// RegisterBotServants register all the servants to gin.Engine +func RegisterBotServants(e *gin.Engine) { + bot.RouteBot(e) +} + +// RegisterLocalossServants register all the servants to gin.Engine +func RegisterLocalossServants(e *gin.Engine) { + localoss.RouteLocaloss(e) +} diff --git a/internal/servants/space/space.go b/internal/servants/space/space.go new file mode 100644 index 00000000..311f76b0 --- /dev/null +++ b/internal/servants/space/space.go @@ -0,0 +1,15 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package space + +import ( + "github.com/gin-gonic/gin" + api "github.com/rocboss/paopao-ce/internal/mirc/auto/api/x/v1" +) + +// RouteWeb register SpaceX route +func RouteSpaceX(e *gin.Engine) { + api.RegisterUserServant(e, newUserSrv(), newUserBinding(), newUserRender()) +} diff --git a/internal/servants/space/user.go b/internal/servants/space/user.go new file mode 100644 index 00000000..2e6014a0 --- /dev/null +++ b/internal/servants/space/user.go @@ -0,0 +1,51 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package space + +import ( + api "github.com/rocboss/paopao-ce/internal/mirc/auto/api/x/v1" + "github.com/rocboss/paopao-ce/internal/servants/base" +) + +var ( + _ api.User = (*userSrv)(nil) + _ api.UserBinding = (*userBinding)(nil) + _ api.UserRender = (*userRender)(nil) +) + +type userSrv struct { + base.BaseServant + api.UnimplementedUserServant +} + +type userBinding struct { + base.BaseBinding + *api.UnimplementedUserBinding +} + +type userRender struct { + base.BaseRender + *api.UnimplementedUserRender +} + +func newUserSrv() api.User { + return &userSrv{} +} + +func newUserBinding() api.UserBinding { + return &userBinding{ + UnimplementedUserBinding: &api.UnimplementedUserBinding{ + BindAny: base.BindAny, + }, + } +} + +func newUserRender() api.UserRender { + return &userRender{ + UnimplementedUserRender: &api.UnimplementedUserRender{ + RenderAny: base.RenderAny, + }, + } +} diff --git a/internal/service/admin.go b/internal/service/admin.go new file mode 100644 index 00000000..ad965e80 --- /dev/null +++ b/internal/service/admin.go @@ -0,0 +1,86 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package service + +import ( + "fmt" + "net/http" + + "github.com/fatih/color" + "github.com/gin-contrib/cors" + "github.com/gin-gonic/gin" + "github.com/rocboss/paopao-ce/internal/conf" + "github.com/rocboss/paopao-ce/internal/servants" +) + +type adminService struct { + *baseHttpService +} + +func (s *adminService) Name() string { + return "AdminService" +} + +func (s *adminService) Init() error { + s.registerRoute(servants.RegisterAdminServants) + return nil +} + +func (s *adminService) String() string { + return fmt.Sprintf("listen on %s\n", color.GreenString("http://%s:%s", conf.AdminServerSetting.HttpIp, conf.AdminServerSetting.HttpPort)) +} + +func newAdminEngine() *gin.Engine { + e := gin.New() + e.HandleMethodNotAllowed = true + e.Use(gin.Logger()) + e.Use(gin.Recovery()) + + // 跨域配置 + corsConfig := cors.DefaultConfig() + corsConfig.AllowAllOrigins = true + corsConfig.AddAllowHeaders("Authorization") + e.Use(cors.New(corsConfig)) + + // 默认404 + e.NoRoute(func(c *gin.Context) { + c.JSON(http.StatusNotFound, gin.H{ + "code": 404, + "msg": "Not Found", + }) + }) + + // 默认405 + e.NoMethod(func(c *gin.Context) { + c.JSON(http.StatusMethodNotAllowed, gin.H{ + "code": 405, + "msg": "Method Not Allowed", + }) + }) + + return e +} + +func newAdminService() Service { + addr := conf.AdminServerSetting.HttpIp + ":" + conf.AdminServerSetting.HttpPort + server := httpServerFrom(addr, func() *httpServer { + engine := newAdminEngine() + return &httpServer{ + e: engine, + server: &http.Server{ + Addr: addr, + Handler: engine, + ReadTimeout: conf.AdminServerSetting.ReadTimeout, + WriteTimeout: conf.AdminServerSetting.WriteTimeout, + MaxHeaderBytes: 1 << 20, + }, + } + }) + return &adminService{ + baseHttpService: &baseHttpService{ + server: server, + }, + } +} diff --git a/internal/service/bot.go b/internal/service/bot.go new file mode 100644 index 00000000..b9c66793 --- /dev/null +++ b/internal/service/bot.go @@ -0,0 +1,86 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package service + +import ( + "fmt" + "net/http" + + "github.com/fatih/color" + "github.com/gin-contrib/cors" + "github.com/gin-gonic/gin" + "github.com/rocboss/paopao-ce/internal/conf" + "github.com/rocboss/paopao-ce/internal/servants" +) + +type botService struct { + *baseHttpService +} + +func (s *botService) Name() string { + return "BotService" +} + +func (s *botService) Init() error { + s.registerRoute(servants.RegisterBotServants) + return nil +} + +func (s *botService) String() string { + return fmt.Sprintf("listen on %s\n", color.GreenString("http://%s:%s", conf.BotServerSetting.HttpIp, conf.BotServerSetting.HttpPort)) +} + +func newBotEngine() *gin.Engine { + e := gin.New() + e.HandleMethodNotAllowed = true + e.Use(gin.Logger()) + e.Use(gin.Recovery()) + + // 跨域配置 + corsConfig := cors.DefaultConfig() + corsConfig.AllowAllOrigins = true + corsConfig.AddAllowHeaders("Authorization") + e.Use(cors.New(corsConfig)) + + // 默认404 + e.NoRoute(func(c *gin.Context) { + c.JSON(http.StatusNotFound, gin.H{ + "code": 404, + "msg": "Not Found", + }) + }) + + // 默认405 + e.NoMethod(func(c *gin.Context) { + c.JSON(http.StatusMethodNotAllowed, gin.H{ + "code": 405, + "msg": "Method Not Allowed", + }) + }) + + return e +} + +func newBotService() Service { + addr := conf.BotServerSetting.HttpIp + ":" + conf.BotServerSetting.HttpPort + server := httpServerFrom(addr, func() *httpServer { + engine := newBotEngine() + return &httpServer{ + e: engine, + server: &http.Server{ + Addr: addr, + Handler: engine, + ReadTimeout: conf.BotServerSetting.ReadTimeout, + WriteTimeout: conf.BotServerSetting.WriteTimeout, + MaxHeaderBytes: 1 << 20, + }, + } + }) + return &botService{ + baseHttpService: &baseHttpService{ + server: server, + }, + } +} diff --git a/internal/service/localoss.go b/internal/service/localoss.go new file mode 100644 index 00000000..18dd79f9 --- /dev/null +++ b/internal/service/localoss.go @@ -0,0 +1,61 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package service + +import ( + "fmt" + "net/http" + + "github.com/fatih/color" + "github.com/gin-gonic/gin" + "github.com/rocboss/paopao-ce/internal/conf" + "github.com/rocboss/paopao-ce/internal/servants" +) + +type localossService struct { + *baseHttpService +} + +func (s *localossService) Name() string { + return "LocalossService" +} + +func (s *localossService) Init() error { + s.registerRoute(servants.RegisterLocalossServants) + return nil +} + +func (s *localossService) String() string { + return fmt.Sprintf("listen on %s\n", color.GreenString("http://%s:%s", conf.LocalossServerSetting.HttpIp, conf.LocalossServerSetting.HttpPort)) +} + +func newLocalossEngine() *gin.Engine { + e := gin.New() + e.Use(gin.Logger()) + e.Use(gin.Recovery()) + return e +} + +func newLocalossService() Service { + addr := conf.LocalossServerSetting.HttpIp + ":" + conf.LocalossServerSetting.HttpPort + server := httpServerFrom(addr, func() *httpServer { + engine := newLocalossEngine() + return &httpServer{ + e: engine, + server: &http.Server{ + Addr: addr, + Handler: engine, + ReadTimeout: conf.LocalossServerSetting.ReadTimeout, + WriteTimeout: conf.LocalossServerSetting.WriteTimeout, + MaxHeaderBytes: 1 << 20, + }, + } + }) + return &localossService{ + baseHttpService: &baseHttpService{ + server: server, + }, + } +} diff --git a/internal/service/service.go b/internal/service/service.go index a69c8c91..549ae2f1 100644 --- a/internal/service/service.go +++ b/internal/service/service.go @@ -46,5 +46,20 @@ func newService() (ss []Service) { ss = append(ss, newOldWebService()) }) + cfg.In(cfg.Actions{ + "Admin": func() { + ss = append(ss, newAdminService()) + }, + "SpaceX": func() { + ss = append(ss, newSpaceXService()) + }, + "Bot": func() { + ss = append(ss, newBotService()) + }, + "LocalOSS": func() { + ss = append(ss, newLocalossService()) + }, + }) + return } diff --git a/internal/service/space.go b/internal/service/space.go new file mode 100644 index 00000000..3866c5ac --- /dev/null +++ b/internal/service/space.go @@ -0,0 +1,86 @@ +// Copyright 2022 ROC. All rights reserved. +// Use of this source code is governed by a MIT style +// license that can be found in the LICENSE file. + +package service + +import ( + "fmt" + "net/http" + + "github.com/fatih/color" + "github.com/gin-contrib/cors" + "github.com/gin-gonic/gin" + "github.com/rocboss/paopao-ce/internal/conf" + "github.com/rocboss/paopao-ce/internal/servants" +) + +type spaceXService struct { + *baseHttpService +} + +func (s *spaceXService) Name() string { + return "WebService" +} + +func (s *spaceXService) Init() error { + s.registerRoute(servants.RegisterSpaceXServants) + return nil +} + +func (s *spaceXService) String() string { + return fmt.Sprintf("listen on %s\n", color.GreenString("http://%s:%s", conf.SpaceXServerSetting.HttpIp, conf.SpaceXServerSetting.HttpPort)) +} + +func newSpaceXEngine() *gin.Engine { + e := gin.New() + e.HandleMethodNotAllowed = true + e.Use(gin.Logger()) + e.Use(gin.Recovery()) + + // 跨域配置 + corsConfig := cors.DefaultConfig() + corsConfig.AllowAllOrigins = true + corsConfig.AddAllowHeaders("Authorization") + e.Use(cors.New(corsConfig)) + + // 默认404 + e.NoRoute(func(c *gin.Context) { + c.JSON(http.StatusNotFound, gin.H{ + "code": 404, + "msg": "Not Found", + }) + }) + + // 默认405 + e.NoMethod(func(c *gin.Context) { + c.JSON(http.StatusMethodNotAllowed, gin.H{ + "code": 405, + "msg": "Method Not Allowed", + }) + }) + + return e +} + +func newSpaceXService() Service { + addr := conf.SpaceXServerSetting.HttpIp + ":" + conf.SpaceXServerSetting.HttpPort + server := httpServerFrom(addr, func() *httpServer { + engine := newSpaceXEngine() + return &httpServer{ + e: engine, + server: &http.Server{ + Addr: addr, + Handler: engine, + ReadTimeout: conf.SpaceXServerSetting.ReadTimeout, + WriteTimeout: conf.SpaceXServerSetting.WriteTimeout, + MaxHeaderBytes: 1 << 20, + }, + } + }) + return &spaceXService{ + baseHttpService: &baseHttpService{ + server: server, + }, + } +}