-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdelete.go
91 lines (83 loc) · 2.68 KB
/
delete.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package main
import (
"errors"
"strings"
"github.com/gin-gonic/gin"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
"git.tcp.direct/tcp.direct/tcp.ac/config"
)
func adminBypass(c *gin.Context, adminKey string, t EntryType) {
slog := log.With().Str("caller", "admin_del").Str("type", typeToString(t, true)).Logger()
slog.Trace().Msg("admin key attempt")
if config.AdminKey == "" {
errThrow(c, 404, errors.New("admin key not configured"), message404)
return
}
rKey := c.Param("key")
if adminKey != config.AdminKey {
if zerolog.GlobalLevel() == zerolog.TraceLevel {
slog.Warn().Str("wanted", config.AdminKey).Str("got", adminKey).Msg("bad admin key!")
} else {
slog.Warn().Msg("bad admin key!")
}
errThrow(c, 404, errors.New("bad key"), message404)
return
}
slog.Trace().Msg("admin key accepted")
if !db.With(typeToString(t, true)).Has([]byte(rKey)) {
errThrow(c, 404, errors.New("failed to delete entry"), messageAdmin404)
return
}
err := db.With(typeToString(t, true)).Delete([]byte(rKey))
if err != nil {
errThrow(c, 500, err, mustJson(map[string]string{"error": err.Error()}))
return
}
slog.Info().Msg("admin deleted entry")
c.JSON(200, "DELETE_SUCCESS")
}
func del(c *gin.Context, t EntryType) {
slog := log.With().Str("caller", "del").Str("type", typeToString(t, true)).Logger()
rKey := c.Param("key")
adminKey, adminAttempt := c.GetQuery("admin")
if adminAttempt {
adminBypass(c, adminKey, t)
return
}
if !validateKey(rKey) {
errThrow(c, 400, errors.New("failed to validate delete key"), message404)
return
}
target, err := db.With("key").Get([]byte(rKey))
if err != nil {
errThrow(c, 400, err, message404)
return
}
if target == nil || !strings.HasPrefix(string(target), typeToString(t, false)+".") {
errThrow(c, 400, errors.New("no delete entry found with provided key"), message404)
return
}
finalTarget := strings.Split(string(target), ".")
if !db.With(typeToString(t, true)).Has([]byte(finalTarget[1])) {
// this shouldn't happen...?
errThrow(c, 500, errors.New("corresponding image to delete not found in database"), message500)
return
}
err = db.With(typeToString(t, true)).Delete([]byte(finalTarget[1]))
if err != nil {
errThrow(c, 500, err, message500)
return
}
if db.With(typeToString(t, true)).Has([]byte(finalTarget[1])) {
errThrow(c, 500, errors.New("failed to delete entry"), message500)
return
}
slog.Info().Str("rkey", finalTarget[1]).Msg("Image file deleted successfully")
slog.Trace().Str("rkey", finalTarget[1]).Msg("Removing delete key entry")
err = db.With("key").Delete([]byte(rKey))
if err != nil {
slog.Error().Str("rkey", finalTarget[1]).Msg("Couldn't delete key")
}
c.JSON(200, "DELETE_SUCCESS")
}