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

controllers.GetAllAvailableDecks   A

Complexity

Conditions 3

Size

Total Lines 29
Code Lines 21

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 21
nop 1
dl 0
loc 29
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
9
	"github.com/gofiber/fiber/v2"
10
)
11
12
// GET
13
14
// GetAllDecks method to get all decks
15
// @Description Get every deck. Shouldn't really be used, consider using /v1/decks/public instead !
16
// @Summary get all decks
17
// @Tags Deck
18
// @Produce json
19
// @Success 200 {object} models.Deck
20
// @Router /v1/decks [get]
21
func GetAllDecks(c *fiber.Ctx) error {
22
	db := database.DBConn // DB Conn
23
24
	auth := CheckAuth(c, models.PermAdmin) // 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
	var decks []models.Deck
35
36
	if res := db.Find(&decks); res.Error != nil {
37
38
		return c.Status(http.StatusInternalServerError).JSON(models.ResponseHTTP{
39
			Success: false,
40
			Message: "Failed to get all decks",
41
			Data:    nil,
42
			Count:   0,
43
		})
44
	}
45
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
46
		Success: true,
47
		Message: "Get all decks",
48
		Data:    decks,
49
		Count:   len(decks),
50
	})
51
52
}
53
54
// GetDeckByID method to get a deck
55
// @Description Get a deck by tech ID
56
// @Summary get a deck
57
// @Tags Deck
58
// @Produce json
59
// @Param id path int true "Deck ID"
60
// @Success 200 {model} models.Deck
61
// @Router /v1/decks/{id} [get]
62
func GetDeckByID(c *fiber.Ctx) error {
63
	db := database.DBConn // DB Conn
64
65
	// Params
66
	id := c.Params("id")
67
68
	auth := CheckAuth(c, models.PermAdmin) // Check auth
69
	if !auth.Success {
70
		return c.Status(http.StatusUnauthorized).JSON(models.ResponseHTTP{
71
			Success: false,
72
			Message: auth.Message,
73
			Data:    nil,
74
			Count:   0,
75
		})
76
	}
77
78
	deck := new(models.Deck)
79
80
	if err := db.First(&deck, id).Error; err != nil {
81
		return c.Status(http.StatusServiceUnavailable).JSON(models.ResponseHTTP{
82
			Success: false,
83
			Message: err.Error(),
84
			Data:    nil,
85
			Count:   0,
86
		})
87
	}
88
89
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
90
		Success: true,
91
		Message: "Success get deck by ID.",
92
		Data:    *deck,
93
		Count:   1,
94
	})
95
}
96
97
// GetAllSubDecks method to get a deck
98
// @Description Get decks a user is sub to
99
// @Summary get a list of deck
100
// @Tags Deck
101
// @Produce json
102
// @Param userID path int true "user ID"
103
// @Success 200 {array} models.Deck
104
// @Router /v1/decks/sub [get]
105
func GetAllSubDecks(c *fiber.Ctx) error {
106
	db := database.DBConn // DB Conn
107
108
	auth := CheckAuth(c, models.PermUser) // Check auth
109
	if !auth.Success {
110
		return c.Status(http.StatusUnauthorized).JSON(models.ResponseHTTP{
111
			Success: false,
112
			Message: auth.Message,
113
			Data:    nil,
114
			Count:   0,
115
		})
116
	}
117
118
	var decks []models.Deck
119
120
	if err := db.Joins("JOIN accesses ON accesses.deck_id = decks.id AND accesses.user_id = ? AND accesses.permission >= ?", auth.User.ID, models.AccessStudent).Find(&decks).Error; err != nil {
121
		return c.Status(http.StatusInternalServerError).JSON(models.ResponseHTTP{
122
			Success: false,
123
			Message: "Failed to get all sub decks",
124
			Data:    nil,
125
			Count:   0,
126
		})
127
	}
128
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
129
		Success: true,
130
		Message: "Get all sub decks",
131
		Data:    decks,
132
		Count:   len(decks),
133
	})
134
}
135
136
// GetAllAvailableDecks method to get a list of deck
137
// @Description Get all public deck that you are not sub to
138
// @Summary get a list of deck
139
// @Tags Deck
140
// @Produce json
141
// @Success 200 {array} models.Deck
142
// @Router /v1/decks/available [get]
143
func GetAllAvailableDecks(c *fiber.Ctx) error {
144
	db := database.DBConn // DB Conn
145
146
	// Params
147
	auth := CheckAuth(c, models.PermUser) // Check auth
148
	if !auth.Success {
149
		return c.Status(http.StatusUnauthorized).JSON(models.ResponseHTTP{
150
			Success: false,
151
			Message: auth.Message,
152
			Data:    nil,
153
			Count:   0,
154
		})
155
	}
156
157
	var decks []models.Deck
158
159
	if err := db.Joins("JOIN accesses ON accesses.deck_id = decks.id AND decks.status = ? AND accesses.user_id = ? AND accesses.permission < ?", models.DeckPublic, auth.User.ID, models.AccessStudent).Find(&decks).Error; err != nil {
160
		return c.Status(http.StatusInternalServerError).JSON(models.ResponseHTTP{
161
			Success: false,
162
			Message: "Failed to get all sub decks",
163
			Data:    nil,
164
			Count:   0,
165
		})
166
	}
167
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
168
		Success: true,
169
		Message: "Get all sub decks",
170
		Data:    decks,
171
		Count:   len(decks),
172
	})
