mirror of
https://github.com/h44z/wg-portal.git
synced 2025-04-19 08:55:12 +00:00
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
76 lines
3.1 KiB
Go
76 lines
3.1 KiB
Go
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"`
|
|
}
|