diff options
Diffstat (limited to 'controllers/register.go')
| -rw-r--r-- | controllers/register.go | 75 |
1 files changed, 73 insertions, 2 deletions
diff --git a/controllers/register.go b/controllers/register.go index d16db9d..acadbc5 100644 --- a/controllers/register.go +++ b/controllers/register.go @@ -1,12 +1,83 @@ package controllers import ( + "imageboard/database" + "imageboard/models" + "imageboard/utils/auth" + "imageboard/utils/email" "imageboard/utils/shortcuts" + "log" + "strings" "github.com/gofiber/fiber/v2" ) +type RegisterForm struct { + Username string `json:"username" form:"username"` + Email string `json:"email" form:"email"` + Password string `json:"password" form:"password"` + ConfirmPassword string `json:"confirm_password" form:"confirm_password"` +} + +func renderRegisterError(ctx *fiber.Ctx, errorMsg string, statusCode int) error { + return shortcuts.RenderWithStatus(ctx, TEMPLATE_REGISTER, fiber.Map{ + "Error": errorMsg, + "Username": ctx.FormValue("username"), + "Email": ctx.FormValue("email"), + }, statusCode) +} + func RegisterPageController(ctx *fiber.Ctx) error { - ctx.Locals("Title", "Register") - return shortcuts.Render(ctx, "register", nil) + ctx.Locals("Title", PT_REGISTER) + + if auth.IsAuthenticated(ctx) { + return ctx.Redirect(auth.GetRedirectURL(ctx), fiber.StatusSeeOther) + } + + return shortcuts.Render(ctx, TEMPLATE_REGISTER, nil) +} + +func RegisterPostController(ctx *fiber.Ctx) error { + ctx.Locals("Title", PT_REGISTER) + + if auth.IsAuthenticated(ctx) { + return ctx.Redirect(auth.GetRedirectURL(ctx), fiber.StatusSeeOther) + } + + var form RegisterForm + if err := ctx.BodyParser(&form); err != nil { + return renderRegisterError(ctx, ERR_INVALID_FORM_DATA, fiber.StatusBadRequest) + } + + if form.Password != form.ConfirmPassword { + return renderRegisterError(ctx, ERR_PASSWORD_MISMATCH, fiber.StatusBadRequest) + } + + user := &models.User{ + Username: form.Username, + Email: form.Email, + Password: form.Password, + } + + if err := database.CreateUser(user); err != nil { + var statusCode int + if strings.Contains(err.Error(), "username") { + statusCode = fiber.StatusConflict + } else if strings.Contains(err.Error(), "email") { + statusCode = fiber.StatusBadRequest + } else { + statusCode = fiber.StatusInternalServerError + } + + return renderRegisterError(ctx, "Failed to create user: "+err.Error(), statusCode) + } + + if err := email.SendVerificationEmail(user); err != nil { + log.Printf("Failed to send verification email: %v", err) + return renderRegisterError(ctx, "User created but failed to send verification email", fiber.StatusInternalServerError) + } + + return shortcuts.Render(ctx, TEMPLATE_REGISTER, fiber.Map{ + "Success": SUCCESS_USER_REGISTERED, + }) } |
