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 }