Completed
Push — main ( 19662a...9f7f07 )
by Yume
14s queued 11s
created

controllers.GetAllSubUsers   B

Complexity

Conditions 5

Size

Total Lines 29
Code Lines 20

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
eloc 20
nop 1
dl 0
loc 29
rs 8.9332
c 0
b 0
f 0
1
package controllers
2
3
import (
4
	"memnixrest/app/models"
5
	queries2 "memnixrest/app/queries"
6
	"memnixrest/pkg/database"
7
	"memnixrest/pkg/utils"
8
	"net/http"
9
	"strconv"
10
11
	"github.com/gofiber/fiber/v2"
12
)
13
14
// GET
15
16
// GetAllDecks method to get all decks
17
// @Description Get every deck. Shouldn't really be used, consider using /v1/decks/public instead !
18
// @Summary gets all decks
19
// @Tags Deck
20
// @Produce json
21
// @Success 200 {object} models.Deck
22
// @Router /v1/decks [get]
23
func GetAllDecks(c *fiber.Ctx) error {
24
	db := database.DBConn // DB Conn
25
26
	auth := CheckAuth(c, models.PermAdmin) // Check auth
27
	if !auth.Success {
28
		return queries2.AuthError(c, auth)
29
	}
30
31
	var decks []models.Deck
32
33
	if res := db.Find(&decks); res.Error != nil {
34
		return queries2.RequestError(c, http.StatusInternalServerError, utils.ErrorRequestFailed)
35
	}
36
37
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
38
		Success: true,
39
		Message: "Get all decks",
40
		Data:    decks,
41
		Count:   len(decks),
42
	})
43
44
}
45
46
// GetDeckByID method to get a deck
47
// @Description Get a deck by tech ID
48
// @Summary get a deck
49
// @Tags Deck
50
// @Produce json
51
// @Param id path int true "Deck ID"
52
// @Success 200 {model} models.Deck
53
// @Router /v1/decks/{deckID} [get]
54
func GetDeckByID(c *fiber.Ctx) error {
55
	db := database.DBConn // DB Conn
56
57
	// Params
58
	id := c.Params("deckID")
59
60
	auth := CheckAuth(c, models.PermAdmin) // Check auth
61
	if !auth.Success {
62
		return queries2.AuthError(c, auth)
63
	}
64
65
	deck := new(models.Deck)
66
67
	if err := db.First(&deck, id).Error; err != nil {
68
		return queries2.RequestError(c, http.StatusInternalServerError, err.Error())
69
	}
70
71
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
72
		Success: true,
73
		Message: "Success get deck by ID.",
74
		Data:    *deck,
75
		Count:   1,
76
	})
77
}
78
79
// GetAllSubDecks method to get a deck
80
// @Description Get decks a user is sub to
81
// @Summary get a list of deck
82
// @Tags Deck
83
// @Produce json
84
// @Success 200 {array} models.ResponseDeck
85
// @Router /v1/decks/sub [get]
86
func GetAllSubDecks(c *fiber.Ctx) error {
87
	db := database.DBConn // DB Conn
88
89
	auth := CheckAuth(c, models.PermUser) // Check auth
90
	if !auth.Success {
91
		return queries2.AuthError(c, auth)
92
	}
93
94
	var responseDeck []models.ResponseDeck
95
96
	var accesses []models.Access // Accesses array
97
98
	if err := db.Joins("Deck").Joins("User").Where("accesses.user_id = ? AND accesses.permission >= ?", auth.User.ID, models.AccessStudent).Find(&accesses).Error; err != nil {
99
		return queries2.RequestError(c, http.StatusInternalServerError, err.Error())
100
	}
101
102
	for _, s := range accesses {
103
		responseDeck = append(responseDeck, queries2.FillResponseDeck(&s.Deck, s.Permission))
104
	}
105
106
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
107
		Success: true,
108
		Message: "Get all sub decks",
109
		Data:    responseDeck,
110
		Count:   len(responseDeck),
111
	})
