mirror of
https://github.com/yanislav-igonin/micrach
synced 2024-12-22 14:22:33 +03:00
add validation on post create
This commit is contained in:
parent
55cc4a3614
commit
fb9933097b
@ -244,12 +244,28 @@ func UpdateThread(c *fiber.Ctx) error {
|
|||||||
// TODO: dat shit crashes if no fields in request
|
// TODO: dat shit crashes if no fields in request
|
||||||
text := form.Value["text"][0]
|
text := form.Value["text"][0]
|
||||||
filesInRequest := form.File["files"]
|
filesInRequest := form.File["files"]
|
||||||
validationErrorMessage := utils.ValidatePost("", text, filesInRequest)
|
|
||||||
if validationErrorMessage != "" {
|
validationErrors := utils.ValidatePost2("", text, filesInRequest)
|
||||||
errorHtmlData := repositories.BadRequestHtmlData{
|
if validationErrors != nil {
|
||||||
Message: validationErrorMessage,
|
thread, err := repositories.Posts.GetThreadByPostID(threadID)
|
||||||
|
if err != nil {
|
||||||
|
log.Println("error:", err)
|
||||||
|
return c.Status(fiber.StatusInternalServerError).Render("pages/500", nil)
|
||||||
}
|
}
|
||||||
return c.Status(fiber.StatusBadRequest).Render("pages/400", errorHtmlData)
|
|
||||||
|
firstPost := thread[0]
|
||||||
|
captchaID := form.Value["captchaId"][0]
|
||||||
|
htmlData := repositories.GetThreadHtmlData{
|
||||||
|
Thread: thread,
|
||||||
|
FormData: repositories.HtmlFormData{
|
||||||
|
FirstPostID: firstPost.ID,
|
||||||
|
CaptchaID: captchaID,
|
||||||
|
IsCaptchaActive: config.App.IsCaptchaActive,
|
||||||
|
Errors: *validationErrors,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
return c.Render("pages/thread", htmlData)
|
||||||
}
|
}
|
||||||
|
|
||||||
if config.App.IsCaptchaActive {
|
if config.App.IsCaptchaActive {
|
||||||
|
@ -39,11 +39,19 @@ type File struct {
|
|||||||
// HTML Templates Structs
|
// HTML Templates Structs
|
||||||
// HTML Templates Structs
|
// HTML Templates Structs
|
||||||
|
|
||||||
|
// post-form.html
|
||||||
|
type HtmlFormErrors struct {
|
||||||
|
Title string
|
||||||
|
Text string
|
||||||
|
Files string
|
||||||
|
}
|
||||||
|
|
||||||
// post-form.html
|
// post-form.html
|
||||||
type HtmlFormData struct {
|
type HtmlFormData struct {
|
||||||
FirstPostID int
|
FirstPostID int
|
||||||
CaptchaID string
|
CaptchaID string
|
||||||
IsCaptchaActive bool
|
IsCaptchaActive bool
|
||||||
|
Errors HtmlFormErrors
|
||||||
}
|
}
|
||||||
|
|
||||||
// index.html
|
// index.html
|
||||||
@ -70,11 +78,11 @@ type BadRequestHtmlData struct {
|
|||||||
Message string
|
Message string
|
||||||
}
|
}
|
||||||
|
|
||||||
const InvalidCaptchaErrorMessage = "INVALID CAPTCHA"
|
const InvalidCaptchaErrorMessage = "Invalid captcha"
|
||||||
const InvalidTextOrFilesErrorMessage = "TEXT OR FILES SHOULD NOT BE EMPTY"
|
const InvalidTextOrFilesErrorMessage = "Text or files should not be empty"
|
||||||
const InvalidTitleLengthErrorMessage = "TITLE SHOULD NOT EXCEED 100 CHARS"
|
const InvalidTitleLengthErrorMessage = "Title should not exceed 100 chars"
|
||||||
const InvalidTextLengthErrorMessage = "TEXT SHOULD NOT EXCEED 1000 CHARS"
|
const InvalidTextLengthErrorMessage = "Text should not exceed 1000 chars"
|
||||||
const InvalidFilesLengthErrorMessage = "MAXIMUM 4 FILES CAN BE UPLOADED"
|
const InvalidFilesLengthErrorMessage = "Maximum 4 files can be uploaded"
|
||||||
const InvalidFileSizeErrorMessage = "FILE SIZE EXCIDED (3MB PER FILE)"
|
const InvalidFileSizeErrorMessage = "File size exceeded (3MB PER FILE)"
|
||||||
const InvalidFileExtErrorMessage = "AVALIABLE FILE EXT: PNG, JPG"
|
const InvalidFileExtErrorMessage = "Available file ext: PNG, JPG"
|
||||||
const ThreadIsArchivedErrorMessage = "THREAD IS ARCHIVED"
|
const ThreadIsArchivedErrorMessage = "Thread is archived"
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
#postForm > * {
|
.form-control {
|
||||||
margin-bottom: 1rem;
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-error-label {
|
||||||
|
color: #f00;
|
||||||
}
|
}
|
@ -9,17 +9,20 @@
|
|||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
||||||
{{ if eq .FirstPostID 0 }}
|
{{ if eq .FirstPostID 0 }}
|
||||||
|
<label class="form-error-label" for="title">{{ .Errors.Title }}</label>
|
||||||
<input class="form-control" id="postTitle" placeholder="Title" name="title">
|
<input class="form-control" id="postTitle" placeholder="Title" name="title">
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
||||||
|
<label class="form-error-label" for="text">{{ .Errors.Text }}</label>
|
||||||
<textarea class="form-control" id="postText" rows="5" placeholder="Text" name="text"></textarea>
|
<textarea class="form-control" id="postText" rows="5" placeholder="Text" name="text"></textarea>
|
||||||
|
<label class="form-error-label" for="files">{{ .Errors.Files }}</label>
|
||||||
<input class="form-control" type="file" id="postFiles" multiple name="files">
|
<input class="form-control" type="file" id="postFiles" multiple name="files">
|
||||||
|
|
||||||
{{ if .IsCaptchaActive }}
|
{{ if .IsCaptchaActive }}
|
||||||
{{ template "captcha" .CaptchaID }}
|
{{ template "captcha" .CaptchaID }}
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
||||||
<div class="row">
|
<div class="row mb-4">
|
||||||
{{ if ne .FirstPostID 0 }}
|
{{ if ne .FirstPostID 0 }}
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<input class="form-check-input" type="checkbox" value="on" id="postSage" name="sage">
|
<input class="form-check-input" type="checkbox" value="on" id="postSage" name="sage">
|
||||||
|
@ -6,7 +6,7 @@ import (
|
|||||||
"image"
|
"image"
|
||||||
"image/jpeg"
|
"image/jpeg"
|
||||||
"image/png"
|
"image/png"
|
||||||
Repositories "micrach/repositories"
|
"micrach/repositories"
|
||||||
"mime/multipart"
|
"mime/multipart"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
@ -70,36 +70,81 @@ func CreateThreadFolder(postID int) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Delete after
|
||||||
func ValidatePost(title, text string, files []*multipart.FileHeader) string {
|
func ValidatePost(title, text string, files []*multipart.FileHeader) string {
|
||||||
if text == "" && len(files) == 0 {
|
if text == "" && len(files) == 0 {
|
||||||
return Repositories.InvalidTextOrFilesErrorMessage
|
return repositories.InvalidTextOrFilesErrorMessage
|
||||||
}
|
}
|
||||||
|
|
||||||
if len([]rune(title)) > 100 {
|
if len([]rune(title)) > 100 {
|
||||||
return Repositories.InvalidTitleLengthErrorMessage
|
return repositories.InvalidTitleLengthErrorMessage
|
||||||
}
|
}
|
||||||
|
|
||||||
if len([]rune(text)) > 1000 {
|
if len([]rune(text)) > 1000 {
|
||||||
return Repositories.InvalidTextLengthErrorMessage
|
return repositories.InvalidTextLengthErrorMessage
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(files) > 4 {
|
if len(files) > 4 {
|
||||||
return Repositories.InvalidFilesLengthErrorMessage
|
return repositories.InvalidFilesLengthErrorMessage
|
||||||
}
|
}
|
||||||
|
|
||||||
isFilesExtsValid := CheckFilesExt(files)
|
isFilesExtsValid := CheckFilesExt(files)
|
||||||
if !isFilesExtsValid {
|
if !isFilesExtsValid {
|
||||||
return Repositories.InvalidFileExtErrorMessage
|
return repositories.InvalidFileExtErrorMessage
|
||||||
}
|
}
|
||||||
|
|
||||||
isFilesSizesNotToBig := CheckFilesSize(files)
|
isFilesSizesNotToBig := CheckFilesSize(files)
|
||||||
if !isFilesSizesNotToBig {
|
if !isFilesSizesNotToBig {
|
||||||
return Repositories.InvalidFileSizeErrorMessage
|
return repositories.InvalidFileSizeErrorMessage
|
||||||
}
|
}
|
||||||
|
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ValidatePost2(title, text string, files []*multipart.FileHeader) *repositories.HtmlFormErrors {
|
||||||
|
validationError := new(repositories.HtmlFormErrors)
|
||||||
|
hasErrors := false
|
||||||
|
|
||||||
|
if text == "" && len(files) == 0 {
|
||||||
|
validationError.Text = repositories.InvalidTextOrFilesErrorMessage
|
||||||
|
validationError.Files = repositories.InvalidTextOrFilesErrorMessage
|
||||||
|
hasErrors = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if len([]rune(title)) > 100 {
|
||||||
|
validationError.Title = repositories.InvalidTitleLengthErrorMessage
|
||||||
|
hasErrors = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if len([]rune(text)) > 1000 {
|
||||||
|
validationError.Text = repositories.InvalidTextLengthErrorMessage
|
||||||
|
hasErrors = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(files) > 4 {
|
||||||
|
validationError.Files = repositories.InvalidFilesLengthErrorMessage
|
||||||
|
hasErrors = true
|
||||||
|
}
|
||||||
|
|
||||||
|
isFilesExtsValid := CheckFilesExt(files)
|
||||||
|
if !isFilesExtsValid {
|
||||||
|
validationError.Files = repositories.InvalidFileExtErrorMessage
|
||||||
|
hasErrors = true
|
||||||
|
}
|
||||||
|
|
||||||
|
isFilesSizesNotToBig := CheckFilesSize(files)
|
||||||
|
if !isFilesSizesNotToBig {
|
||||||
|
validationError.Files = repositories.InvalidFileSizeErrorMessage
|
||||||
|
hasErrors = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if hasErrors {
|
||||||
|
return validationError
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func CheckFilesSize(files []*multipart.FileHeader) bool {
|
func CheckFilesSize(files []*multipart.FileHeader) bool {
|
||||||
for _, file := range files {
|
for _, file := range files {
|
||||||
if file.Size > int64(FILE_SIZE_IN_BYTES) {
|
if file.Size > int64(FILE_SIZE_IN_BYTES) {
|
||||||
|
Loading…
Reference in New Issue
Block a user