Skip to content

Commit 28e0317

Browse files
committed
[30/8/22] add router /admin/delete-permanently:id
1 parent d3a76af commit 28e0317

File tree

3 files changed

+130
-9
lines changed

3 files changed

+130
-9
lines changed

controllers/admin_controller.go

Lines changed: 68 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package controllers
33
import (
44
"fmt"
55
"net/http"
6+
"strconv"
67

78
"github.com/labstack/echo/v4"
89
"github.com/ockibagusp/golang-website-example/middleware"
@@ -48,28 +49,28 @@ func (controller *Controller) DeletePermanently(c echo.Context) error {
4849
)
4950

5051
if c.QueryParam("admin") == "all" {
51-
log.Infof(`for GET to admin delete permanently: admin models.User{}.FindAll(db, "admin")`)
52+
log.Infof(`for GET to admin delete permanently: admin models.User{}.FindDeleteAll(db, "admin")`)
5253
typing = "Admin"
53-
users, err = models.User{}.FindAll(controller.DB, "admin")
54+
users, err = models.User{}.FindDeleteAll(controller.DB, "admin")
5455
} else if c.QueryParam("user") == "all" {
55-
log.Infof(`for GET to admin delete permanently: user models.User{}.FindAll(db, "user")`)
56+
log.Infof(`for GET to admin delete permanently: user models.User{}.FindDeleteAll(db, "user")`)
5657
typing = "User"
57-
users, err = models.User{}.FindAll(controller.DB, "user")
58+
users, err = models.User{}.FindDeleteAll(controller.DB, "user")
5859
} else {
59-
log.Infof(`for GET to admin delete permanently: models.User{}.FindAll(db) or models.User{}.FindAll(db, "all")`)
60+
log.Infof(`for GET to admin delete permanently: models.User{}.FindDeleteAll(db) or models.User{}.FindDeleteAll(db, "all")`)
6061
typing = "All"
6162
// models.User{} or (models.User{}) or var user models.User or user := models.User{}
62-
users, err = models.User{}.FindAll(controller.DB)
63+
users, err = models.User{}.FindDeleteAll(controller.DB)
6364
}
6465

6566
if err != nil {
66-
log.Warnf("for GET to admin delete permanently without models.User{}.FindAll() errors: `%v`", err)
67+
log.Warnf("for GET to admin delete permanently without models.User{}.FindDeleteAll() errors: `%v`", err)
6768
log.Warn("END request method GET for admin delete permanently: [-]failure")
6869
// HTTP response status: 404 Not Found
6970
return c.HTML(http.StatusNotFound, err.Error())
7071
}
7172

72-
log.Info("END request method GET for users: [+]success")
73+
log.Info("END request method GET to admin delete permanently: [+]success")
7374
return c.Render(http.StatusOK, "admin/admin-delete-permanently.html", echo.Map{
7475
"name": fmt.Sprintf("Users: %v", typing),
7576
"nav": "users", // (?)
@@ -90,3 +91,62 @@ func (controller *Controller) DeletePermanently(c echo.Context) error {
9091
"users": users,
9192
})
9293
}
94+
95+
/*
96+
* Delete Permanently By ID
97+
*
98+
* @target: [Admin] Delete Permanently By ID
99+
* @method: GET
100+
* @route: /admin/delete-permanently/:id
101+
*/
102+
func (controller *Controller) DeletePermanentlyByID(c echo.Context) error {
103+
session, _ := middleware.GetAuth(c)
104+
log := log.WithFields(log.Fields{
105+
"username": session.Values["username"],
106+
"route": c.Path(),
107+
})
108+
log.Info("START request method GET for admin delete permanently by id")
109+
110+
is_auth_type := session.Values["is_auth_type"]
111+
if is_auth_type == -1 {
112+
log.Warn("for GET to admin delete permanently by id without no-session [@route: /login]")
113+
middleware.SetFlashError(c, "login process failed!")
114+
log.Warn("END request method GET for admin delete permanently by id: [-]failure")
115+
return c.Redirect(http.StatusFound, "/login")
116+
}
117+
118+
id, _ := strconv.Atoi(c.Param("id"))
119+
120+
// why?
121+
// delete permanently not for admin
122+
if id == 1 {
123+
log.Warn("END request method GET for admin delete permanently by id [admin]: [-]failure")
124+
// HTTP response status: 403 Forbidden
125+
return c.HTML(http.StatusForbidden, "403 Forbidden")
126+
}
127+
128+
if !middleware.IsAdmin(is_auth_type) {
129+
log.Warn("END request method GET for admin delete permanently by id: [-]failure")
130+
// HTTP response status: 404 Not Found
131+
return c.HTML(http.StatusNotFound, "404 Not Found")
132+
}
133+
134+
user, err := (models.User{}).UnscopedFirstUserByID(controller.DB, id)
135+
if err != nil {
136+
log.Warnf("for GET to admin delete permanently by id without models.User{}.FirstByID() errors: `%v`", err)
137+
log.Warn("END request method GET for admin delete permanently by id: [-]failure")
138+
// HTTP response status: 404 Not Found
139+
return c.HTML(http.StatusNotFound, err.Error())
140+
}
141+
142+
if err := user.DeletePermanently(controller.DB, id); err != nil {
143+
log.Warnf("for GET to admin delete permanently by id without models.User{}.Delete() errors: `%v`", err)
144+
log.Warn("END request method GET for admin delete permanently by id: [-]failure")
145+
// HTTP response status: 403 Forbidden
146+
return c.HTML(http.StatusForbidden, err.Error())
147+
}
148+
149+
// delete permanently admin
150+
log.Info("END request method GET for admin delete permanently by id: [+]success")
151+
return c.Redirect(http.StatusMovedPermanently, "/admin/delete-permanently")
152+
}

models/user.go

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,14 +80,27 @@ func (user User) Save(db *gorm.DB) (*User, error) {
8080
// User: FirstUserByID
8181
func (user User) FirstUserByID(db *gorm.DB, id int) (*User, error) {
8282
err := db.First(&user, id).Error
83+
84+
return isFirstUserByID(&user, err)
85+
}
86+
87+
// User: UnscopedFirstUserByID
88+
func (user User) UnscopedFirstUserByID(db *gorm.DB, id int) (*User, error) {
89+
err := db.Unscoped().First(&user, id).Error
90+
91+
return isFirstUserByID(&user, err)
92+
}
93+
94+
// User: isFirstUserByID
95+
func isFirstUserByID(user *User, err error) (*User, error) {
8396
if err != nil {
8497
if errors.Is(err, gorm.ErrRecordNotFound) {
8598
return nil, errors.New("User Not Found")
8699
}
87100
return nil, err
88101
}
89102

90-
return &user, nil
103+
return user, nil
91104
}
92105

93106
// User: FirstByIDAndUsername
@@ -178,6 +191,52 @@ func (user User) Delete(db *gorm.DB, id int) error {
178191
return nil
179192
}
180193

194+
// User: FindDeleteAll(db, admin_or_user={admin, user})
195+
func (user User) FindDeleteAll(db *gorm.DB, admin_or_user ...string) ([]User, error) {
196+
users := []User{}
197+
198+
var err error
199+
200+
// same,
201+
// if len(admin_or_user) == 0 || len(admin_or_user) == 1 && admin_or_user[0] == "all" {...}
202+
if user.isAll(&admin_or_user) {
203+
// Limit: 25 ?
204+
err = db.Limit(25).Unscoped().Where("deleted_at is not null").Find(&users).Error
205+
} else if user.isAdmin(&admin_or_user) {
206+
err = db.Limit(25).Unscoped().Where("is_admin = 1 AND deleted_at is not null").Find(&users).Error
207+
} else if user.isUser(&admin_or_user) {
208+
err = db.Limit(25).Unscoped().Where("is_admin = 0 AND deleted_at is not null").Find(&users).Error
209+
} else { // admin_or_user agrs [2,..]=string
210+
return nil, errors.New(`models.User{}.FindDeleteAll: admin_or_user agrs [2]{"admin", "user"}=string`)
211+
}
212+
213+
if err != nil {
214+
return nil, err
215+
}
216+
217+
return users, nil
218+
}
219+
220+
// User: Delete Permanently
221+
func (user User) DeletePermanently(db *gorm.DB, id int) error {
222+
tx := db.Begin()
223+
var count int64
224+
// if tx.Unscoped().Select("id").First(&user).Error != nil {}
225+
if tx.Unscoped().Select("id").First(&user).Count(&count); count != 1 {
226+
tx.Rollback()
227+
return errors.New("User Not Found")
228+
}
229+
230+
// if tx.Unscoped().Delete(&user, id).Error != nil {}
231+
if err := tx.Unscoped().Delete(&user, id).Error; err != nil {
232+
tx.Rollback()
233+
return err
234+
}
235+
tx.Commit()
236+
237+
return nil
238+
}
239+
181240
// is? all, admin or user?
182241
func (User) isAll(admin_or_user *[]string) bool {
183242
return len(*admin_or_user) == 0 || len(*admin_or_user) == 1 && (*admin_or_user)[0] == "all"

router/router.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ func New(controllers *controllers.Controller) (router *echo.Echo) {
6969
// admin
7070
router.GET("/admin/delete-permanently", controllers.DeletePermanently).
7171
Name = "/admin/delete-permanently get"
72+
router.GET("/admin/delete-permanently/:id", controllers.DeletePermanentlyByID).
73+
Name = "/admin/delete-permanently:id get"
7274

7375
return
7476
}

0 commit comments

Comments
 (0)