112
}
113
114
// GetAllSubUsers method to get a list of users
115
// @Description Get all the sub users to a deck
116
// @Summary gets a list of users
117
// @Tags Deck
118
// @Produce json
119
// @Success 200 {array} models.User
120
// @Router /v1/decks/{deckID}/users [get]
121
func GetAllSubUsers(c *fiber.Ctx) error {
122
123
	// Params
124
	deckID := c.Params("deckID")
125
	result := new(models.ResponseHTTP)
126
	auth := CheckAuth(c, models.PermUser) // Check auth
127
	if !auth.Success {
128
		return queries2.AuthError(c, auth)
129
	}
130
131
	var users []models.User
132
	id, _ := strconv.ParseUint(deckID, 10, 32)
133
134
	if result = queries2.GetSubUsers(uint(id)); !result.Success {
135
		return queries2.RequestError(c, http.StatusInternalServerError, utils.ErrorRequestFailed)
136
	}
137
138
	switch result.Data.(type) {
139
	default:
140
		return queries2.RequestError(c, http.StatusInternalServerError, utils.ErrorRequestFailed)
141
	case []models.User:
142
		users = result.Data.([]models.User)
143
	}
144
145
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
146
		Success: true,
147
		Message: "Get all sub users",
148
		Data:    users,
149
		Count:   len(users),
150
	})
151
}
152
153
// GetAllAvailableDecks method to get a list of deck
154
// @Description Get all public deck that you are not sub to
155
// @Summary get a list of deck
156
// @Tags Deck
157
// @Produce json
158
// @Success 200 {array} models.ResponseDeck
159
// @Router /v1/decks/available [get]
160
func GetAllAvailableDecks(c *fiber.Ctx) error {
161
	db := database.DBConn // DB Conn
162
163
	auth := CheckAuth(c, models.PermUser) // Check auth
164
	if !auth.Success {
165
		return queries2.AuthError(c, auth)
166
	}
167
168
	var responseDeck []models.ResponseDeck
169
	var decks []models.Deck
170
171
	if err := db.Raw("SELECT DISTINCT public.decks.* FROM public.decks INNER JOIN public.accesses ON public.decks.id = public.accesses.deck_id INNER JOIN public.users ON public.users.id = public.accesses.user_id WHERE public.decks.status = 3 AND "+
172
		"(( public.accesses.permission < 1 ) OR (NOT EXISTS (select public.decks.* from public.decks INNER JOIN public.accesses ON public.decks.id = public.accesses.deck_id WHERE public.decks.status = 3 AND public.accesses.user_id = ?)))", auth.User.ID).Scan(&decks).Error; err != nil {
173
		return queries2.RequestError(c, http.StatusInternalServerError, err.Error())
174
	}
175
176
	for _, s := range decks {
177
		responseDeck = append(responseDeck, queries2.FillResponseDeck(&s, models.AccessNone))
178
	}
179
180
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
181
		Success: true,
182
		Message: "Get all available decks",
183
		Data:    responseDeck,
184
		Count:   len(responseDeck),
185
	})
186
}
187
188
// GetAllPublicDecks method to get a list of deck
189
// @Description Get all public deck
190
// @Summary gets a list of deck
191
// @Tags Deck
192
// @Produce json
193
// @Success 200 {array} models.Deck
194
// @Router /v1/decks/public [get]
195
func GetAllPublicDecks(c *fiber.Ctx) error {
196
	db := database.DBConn // DB Conn
197
198
	auth := CheckAuth(c, models.PermUser) // Check auth
199
	if !auth.Success {
200
		return queries2.AuthError(c, auth)
201
	}
202
203
	var decks []models.Deck
204
205
	if err := db.Where("decks.status = ?", models.DeckPublic).Find(&decks).Error; err != nil {
206
		return queries2.RequestError(c, http.StatusInternalServerError, err.Error())
207
	}
208
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
209
		Success: true,
210
		Message: "Get all public decks",
211
		Data:    decks,
212
		Count:   len(decks),
213
	})
