github.com/navikt/knorten@v0.0.0-20240419132333-1333f46ed8b6/pkg/api/compute.go (about)

     1  package api
     2  
     3  import (
     4  	"net/http"
     5  	"strconv"
     6  
     7  	"github.com/navikt/knorten/pkg/api/middlewares"
     8  
     9  	"github.com/gin-contrib/sessions"
    10  	"github.com/gin-gonic/gin"
    11  	"github.com/gin-gonic/gin/binding"
    12  	"github.com/go-playground/validator/v10"
    13  	"github.com/navikt/knorten/pkg/database/gensql"
    14  	"github.com/navikt/knorten/pkg/user"
    15  )
    16  
    17  type computeForm struct {
    18  	DiskSize string `form:"diskSize" binding:"validDiskSize"`
    19  }
    20  
    21  func (c *client) setupComputeRoutes() {
    22  	if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
    23  		err := v.RegisterValidation("validDiskSize", user.ValidateDiskSize)
    24  		if err != nil {
    25  			c.log.WithError(err).Error("can't register validator")
    26  			return
    27  		}
    28  	}
    29  
    30  	c.router.GET("/compute/new", func(ctx *gin.Context) {
    31  		ctx.HTML(http.StatusOK, "compute/new", gin.H{
    32  			"loggedIn": ctx.GetBool(middlewares.LoggedInKey),
    33  			"isAdmin":  ctx.GetBool(middlewares.AdminKey),
    34  		})
    35  	})
    36  
    37  	c.router.POST("/compute/new", func(ctx *gin.Context) {
    38  		err := c.createComputeInstance(ctx)
    39  		if err != nil {
    40  			session := sessions.Default(ctx)
    41  			session.AddFlash(err.Error())
    42  			err := session.Save()
    43  			if err != nil {
    44  				c.log.WithError(err).Error("problem saving session")
    45  				ctx.Redirect(http.StatusSeeOther, "/compute/new")
    46  				return
    47  			}
    48  			ctx.Redirect(http.StatusSeeOther, "/compute/new")
    49  			return
    50  		}
    51  
    52  		ctx.Redirect(http.StatusSeeOther, "/oversikt")
    53  	})
    54  
    55  	c.router.GET("/compute/edit", func(ctx *gin.Context) {
    56  		user, err := getUser(ctx)
    57  		if err != nil {
    58  			session := sessions.Default(ctx)
    59  			session.AddFlash(err.Error())
    60  			err := session.Save()
    61  			if err != nil {
    62  				c.log.WithError(err).Error("problem saving session")
    63  				ctx.Redirect(http.StatusSeeOther, "/oversikt")
    64  				return
    65  			}
    66  			ctx.Redirect(http.StatusSeeOther, "/oversikt")
    67  			return
    68  		}
    69  
    70  		computeInstance, err := c.repo.ComputeInstanceGet(ctx, user.Email)
    71  		if err != nil {
    72  			session := sessions.Default(ctx)
    73  			session.AddFlash(err.Error())
    74  			err := session.Save()
    75  			if err != nil {
    76  				c.log.WithError(err).Error("problem saving session")
    77  				ctx.Redirect(http.StatusSeeOther, "/oversikt")
    78  				return
    79  			}
    80  			ctx.Redirect(http.StatusSeeOther, "/oversikt")
    81  			return
    82  		}
    83  
    84  		ctx.HTML(http.StatusOK, "compute/edit", gin.H{
    85  			"name":     "compute-" + getNormalizedNameFromEmail(user.Email),
    86  			"diskSize": computeInstance.DiskSize,
    87  			"loggedIn": ctx.GetBool(middlewares.LoggedInKey),
    88  			"isAdmin":  ctx.GetBool(middlewares.AdminKey),
    89  		})
    90  	})
    91  
    92  	c.router.POST("/compute/edit", func(ctx *gin.Context) {
    93  		if err := c.editCompute(ctx); err != nil {
    94  			session := sessions.Default(ctx)
    95  			session.AddFlash(err.Error())
    96  			err := session.Save()
    97  			if err != nil {
    98  				c.log.WithError(err).Error("problem saving session")
    99  				ctx.Redirect(http.StatusSeeOther, "/oversikt")
   100  				return
   101  			}
   102  			ctx.Redirect(http.StatusSeeOther, "/oversikt")
   103  			return
   104  		}
   105  		ctx.Redirect(http.StatusSeeOther, "/oversikt")
   106  	})
   107  
   108  	c.router.POST("/compute/delete", func(ctx *gin.Context) {
   109  		err := c.deleteComputeInstance(ctx)
   110  		if err != nil {
   111  			session := sessions.Default(ctx)
   112  			session.AddFlash(err.Error())
   113  			err := session.Save()
   114  			if err != nil {
   115  				c.log.WithError(err).Error("problem saving session")
   116  				ctx.Redirect(http.StatusSeeOther, "/oversikt")
   117  				return
   118  			}
   119  			ctx.Redirect(http.StatusSeeOther, "/oversikt")
   120  			return
   121  		}
   122  
   123  		ctx.Redirect(http.StatusSeeOther, "/oversikt")
   124  	})
   125  }
   126  
   127  func (c *client) editCompute(ctx *gin.Context) error {
   128  	var form computeForm
   129  	err := ctx.ShouldBindWith(&form, binding.Form)
   130  	if err != nil {
   131  		return err
   132  	}
   133  
   134  	user, err := getUser(ctx)
   135  	if err != nil {
   136  		return err
   137  	}
   138  
   139  	instance, err := c.repo.ComputeInstanceGet(ctx, user.Email)
   140  	if err != nil {
   141  		return err
   142  	}
   143  
   144  	diskSizeInt, err := strconv.ParseInt(form.DiskSize, 10, 32)
   145  	if err != nil {
   146  		return err
   147  	}
   148  	instance.DiskSize = int32(diskSizeInt)
   149  
   150  	if err := c.repo.RegisterResizeComputeDiskEvent(ctx, user.Email, instance); err != nil {
   151  		return err
   152  	}
   153  
   154  	return nil
   155  }
   156  
   157  func (c *client) deleteComputeInstance(ctx *gin.Context) error {
   158  	user, err := getUser(ctx)
   159  	if err != nil {
   160  		return err
   161  	}
   162  
   163  	return c.repo.RegisterDeleteComputeEvent(ctx, user.Email)
   164  }
   165  
   166  func (c *client) createComputeInstance(ctx *gin.Context) error {
   167  	user, err := getUser(ctx)
   168  	if err != nil {
   169  		return err
   170  	}
   171  
   172  	instance := gensql.ComputeInstance{
   173  		Owner:    user.Email,
   174  		Name:     "compute-" + getNormalizedNameFromEmail(user.Email),
   175  		DiskSize: 10,
   176  	}
   177  
   178  	return c.repo.RegisterCreateComputeEvent(ctx, instance.Owner, instance)
   179  }