Skip to content

Commit 9395d67

Browse files
committed
add functionality to view and delete a single item
Signed-off-by: Alwin Doss <alwindoss84@gmail.com>
1 parent 081378e commit 9395d67

File tree

6 files changed

+135
-7
lines changed

6 files changed

+135
-7
lines changed

internal/dbase/repository.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ type Repository interface {
1818
GetAllData(name []byte) ([]KeyValuePair, error)
1919
Get(bucket, key []byte) ([]byte, error)
2020
Set(bucket, key, value []byte) error
21+
Delete(bucket, key []byte) error
2122
}
2223

2324
func NewBoltDBRepository(db *bbolt.DB) Repository {
@@ -151,3 +152,15 @@ func (d *boltDBRepository) GetAllData(bucket []byte) ([]KeyValuePair, error) {
151152

152153
return kvPairs, nil
153154
}
155+
156+
func (d *boltDBRepository) Delete(bucket, key []byte) error {
157+
d.DB.Update(func(tx *bbolt.Tx) error {
158+
b := tx.Bucket(bucket)
159+
err := b.Delete(key)
160+
if err != nil {
161+
return err
162+
}
163+
return nil
164+
})
165+
return nil
166+
}

internal/handlers/page_handlers.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ type PageHandler interface {
2020
DeleteBucketHandler(w http.ResponseWriter, r *http.Request)
2121
AddItemHandler(w http.ResponseWriter, r *http.Request)
2222
RenderAddItemPage(w http.ResponseWriter, r *http.Request)
23+
RenderViewItemPage(w http.ResponseWriter, r *http.Request)
24+
DeleteItemHandler(w http.ResponseWriter, r *http.Request)
2325
}
2426

2527
func NewPageHandler(cfg *astra.Config, session *scs.SessionManager, service service.Service) PageHandler {
@@ -245,3 +247,58 @@ func (h *pageHandler) RenderAddItemPage(w http.ResponseWriter, r *http.Request)
245247
}
246248
renderTemplate(w, r, h.Cfg, "add-item.page.tmpl", d)
247249
}
250+
251+
func (h *pageHandler) RenderViewItemPage(w http.ResponseWriter, r *http.Request) {
252+
// remoteIP := r.RemoteAddr
253+
254+
// h.SessMgr.Put(r.Context(), "remote-ip", remoteIP)
255+
bucketName := r.FormValue("bucket_name")
256+
key := r.FormValue("key")
257+
val, err := h.Svc.Get(bucketName, key)
258+
if err != nil {
259+
h.SessMgr.Put(r.Context(), "error", "unable to get the value from the bucket")
260+
http.Redirect(w, r, "/", http.StatusSeeOther)
261+
return
262+
}
263+
log.Printf("Bucket Name in the RenderViewItemPage is: %s", bucketName)
264+
log.Printf("Key in the RenderViewItemPage is: %s", key)
265+
log.Printf("Val in the RenderViewItemPage is: %s", val)
266+
itemDetails := kvPair{
267+
Key: key,
268+
Value: val,
269+
}
270+
data := make(map[string]interface{})
271+
data["bucket_name"] = bucketName
272+
data["item_details"] = itemDetails
273+
274+
d := &TemplateData{
275+
Title: "View Item",
276+
Form: forms.New(nil),
277+
Data: data,
278+
}
279+
renderTemplate(w, r, h.Cfg, "view-item.page.tmpl", d)
280+
}
281+
282+
func (h *pageHandler) DeleteItemHandler(w http.ResponseWriter, r *http.Request) {
283+
bucketName := r.FormValue("bucket_name")
284+
key := r.FormValue("key")
285+
err := h.Svc.Delete(bucketName, key)
286+
if err != nil {
287+
h.SessMgr.Put(r.Context(), "error", "unable to delete the item from the bucket")
288+
http.Redirect(w, r, "/", http.StatusSeeOther)
289+
return
290+
}
291+
292+
log.Printf("Bucket Name in the DeleteItemHandler is: %s", bucketName)
293+
log.Printf("Key in the DeleteItemHandler is: %s", key)
294+
295+
// h.SessMgr.Put(r.Context(), "remote-ip", remoteIP)
296+
297+
// d := &TemplateData{
298+
// Title: "View Bucket",
299+
// Form: forms.New(nil),
300+
// Data: data,
301+
// }
302+
http.Redirect(w, r, "/view-bucket?bucket_name="+bucketName, http.StatusSeeOther)
303+
// renderTemplate(w, r, h.Cfg, "view-bucket.page.tmpl", d)
304+
}

