Passed
Push — main ( 26be31...19cade )
by Yume
01:25
created

controllers.SubToDeck   B

Complexity

Conditions 5

Size

Total Lines 48
Code Lines 34

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
eloc 34
nop 1
dl 0
loc 48
rs 8.5973
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
	var decks []models.Deck
25
26
	if res := db.Find(&decks); res.Error != nil {
27
28
		return c.Status(http.StatusInternalServerError).JSON(models.ResponseHTTP{
29
			Success: false,
30
			Message: "Failed to get all decks",
31
			Data:    nil,
32
			Count:   0,
33
		})
34
	}
35
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
36
		Success: true,
37
		Message: "Get all decks",
38
		Data:    decks,
39
		Count:   len(decks),
40
	})
41
42
}
43
44
// GetDeckByID method to get a deck
45
// @Description Get a deck by tech ID
46
// @Summary get a deck
47
// @Tags Deck
48
// @Produce json
49
// @Param id path int true "Deck ID"
50
// @Success 200 {model} models.Deck
51
// @Router /v1/decks/{id} [get]
52
func GetDeckByID(c *fiber.Ctx) error {
53
	db := database.DBConn // DB Conn
54
55
	// Params
56
	id := c.Params("id")
57
58
	deck := new(models.Deck)
59
60
	if err := db.First(&deck, id).Error; err != nil {
61
		return c.Status(http.StatusServiceUnavailable).JSON(models.ResponseHTTP{
62
			Success: false,
63
			Message: err.Error(),
64
			Data:    nil,
65
			Count:   0,
66
		})
67
	}
68
69
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
70
		Success: true,
71
		Message: "Success get deck by ID.",
72
		Data:    *deck,
73
		Count:   1,
74
	})
75
}
76
77
// GetAllSubDecks method to get a deck
78
// @Description Get decks a user is sub to
79
// @Summary get a list of deck
80
// @Tags Deck
81
// @Produce json
82
// @Param userID path int true "user ID"
83
// @Success 200 {array} models.Deck
84
// @Router /v1/decks/user/{userID} [get]
85
func GetAllSubDecks(c *fiber.Ctx) error {
86
	db := database.DBConn // DB Conn
87
88
	// Params
89
	id := c.Params("userID")
90
91
	var decks []models.Deck
92
93
	if err := db.Joins("JOIN accesses ON accesses.deck_id = decks.id AND accesses.user_id = ? AND accesses.permission > 0", id).Find(&decks).Error; err != nil {
94
		return c.Status(http.StatusInternalServerError).JSON(models.ResponseHTTP{
95
			Success: false,
96
			Message: "Failed to get all sub decks",
97
			Data:    nil,
98
			Count:   0,
99
		})
100
	}
101
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
102
		Success: true,
103
		Message: "Get all sub decks",
104
		Data:    decks,
105
		Count:   len(decks),
106
	})
107
}
108
109
// GetAllPublicDecks method to get a deck
110
// @Description Get all public deck
111
// @Summary get a list of deck
112
// @Tags Deck
113
// @Produce json
114
// @Success 200 {model} models.Deck
115
// @Router /v1/decks/public [get]
116
func GetAllPublicDecks(c *fiber.Ctx) error {
117
	db := database.DBConn // DB Conn
118
119
	var decks []models.Deck
120
121
	if err := db.Where("decks.status = 2").Find(&decks).Error; err != nil {
122
		return c.Status(http.StatusInternalServerError).JSON(models.ResponseHTTP{
123
			Success: false,
124
			Message: "Failed to get all public decks",
125
			Data:    nil,
126
			Count:   0,
127
		})
128
	}
129
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
130
		Success: true,
131
		Message: "Get all public decks",
132
		Data:    decks,
133
		Count:   len(decks),
134
	})
135
}
136
137
// POST
138
139
// CreateNewDeck
140
func CreateNewDeck(c *fiber.Ctx) error {
141
	db := database.DBConn // DB Conn
142
143
	deck := new(models.Deck)
144
145
	if err := c.BodyParser(&deck); err != nil {
146
		return c.Status(http.StatusBadRequest).JSON(models.ResponseHTTP{
147
			Success: false,
148
			Message: err.Error(),
149
			Data:    nil,
150
			Count:   0,
151
		})
152
	}
153
154
	db.Create(deck)
155
156
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
157
		Success: true,
158
		Message: "Success register a deck",
159
		Data:    *deck,
160
		Count:   1,
161
	})
162
}
163
164
// UnsubToDeck
165
func UnSubToDeck(c *fiber.Ctx) error {
166
	db := database.DBConn // DB Conn
167
168
	// Params
169
	deckID := c.Params("deckID")
170
	userID := c.Params("userID")
171
172
	access := new(models.Access)
173
	if err := db.Joins("User").Joins("Deck").Where("accesses.user_id = ? AND accesses.deck_id =?", userID, deckID).Find(&access).Error; err != nil {
174
		return c.Status(http.StatusInternalServerError).JSON(models.ResponseHTTP{
175
			Success: false,
176
			Message: "This user isn't sub to the deck",
177
			Data:    nil,
178
			Count:   0,
179
		})
180
	}
181
182
	access.Permission = 0
183
	db.Preload("User").Preload("Deck").Save(access)
184
185
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
186
		Success: true,
187
		Message: "Success unsub to the deck",
188
		Data:    nil,
189
		Count:   0,
190
	})
191
}
192
193
// SubToDeck
194
func SubToDeck(c *fiber.Ctx) error {
195
	db := database.DBConn // DB Conn
196
	deckID := c.Params("deckID")
197
	deck := new(models.Deck)
198
199
	// Check auth
200
	auth := CheckAuth(c, models.PermUser)
201
	if !auth.Success {
202
		return c.Status(http.StatusUnauthorized).JSON(models.ResponseHTTP{
203
			Success: false,
204
			Message: auth.Message,
205
			Data:    nil,
206
			Count:   0,
207
		})
208
	}
209
210
	if err := db.First(&deck, deckID).Error; err != nil {
211
		return c.Status(http.StatusInternalServerError).JSON(models.ResponseHTTP{
212
			Success: false,
213
			Message: err.Error(),
214
			Data:    nil,
215
			Count:   0,
216
		})
217
	}
218
219
	if err := queries.GenerateAccess(c, &auth.User, deck); !err.Success {
220
		return c.Status(http.StatusInternalServerError).JSON(models.ResponseHTTP{
221
			Success: false,
222
			Message: err.Message,
223
			Data:    nil,
224
			Count:   0,
225
		})
226
	}
227
228
	if err := queries.PopulateMemDate(c, &auth.User, deck); !err.Success {
229
		return c.Status(http.StatusInternalServerError).JSON(models.ResponseHTTP{
230
			Success: false,
231
			Message: err.Message,
232
			Data:    nil,
233
			Count:   0,
234
		})
235
	}
236
237
	return c.Status(http.StatusOK).JSON(models.ResponseHTTP{
238
		Success: true,
239
		Message: "Success subscribing to deck",
240
		Data:    nil,
241
		Count:   0,
242
	})
243
}
244