124 lines
3.1 KiB
Go
124 lines
3.1 KiB
Go
package repository
|
||
|
||
import (
|
||
"encoding/json"
|
||
"github.com/spf13/cast"
|
||
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
|
||
"gorm.io/gorm"
|
||
"wireguard-dashboard/client"
|
||
"wireguard-dashboard/http/param"
|
||
"wireguard-dashboard/model/entity"
|
||
"wireguard-dashboard/model/template_data"
|
||
"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
|
||
}
|
||
|
||
// Save
|
||
// @description: 新增/编辑客户端
|
||
// @receiver r
|
||
// @param p
|
||
// @param adminId
|
||
// @return err
|
||
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{
|
||
PrivateKey: privateKey.String(),
|
||
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,
|
||
Enabled: true,
|
||
}
|
||
|
||
err = r.Model(&entity.Client{}).Create(ent).Error
|
||
return
|
||
}
|