mirror of https://github.com/h44z/wg-portal.git
				
				
				
			
		
			
				
	
	
		
			95 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Go
		
	
	
	
| package handlers
 | |
| 
 | |
| import (
 | |
| 	"errors"
 | |
| 	"net/http"
 | |
| 
 | |
| 	"github.com/go-pkgz/routegroup"
 | |
| 
 | |
| 	"github.com/h44z/wg-portal/internal/app/api/core"
 | |
| 	"github.com/h44z/wg-portal/internal/app/api/core/middleware/cors"
 | |
| 	"github.com/h44z/wg-portal/internal/app/api/v1/models"
 | |
| 	"github.com/h44z/wg-portal/internal/domain"
 | |
| )
 | |
| 
 | |
| type Handler interface {
 | |
| 	// GetName returns the name of the handler.
 | |
| 	GetName() string
 | |
| 	// RegisterRoutes registers the routes for the handler. The session manager is passed to the handler.
 | |
| 	RegisterRoutes(g *routegroup.Bundle)
 | |
| }
 | |
| 
 | |
| // To compile the API documentation use the
 | |
| // api_build_tool
 | |
| // command that can be found in the $PROJECT_ROOT/cmd/api_build_tool directory.
 | |
| 
 | |
| // @title WireGuard Portal Public API
 | |
| // @version 1.0
 | |
| // @description The WireGuard Portal REST API enables efficient management of WireGuard VPN configurations through a set of JSON-based endpoints.
 | |
| // @description It supports creating and editing peers, interfaces, and user profiles, while also providing role-based access control and auditing.
 | |
| // @description This API allows seamless integration with external tools or scripts for automated network configuration and administration.
 | |
| 
 | |
| // @license.name MIT
 | |
| // @license.url https://github.com/h44z/wg-portal/blob/master/LICENSE.txt
 | |
| 
 | |
| // @contact.name WireGuard Portal Project
 | |
| // @contact.url https://github.com/h44z/wg-portal
 | |
| 
 | |
| // @securityDefinitions.basic BasicAuth
 | |
| 
 | |
| // @BasePath /api/v1
 | |
| // @query.collection.format multi
 | |
| 
 | |
| func NewRestApi(handlers ...Handler) core.ApiEndpointSetupFunc {
 | |
| 	return func() (core.ApiVersion, core.GroupSetupFn) {
 | |
| 		return "v1", func(group *routegroup.Bundle) {
 | |
| 			group.Use(cors.New().Handler)
 | |
| 
 | |
| 			// Handler functions
 | |
| 			for _, h := range handlers {
 | |
| 				h.RegisterRoutes(group)
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func ParseServiceError(err error) (int, models.Error) {
 | |
| 	if err == nil {
 | |
| 		return 500, models.Error{
 | |
| 			Code:    500,
 | |
| 			Message: "unknown server error",
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	code := http.StatusInternalServerError
 | |
| 	switch {
 | |
| 	case errors.Is(err, domain.ErrNotFound):
 | |
| 		code = http.StatusNotFound
 | |
| 	case errors.Is(err, domain.ErrNoPermission):
 | |
| 		code = http.StatusForbidden
 | |
| 	case errors.Is(err, domain.ErrDuplicateEntry):
 | |
| 		code = http.StatusConflict
 | |
| 	case errors.Is(err, domain.ErrInvalidData):
 | |
| 		code = http.StatusBadRequest
 | |
| 	}
 | |
| 
 | |
| 	return code, models.Error{
 | |
| 		Code:    code,
 | |
| 		Message: err.Error(),
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // region handler-interfaces
 | |
| 
 | |
| type Authenticator interface {
 | |
| 	// LoggedIn checks if a user is logged in. If scopes are given, they are validated as well.
 | |
| 	LoggedIn(scopes ...Scope) func(next http.Handler) http.Handler
 | |
| }
 | |
| 
 | |
| type Validator interface {
 | |
| 	// Struct validates the given struct.
 | |
| 	Struct(s interface{}) error
 | |
| }
 | |
| 
 | |
| // endregion handler-interfaces
 |