-
Notifications
You must be signed in to change notification settings - Fork 0
/
note.go
229 lines (192 loc) · 5.89 KB
/
note.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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
package handlers
import (
"fmt"
"github.com/MelihEmreGuler/go-user-notes-app/middleware/session"
"github.com/MelihEmreGuler/go-user-notes-app/repository"
"github.com/gofiber/fiber/v2"
)
type createNoteRequest struct {
Title string `json:"title"`
Content string `json:"content"`
SessionID string `json:"session_id"`
}
type updateNoteRequest struct {
Title string `json:"title"`
Content string `json:"content"`
SessionID string `json:"session_id"`
}
// checkSession checks if the user is logged in and sets the session information to the context
func checkSession(c *fiber.Ctx) error {
// Checks if the user is logged in
sess, err := session.AuthenticateAndRefresh(c)
if err != nil {
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
"error": "unauthorized",
})
}
// Set the session information to the context
c.Locals("session", sess)
return nil
}
/*
curl -X POST http://localhost:8080/note \
-H "Content-Type: application/json" \
-d '{
"title": "My First Note",
"content": "This is the content of my first note."
}'
*/
// CreateNote creates a new note
// @Summary Create a new note
// @Description Create a new note with the given title and content
// @Tags Notes
// @Accept json
// @Produce json
// @Param request body createNoteRequest true "Note Information"
// @Success 200 {object} map[string]interface{}
// @Failure 400 {object} map[string]interface{}
// @Router /note [post]
func CreateNote(c *fiber.Ctx) error {
// Checks if the user is logged in
// if err := checkSession(c); err != nil {
// return err
// }
// Get the session information from the context
//sess, ok := c.Locals("session").(*models.Session)
// if !ok {
// return fmt.Errorf("session not found")
// }
request := &createNoteRequest{}
if err := c.BodyParser(request); err != nil {
return fmt.Errorf("error while parsing request body: %w", err)
}
sessionID := request.SessionID
sess, err := repository.R.SelectSession(sessionID)
if err != nil {
return fmt.Errorf("error while selecting session: %w", err)
}
// Insert note to database
err = repository.R.InsertNote(sess.UserID, request.Title, request.Content)
if err != nil {
return fmt.Errorf("error while inserting note: %w", err)
}
return c.Status(fiber.StatusOK).JSON(fiber.Map{
"success": true,
"message": "Note created",
})
}
// GetNotes returns all notes of the user
// @Summary Get all notes
// @Description Get all notes of the user
// @Tags Notes
// @Accept json
// @Produce json
// @Param session_id header string true "Session ID"
// @Success 200 {object} map[string]interface{}
// @Failure 400 {object} map[string]interface{}
// @Router /notes [get]
func GetNotes(c *fiber.Ctx) error {
sessionID := c.Get("session_id")
sess, err := repository.R.SelectSession(sessionID)
if err != nil {
return fmt.Errorf("error while selecting session: %w", err)
}
// Get notes from database
notes, err := repository.R.GetNotes(sess.UserID)
if err != nil {
return fmt.Errorf("error while getting notes: %w", err)
}
return c.Status(fiber.StatusOK).JSON(fiber.Map{
"success": true,
"notes": notes,
})
}
// GetNote returns a note of the user
// @Summary Get a note
// @Description Get a note of the user with the given id
// @Tags Notes
// @Accept json
// @Produce json
// @Param id query string true "Note ID"
// @Param session_id header string true "Session ID"
// @Success 200 {object} map[string]interface{}
// @Failure 400 {object} map[string]interface{}
// @Router /note/:id [get]
func GetNote(c *fiber.Ctx) error {
sessionID := c.Get("session_id")
sess, err := repository.R.SelectSession(sessionID)
if err != nil {
return fmt.Errorf("error while selecting session: %w", err)
}
note, err := repository.R.GetNoteByID(sess.UserID, c.Query("id"))
if err != nil {
return fmt.Errorf("error while getting note: %w", err)
}
if note == nil {
return c.Status(fiber.StatusNotFound).JSON(fiber.Map{
"error": "note not found",
})
}
// Set the user id to the note
note.UserId = sess.UserID
return c.Status(fiber.StatusOK).JSON(fiber.Map{
"success": true,
"note": note,
})
}
// UpdateNote updates a note of the user
// @Summary Update a note
// @Description Update a note of the user with the given id
// @Tags Notes
// @Accept json
// @Produce json
// @Param id query string true "Note ID"
// @Param request body updateNoteRequest true "Note Information"
// @Success 200 {object} map[string]interface{}
// @Failure 400 {object} map[string]interface{}
// @Router /note/:id [put]
func UpdateNote(c *fiber.Ctx) error {
request := &updateNoteRequest{}
if err := c.BodyParser(request); err != nil {
return fmt.Errorf("error while parsing request body: %w", err)
}
sessionID := request.SessionID
sess, err := repository.R.SelectSession(sessionID)
if err != nil {
return fmt.Errorf("Please login ! -> %w", err)
}
err = repository.R.UpdateNoteByID(sess.UserID, c.Query("id"), request.Title, request.Content)
if err != nil {
return fmt.Errorf("error while updating note: %w", err)
}
return c.Status(fiber.StatusOK).JSON(fiber.Map{
"success": true,
"message": "Note updated",
})
}
// DeleteNote deletes a note of the user
// @Summary Delete a note
// @Description Delete a note of the user with the given id
// @Tags Notes
// @Accept json
// @Produce json
// @Param id query string true "Note ID"
// @Param request body deleteNoteRequest true "Note Information"
// @Success 200 {object} map[string]interface{}
// @Failure 400 {object} map[string]interface{}
// @Router /note/:id [delete]
func DeleteNote(c *fiber.Ctx) error {
sessionID := c.Get("session_id")
sess, err := repository.R.SelectSession(sessionID)
if err != nil {
return fmt.Errorf("error while selecting session: %w", err)
}
err = repository.R.DeleteNoteByID(sess.UserID, c.Query("id"))
if err != nil {
return fmt.Errorf("error while deleting note: %w", err)
}
return c.Status(fiber.StatusOK).JSON(fiber.Map{
"success": true,
"message": "note deleted",
})
}