package server import ( "be-vpn/internal/dto" "be-vpn/internal/model" "github.com/gin-gonic/gin" "log" "net/http" "sync" "time" ) var nodes = make([]*model.Node, 0) var locker = sync.RWMutex{} func Config(c *gin.Context) { c.JSON(http.StatusOK, dto.ConfigResponse{ Response: dto.NewOkResponse(), Data: dto.ConfigResult{ FreeTrialDuration: (time.Hour * 1).Milliseconds() / 1000, }, }) } func Register(c *gin.Context) { locker.Lock() defer locker.Unlock() var request dto.RegisterRequest if err := c.ShouldBindJSON(&request); err != nil { dto.BadRequest(c, err) return } for _, node := range nodes { if node.Ip == request.Ip { node.Ip = request.Ip node.Secret = request.Secret node.CountryCode = request.CountryCode node.CountryName = request.CountryName node.LastUpdateTime = time.Now() c.JSON(http.StatusOK, dto.RegisterResponse{ Response: dto.NewOkResponse(), Data: dto.RegisterResult{ Success: true, }, }) return } } node := &model.Node{ Ip: request.Ip, Secret: request.Secret, LastUpdateTime: time.Now(), } nodes = append(nodes, node) log.Printf("update nodes: %+v", nodes) } func List(c *gin.Context) { locker.RLock() defer locker.RUnlock() dtoNodes := make([]dto.Node, 0) for _, node := range nodes { if node.LastUpdateTime.Add(10 * time.Second).After(time.Now()) { dtoNodes = append(dtoNodes, dto.Node{ Ip: node.Ip, CountryCode: node.CountryCode, CountryName: node.CountryName, }) } } c.JSON(http.StatusOK, dto.ListResponse{ Response: dto.NewOkResponse(), Data: dtoNodes, }) } func Secret(c *gin.Context) { locker.RLock() defer locker.RUnlock() var request dto.DetailRequest if err := c.ShouldBindQuery(&request); err != nil { dto.BadRequest(c, err) return } for _, node := range nodes { if node.Ip == request.Ip { //secret, err := util.AesEncrypt([]byte(node.Secret)) //if err != nil { // dto.Error(c, err) // return //} c.Header("Content-Disposition", "attachment; filename=client.ovpn") c.Data(http.StatusOK, "plain/text", []byte(node.Secret)) return } } c.JSON(http.StatusNotFound, gin.H{ "message": "not found ip", }) } func Health(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"status": "up"}) }