Passed
Push — main ( 19cade...5376e4 )
by Yume
01:03
created

controllers.GetNextCardByDeck   A

Complexity

Conditions 3

Size

Total Lines 30
Code Lines 21

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 21
nop 1
dl 0
loc 30
rs 9.376
c 0
b 0
f 0
1
package controllers
2
3
import (
4
	"memnixrest/app/database"
5
	"memnixrest/app/models"
6
	"memnixrest/pkg/queries"
7
	"net/http"
8
	"strings"
9
10
	"github.com/gofiber/fiber/v2"
11
)
12
13
// GetTodayCard method
14
// @Description Get next today card
15
// @Summary get a card
16
// @Tags Card
17
// @Produce json
18
// @Success 200 {object} models.Card
19
// @Router /v1/cards/today [get]
20
func GetTodayCard(c *fiber.Ctx) error {
21
	//db := database.DBConn // DB Conn
22
23
	res := *new(models.ResponseHTTP)
24
	auth := CheckAuth(c, models.PermUser) // Check auth
25
	if !auth.Success {
26
		return c.Status(http.StatusUnauthorized).JSON(models.ResponseHTTP{
27
			Success: false,
28
			Message: auth.Message,
29
			Data:    nil,
30
			Count:   0,
31
		})
32
	}
33
34
	if res = queries.FetchNextTodayCard(c, &auth.User); !res.Success {
35
		return c.Status(http.StatusInternalServerError).JSON(models.ResponseHTTP{
36
			Success: false,
37
			Message: res.Message,
38
			Data:    nil,
39
			Count:   0,
40
		})
41
	}
42
43
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
44
		Success: true,
45
		Message: "Get todays card",
46
		Data:    res.Data,
47
		Count:   1,
48
	})
49
}
50
51
// GetNextCard method
52
// @Description Get next card
53
// @Summary get a card
54
// @Tags Card
55
// @Produce json
56
// @Success 200 {object} models.Card
57
// @Router /v1/cards/next [get]
58
func GetNextCard(c *fiber.Ctx) error {
59
	//db := database.DBConn // DB Conn
60
61
	res := *new(models.ResponseHTTP)
62
	auth := CheckAuth(c, models.PermUser) // Check auth
63
	if !auth.Success {
64
		return c.Status(http.StatusUnauthorized).JSON(models.ResponseHTTP{
65
			Success: false,
66
			Message: auth.Message,
67
			Data:    nil,
68
			Count:   0,
69
		})
70
	}
71
72
	if res = queries.FetchNextCard(c, &auth.User); !res.Success {
73
		return c.Status(http.StatusInternalServerError).JSON(models.ResponseHTTP{
74
			Success: false,
75
			Message: res.Message,
76
			Data:    nil,
77
			Count:   0,
78
		})
79
	}
80
81
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
82
		Success: true,
83
		Message: "Get next card",
84
		Data:    res.Data,
85
		Count:   1,
86
	})
87
}
88
89
// GetNextCard method
90
// @Description Get next card by deckID
91
// @Summary get a card
92
// @Tags Card
93
// @Produce json
94
// @Success 200 {object} models.Card
95
// @Router /v1/cards/{deckID}/next [get]
96
func GetNextCardByDeck(c *fiber.Ctx) error {
97
	//db := database.DBConn // DB Conn
98
99
	deckID := c.Params("deckID")
100
101
	res := *new(models.ResponseHTTP)
102
	auth := CheckAuth(c, models.PermUser) // Check auth
103
	if !auth.Success {
104
		return c.Status(http.StatusUnauthorized).JSON(models.ResponseHTTP{
105
			Success: false,
106
			Message: auth.Message,
107
			Data:    nil,
108
			Count:   0,
109
		})
110
	}
111
112
	if res = queries.FetchNextCardByDeck(c, &auth.User, deckID); !res.Success {
113
		return c.Status(http.StatusInternalServerError).JSON(models.ResponseHTTP{
114
			Success: false,
115
			Message: res.Message,
116
			Data:    nil,
117
			Count:   0,
118
		})
119
	}
120
121
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
122
		Success: true,
123
		Message: "Get next card by deck",
124
		Data:    res.Data,
125
		Count:   1,
126
	})
