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
+
+
+
+
+