mirror of
https://github.com/h44z/wg-portal.git
synced 2025-04-19 08:55:12 +00:00
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
|