internal/server/server.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ func createRoutes(cfg *astra.Config, sess *scs.SessionManager, service service.S
6767
router.Get("/delete-bucket", hdlrs.DeleteBucketHandler)
6868
router.Get("/add-item", hdlrs.RenderAddItemPage)
6969
router.Post("/add-item", hdlrs.AddItemHandler)
70+
router.Get("/view-item", hdlrs.RenderViewItemPage)
71+
router.Get("/delete-item", hdlrs.DeleteItemHandler)
72+
7073
// router.Get("/about", handlers.About)
7174
// router.Get("/generals-quarters", handlers.Generals)
7275
// router.Get("/majors-suite", handlers.Majors)

internal/service/service.go

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,9 @@ type Service interface {
1818
DeleteBucket(name string) error
1919
GetBuckets() ([]string, error)
2020
GetAllData(bucket string) (interface{}, error)
21-
Get(bucket, key string) (interface{}, error)
21+
Get(bucket, key string) (string, error)
2222
Set(bucket, key string, value interface{}) error
23+
Delete(bucket, key string) error
2324
}
2425

2526
func NewService(repo dbase.Repository) Service {
@@ -53,14 +54,14 @@ func (s *boltDBService) GetBuckets() ([]string, error) {
5354
return buckets, nil
5455
}
5556

56-
func (s *boltDBService) Get(bucket, key string) (interface{}, error) {
57+
func (s *boltDBService) Get(bucket, key string) (string, error) {
5758
value, err := s.Repo.Get([]byte(bucket), []byte(key))
5859
if err != nil {
59-
return nil, err
60+
return "", err
6061
}
61-
var data interface{}
62+
var data string
6263
json.Unmarshal(value, &data)
63-
return &data, nil
64+
return data, nil
6465
}
6566

6667
func (s *boltDBService) Set(bucket, key string, value interface{}) error {
@@ -91,3 +92,11 @@ func (s *boltDBService) GetAllData(bucket string) (interface{}, error) {
9192
}
9293
return svcKVPairs, nil
9394
}
95+
96+
func (s *boltDBService) Delete(bucket, key string) error {
97+
err := s.Repo.Delete([]byte(bucket), []byte(key))
98+
if err != nil {
99+
return err
100+
}
101+
return nil
102+
}

templates/view-bucket.page.tmpl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,10 @@
4141
<!-- <td>{{marshal $val.Value}}</td> -->
4242
<td>
4343
<div class="bucket-action-icons">
44-
<a href="/view-item?key={{$val.Key}},val={{$val.Value}}">
44+
<a href="/view-item?bucket_name={{$bucketName}}&key={{$val.Key}}">
4545
<i class="bi bi-eye"></i>
4646
</a>
47-
<a href="/delete-item?key={{$val.Key}}">
47+
<a href="/delete-item?bucket_name={{$bucketName}}&key={{$val.Key}}">
4848
<i class="bi bi-trash"></i>
4949
</a>
5050
</div>

templates/view-item.page.tmpl

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
{{template "base" .}}
2+
3+
{{define "css"}}
4+
<style>
5+
.bucket-table {
6+
margin-top: 30px;
7+
}
8+
.bucket-home {
9+
margin-top: 30px;
10+
}
11+
.bucket-action-icons {
12+
display: flex;
13+
justify-content: space-evenly;
14+
}
15+
</style>
16+
{{end}}
17+
18+
{{define "content"}}
19+
20+
{{$res := index .Data "item_details"}}
21+
{{$bucketName := index .Data "bucket_name"}}
22+
<div class="container">
23+
<div class="bucket-home">
24+
<a href="/view-bucket?bucket_name={{$bucketName}}" class="btn btn-success">Go Back</a>
25+
<table class="table table-bordered bucket-table">
26+
<thead>
27+
<tr>
28+
<!-- <th scope="col">#</th> -->
29+
<th scope="col">Bucket</th>
30+
<th scope="col">Key</th>
31+
<th scope="col">Value</th>
32+
<!-- <th scope="col">Actions</th> -->
33+
</tr>
34+
</thead>
35+
<tbody>
36+
<tr>
37+
<td>{{$bucketName}}</td>
38+
<td>{{$res.Key}}</td>
39+
<td>{{$res.Value}}</td>
40+
</tr>
41+
42+
</tbody>
43+
</table>
44+
</div>
45+
</div>
46+
{{end}}

0 commit comments

Comments
 (0)