/
question.controller.go
153 lines (127 loc) · 3.89 KB
/
question.controller.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
package question
import (
"fmt"
"net/http"
"strings"
"github.com/gin-gonic/gin"
"github.com/jinzhu/gorm"
"github.com/nireo/forms/server/database/models"
)
// Question alias for model
type Question = models.Question
// User alias for model
type User = models.User
// Form alias for model
type Form = models.Form
func createQuestion(c *gin.Context) {
db := c.MustGet("db").(*gorm.DB)
user := c.MustGet("user").(User)
id := c.Param("id")
type RequestBody struct {
Required string `json:"required" binding:"required"`
Question string `json:"question" binding:"required"`
AnswerType uint8 `json:"answerType" binding:"required"`
Answers []string `json:"answers" binding:"required"`
Step uint `json:"step" binding:"required"`
Min uint `json:"min" binding:"required"`
Max uint `json:"max" binding:"required"`
UUID string `json:"temp_uuid" binding:"required"`
}
var requestBody RequestBody
if err := c.BindJSON(&requestBody); err != nil {
c.AbortWithStatus(http.StatusBadRequest)
return
}
var form Form
if err := db.Set("gorm:auto_preload", true).Where("unique_id = ?", id).First(&form).Error; err != nil {
c.AbortWithStatus(http.StatusNotFound)
return
}
if !(form.UserID == user.ID) {
c.AbortWithStatus(http.StatusUnauthorized)
return
}
isRequired := false
if requestBody.Required == "true" {
isRequired = true
}
answersString := strings.Join(requestBody.Answers[:], "|")
question := Question{
Required: isRequired,
Question: requestBody.Question,
AnswerType: requestBody.AnswerType,
Answers: answersString,
Step: requestBody.Step,
Min: requestBody.Min,
Max: requestBody.Max,
FormID: form.ID,
UUID: requestBody.UUID,
}
db.NewRecord(question)
db.Create(&question)
c.JSON(http.StatusOK, question.Serialize())
}
func deleteQuestion(c *gin.Context) {
db := c.MustGet("db").(*gorm.DB)
id := c.Param("id")
user := c.MustGet("user").(User)
var question Question
if err := db.Where("uuid = ? ", id).First(&question).Error; err != nil {
c.AbortWithStatus(http.StatusNotFound)
return
}
// check ownership
var form Form
if err := db.Where("id = ?", question.FormID).First(&form).Error; err != nil {
c.AbortWithStatus(http.StatusNotFound)
return
}
if !(form.UserID == user.ID) {
c.AbortWithStatus(http.StatusUnauthorized)
return
}
db.Delete(&question)
c.Status(http.StatusNoContent)
}
func updateQuestion(c *gin.Context) {
db := c.MustGet("db").(*gorm.DB)
id := c.Param("id")
type RequestBody struct {
Question string `json:"question" binding:"required"`
Required string `json:"required" binding:"required"`
AnswerType uint8 `json:"answerType" binding:"required"`
Answers []string `json:"answers" binding:"required"`
Step uint `json:"step" binding:"required"`
Min uint `json:"min" binding:"required"`
Max uint `json:"max" binding:"required"`
UUID string `json:"temp_uuid" binding:"required"`
}
var requestBody RequestBody
if err := c.BindJSON(&requestBody); err != nil {
c.AbortWithStatus(http.StatusBadRequest)
fmt.Println(err)
return
}
var question Question
if err := db.Where("uuid = ?", id).First(&question).Error; err != nil {
c.AbortWithStatus(http.StatusNotFound)
return
}
// convert required to from string to boolean since binding
// the request body struct fails if required == false
isRequired := false
if requestBody.Required == "true" {
isRequired = true
}
answersString := strings.Join(requestBody.Answers[:], "|")
question.Required = isRequired
question.Question = requestBody.Question
question.AnswerType = requestBody.AnswerType
question.Answers = answersString
question.Step = requestBody.Step
question.Min = requestBody.Min
question.Max = requestBody.Max
question.UUID = requestBody.UUID
db.Save(&question)
c.JSON(http.StatusOK, question.Serialize())
}