127
}
128
129
// GetAllCards method
130
// @Description Get every cards. Shouldn't really be used
131
// @Summary get all cards
132
// @Tags Card
133
// @Produce json
134
// @Success 200 {array} models.Card
135
// @Router /v1/cards/ [get]
136
func GetAllCards(c *fiber.Ctx) error {
137
	db := database.DBConn // DB Conn
138
139
	auth := CheckAuth(c, models.PermAdmin) // Check auth
140
	if !auth.Success {
141
		return c.Status(http.StatusUnauthorized).JSON(models.ResponseHTTP{
142
			Success: false,
143
			Message: auth.Message,
144
			Data:    nil,
145
			Count:   0,
146
		})
147
	}
148
149
	var cards []models.Card
150
151
	if res := db.Joins("Deck").Find(&cards); res.Error != nil {
152
153
		return c.Status(http.StatusInternalServerError).JSON(models.ResponseHTTP{
154
			Success: false,
155
			Message: "Failed to get all cards",
156
			Data:    nil,
157
			Count:   0,
158
		})
159
	}
160
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
161
		Success: true,
162
		Message: "Get All cards",
163
		Data:    cards,
164
		Count:   len(cards),
165
	})
166
167
}
168
169
// GetCardByID method to get a card by id
170
// @Description Get a card by tech id
171
// @Summary get a card
172
// @Tags Card
173
// @Produce json
174
// @Param id path int true "Card ID"
175
// @Success 200 {object} models.Card
176
// @Router /v1/cards/id/{id} [get]
177
func GetCardByID(c *fiber.Ctx) error {
178
	db := database.DBConn // DB Conn
179
180
	auth := CheckAuth(c, models.PermAdmin) // Check auth
181
	if !auth.Success {
182
		return c.Status(http.StatusUnauthorized).JSON(models.ResponseHTTP{
183
			Success: false,
184
			Message: auth.Message,
185
			Data:    nil,
186
			Count:   0,
187
		})
188
	}
189
190
	// Params
191
	id := c.Params("id")
192
193
	card := new(models.Card)
194
195
	if err := db.Joins("Deck").First(&card, id).Error; err != nil {
196
		return c.Status(http.StatusServiceUnavailable).JSON(models.ResponseHTTP{
197
			Success: false,
198
			Message: err.Error(),
199
			Data:    nil,
200
			Count:   0,
201
		})
202
	}
203
204
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
205
		Success: true,
206
		Message: "Success get card by ID.",
207
		Data:    *card,
208
		Count:   1,
209
	})
210
}
211
212
// GetCardsFromDeck method to get cards from deck
213
// @Description Get every cards from a deck
214
// @Summary get a list of card
215
// @Tags Card
216
// @Produce json
217
// @Param deckID path int true "Deck ID"
218
// @Success 200 {array} models.Card
219
// @Router /v1/cards/deck/{deckID} [get]
220
func GetCardsFromDeck(c *fiber.Ctx) error {
221
	db := database.DBConn // DB Conn
222
223
	// Params
224
	id := c.Params("deckID")
225
226
	auth := CheckAuth(c, models.PermAdmin) // Check auth
227
	if !auth.Success {
228
		return c.Status(http.StatusUnauthorized).JSON(models.ResponseHTTP{
229
			Success: false,
230
			Message: auth.Message,
231
			Data:    nil,
232
			Count:   0,
233
		})
234
	}
235
236
	var cards []models.Card
237
238
	if err := db.Joins("Deck").Where("cards.deck_id = ?", id).Find(&cards).Error; err != nil {
239
		return c.Status(http.StatusServiceUnavailable).JSON(models.ResponseHTTP{
240
			Success: false,
241
			Message: err.Error(),
242
			Data:    nil,
243
			Count:   0,
244
		})
245
	}
246
247
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
248
		Success: true,
249
		Message: "Success get cards from deck.",
250
		Data:    cards,
251
		Count:   len(cards),
252
	})