214
}
215
216
// POST
217
218
// CreateNewDeck method
219
// @Description Create a new deck
220
// @Summary creates a deck
221
// @Tags Deck
222
// @Produce json
223
// @Success 200
224
// @Accept json
225
// @Param deck body models.Deck true "Deck to create"
226
// @Router /v1/decks/new [post]
227
func CreateNewDeck(c *fiber.Ctx) error {
228
	db := database.DBConn // DB Conn
229
230
	auth := CheckAuth(c, models.PermUser) // Check auth
231
	if !auth.Success {
232
		return queries2.AuthError(c, auth)
233
	}
234
235
	deck := new(models.Deck)
236
237
	if err := c.BodyParser(&deck); err != nil {
238
		return queries2.RequestError(c, http.StatusBadRequest, err.Error())
239
240
	}
241
242
	if len(deck.DeckName) <= 5 {
243
		return queries2.RequestError(c, http.StatusBadRequest, utils.ErrorDeckName)
244
	}
245
246
	deck.Status = models.DeckPrivate
247
	db.Create(deck)
248
249
	if err := queries2.GenerateCreatorAccess(&auth.User, deck); !err.Success {
250
		return queries2.RequestError(c, http.StatusBadRequest, err.Message)
251
	}
252
253
	log := queries2.CreateLog(models.LogDeckCreated, auth.User.Username+" created "+deck.DeckName)
254
	_ = queries2.CreateUserLog(auth.User.ID, log)
255
	_ = queries2.CreateDeckLog(deck.ID, log)
256
257
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
258
		Success: true,
259
		Message: "Success register a deck",
260
		Data:    *deck,
261
		Count:   1,
262
	})
263
}
264
265
// UnSubToDeck method
266
// @Description Unsubscribe to a deck
267
// @Summary unsub deck
268
// @Tags Deck
269
// @Produce json
270
// @Success 200
271
// @Accept json
272
// @Router /v1/decks/{deckID}/unsubscribe [post]
273
func UnSubToDeck(c *fiber.Ctx) error {
274
	db := database.DBConn // DB Conn
275
276
	auth := CheckAuth(c, models.PermUser) // Check auth
277
	if !auth.Success {
278
		return queries2.AuthError(c, auth)
279
	}
280
281
	// Params
282
	deckID := c.Params("deckID")
283
284
	access := new(models.Access)
285
	if err := db.Joins("User").Joins("Deck").Where("accesses.user_id = ? AND accesses.deck_id = ?", auth.User.ID, deckID).Find(&access).Error; err != nil {
286
		return queries2.RequestError(c, http.StatusBadRequest, utils.ErrorNotSub)
287
	}
288
289
	if access.Permission == 0 {
290
		return queries2.RequestError(c, http.StatusForbidden, utils.ErrorNotSub)
291
	}
292
293
	access.Permission = 0
294
	db.Preload("User").Preload("Deck").Save(access)
295
296
	log := queries2.CreateLog(models.LogUnsubscribe, auth.User.Username+" unsubscribed to "+access.Deck.DeckName)
297
	_ = queries2.CreateUserLog(auth.User.ID, log)
298
	_ = queries2.CreateDeckLog(access.Deck.ID, log)
299
300
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
301
		Success: true,
302
		Message: "Success unsub to the deck",
303
		Data:    nil,
304
		Count:   0,
305
	})
306
}
307
308
// SubToDeck method
309
// @Description Subscribe to a deck
310
// @Summary sub deck
311
// @Tags Deck
312
// @Produce json
313
// @Success 200
314
// @Accept json
315
// @Router /v1/decks/{deckID}/subscribe [post]
316
func SubToDeck(c *fiber.Ctx) error {
317
	db := database.DBConn // DB Conn
318
	deckID := c.Params("deckID")
319
	deck := new(models.Deck)
320
321
	// Check auth
322
	auth := CheckAuth(c, models.PermUser)
323
	if !auth.Success {
324
		return queries2.AuthError(c, auth)
325
	}
326
327
	if err := db.First(&deck, deckID).Error; err != nil {
328
		return queries2.RequestError(c, http.StatusInternalServerError, err.Error())
329
330
	}
331
332
	if err := queries2.GenerateAccess(&auth.User, deck); !err.Success {
333
		return queries2.RequestError(c, http.StatusInternalServerError, err.Message)
334
	}
335
336
	if err := queries2.PopulateMemDate(&auth.User, deck); !err.Success {
337
		return queries2.RequestError(c, http.StatusInternalServerError, err.Message)
338
	}
339
340
	log := queries2.CreateLog(models.LogSubscribe, auth.User.Username+" subscribed to "+deck.DeckName)
341
	_ = queries2.CreateUserLog(auth.User.ID, log)
342
	_ = queries2.CreateDeckLog(deck.ID, log)
343
344
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
345
		Success: true,
346
		Message: "Success subscribing to deck",
347
		Data:    nil,
348
		Count:   0,
349
	})
350
}
351
352
// PUT
353
354
// UpdateDeckByID method
355
// @Description Edit a deck
356
// @Summary edits a deck
357
// @Tags Deck
358
// @Produce json
359
// @Success 200
360
// @Accept json
361
// @Param deck body models.Deck true "Deck to edit"
362
// @Router /v1/decks/{deckID}/edit [put]
363
func UpdateDeckByID(c *fiber.Ctx) error {
364
	db := database.DBConn // DB Conn
365
366
	// Params
367
	id := c.Params("deckID")
368
369
	auth := CheckAuth(c, models.PermUser) // Check auth
370
	if !auth.Success {
371
		return queries2.AuthError(c, auth)
372
	}
373
374
	deck := new(models.Deck)
375
376
	if err := db.First(&deck, id).Error; err != nil {
377
		return queries2.RequestError(c, http.StatusInternalServerError, err.Error())
378
379
	}
380
381
	if res := queries2.CheckAccess(auth.User.ID, deck.ID, models.AccessOwner); !res.Success {
382
		return queries2.RequestError(c, http.StatusForbidden, utils.ErrorForbidden)
383
384
	}
385
386
	if err := UpdateDeck(c, deck); !err.Success {
387
		return queries2.RequestError(c, http.StatusBadRequest, err.Message)
388
	}
389
390
	log := queries2.CreateLog(models.LogDeckEdited, auth.User.Username+" edited "+deck.DeckName)
391
	_ = queries2.CreateUserLog(auth.User.ID, log)
392
	_ = queries2.CreateDeckLog(deck.ID, log)
393
394
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
395
		Success: true,
396
		Message: "Success update deck by ID",
397
		Data:    *deck,
398
		Count:   1,
399
	})
400
}
401
402
// UpdateDeck function
403
func UpdateDeck(c *fiber.Ctx, d *models.Deck) *models.ResponseHTTP {
404
	db := database.DBConn
405
406
	deckStatus := d.Status
407
408
	res := new(models.ResponseHTTP)
409
410
	if err := c.BodyParser(&d); err != nil {
411
		res.GenerateError(err.Error())
412
		return res
413
414
	}
415
416
	if d.Status != deckStatus {
417
		res.GenerateError(utils.ErrorBreak)
418
		return res
419
	}
420
421
	if len(d.DeckName) <= 5 {
422
		res.GenerateError(utils.ErrorDeckName)
423
		return res
424
	}
425
426
	db.Save(d)
427
428
	res.GenerateSuccess("Success update deck", nil, 0)
429
	return res
430
}
431
432
// DeleteDeckById method
433
// @Description Delete a deck
434
// @Summary delete a deck
435
// @Tags Deck
436
// @Produce json
437
// @Success 200
438
// @Router /v1/decks/{deckID} [delete]
439
func DeleteDeckById(c *fiber.Ctx) error {
440
	db := database.DBConn // DB Conn
441
	id := c.Params("deckID")
442
443
	auth := CheckAuth(c, models.PermUser) // Check auth
444
	if !auth.Success {
445
		return queries2.AuthError(c, auth)
446
	}
447
448
	deck := new(models.Deck)
449
450
	if err := db.First(&deck, id).Error; err != nil {
451
		return queries2.RequestError(c, http.StatusInternalServerError, err.Error())
452
453
	}
454
455
	if res := queries2.CheckAccess(auth.User.ID, deck.ID, models.AccessOwner); !res.Success {
456
		return queries2.RequestError(c, http.StatusForbidden, utils.ErrorForbidden)
457
	}
458
459
	db.Delete(deck)
460
461
	log := queries2.CreateLog(models.LogDeckDeleted, auth.User.Username+" deleted "+deck.DeckName)
462
	_ = queries2.CreateUserLog(auth.User.ID, log)
463
	_ = queries2.CreateDeckLog(deck.ID, log)
464
465
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
466
		Success: true,
467
		Message: "Success delete deck by ID",
468
		Data:    *deck,
469
		Count:   1,
470
	})
471
472
}
473