mirror of
https://github.com/h44z/wg-portal.git
synced 2025-09-15 07:11:15 +00:00
API - CRUD for peers, interfaces and users (#340)
Public REST API implementation to handle peers, interfaces and users. It also includes some simple provisioning endpoints. The Swagger API documentation is available under /api/v1/doc.html
This commit is contained in:
75
internal/app/api/v1/models/models_provisioning.go
Normal file
75
internal/app/api/v1/models/models_provisioning.go
Normal file
@@ -0,0 +1,75 @@
|
||||
package models
|
||||
|
||||
import "github.com/h44z/wg-portal/internal/domain"
|
||||
|
||||
// UserInformation represents the information about a user and its linked peers.
|
||||
type UserInformation struct {
|
||||
// UserIdentifier is the unique identifier of the user.
|
||||
UserIdentifier string `json:"UserIdentifier" example:"uid-1234567"`
|
||||
// PeerCount is the number of peers linked to the user.
|
||||
PeerCount int `json:"PeerCount" example:"2"`
|
||||
// Peers is a list of peers linked to the user.
|
||||
Peers []UserInformationPeer `json:"Peers"`
|
||||
}
|
||||
|
||||
// UserInformationPeer represents the information about a peer.
|
||||
type UserInformationPeer struct {
|
||||
// Identifier is the unique identifier of the peer. It equals the public key of the peer.
|
||||
Identifier string `json:"Identifier" example:"peer-1234567"`
|
||||
// DisplayName is a user-defined description of the peer.
|
||||
DisplayName string `json:"DisplayName" example:"My iPhone"`
|
||||
// IPAddresses is a list of IP addresses in CIDR format assigned to the peer.
|
||||
IpAddresses []string `json:"IpAddresses" example:"10.11.12.2/24"`
|
||||
// IsDisabled is a flag that specifies if the peer is enabled or not. Disabled peers are not able to connect.
|
||||
IsDisabled bool `json:"IsDisabled,omitempty" example:"true"`
|
||||
|
||||
// InterfaceIdentifier is the unique identifier of the WireGuard Portal device the peer is connected to.
|
||||
InterfaceIdentifier string `json:"InterfaceIdentifier" example:"wg0"`
|
||||
}
|
||||
|
||||
func NewUserInformation(user *domain.User, peers []domain.Peer) *UserInformation {
|
||||
if user == nil {
|
||||
return &UserInformation{}
|
||||
}
|
||||
|
||||
ui := &UserInformation{
|
||||
UserIdentifier: string(user.Identifier),
|
||||
PeerCount: len(peers),
|
||||
}
|
||||
|
||||
for _, peer := range peers {
|
||||
ui.Peers = append(ui.Peers, NewUserInformationPeer(peer))
|
||||
}
|
||||
|
||||
if len(ui.Peers) == 0 {
|
||||
ui.Peers = []UserInformationPeer{} // Ensure that the JSON output is an empty array instead of null.
|
||||
}
|
||||
|
||||
return ui
|
||||
}
|
||||
|
||||
func NewUserInformationPeer(peer domain.Peer) UserInformationPeer {
|
||||
up := UserInformationPeer{
|
||||
Identifier: string(peer.Identifier),
|
||||
DisplayName: peer.DisplayName,
|
||||
IpAddresses: domain.CidrsToStringSlice(peer.Interface.Addresses),
|
||||
IsDisabled: peer.IsDisabled(),
|
||||
InterfaceIdentifier: string(peer.InterfaceIdentifier),
|
||||
}
|
||||
|
||||
return up
|
||||
}
|
||||
|
||||
// ProvisioningRequest represents a request to provision a new peer.
|
||||
type ProvisioningRequest struct {
|
||||
// InterfaceIdentifier is the identifier of the WireGuard interface the peer should be linked to.
|
||||
InterfaceIdentifier string `json:"InterfaceIdentifier" example:"wg0" binding:"required"`
|
||||
// UserIdentifier is the identifier of the user the peer should be linked to.
|
||||
// If no user identifier is set, the authenticated user is used.
|
||||
UserIdentifier string `json:"UserIdentifier" example:"uid-1234567"`
|
||||
|
||||
// PublicKey is the optional public key of the peer. If no public key is set, a new key pair is generated.
|
||||
PublicKey string `json:"PublicKey" example:"xTIBA5rboUvnH4htodjb6e697QjLERt1NAB4mZqp8Dg=" binding:"omitempty,len=44"`
|
||||
// PresharedKey is the optional pre-shared key of the peer. If no pre-shared key is set, a new key is generated.
|
||||
PresharedKey string `json:"PresharedKey" example:"yAnz5TF+lXXJte14tji3zlMNq+hd2rYUIgJBgB3fBmk=" binding:"omitempty,len=44"`
|
||||
}
|
Reference in New Issue
Block a user