253
}
254
255
// POST
256
257
// CreateNewCard method
258
// @Description Create a new card
259
// @Summary create a card
260
// @Tags Card
261
// @Produce json
262
// @Accept json
263
// @Param card body models.Card true "Card to create"
264
// @Success 200
265
// @Router /v1/cards/new [post]
266
func CreateNewCard(c *fiber.Ctx) error {
267
	db := database.DBConn // DB Conn
268
	card := new(models.Card)
269
270
	auth := CheckAuth(c, models.PermAdmin) // Check auth
271
	if !auth.Success {
272
		return c.Status(http.StatusUnauthorized).JSON(models.ResponseHTTP{
273
			Success: false,
274
			Message: auth.Message,
275
			Data:    nil,
276
			Count:   0,
277
		})
278
	}
279
280
	if err := c.BodyParser(&card); err != nil {
281
		return c.Status(http.StatusBadRequest).JSON(models.ResponseHTTP{
282
			Success: false,
283
			Message: err.Error(),
284
			Data:    nil,
285
			Count:   0,
286
		})
287
	}
288
289
	db.Preload("Deck").Create(card)
290
291
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
292
		Success: true,
293
		Message: "Success register a card",
294
		Data:    *card,
295
		Count:   1,
296
	})
297
}
298
299
// PostResponse method
300
// @Description Post a response and check it
301
// @Summary post a response
302
// @Tags Card
303
// @Produce json
304
// @Success 200
305
// @Accept json
306
// @Router /v1/cards/response [post]
307
func PostResponse(c *fiber.Ctx) error {
308
	db := database.DBConn // DB Conn
309
310
	auth := CheckAuth(c, models.PermUser) // Check auth
311
	if !auth.Success {
312
		return c.Status(http.StatusUnauthorized).JSON(models.ResponseHTTP{
313
			Success: false,
314
			Message: auth.Message,
315
			Data:    nil,
316
			Count:   0,
317
		})
318
	}
319
320
	response := new(models.CardResponse)
321
	card := new(models.Card)
322
323
	if err := c.BodyParser(&response); err != nil {
324
		return c.Status(http.StatusBadRequest).JSON(models.ResponseHTTP{
325
			Success: false,
326
			Message: err.Error(),
327
			Data:    nil,
328
			Count:   0,
329
		})
330
	}
331
332
	if err := db.Joins("Deck").First(&card, response.CardID).Error; err != nil {
333
		return c.Status(http.StatusServiceUnavailable).JSON(models.ResponseHTTP{
334
			Success: false,
335
			Message: err.Error(),
336
			Data:    nil,
337
			Count:   0,
338
		})
339
	}
340
341
	access := queries.CheckAccess(c, &auth.User, card)
342
343
	if access.Permission < models.AccessStudent {
344
		return c.Status(http.StatusServiceUnavailable).JSON(models.ResponseHTTP{
345
			Success: false,
346
			Message: "You don't have the permission to answer this deck!",
347
			Data:    nil,
348
			Count:   0,
349
		})
350
	}
351
352
	validation := new(models.CardResponseValidation)
353
354
	if strings.EqualFold(strings.TrimSpace(response.Response), strings.TrimSpace(card.Answer)) {
355
		validation.Validate = true
356
		validation.Message = "Correct answer"
357
	} else {
358
		validation.Validate = false
359
		validation.Message = "Incorrect answer"
360
	}
361
362
	_ = queries.PostMem(c, auth.User, *card, *validation)
363
364
	validation.Answer = card.Answer
365
366
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
367
		Success: true,
368
		Message: "Success post response",
369
		Data:    *validation,
370
		Count:   1,
371
	})
372
}
373