Passed
Push — main ( f6597a...58b626 )
by Yume
01:31 queued 12s
created

controllers.*DeckController.Create   A

Complexity

Conditions 4

Size

Total Lines 18
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

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