173
}
174
175
// GetAllPublicDecks method to get a list of deck
176
// @Description Get all public deck
177
// @Summary get a list of deck
178
// @Tags Deck
179
// @Produce json
180
// @Success 200 {array} models.Deck
181
// @Router /v1/decks/public [get]
182
func GetAllPublicDecks(c *fiber.Ctx) error {
183
	db := database.DBConn // DB Conn
184
185
	auth := CheckAuth(c, models.PermUser) // Check auth
186
	if !auth.Success {
187
		return c.Status(http.StatusUnauthorized).JSON(models.ResponseHTTP{
188
			Success: false,
189
			Message: auth.Message,
190
			Data:    nil,
191
			Count:   0,
192
		})
193
	}
194
195
	var decks []models.Deck
196
197
	if err := db.Where("decks.status = ?", models.DeckPublic).Find(&decks).Error; err != nil {
198
		return c.Status(http.StatusInternalServerError).JSON(models.ResponseHTTP{
199
			Success: false,
200
			Message: "Failed to get all public decks",
201
			Data:    nil,
202
			Count:   0,
203
		})
204
	}
205
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
206
		Success: true,
207
		Message: "Get all public decks",
208
		Data:    decks,
209
		Count:   len(decks),
210
	})
211
}
212
213
// POST
214
215
//TODO: Swagger
216
217
// CreateNewDeck
218
func CreateNewDeck(c *fiber.Ctx) error {
219
	db := database.DBConn // DB Conn
220
221
	auth := CheckAuth(c, models.PermAdmin) // Check auth
222
	if !auth.Success {
223
		return c.Status(http.StatusUnauthorized).JSON(models.ResponseHTTP{
224
			Success: false,
225
			Message: auth.Message,
226
			Data:    nil,
227
			Count:   0,
228
		})
229
	}
230
231
	deck := new(models.Deck)
232
233
	if err := c.BodyParser(&deck); err != nil {
234
		return c.Status(http.StatusBadRequest).JSON(models.ResponseHTTP{
235
			Success: false,
236
			Message: err.Error(),
237
			Data:    nil,
238
			Count:   0,
239
		})
240
	}
241
242
	db.Create(deck)
243
244
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
245
		Success: true,
246
		Message: "Success register a deck",
247
		Data:    *deck,
248
		Count:   1,
249
	})
250
}
251
252
// UnsubToDeck
253
func UnSubToDeck(c *fiber.Ctx) error {
254
	db := database.DBConn // DB Conn
255
256
	auth := CheckAuth(c, models.PermUser) // Check auth
257
	if !auth.Success {
258
		return c.Status(http.StatusUnauthorized).JSON(models.ResponseHTTP{
259
			Success: false,
260
			Message: auth.Message,
261
			Data:    nil,
262
			Count:   0,
263
		})
264
	}
265
266
	// Params
267
	deckID := c.Params("deckID")
268
269
	access := new(models.Access)
270
	if err := db.Joins("User").Joins("Deck").Where("accesses.user_id = ? AND accesses.deck_id =?", auth.User.ID, deckID).Find(&access).Error; err != nil {
271
		return c.Status(http.StatusInternalServerError).JSON(models.ResponseHTTP{
272
			Success: false,
273
			Message: "This user isn't sub to the deck",
274
			Data:    nil,
275
			Count:   0,
276
		})
277
	}
278
279
	access.Permission = 0
280
	db.Preload("User").Preload("Deck").Save(access)
281
282
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
283
		Success: true,
284
		Message: "Success unsub to the deck",
285
		Data:    nil,
286
		Count:   0,
287
	})
288
}
289
290
// SubToDeck
291
func SubToDeck(c *fiber.Ctx) error {
292
	db := database.DBConn // DB Conn
293
	deckID := c.Params("deckID")
294
	deck := new(models.Deck)
295
296
	// Check auth
297
	auth := CheckAuth(c, models.PermUser)
298
	if !auth.Success {
299
		return c.Status(http.StatusUnauthorized).JSON(models.ResponseHTTP{
300
			Success: false,
301
			Message: auth.Message,
302
			Data:    nil,
303
			Count:   0,
304
		})
305
	}
306
307
	if err := db.First(&deck, deckID).Error; err != nil {
308
		return c.Status(http.StatusInternalServerError).JSON(models.ResponseHTTP{
309
			Success: false,
310
			Message: err.Error(),
311
			Data:    nil,
312
			Count:   0,
313
		})
314
	}
315
316
	if err := queries.GenerateAccess(c, &auth.User, deck); !err.Success {
317
		return c.Status(http.StatusInternalServerError).JSON(models.ResponseHTTP{
318
			Success: false,
319
			Message: err.Message,
320
			Data:    nil,
321
			Count:   0,
322
		})
323
	}
324
325
	if err := queries.PopulateMemDate(c, &auth.User, deck); !err.Success {
326
		return c.Status(http.StatusInternalServerError).JSON(models.ResponseHTTP{
327
			Success: false,
328
			Message: err.Message,
329
			Data:    nil,
330
			Count:   0,
331
		})
332
	}
333
334
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
335
		Success: true,
336
		Message: "Success subscribing to deck",
337
		Data:    nil,
338
		Count:   0,
339
	})
340
}
341