Passed
Push — main ( 0795ea...57a23e )
by Yume
02:19 queued 01:06
created

controllers.*DeckController.GetByID   B

Complexity

Conditions 6

Size

Total Lines 19
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 6
eloc 14
nop 1
dl 0
loc 19
rs 8.6666
c 0
b 0
f 0
1
package controllers
2
3
import (
4
	"github.com/gofiber/fiber/v2"
5
	"github.com/memnix/memnix-rest/domain"
6
	"github.com/memnix/memnix-rest/internal/deck"
7
	"github.com/memnix/memnix-rest/pkg/utils"
8
	"github.com/memnix/memnix-rest/views"
9
	"github.com/pkg/errors"
10
)
11
12
// DeckController is the controller for the deck routes
13
type DeckController struct {
14
	deck.IUseCase
15
}
16
17
// NewDeckController returns a new deck controller
18
func NewDeckController(useCase deck.IUseCase) DeckController {
19
	return DeckController{IUseCase: useCase}
20
}
21
22
// GetByID is the controller for the get deck by id route
23
//
24
//	@Summary		Get deck by id
25
//	@Description	Get deck by id
26
//	@Tags			Deck
27
//	@Accept			json
28
//	@Produce		json
29
//	@Param			id	path		uint	true	"Deck ID"
30
//	@Success		200	{object}	views.HTTPResponseVM
31
//	@Failure		400	{object}	views.HTTPResponseVM
32
//	@Failure		403	{object}	views.HTTPResponseVM
33
//	@Failure		404	{object}	views.HTTPResponseVM
34
//	@Router			/v2/deck/{id} [get]
35
//	@Security		Bearer
36
func (d *DeckController) GetByID(c *fiber.Ctx) error {
37
	id := c.Params("id")
38
	uintID, err := utils.ConvertStrToUInt(id)
39
	if err != nil {
40
		return c.Status(fiber.StatusBadRequest).JSON(views.NewHTTPResponseVMFromError(err))
41
	}
42
	deckObject, err := d.IUseCase.GetByID(c.UserContext(), uintID)
43
	if err != nil {
44
		return c.Status(fiber.StatusNotFound).JSON(views.NewHTTPResponseVMFromError(err))
45
	}
46
	user, err := utils.GetUserFromContext(c)
47
	if err != nil {
48
		return c.Status(fiber.StatusInternalServerError).JSON(views.NewHTTPResponseVMFromError(err))
49
	}
50
	if !deckObject.IsOwner(user.ID) && user.Permission != domain.PermissionAdmin {
51
		return c.Status(fiber.StatusForbidden).JSON(views.NewHTTPResponseVMFromError(errors.New("deck is private")))
52
	}
53
54
	return c.Status(fiber.StatusOK).JSON(views.NewHTTPResponseVM("deck found", deckObject))
55
}
56
57
// Create is the controller for the create deck route
58
//
59
//	@Summary		Create deck
60
//	@Description	Create deck
61
//	@Tags			Deck
62
//	@Accept			json
63
//	@Produce		json
64
//	@Param			deck	body		domain.Deck	true	"Deck object"
65
//	@Success		201		{object}	views.HTTPResponseVM
66
//	@Failure		400		{object}	views.HTTPResponseVM
67
//	@Router			/v2/deck [post]
68
//	@Security		Bearer
69
func (d *DeckController) Create(c *fiber.Ctx) error {
70
	var createDeck domain.CreateDeck
71
	err := c.BodyParser(&createDeck)
72
	if err != nil {
73
		return c.Status(fiber.StatusBadRequest).JSON(views.NewHTTPResponseVMFromError(err))
74
	}
75
76
	if err := createDeck.Validate(); err != nil {
77
		return c.Status(fiber.StatusBadRequest).JSON(views.NewHTTPResponseVMFromError(err))
78
	}
79
80
	deckObject := createDeck.ToDeck()
81
82
	user, err := utils.GetUserFromContext(c)
83
	if err != nil {
84
		return c.Status(fiber.StatusInternalServerError).JSON(views.NewHTTPResponseVMFromError(err))
85
	}
86
87
	if err := d.IUseCase.CreateFromUser(c.UserContext(), user, &deckObject); err != nil {
88
		return c.Status(fiber.StatusBadRequest).JSON(views.NewHTTPResponseVMFromError(err))
89
	}
90
91
	return c.Status(fiber.StatusCreated).JSON(views.NewHTTPResponseVM("deck created", deckObject.ToPublicDeck()))
92
}
93
94
// GetOwned is the controller for the get owned decks route
95
//
96
//	@Summary		Get owned decks
97
//	@Description	Get owned decks
98
//	@Tags			Deck
99
//	@Accept			json
100
//	@Produce		json
101
//	@Success		200	{object}	views.HTTPResponseVM
102
//	@Failure		400	{object}	views.HTTPResponseVM
103
//	@Failure		404	{object}	views.HTTPResponseVM
104
//	@Router			/v2/deck/owned [get]
105
//	@Security		Bearer
106
func (d *DeckController) GetOwned(c *fiber.Ctx) error {
107
	user, err := utils.GetUserFromContext(c)
108
	if err != nil {
109
		return c.Status(fiber.StatusInternalServerError).JSON(views.NewHTTPResponseVMFromError(err))
110
	}
111
	deckObjects, err := d.IUseCase.GetByUser(c.UserContext(), user)
112
	if err != nil {
113
		return c.Status(fiber.StatusNotFound).JSON(views.NewHTTPResponseVMFromError(err))
114
	}
115
116
	return c.Status(fiber.StatusOK).JSON(views.NewHTTPResponseVM("owned decks found", deckObjects))
117
}
118
119
// GetLearning is the controller for the get learning decks route
120
//
121
//	@Summary		Get learning decks
122
//	@Description	Get learning decks
123
//	@Tags			Deck
124
//	@Accept			json
125
//	@Produce		json
126
//	@Success		200	{object}	views.HTTPResponseVM
127
//	@Failure		400	{object}	views.HTTPResponseVM
128
//	@Failure		404	{object}	views.HTTPResponseVM
129
//	@Router			/v2/deck/learning [get]
130
//	@Security		Bearer
131
func (d *DeckController) GetLearning(c *fiber.Ctx) error {
132
	user, err := utils.GetUserFromContext(c)
133
	if err != nil {
134
		return c.Status(fiber.StatusInternalServerError).JSON(views.NewHTTPResponseVMFromError(err))
135
	}
136
	deckObjects, err := d.IUseCase.GetByLearner(c.UserContext(), user)
137
	if err != nil {
138
		return c.Status(fiber.StatusNotFound).JSON(views.NewHTTPResponseVMFromError(err))
139
	}
140
141
	return c.Status(fiber.StatusOK).JSON(views.NewHTTPResponseVM("learning decks found", deck.ConvertToPublic(deckObjects)))
142
}
143
144
// GetPublic is the controller for the get public decks route
145
//
146
//	@Summary		Get public decks
147
//	@Description	Get public decks
148
//	@Tags			Deck
149
//	@Accept			json
150
//	@Produce		json
151
//	@Success		200	{object}	views.HTTPResponseVM
152
//	@Failure		400	{object}	views.HTTPResponseVM
153
//	@Failure		404	{object}	views.HTTPResponseVM
154
//	@Router			/v2/deck/public [get]
155
//	@Security		Bearer
156
func (d *DeckController) GetPublic(c *fiber.Ctx) error {
157
	deckObjects, err := d.IUseCase.GetPublic(c.UserContext())
158
	if err != nil {
159
		return c.Status(fiber.StatusNotFound).JSON(views.NewHTTPResponseVMFromError(err))
160
	}
161
162
	return c.Status(fiber.StatusOK).JSON(views.NewHTTPResponseVM("public decks found", deckObjects))
163
}
164