@@ -6,11 +6,13 @@ import (
66 "errors"
77 "fmt"
88 "net/http"
9+ "strconv"
910 "strings"
1011 "time"
1112
1213 "github.com/codescalers/cloud4students/internal"
1314 "github.com/codescalers/cloud4students/models"
15+ "github.com/gorilla/mux"
1416 "github.com/rs/zerolog/log"
1517 "gopkg.in/validator.v2"
1618 "gorm.io/gorm"
@@ -53,9 +55,11 @@ type SetPricesInput struct {
5355 PublicIP float64 `json:"public_ip"`
5456}
5557
56- type ListDeploymentsResponse struct {
57- VMs []models.VM `json:"vms"`
58- K8S []models.K8sCluster `json:"k8s"`
58+ type UserResponse struct {
59+ * models.User
60+ VMs []models.VM `json:"vms"`
61+ K8S []models.K8sCluster `json:"k8s"`
62+ Count models.DeploymentsCount `json:"count"`
5963}
6064
6165// GetAllUsersHandler returns all users
@@ -66,7 +70,7 @@ type ListDeploymentsResponse struct {
6670// @Accept json
6771// @Produce json
6872// @Security BearerAuth
69- // @Success 200 {object} []models.User
73+ // @Success 200 {object} []UserResponse
7074// @Failure 400 {object} Response
7175// @Failure 401 {object} Response
7276// @Failure 404 {object} Response
@@ -86,9 +90,40 @@ func (a *App) GetAllUsersHandler(req *http.Request) (interface{}, Response) {
8690 return nil , InternalServerError (errors .New (internalServerErrorMsg ))
8791 }
8892
93+ var allUsers []UserResponse
94+
95+ for _ , user := range users {
96+ // vms
97+ vms , err := a .db .GetAllVms (user .ID .String ())
98+ if err != nil && err != gorm .ErrRecordNotFound {
99+ log .Error ().Err (err ).Send ()
100+ return nil , InternalServerError (errors .New (internalServerErrorMsg ))
101+ }
102+
103+ // k8s clusters
104+ clusters , err := a .db .GetAllK8s (user .ID .String ())
105+ if err != nil && err != gorm .ErrRecordNotFound {
106+ log .Error ().Err (err ).Send ()
107+ return nil , InternalServerError (errors .New (internalServerErrorMsg ))
108+ }
109+
110+ count , err := a .db .CountUserDeployments (user .ID .String ())
111+ if err != nil && err != gorm .ErrRecordNotFound {
112+ log .Error ().Err (err ).Send ()
113+ return nil , InternalServerError (errors .New (internalServerErrorMsg ))
114+ }
115+
116+ allUsers = append (allUsers , UserResponse {
117+ User : & user ,
118+ VMs : vms ,
119+ K8S : clusters ,
120+ Count : count ,
121+ })
122+ }
123+
89124 return ResponseMsg {
90125 Message : "Users are found" ,
91- Data : users ,
126+ Data : allUsers ,
92127 }, Ok ()
93128}
94129
@@ -240,6 +275,71 @@ func (a *App) GetBalanceHandler(req *http.Request) (interface{}, Response) {
240275 }, Ok ()
241276}
242277
278+ // DeleteVMDeploymentHandler deletes a virtual machine
279+ // Example endpoint: Deletes a virtual machine
280+ // @Summary Deletes a virtual machine
281+ // @Description Deletes a virtual machine
282+ // @Tags Admin
283+ // @Accept json
284+ // @Produce json
285+ // @Security BearerAuth
286+ // @Param id path string true "Virtual machine ID"
287+ // @Success 200 {object} Response
288+ // @Failure 400 {object} Response
289+ // @Failure 401 {object} Response
290+ // @Failure 404 {object} Response
291+ // @Failure 500 {object} Response
292+ // @Router /deployments/vm/{id} [delete]
293+ func (a * App ) DeleteVMDeploymentHandler (req * http.Request ) (interface {}, Response ) {
294+ id , err := strconv .Atoi (mux .Vars (req )["id" ])
295+ if err != nil {
296+ return nil , BadRequest (errors .New ("failed to read deployment id" ))
297+ }
298+
299+ if err = a .db .DeleteVMByID (id ); err != nil {
300+ log .Error ().Err (err ).Send ()
301+ return nil , InternalServerError (errors .New (internalServerErrorMsg ))
302+ }
303+
304+ return ResponseMsg {
305+ Message : "Virtual machine is deleted successfully" ,
306+ }, Ok ()
307+ }
308+
309+ // DeleteK8sDeploymentHandler deletes a kubernetes cluster
310+ // Example endpoint: Deletes a kubernetes cluster
311+ // @Summary Deletes a kubernetes cluster
312+ // @Description Deletes a kubernetes cluster
313+ // @Tags Admin
314+ // @Accept json
315+ // @Produce json
316+ // @Security BearerAuth
317+ // @Param id path string true "Kubernetes cluster ID"
318+ // @Success 200 {object} Response
319+ // @Failure 400 {object} Response
320+ // @Failure 401 {object} Response
321+ // @Failure 404 {object} Response
322+ // @Failure 500 {object} Response
323+ // @Router /deployments/k8s/{id} [delete]
324+ func (a * App ) DeleteK8sDeploymentHandler (req * http.Request ) (interface {}, Response ) {
325+ id , err := strconv .Atoi (mux .Vars (req )["id" ])
326+ if err != nil {
327+ return nil , BadRequest (errors .New ("failed to read deployment id" ))
328+ }
329+
330+ if err = a .db .DeleteK8s (id ); err == gorm .ErrRecordNotFound {
331+ return nil , NotFound (errors .New ("kubernetes cluster is not found" ))
332+ }
333+ if err != nil {
334+ log .Error ().Err (err ).Send ()
335+ return nil , InternalServerError (errors .New (internalServerErrorMsg ))
336+ }
337+
338+ return ResponseMsg {
339+ Message : "Kubernetes cluster is deleted successfully" ,
340+ }, Ok ()
341+ }
342+
243343// DeleteAllDeploymentsHandler deletes all users' deployments
244344// Example endpoint: Deletes all users' deployments
245345// @Summary Deletes all users' deployments
@@ -329,70 +429,6 @@ func (a *App) DeleteAllDeploymentsHandler(req *http.Request) (interface{}, Respo
329429 }, Ok ()
330430}
331431
332- // ListDeploymentsHandler lists all users' deployments
333- // Example endpoint: List all users' deployments
334- // @Summary List all users' deployments
335- // @Description List all users' deployments
336- // @Tags Admin
337- // @Accept json
338- // @Produce json
339- // @Security BearerAuth
340- // @Success 200 {object} ListDeploymentsResponse
341- // @Failure 400 {object} Response
342- // @Failure 401 {object} Response
343- // @Failure 404 {object} Response
344- // @Failure 500 {object} Response
345- // @Router /deployments [get]
346- func (a * App ) ListDeploymentsHandler (req * http.Request ) (interface {}, Response ) {
347- users , err := a .db .ListAllUsers ()
348- if err == gorm .ErrRecordNotFound || len (users ) == 0 {
349- return ResponseMsg {
350- Message : "Users are not found" ,
351- }, Ok ()
352- }
353-
354- if err != nil {
355- log .Error ().Err (err ).Send ()
356- return nil , InternalServerError (errors .New (internalServerErrorMsg ))
357- }
358-
359- var allVMs []models.VM
360- var allClusters []models.K8sCluster
361-
362- for _ , user := range users {
363- // vms
364- vms , err := a .db .GetAllVms (user .ID .String ())
365- if err == gorm .ErrRecordNotFound || len (vms ) == 0 {
366- log .Error ().Err (err ).Str ("userID" , user .ID .String ()).Msg ("Virtual machines are not found" )
367- continue
368- }
369- if err != nil {
370- log .Error ().Err (err ).Send ()
371- return nil , InternalServerError (errors .New (internalServerErrorMsg ))
372- }
373-
374- allVMs = append (allVMs , vms ... )
375-
376- // k8s clusters
377- clusters , err := a .db .GetAllK8s (user .ID .String ())
378- if err == gorm .ErrRecordNotFound || len (clusters ) == 0 {
379- log .Error ().Err (err ).Str ("userID" , user .ID .String ()).Msg ("Kubernetes clusters are not found" )
380- continue
381- }
382- if err != nil {
383- log .Error ().Err (err ).Send ()
384- return nil , InternalServerError (errors .New (internalServerErrorMsg ))
385- }
386-
387- allClusters = append (allClusters , clusters ... )
388- }
389-
390- return ResponseMsg {
391- Message : "Deployments are listed successfully" ,
392- Data : ListDeploymentsResponse {VMs : allVMs , K8S : allClusters },
393- }, Ok ()
394- }
395-
396432// UpdateMaintenanceHandler updates maintenance flag
397433// Example endpoint: Updates maintenance flag
398434// @Summary Updates maintenance flag
0 commit comments