package provisioning import ( "context" "fmt" "log" "strconv" "git.linuxforward.com/byom/byom-onboard/internal/common/models" "git.linuxforward.com/byom/byom-onboard/internal/platform/database" "github.com/gin-gonic/gin" ) type Handler struct { client ProviderClient db *database.Database } func NewHandler(client ProviderClient, db *database.Database) *Handler { return &Handler{ client: client, } } func (h *Handler) AddVPS(c *gin.Context) { var req models.AddVPSRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(400, gin.H{"error": err.Error()}) return } vps := models.VPSInstance{ DisplayName: req.DisplayName, IpAddress: req.IpAddress, Plan: req.Plan, } if err := h.db.AddVPS(&vps); err != nil { c.JSON(500, gin.H{"error": err.Error()}) return } c.JSON(200, gin.H{"message": "VPS added successfully"}) } func (h *Handler) ListVPS(c *gin.Context) { instances, err := h.db.ListVPS() if err != nil { c.JSON(500, gin.H{"error": err.Error()}) return } c.JSON(200, instances) } var mapPlanToVPS = map[string]string{ "basic": "1-2-40", "pro": "2-4-80", "enterprise": "16-16-160", } func (h *Handler) FindVPSForPlan(plan string, userID uint) (string, string, error) { vps, ok := mapPlanToVPS[plan] if !ok { return "", "", fmt.Errorf("plan not found") } availableVPS, err := h.db.GetAvailableVPS(context.Background(), vps) if err != nil { return "", "", err } //assign the vps to the user id, err := strconv.ParseUint(availableVPS[0].ID, 10, 32) if err != nil { return "", "", err } if err := h.db.AssignVPSToUser(uint(id), userID); err != nil { return "", "", err } log.Println("Found", len(availableVPS), "available VPS for plan", plan) return availableVPS[0].DisplayName, availableVPS[0].IpAddress, nil } func (h *Handler) GetVPSStatus(c *gin.Context) { var req models.GetVPSStatusRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(400, gin.H{"error": err.Error()}) return } status, err := h.client.GetVPSStatus(req.ID) if err != nil { c.JSON(500, gin.H{"error": err.Error()}) return } c.JSON(200, gin.H{"status": status}) }