provide^Wupdate docs of package web
continuous-integration/drone the build is pending
Details
continuous-integration/drone the build is pending
Details
This commit is contained in:
parent
6af94245b6
commit
b10fc5b588
|
@ -1,6 +1,6 @@
|
|||
package web
|
||||
|
||||
// HTTPError as a response, with data
|
||||
// HTTPError is returned in HTTP error responses.
|
||||
type HTTPError struct {
|
||||
Message string `json:"message" example:"invalid format"`
|
||||
Error string `json:"error,omitempty" example:"<internal error message>"`
|
||||
|
@ -8,10 +8,7 @@ type HTTPError struct {
|
|||
}
|
||||
|
||||
const (
|
||||
// APIErrorInvalidRequestFormat const for api error with invalid request format
|
||||
APIErrorInvalidRequestFormat = "Invalid Request Format"
|
||||
// APIErrorInternalDatabase const for api error with problem with database
|
||||
APIErrorInternalDatabase = "Internal Database Error"
|
||||
// APIErrorNotFound const for api error with not found object
|
||||
APIErrorNotFound = "Not found"
|
||||
APIErrorInternalDatabase = "Internal Database Error"
|
||||
APIErrorNotFound = "Not found"
|
||||
)
|
||||
|
|
34
web/main.go
34
web/main.go
|
@ -1,3 +1,12 @@
|
|||
/*
|
||||
Package web implements common functionality for web APIs using Gin and Gorm.
|
||||
|
||||
Modules
|
||||
|
||||
Modules provide functionality for a web server. A module is a function executed
|
||||
before starting a server, accessing the Service and the Gin Engine. Each Service
|
||||
maintains a list of modules. When it runs, it executes all of its modules.
|
||||
*/
|
||||
package web
|
||||
|
||||
import (
|
||||
|
@ -13,8 +22,7 @@ import (
|
|||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
// Service to store Configuration and Webserver wide objects
|
||||
// (like DB Connection)
|
||||
// A Service stores configuration of a server.
|
||||
type Service struct {
|
||||
// config
|
||||
Listen string `toml:"listen"`
|
||||
|
@ -36,32 +44,32 @@ type Service struct {
|
|||
modules []ModuleRegisterFunc
|
||||
}
|
||||
|
||||
// Run to startup all related web parts
|
||||
// (e.g. configure the server, metrics, and finally bind routing)
|
||||
func (config *Service) Run() error {
|
||||
// Run creates, configures, and runs a new gin.Engine using its registered
|
||||
// modules.
|
||||
func (s *Service) Run() error {
|
||||
gin.EnableJsonDecoderDisallowUnknownFields()
|
||||
gin.SetMode(gin.ReleaseMode)
|
||||
r := gin.New()
|
||||
// catch crashed
|
||||
r.Use(gin.Recovery())
|
||||
|
||||
if config.AccessLog {
|
||||
if s.AccessLog {
|
||||
r.Use(gin.Logger())
|
||||
log.Debug("request logging enabled")
|
||||
}
|
||||
config.LoadSession(r)
|
||||
config.Bind(r)
|
||||
s.LoadSession(r)
|
||||
s.Bind(r)
|
||||
|
||||
if config.ACME.Enable {
|
||||
if config.Listen != "" {
|
||||
if s.ACME.Enable {
|
||||
if s.Listen != "" {
|
||||
log.Panic("For ACME / Let's Encrypt it is not possible to set `listen`")
|
||||
}
|
||||
m := autocert.Manager{
|
||||
Prompt: autocert.AcceptTOS,
|
||||
HostPolicy: autocert.HostWhitelist(config.ACME.Domains...),
|
||||
Cache: autocert.DirCache(config.ACME.Cache),
|
||||
HostPolicy: autocert.HostWhitelist(s.ACME.Domains...),
|
||||
Cache: autocert.DirCache(s.ACME.Cache),
|
||||
}
|
||||
return autotls.RunWithManager(r, &m)
|
||||
}
|
||||
return r.Run(config.Listen)
|
||||
return r.Run(s.Listen)
|
||||
}
|
||||
|
|
|
@ -6,15 +6,15 @@ import (
|
|||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
// ModuleRegisterFunc format of module which registered to WebService
|
||||
// A ModuleRegisterFunc is a module.
|
||||
type ModuleRegisterFunc func(*gin.Engine, *Service)
|
||||
|
||||
// ModuleRegister used on start of WebService
|
||||
// ModuleRegister adds f to ws's list of modules.
|
||||
func (ws *Service) ModuleRegister(f ModuleRegisterFunc) {
|
||||
ws.modules = append(ws.modules, f)
|
||||
}
|
||||
|
||||
// Bind WebService to gin.Engine
|
||||
// Bind executes all of ws's modules with r.
|
||||
func (ws *Service) Bind(r *gin.Engine) {
|
||||
for _, f := range ws.modules {
|
||||
f(r, ws)
|
||||
|
|
|
@ -6,9 +6,11 @@ import (
|
|||
"time"
|
||||
)
|
||||
|
||||
// JSONRequest easy get request for json
|
||||
// JSONRequest issues a GET request to the specified URL and reads the returned
|
||||
// JSON into value. See json.Unmarshal for the rules for converting JSON into a
|
||||
// value.
|
||||
func JSONRequest(url string, value interface{}) error {
|
||||
var netClient = &http.Client{
|
||||
netClient := &http.Client{
|
||||
Timeout: time.Second * 20,
|
||||
}
|
||||
|
||||
|
@ -18,6 +20,7 @@ func JSONRequest(url string, value interface{}) error {
|
|||
}
|
||||
|
||||
err = json.NewDecoder(resp.Body).Decode(&value)
|
||||
resp.Body.Close()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
|
|
@ -5,19 +5,21 @@ import (
|
|||
)
|
||||
|
||||
const (
|
||||
// ContentTypeJSON content type of json
|
||||
ContentTypeJSON = "application/json"
|
||||
// ContentTypeJS content type of javascript
|
||||
ContentTypeJS = "application/javascript"
|
||||
// ContentTypeXML content type of xml
|
||||
ContentTypeXML = "text/xml"
|
||||
// ContentTypeYAML content type of yaml
|
||||
ContentTypeJS = "application/javascript"
|
||||
ContentTypeXML = "text/xml"
|
||||
ContentTypeYAML = "text/yaml"
|
||||
// ContentTypeHTML content type of html
|
||||
ContentTypeHTML = "text/html"
|
||||
)
|
||||
|
||||
// Response give
|
||||
// Response sends an HTTP response.
|
||||
//
|
||||
// statusCode is the respone's status.
|
||||
//
|
||||
// If the request's Content-Type is JavaScript, JSON, YAML, or XML, it returns
|
||||
// data serialized as JSONP, JSON, YAML, or XML, respectively. If the
|
||||
// Content-Type is HTML, it returns the HTML template templateName rendered with
|
||||
// data.
|
||||
func Response(ctx *gin.Context, statusCode int, data interface{}, templateName string) {
|
||||
switch ctx.ContentType() {
|
||||
case ContentTypeJS:
|
||||
|
|
|
@ -6,8 +6,8 @@ import (
|
|||
"github.com/gin-gonic/gin"
|
||||
)
|
||||
|
||||
// LoadSession module to start Session Handling in WebService
|
||||
func (config *Service) LoadSession(r *gin.Engine) {
|
||||
store := cookie.NewStore([]byte(config.Session.Secret))
|
||||
r.Use(sessions.Sessions(config.Session.Name, store))
|
||||
// LoadSessions starts session handling for s.
|
||||
func (s *Service) LoadSession(r *gin.Engine) {
|
||||
store := cookie.NewStore([]byte(s.Session.Secret))
|
||||
r.Use(sessions.Sessions(s.Session.Name, store))
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue