Passed
Push — main ( 161ef3...619ee7 )
by Yume
01:02
created

controllers.UnSubToDeck   A

Complexity

Conditions 3

Size

Total Lines 40
Code Lines 28

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 28
nop 1
dl 0
loc 40
rs 9.208
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
// @Success 200 {array} models.Deck
103
// @Router /v1/decks/sub [get]
104
func GetAllSubDecks(c *fiber.Ctx) error {
105
	db := database.DBConn // DB Conn
106
107
	auth := CheckAuth(c, models.PermUser) // Check auth
108
	if !auth.Success {
109
		return c.Status(http.StatusUnauthorized).JSON(models.ResponseHTTP{
110
			Success: false,
111
			Message: auth.Message,
112
			Data:    nil,
113
			Count:   0,
114
		})
115
	}
116
117
	var decks []models.Deck
118
119
	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 {
120
		return c.Status(http.StatusInternalServerError).JSON(models.ResponseHTTP{
121
			Success: false,
122
			Message: "Failed to get all sub decks",
123
			Data:    nil,
124
			Count:   0,
125
		})
126
	}
127
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
128
		Success: true,
129
		Message: "Get all sub decks",
130
		Data:    decks,
131
		Count:   len(decks),
132
	})
133
}
134
135
// GetAllAvailableDecks method to get a list of deck
136
// @Description Get all public deck that you are not sub to
137
// @Summary get a list of deck
138
// @Tags Deck
139
// @Produce json
140
// @Success 200 {array} models.Deck
141
// @Router /v1/decks/available [get]
142
func GetAllAvailableDecks(c *fiber.Ctx) error {
143
	db := database.DBConn // DB Conn
144
145
	// Params
146
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("left join accesses ON decks.id = accesses.deck_id AND accesses.user_id = ?", auth.User.ID).Where("decks.status = ? AND ((accesses.deck_id IS NULL) OR (accesses.permission < ?))", models.DeckPublic, 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 public decks: " + err.Error(),
163
			Data:    nil,
164
			Count:   0,
165
		})
166
	}
167
168
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
169
		Success: true,
170
		Message: "Get all available decks",
171
		Data:    decks,
172
		Count:   len(decks),
173
	})
174
}
175
176
// GetAllPublicDecks method to get a list of deck
177
// @Description Get all public deck
178
// @Summary get a list of deck
179
// @Tags Deck
180
// @Produce json
181
// @Success 200 {array} models.Deck
182
// @Router /v1/decks/public [get]
183
func GetAllPublicDecks(c *fiber.Ctx) error {
184
	db := database.DBConn // DB Conn
185
186
	auth := CheckAuth(c, models.PermUser) // Check auth
187
	if !auth.Success {
188
		return c.Status(http.StatusUnauthorized).JSON(models.ResponseHTTP{
189
			Success: false,
190
			Message: auth.Message,
191
			Data:    nil,
192
			Count:   0,
193
		})
194
	}
195
196
	var decks []models.Deck
197
198
	if err := db.Where("decks.status = ?", models.DeckPublic).Find(&decks).Error; err != nil {
199
		return c.Status(http.StatusInternalServerError).JSON(models.ResponseHTTP{
200
			Success: false,
201
			Message: "Failed to get all public decks",
202
			Data:    nil,
203
			Count:   0,
204
		})
205
	}
206
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
207
		Success: true,
208
		Message: "Get all public decks",
209
		Data:    decks,
210
		Count:   len(decks),
211
	})
212
}
213
214
// POST
215
216
// CreateNewDeck method
217
// @Description Create a new deck
218
// @Summary create a deck
219
// @Tags Deck
220
// @Produce json
221
// @Success 200
222
// @Accept json
223
// @Param deck body models.Deck true "Deck to create"
224
// @Router /v1/decks/new [post]
225
func CreateNewDeck(c *fiber.Ctx) error {
226
	db := database.DBConn // DB Conn
227
228
	auth := CheckAuth(c, models.PermUser) // Check auth
229
	if !auth.Success {
230
		return c.Status(http.StatusUnauthorized).JSON(models.ResponseHTTP{
231
			Success: false,
232
			Message: auth.Message,
233
			Data:    nil,
234
			Count:   0,
235
		})
236
	}
237
238
	deck := new(models.Deck)
239
240
	if err := c.BodyParser(&deck); err != nil {
241
		return c.Status(http.StatusBadRequest).JSON(models.ResponseHTTP{
242
			Success: false,
243
			Message: err.Error(),
244
			Data:    nil,
245
			Count:   0,
246
		})
247
	}
248
249
	if len(deck.DeckName) <= 5 {
250
		return c.Status(http.StatusBadRequest).JSON(models.ResponseHTTP{
251
			Success: false,
252
			Message: "Your deck's name should be at least 5 char long.",
253
			Data:    nil,
254
			Count:   0,
255
		})
256
	}
257
258
	deck.Status = models.DeckPrivate
259
260
	db.Create(deck)
261
262
	if err := queries.GenerateCreatorAccess(c, &auth.User, deck); !err.Success {
263
		return c.Status(http.StatusBadRequest).JSON(models.ResponseHTTP{
264
			Success: false,
265
			Message: err.Message,
266
			Data:    nil,
267
			Count:   0,
268
		})
269
	}
270
271
	log := queries.CreateLog(models.LogDeckCreated, auth.User.Username+" created "+deck.DeckName)
272
	_ = queries.CreateUserLog(auth.User, *log)
273
	_ = queries.CreateDeckLog(*deck, *log)
274
275
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
276
		Success: true,
277
		Message: "Success register a deck",
278
		Data:    *deck,
279
		Count:   1,
280
	})
