Skip to content

Commit a24994c

Browse files
committed
Merge branch 'development_flat_payment' of github.com:codescalers/cloud4students into development_audit
2 parents ecfafd1 + da94fa0 commit a24994c

11 files changed

Lines changed: 403 additions & 141 deletions

File tree

server/app/admin_handler.go

Lines changed: 105 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -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

server/app/app.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,8 @@ func (a *App) registerHandlers() {
199199
balanceRouter.HandleFunc("", WrapFunc(a.GetBalanceHandler)).Methods("GET", "OPTIONS")
200200
maintenanceRouter.HandleFunc("", WrapFunc(a.UpdateMaintenanceHandler)).Methods("PUT", "OPTIONS")
201201
deploymentsRouter.HandleFunc("", WrapFunc(a.DeleteAllDeploymentsHandler)).Methods("DELETE", "OPTIONS")
202-
deploymentsRouter.HandleFunc("", WrapFunc(a.ListDeploymentsHandler)).Methods("GET", "OPTIONS")
202+
deploymentsRouter.HandleFunc("/vm/{id}", WrapFunc(a.DeleteVMDeploymentHandler)).Methods("DELETE", "OPTIONS")
203+
deploymentsRouter.HandleFunc("/k8s/{id}", WrapFunc(a.DeleteK8sDeploymentHandler)).Methods("DELETE", "OPTIONS")
203204
deploymentsRouter.HandleFunc("/count", WrapFunc(a.GetDlsCountHandler)).Methods("GET", "OPTIONS")
204205
nextLaunchRouter.HandleFunc("", WrapFunc(a.UpdateNextLaunchHandler)).Methods("PUT", "OPTIONS")
205206

server/app/setup.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,8 @@ func SetUp(t testing.TB) *App {
7676
"medium_vm": 20,
7777
"large_vm": 30
7878
},
79-
"stripe_secret": "sk_test"
79+
"stripe_secret": "sk_test",
80+
"voucher_balance": 10
8081
}
8182
`, dbPath)
8283

server/app/user_handler.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,7 @@ type EmailInput struct {
6565

6666
// ApplyForVoucherInput struct for user to apply for voucher
6767
type ApplyForVoucherInput struct {
68-
Balance uint64 `json:"balance" binding:"required" validate:"min=0"`
69-
Reason string `json:"reason" binding:"required" validate:"nonzero"`
68+
Reason string `json:"reason" binding:"required" validate:"nonzero"`
7069
}
7170

7271
// AddVoucherInput struct for voucher applied by user
@@ -733,7 +732,7 @@ func (a *App) ApplyForVoucherHandler(req *http.Request) (interface{}, Response)
733732
voucher := models.Voucher{
734733
Voucher: v,
735734
UserID: userID,
736-
Balance: input.Balance,
735+
Balance: a.config.VoucherBalance,
737736
Reason: input.Reason,
738737
}
739738

server/app/user_handler_test.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -870,8 +870,6 @@ func TestApplyForVoucherHandler(t *testing.T) {
870870
assert.NoError(t, err)
871871

872872
voucherBody := []byte(`{
873-
"vms":10,
874-
"public_ips":1,
875873
"reason":"strongReason"
876874
}`)
877875

0 commit comments

Comments
 (0)