2024-03-13 17:30:39 +08:00

124 lines
3.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}