281
}
282
283
// UnSubToDeck method
284
// @Description Unsubscribe to a deck
285
// @Summary unsub deck
286
// @Tags Deck
287
// @Produce json
288
// @Success 200
289
// @Accept json
290
// @Router /v1/decks/{deckID}/unsubscribe [post]
291
func UnSubToDeck(c *fiber.Ctx) error {
292
	db := database.DBConn // DB Conn
293
294
	auth := CheckAuth(c, models.PermUser) // Check auth
295
	if !auth.Success {
296
		return c.Status(http.StatusUnauthorized).JSON(models.ResponseHTTP{
297
			Success: false,
298
			Message: auth.Message,
299
			Data:    nil,
300
			Count:   0,
301
		})
302
	}
303
304
	// Params
305
	deckID := c.Params("deckID")
306
307
	access := new(models.Access)
308
	if err := db.Joins("User").Joins("Deck").Where("accesses.user_id = ? AND accesses.deck_id =?", auth.User.ID, deckID).Find(&access).Error; err != nil {
309
		return c.Status(http.StatusInternalServerError).JSON(models.ResponseHTTP{
310
			Success: false,
311
			Message: "This user isn't sub to the deck",
312
			Data:    nil,
313
			Count:   0,
314
		})
315
	}
316
317
	access.Permission = 0
318
	db.Preload("User").Preload("Deck").Save(access)
319
320
	_ = queries.DeleteRating(c, &auth.User, &access.Deck)
321
322
	log := queries.CreateLog(models.LogUnsubscribe, auth.User.Username+" unsubscribed to "+access.Deck.DeckName)
323
	_ = queries.CreateUserLog(auth.User, *log)
324
	_ = queries.CreateDeckLog(access.Deck, *log)
325
326
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
327
		Success: true,
328
		Message: "Success unsub to the deck",
329
		Data:    nil,
330
		Count:   0,
331
	})
332
}
333
334
// SubToDeck method
335
// @Description Subscribe to a deck
336
// @Summary sub deck
337
// @Tags Deck
338
// @Produce json
339
// @Success 200
340
// @Accept json
341
// @Router /v1/decks/{deckID}/subscribe [post]
342
func SubToDeck(c *fiber.Ctx) error {
343
	db := database.DBConn // DB Conn
344
	deckID := c.Params("deckID")
345
	deck := new(models.Deck)
346
347
	// Check auth
348
	auth := CheckAuth(c, models.PermUser)
349
	if !auth.Success {
350
		return c.Status(http.StatusUnauthorized).JSON(models.ResponseHTTP{
351
			Success: false,
352
			Message: auth.Message,
353
			Data:    nil,
354
			Count:   0,
355
		})
356
	}
357
358
	if err := db.First(&deck, deckID).Error; err != nil {
359
		return c.Status(http.StatusInternalServerError).JSON(models.ResponseHTTP{
360
			Success: false,
361
			Message: err.Error(),
362
			Data:    nil,
363
			Count:   0,
364
		})
365
	}
366
367
	if err := queries.GenerateAccess(c, &auth.User, deck); !err.Success {
368
		return c.Status(http.StatusInternalServerError).JSON(models.ResponseHTTP{
369
			Success: false,
370
			Message: err.Message,
371
			Data:    nil,
372
			Count:   0,
373
		})
374
	}
375
376
	if err := queries.PopulateMemDate(c, &auth.User, deck); !err.Success {
377
		return c.Status(http.StatusInternalServerError).JSON(models.ResponseHTTP{
378
			Success: false,
379
			Message: err.Message,
380
			Data:    nil,
381
			Count:   0,
382
		})
383
	}
384
385
	log := queries.CreateLog(models.LogSubscribe, auth.User.Username+" subscribed to "+deck.DeckName)
386
	_ = queries.CreateUserLog(auth.User, *log)
387
	_ = queries.CreateDeckLog(*deck, *log)
388
389
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
390
		Success: true,
391
		Message: "Success subscribing to deck",
392
		Data:    nil,
393
		Count:   0,
394
	})
395
}
396