2024-03-11 14:53:28 +08:00
package repository
import (
"encoding/json"
2024-03-13 17:05:02 +08:00
"github.com/spf13/cast"
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
2024-03-11 14:53:28 +08:00
"gorm.io/gorm"
"wireguard-dashboard/client"
"wireguard-dashboard/http/param"
2024-03-13 17:05:02 +08:00
"wireguard-dashboard/model/entity"
"wireguard-dashboard/model/template_data"
2024-03-11 14:53:28 +08:00
"wireguard-dashboard/model/vo"
"wireguard-dashboard/utils"
)
type clientRepo struct {
* gorm . DB
}
func Client ( ) clientRepo {
return clientRepo {
client . DB ,
}
}
// List
// @description: 列表
// @receiver r
// @param p
// @return data
// @return total
// @return err
func ( r clientRepo ) List ( p param . ClientList ) ( data [ ] vo . Client , total int64 , err error ) {
err = r . Table ( "t_wg_client as twc" ) . Scopes ( utils . Page ( p . Current , p . Size ) ) . Joins ( "LEFT JOIN t_user as tu ON twc.user_id = tu.id" ) .
Select ( "twc.id" , "twc.created_at" , "twc.updated_at" , "twc.name" , "twc.email" , "twc.subnet_range" , "twc.ip_allocation" , "twc.allowed_ips" ,
"twc.extra_allowed_ips" , "twc.endpoint" , "twc.use_server_dns" , "twc.enable_after_creation" , "twc.enabled" , "twc.keys as keys_str" , "tu.name as create_user" ) .
Find ( & data ) . Offset ( - 1 ) . Limit ( - 1 ) . Count ( & total ) . Error
if err != nil {
return
}
for i , v := range data {
if v . KeysStr != "" {
_ = json . Unmarshal ( [ ] byte ( v . KeysStr ) , & data [ i ] . Keys )
}
}
return
}
2024-03-11 17:26:41 +08:00
// Save
// @description: 新增/编辑客户端
// @receiver r
// @param p
2024-03-13 17:05:02 +08:00
// @param adminId
2024-03-11 17:26:41 +08:00
// @return err
2024-03-13 17:05:02 +08:00
func ( r clientRepo ) Save ( p param . SaveClient , adminId string ) ( client * entity . Client , err error ) {
ent := & entity . Client {
Base : entity . Base {
Id : p . Id ,
} ,
ServerId : p . ServerId ,
Name : p . Name ,
Email : p . Email ,
SubnetRange : p . SubnetRange ,
IpAllocation : p . IpAllocation ,
AllowedIps : p . AllowedIPS ,
ExtraAllowedIps : p . ExtraAllowedIPS ,
Endpoint : p . Endpoint ,
UseServerDns : p . UseServerDNS ,
EnableAfterCreation : p . EnabledAfterCreation ,
UserId : adminId ,
Enabled : cast . ToBool ( p . Enabled ) ,
}
// id不为空, 更新信息
if p . Id != "" {
keys , _ := json . Marshal ( p . Keys )
ent . Keys = string ( keys )
if err = r . Model ( & entity . Client { } ) . Where ( "id = ?" , p . Id ) . Updates ( ent ) . Error ; err != nil {
return
}
return
}
// 为空,新增
privateKey , err := wgtypes . GeneratePrivateKey ( )
if err != nil {
return
}
publicKey := privateKey . PublicKey ( ) . String ( )
presharedKey , err := wgtypes . GenerateKey ( )
if err != nil {
return
}
keys := template_data . Keys {
PublicKey : publicKey ,
PresharedKey : presharedKey . String ( ) ,
}
keysStr , _ := json . Marshal ( keys )
ent = & entity . Client {
ServerId : p . ServerId ,
Name : p . Name ,
Email : p . Email ,
SubnetRange : p . SubnetRange ,
IpAllocation : p . IpAllocation ,
AllowedIps : p . AllowedIPS ,
ExtraAllowedIps : p . ExtraAllowedIPS ,
Endpoint : p . Endpoint ,
UseServerDns : p . UseServerDNS ,
EnableAfterCreation : p . EnabledAfterCreation ,
Keys : string ( keysStr ) ,
UserId : adminId ,
}
err = r . Model ( & entity . Client { } ) . Create ( ent ) . Error
return
2024-03-11 17:26:41 +08:00
}