From 567bad1cf61038925fe75fc462310a68a8e705fb Mon Sep 17 00:00:00 2001 From: Akhil Gupta Date: Tue, 1 Jun 2021 22:30:21 +0530 Subject: [PATCH] ability to delete vehicle --- server/controllers/vehicle.go | 27 ++++++++++++++++++++ server/db/dbfunctions.go | 17 ++++++++++++- server/service/vehicleService.go | 14 +++++++++++ ui/src/main.js | 6 ++++- ui/src/router/views/vehicle.vue | 42 ++++++++++++++++++++++++++++---- 5 files changed, 99 insertions(+), 7 deletions(-) diff --git a/server/controllers/vehicle.go b/server/controllers/vehicle.go index 94f78f6..f5947d5 100644 --- a/server/controllers/vehicle.go +++ b/server/controllers/vehicle.go @@ -1,6 +1,7 @@ package controllers import ( + "errors" "net/http" "github.com/akhilrex/hammond/common" @@ -14,6 +15,7 @@ func RegisterVehicleController(router *gin.RouterGroup) { router.GET("/vehicles", getAllVehicles) router.GET("/vehicles/:id", getVehicleById) router.PUT("/vehicles/:id", updateVehicle) + router.DELETE("/vehicles/:id", deleteVehicle) router.GET("/vehicles/:id/stats", getVehicleStats) router.GET("/vehicles/:id/users", getVehicleUsers) router.POST("/vehicles/:id/users/:subId", shareVehicle) @@ -366,6 +368,31 @@ func getVehicleUsers(c *gin.Context) { c.JSON(http.StatusUnprocessableEntity, common.NewValidatorError(err)) } } +func deleteVehicle(c *gin.Context) { + var searchByIdQuery models.SearchByIdQuery + + if err := c.ShouldBindUri(&searchByIdQuery); err == nil { + + canDelete, err := service.CanDeleteVehicle(searchByIdQuery.Id, c.MustGet("userId").(string)) + if err != nil { + c.JSON(http.StatusUnprocessableEntity, common.NewError("shareVehicle", err)) + return + } + if !canDelete { + c.JSON(http.StatusUnprocessableEntity, common.NewError("shareVehicle", errors.New("You are not allowed to delete this vehicle."))) + return + } + err = service.DeleteVehicle(searchByIdQuery.Id) + if err != nil { + c.JSON(http.StatusUnprocessableEntity, common.NewError("shareVehicle", err)) + return + } + c.JSON(http.StatusOK, gin.H{}) + + } else { + c.JSON(http.StatusUnprocessableEntity, common.NewValidatorError(err)) + } +} func shareVehicle(c *gin.Context) { var searchByIdQuery models.SubItemQuery diff --git a/server/db/dbfunctions.go b/server/db/dbfunctions.go index 8e5506f..ee06921 100644 --- a/server/db/dbfunctions.go +++ b/server/db/dbfunctions.go @@ -62,7 +62,7 @@ func GetVehicleOwner(vehicleId string) (string, error) { if tx.Error != nil { return "", tx.Error } - return mapping.ID, nil + return mapping.UserID, nil } func GetVehicleUsers(vehicleId string) (*[]UserVehicle, error) { @@ -176,6 +176,11 @@ func GetExpenseById(id string) (*Expense, error) { return &obj, result.Error } +func DeleteVehicleById(id string) error { + + result := DB.Where("id=?", id).Delete(&Vehicle{}) + return result.Error +} func DeleteFillupById(id string) error { result := DB.Where("id=?", id).Delete(&Fillup{}) @@ -186,6 +191,16 @@ func DeleteExpenseById(id string) error { return result.Error } +func DeleteFillupByVehicleId(id string) error { + + result := DB.Where("vehicle_id=?", id).Delete(&Fillup{}) + return result.Error +} +func DeleteExpenseByVehicleId(id string) error { + result := DB.Where("vehicle_id=?", id).Delete(&Expense{}) + return result.Error +} + func GetAllQuickEntries(sorting string) (*[]QuickEntry, error) { if sorting == "" { sorting = "created_at desc" diff --git a/server/service/vehicleService.go b/server/service/vehicleService.go index f4d6064..536c4c6 100644 --- a/server/service/vehicleService.go +++ b/server/service/vehicleService.go @@ -42,6 +42,20 @@ func GetVehicleOwner(vehicleId string) (string, error) { func GetVehicleUsers(vehicleId string) (*[]db.UserVehicle, error) { return db.GetVehicleUsers(vehicleId) } +func CanDeleteVehicle(vehicleId, userId string) (bool, error) { + owner, err := db.GetVehicleOwner(vehicleId) + if err != nil { + return false, err + } + return owner == userId, nil +} + +func DeleteVehicle(vehicleId string) error { + db.DeleteExpenseByVehicleId(vehicleId) + db.DeleteFillupByVehicleId(vehicleId) + return db.DeleteVehicleById(vehicleId) +} + func ShareVehicle(vehicleId, userId string) error { return db.ShareVehicle(vehicleId, userId) } diff --git a/ui/src/main.js b/ui/src/main.js index 703d689..63c0a24 100644 --- a/ui/src/main.js +++ b/ui/src/main.js @@ -18,6 +18,8 @@ import { faDownload, faEye, faEyeSlash, + faTrash, + faShare, } from '@fortawesome/free-solid-svg-icons' import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome' @@ -44,7 +46,9 @@ library.add( faExclamationCircle, faDownload, faEye, - faEyeSlash + faEyeSlash, + faTrash, + faShare ) Vue.use(Buefy, { defaultIconComponent: 'vue-fontawesome', diff --git a/ui/src/router/views/vehicle.vue b/ui/src/router/views/vehicle.vue index 9a68188..5b67fc7 100644 --- a/ui/src/router/views/vehicle.vue +++ b/ui/src/router/views/vehicle.vue @@ -125,6 +125,32 @@ export default { }) .catch((err) => console.log(err)) }, + deleteVehicle() { + var sure = confirm( + 'This will delete all the expenses and fillups related with this vehicle as well. This step cannot be reversed. Are you sure?' + ) + if (sure) { + axios + .delete(`/api/vehicles/${this.vehicle.id}`) + .then((data) => { + this.$buefy.toast.open({ + message: 'Vehicle Deleted Successfully', + type: 'is-success', + duration: 3000, + }) + this.$router.push('/') + }) + .catch((ex) => { + this.$buefy.toast.open({ + duration: 5000, + message: ex.message, + position: 'is-bottom', + type: 'is-danger', + }) + }) + .finally(() => {}) + } + }, addAttachment() { if (this.file == null) { return @@ -219,20 +245,26 @@ export default {

+ Add Fillup + Add Expense Edit - Add Fillup - Add Expense - Share + + + + +