Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Forms Base APIs Created & Tests structure fixed #31

Merged
merged 20 commits into from
Feb 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions src/dtos/http_request.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,13 @@ package dtos

import "github.com/Real-Dev-Squad/wisee-backend/src/models"

type CreateUpdateFormRequestDto struct {
Status *string `json:"status"`
type CreateFormRequestDto struct {
Content models.FormContent `json:"content"`
PerformedById int64 `json:"performed_by_id"`
}

type UpdateFormRequestDto struct {
Status string `json:"status"`
Content models.FormContent `json:"content"`
PerformedById int64 `json:"performed_by_id"`
}
Expand Down
6 changes: 3 additions & 3 deletions src/dtos/http_response.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ type ErrorResponse struct {
}

type ResponseDto struct {
Message string `json:"message"`
Data interface{} `json:"data"`
Error ErrorResponse `json:"error"`
Message string `json:"message"`
Data interface{} `json:"data"`
Error *ErrorResponse `json:"error"`
}

type CreateUpdateGetFormResponseDto struct {
Expand Down
5 changes: 3 additions & 2 deletions src/models/forms.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,8 @@ type FormMetaData struct {
ValidTill time.Time `bun:"valid_till" json:"valid_till"`
UpdatedById *int64 `bun:"updated_by_id,default:null" json:"updated_by_id"`
UpdatedBy *User `bun:"rel:belongs-to,join:updated_by_id=id" json:"updated_by"`
// invite code
// TODO invite code
// TODO remove created by
CreatedAt time.Time `bun:"created_at,nullzero,notnull,default:current_timestamp" json:"created_at"`
UpdatedAt time.Time `bun:"updated_at,default:null" json:"updated_at"`
}
Expand All @@ -72,7 +73,7 @@ type Block struct {
ID string `json:"id"`
Type string `json:"type"`
Content string `json:"content"`
GroupId string `json:"groupID"`
GroupId string `json:"group_id"`
Order int `json:"order"`
Meta interface{} `json:"meta"`
}
242 changes: 242 additions & 0 deletions src/routes/forms.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,242 @@
package routes

import (
"net/http"

"github.com/Real-Dev-Squad/wisee-backend/src/dtos"
"github.com/Real-Dev-Squad/wisee-backend/src/models"
"github.com/gin-gonic/gin"
"github.com/uptrace/bun"
)

func FormRoutes(rg *gin.RouterGroup, db *bun.DB) {
forms := rg.Group("/forms")

forms.POST("", func(ctx *gin.Context) {
var requestBody dtos.CreateFormRequestDto
if err := ctx.ShouldBindJSON(&requestBody); err != nil {
errObj := dtos.ResponseDto{
Message: "invalid request",
Error: &dtos.ErrorResponse{
Message: "invalid request body",
Detail: err.Error(),
},
}
ctx.JSON(http.StatusBadRequest, errObj)
return
}

var form = &models.Form{
Content: requestBody.Content,
CreatedById: requestBody.PerformedById,
Status: models.DRAFT,
OwnerId: requestBody.PerformedById,
}

if _, err := db.NewInsert().Model(form).Exec(ctx); err != nil {
errObj := dtos.ResponseDto{
Message: "something went wrong",
Error: &dtos.ErrorResponse{
Message: "error creating form",
Detail: err.Error(),
},
}
ctx.JSON(http.StatusBadRequest, errObj)
return
}

var FormMetaData = &models.FormMetaData{
FormId: form.Id,
}

if _, err := db.NewInsert().Model(FormMetaData).Exec(ctx); err != nil {
errObj := dtos.ResponseDto{
Message: "something went wrong",
Error: &dtos.ErrorResponse{
Message: "error creating form meta data",
Detail: err.Error(),
},
}
ctx.JSON(http.StatusBadRequest, errObj)
return
}

ivinayakg marked this conversation as resolved.
Show resolved Hide resolved
var resData = dtos.CreateUpdateGetFormResponseDto{
Id: form.Id,
Content: form.Content,
OwnerId: form.OwnerId,
CreatedById: form.CreatedById,
Status: string(form.Status),
CreatedAt: form.CreatedAt.String(),
UpdatedAt: form.UpdatedAt.String(),
}

resObj := dtos.ResponseDto{
Message: "form created successfully",
Data: resData,
}

ctx.JSON(http.StatusCreated, resObj)
})

forms.GET("", func(ctx *gin.Context) {
ivinayakg marked this conversation as resolved.
Show resolved Hide resolved
var form []models.Form
if err := db.NewSelect().Model(&form).OrderExpr("id ASC").Scan(ctx); err != nil {
errObj := dtos.ResponseDto{
Message: "something went wrong",
Error: &dtos.ErrorResponse{
Message: "error fetching forms",
Detail: err.Error(),
},
}
ctx.JSON(http.StatusBadRequest, errObj)
return
}

var resData dtos.GetFormsResponseDto
for _, f := range form {
resData = append(resData, dtos.CreateUpdateGetFormResponseDto{
Id: f.Id,
Content: f.Content,
OwnerId: f.OwnerId,
CreatedById: f.CreatedById,
UpdatedById: f.UpdatedById,
Status: string(f.Status),
CreatedAt: f.CreatedAt.String(),
UpdatedAt: f.UpdatedAt.String(),
})
}

var res = dtos.ResponseDto{
Message: "forms fetched successfully",
Data: resData,
}

ctx.JSON(http.StatusOK, res)
})

forms.GET("/:id", func(ctx *gin.Context) {
var formMetaData models.FormMetaData
var form models.Form

query := db.NewSelect().Model(&formMetaData).Relation("Form").Where("form_id = ?", ctx.Param("id"))
if err := query.Scan(ctx); err != nil {
errObj := dtos.ResponseDto{
Message: "something went wrong",
Error: &dtos.ErrorResponse{
Message: "error fetching form",
Detail: err.Error(),
},
}
ctx.JSON(http.StatusBadRequest, errObj)
return
}

form = *formMetaData.Form

var resData = dtos.GetFormDetailResponseDto{
Id: form.Id,
OwnerId: form.OwnerId,
Status: string(form.Status),
CreatedById: form.CreatedById,
UpdatedById: form.UpdatedById,
CreatedAt: form.CreatedAt.String(),
UpdatedAt: form.UpdatedAt.String(),
Content: form.Content,
Meta: dtos.GetFormMetaDataResponseDto{
Id: formMetaData.Id,
FormId: formMetaData.FormId,
IsDeleted: formMetaData.IsDeleted,
AccepctingResponses: formMetaData.AccepctingResponses,
AllowGuestResponses: formMetaData.AllowGuestResponses,
AllowMultipleRepsonses: formMetaData.AllowMultipleRepsonses,
SendConfirmationEmailToRespondee: formMetaData.SendConfirmationEmailToRespondee,
SendSubmissionEmailToOwner: formMetaData.SendSubmissionEmailToOwner,
ValidTill: formMetaData.ValidTill,
UpdatedById: formMetaData.UpdatedById,
UpdatedAt: formMetaData.UpdatedAt,
},
}

ivinayakg marked this conversation as resolved.
Show resolved Hide resolved
var res = dtos.ResponseDto{
Message: "form fetched successfully",
Data: resData,
}

ctx.JSON(http.StatusOK, res)
})

forms.PATCH("/:id", func(ctx *gin.Context) {
var requestBody dtos.UpdateFormRequestDto
if err := ctx.ShouldBindJSON(&requestBody); err != nil {
errObj := dtos.ResponseDto{
Message: "invalid request",
Error: &dtos.ErrorResponse{
Message: "invalid request body",
Detail: err.Error(),
},
}
ctx.JSON(http.StatusBadRequest, errObj)
return
}
ivinayakg marked this conversation as resolved.
Show resolved Hide resolved

var form models.Form
if err := db.NewSelect().Model(&form).Where("id = ?", ctx.Param("id")).Scan(ctx); err != nil {
errObj := dtos.ResponseDto{
Message: "something went wrong",
Error: &dtos.ErrorResponse{
Message: "error fetching form",
Detail: err.Error(),
},
}
ctx.JSON(http.StatusBadRequest, errObj)
return
}

if requestBody.Status != string(models.DRAFT) && requestBody.Status != string(models.PUBLISHED) {
errObj := dtos.ResponseDto{
Message: "invalid request",
Error: &dtos.ErrorResponse{
Message: "invalid status",
},
}
ctx.JSON(http.StatusBadRequest, errObj)
return
}

form.Content = requestBody.Content
form.Status = models.FORM_STATUS_TYPE(requestBody.Status)
form.OwnerId = requestBody.PerformedById
form.UpdatedById = &requestBody.PerformedById

if _, err := db.NewUpdate().Model(&form).Where("id = ?", ctx.Param("id")).Exec(ctx); err != nil {
errObj := dtos.ResponseDto{
Message: "something went wrong",
Error: &dtos.ErrorResponse{
Message: "error updating form",
Detail: err.Error(),
},
}
ctx.JSON(http.StatusBadRequest, errObj)
return
}

ivinayakg marked this conversation as resolved.
Show resolved Hide resolved
var resData = dtos.CreateUpdateGetFormResponseDto{
Id: form.Id,
Content: form.Content,
OwnerId: form.OwnerId,
CreatedById: form.CreatedById,
Status: string(form.Status),
CreatedAt: form.CreatedAt.String(),
UpdatedAt: form.UpdatedAt.String(),
UpdatedById: form.UpdatedById,
}

resObj := dtos.ResponseDto{
Message: "form updated successfully",
Data: resData,
}

ctx.JSON(http.StatusAccepted, resObj)
})
}
1 change: 1 addition & 0 deletions src/routes/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ func SetupV1Routes(db *bun.DB) *gin.Engine {
v1 := router.Group("v1/")
UserRoutes(v1, db)
AuthRoutes(v1, db)
FormRoutes(v1, db)

router.GET("/health", func(ctx *gin.Context) {
ctx.JSON(200, gin.H{
Expand Down
Loading
Loading