aboutsummaryrefslogtreecommitdiff
path: root/controllers
diff options
context:
space:
mode:
authorBobby <[email protected]>2025-07-16 13:18:20 +0530
committerBobby <[email protected]>2025-07-16 13:18:20 +0530
commitf13506cfba2da90764620dab2c624ac74767de62 (patch)
tree1651ed298d3f7c9dc7f6a5ccc03da7f0d133f5d6 /controllers
parentf352d2678f91e4f4ea6902d084fb9590e2819e92 (diff)
downloadimageboard-f13506cfba2da90764620dab2c624ac74767de62.tar.xz
imageboard-f13506cfba2da90764620dab2c624ac74767de62.zip
constants and types refactor; next value for proper redirect on login
Diffstat (limited to 'controllers')
-rw-r--r--controllers/account.go17
-rw-r--r--controllers/constants.go48
-rw-r--r--controllers/home.go5
-rw-r--r--controllers/login.go26
-rw-r--r--controllers/logout.go11
-rw-r--r--controllers/posts.go36
-rw-r--r--controllers/register.go17
7 files changed, 70 insertions, 90 deletions
diff --git a/controllers/account.go b/controllers/account.go
index 86b3ea4..fa3e0e7 100644
--- a/controllers/account.go
+++ b/controllers/account.go
@@ -1,6 +1,7 @@
package controllers
import (
+ "imageboard/config"
"imageboard/database"
"imageboard/models"
"imageboard/utils/auth"
@@ -10,38 +11,38 @@ import (
)
func renderVerifyEmailError(ctx *fiber.Ctx, errorMsg string, statusCode int) error {
- return shortcuts.RenderWithStatus(ctx, TEMPLATE_VERIFY_EMAIL, fiber.Map{
+ return shortcuts.RenderWithStatus(ctx, config.TEMPLATE_VERIFY_EMAIL, fiber.Map{
"Error": errorMsg,
}, statusCode)
}
func VerifyEmailController(ctx *fiber.Ctx) error {
- ctx.Locals("Title", PT_VERIFY_EMAIL)
+ ctx.Locals("Title", config.PT_VERIFY_EMAIL)
if auth.IsAuthenticated(ctx) {
return ctx.Redirect(auth.GetRedirectURL(ctx), fiber.StatusSeeOther)
}
token := ctx.Query("token")
if token == "" {
- return renderVerifyEmailError(ctx, ERR_VERIFY_EMAIL_MISSING_TOKEN, fiber.StatusBadRequest)
+ return renderVerifyEmailError(ctx, config.ERR_VERIFY_EMAIL_MISSING_TOKEN, fiber.StatusBadRequest)
}
emailToken, err := database.VerifyToken(token, models.EmailTokenTypeVerification)
if err != nil {
- return renderVerifyEmailError(ctx, ERR_VERIFY_EMAIL_INVALID_OR_EXPIRED_TOKEN, fiber.StatusBadRequest)
+ return renderVerifyEmailError(ctx, config.ERR_VERIFY_EMAIL_INVALID_OR_EXPIRED_TOKEN, fiber.StatusBadRequest)
}
user, err := database.GetUserByID(emailToken.UserID)
if err != nil {
- return renderVerifyEmailError(ctx, ERR_VERIFY_EMAIL_USER_NOT_FOUND, fiber.StatusInternalServerError)
+ return renderVerifyEmailError(ctx, config.ERR_VERIFY_EMAIL_USER_NOT_FOUND, fiber.StatusInternalServerError)
}
user.Activate()
if err := database.DB.Save(user).Error; err != nil {
- return renderVerifyEmailError(ctx, ERR_VERIFY_EMAIL_ACTIVATION_FAILED, fiber.StatusInternalServerError)
+ return renderVerifyEmailError(ctx, config.ERR_VERIFY_EMAIL_ACTIVATION_FAILED, fiber.StatusInternalServerError)
}
- return shortcuts.Render(ctx, TEMPLATE_VERIFY_EMAIL, fiber.Map{
- "Success": SUCCESS_VERIFY_EMAIL,
+ return shortcuts.Render(ctx, config.TEMPLATE_VERIFY_EMAIL, fiber.Map{
+ "Success": config.SUCCESS_VERIFY_EMAIL,
"Username": user.Username,
})
diff --git a/controllers/constants.go b/controllers/constants.go
deleted file mode 100644
index 7417314..0000000
--- a/controllers/constants.go
+++ /dev/null
@@ -1,48 +0,0 @@
-package controllers
-
-const (
- // Page titles
- PT_HOME = "Home Page"
- PT_LOGIN = "Login"
- PT_POSTS = "Posts"
- PT_PREFERENCES = "Preferences"
- PT_REGISTER = "Register"
- PT_404 = "Page Not Found"
- PT_VERIFY_EMAIL = "Verify Email"
-
- // Template names
- TEMPLATE_HOME = "home"
- TEMPLATE_LOGIN = "login"
- TEMPLATE_POSTS = "posts"
- TEMPLATE_PREFERENCES = "preferences"
- TEMPLATE_REGISTER = "register"
- TEMPLATE_404 = "404"
- TEMPLATE_VERIFY_EMAIL = "account/verify_email"
-
- // URL constants for various routes
- URL_HOME = "/"
- URL_LOGIN = "/login"
- URL_POSTS = "/posts"
- URL_PREFERENCES = "/preferences"
- URL_REGISTER = "/register"
- URL_FORGOT_PASSWORD = "/account/forgot-password"
- URL_RESEND_VERIFICATION = "/account/resend-verification"
-
- // Error messages
- ERR_INVALID_FORM_DATA = "The submitted form data is invalid. Check your input and try again."
- ERR_USER_NOT_FOUND = `User with that username not found. Maybe you want to <a href="` + URL_REGISTER + `">register</a>?`
- ERR_LOGIN_INVALID_CREDENTIALS = `The credentials you provided are incorrect. Did you <a href="` + URL_FORGOT_PASSWORD + `">forget your password</a>?`
- ERR_ACCOUNT_DISABLED = `Your account is disabled or banned. You can reach out to support for assistance.`
- ERR_ACCOUNT_UNABLE_TO_LOGIN = `You cannot log in at this time. Verify your email or contact support. If you misplaced your verification email, you can <a href="` + URL_RESEND_VERIFICATION + `">request a new one</a>.`
- ERR_PASSWORD_MISMATCH = "Entered passwords do not match. Ensure both fields are identical."
- ERR_SESSION_FAILED_TO_CREATE = "Server failed to create a session. If this issue persists, contact support."
- ERR_SESSION_FAILED_TO_SAVE = "Server failed to save session data. If this issue persists, contact support."
- ERR_VERIFY_EMAIL_MISSING_TOKEN = `Verification token is missing. Check the link you clicked or request a <a href="` + URL_RESEND_VERIFICATION + `">new verification email</a>.`
- ERR_VERIFY_EMAIL_INVALID_OR_EXPIRED_TOKEN = `The verification token is either invalid or has expired. Try requesting a <a href="` + URL_RESEND_VERIFICATION + `">new verification email</a>.`
- ERR_VERIFY_EMAIL_USER_NOT_FOUND = `User not found for the provided verification token. If you think this is an error, contact support.`
- ERR_VERIFY_EMAIL_ACTIVATION_FAILED = `Failed to activate your account. If this issue persists, contact support.`
-
- // Success messages
- SUCCESS_USER_REGISTERED = "Your account has been created successfully. A verification email has been sent to your email address. You will only be able to log in after verifying your email. If you did not receive the email, you can <a href=\"" + URL_RESEND_VERIFICATION + "\">request a new one</a>."
- SUCCESS_VERIFY_EMAIL = `Your email has been successfully verified. You can now <a href="` + URL_LOGIN + `">log in</a> to your account.`
-)
diff --git a/controllers/home.go b/controllers/home.go
index 186ef24..9fd0d33 100644
--- a/controllers/home.go
+++ b/controllers/home.go
@@ -1,12 +1,13 @@
package controllers
import (
+ "imageboard/config"
"imageboard/utils/shortcuts"
"github.com/gofiber/fiber/v2"
)
func HomePageController(ctx *fiber.Ctx) error {
- ctx.Locals("Title", PT_HOME)
- return shortcuts.Render(ctx, TEMPLATE_HOME, nil)
+ ctx.Locals("Title", config.PT_HOME)
+ return shortcuts.Render(ctx, config.TEMPLATE_HOME, nil)
}
diff --git a/controllers/login.go b/controllers/login.go
index 6eb4996..aa02e0c 100644
--- a/controllers/login.go
+++ b/controllers/login.go
@@ -1,6 +1,7 @@
package controllers
import (
+ "imageboard/config"
"imageboard/database"
"imageboard/session"
"imageboard/utils/auth"
@@ -15,56 +16,59 @@ type LoginForm struct {
}
func renderLoginError(ctx *fiber.Ctx, errorMsg string, statusCode int) error {
- return shortcuts.RenderWithStatus(ctx, TEMPLATE_LOGIN, fiber.Map{
+ return shortcuts.RenderWithStatus(ctx, config.TEMPLATE_LOGIN, fiber.Map{
"Error": errorMsg,
"Username": ctx.FormValue("username"), // Preserve username in form
}, statusCode)
}
func LoginPageController(ctx *fiber.Ctx) error {
- ctx.Locals("Title", PT_LOGIN)
+ ctx.Locals("Title", config.PT_LOGIN)
if auth.IsAuthenticated(ctx) {
return ctx.Redirect(auth.GetRedirectURL(ctx), fiber.StatusSeeOther)
}
- return shortcuts.Render(ctx, TEMPLATE_LOGIN, nil)
+ next := ctx.Query("next")
+ return shortcuts.Render(ctx, config.TEMPLATE_LOGIN, fiber.Map{
+ "Next": next,
+ })
}
func LoginPostController(ctx *fiber.Ctx) error {
- ctx.Locals("Title", PT_LOGIN)
+ ctx.Locals("Title", config.PT_LOGIN)
var form LoginForm
var err error
if err = ctx.BodyParser(&form); err != nil {
- return renderLoginError(ctx, ERR_INVALID_FORM_DATA, fiber.StatusBadRequest)
+ return renderLoginError(ctx, config.ERR_INVALID_FORM_DATA, fiber.StatusBadRequest)
}
user, err := database.GetUserByUsername(form.Username)
if err != nil {
- return renderLoginError(ctx, ERR_USER_NOT_FOUND, fiber.StatusUnauthorized)
+ return renderLoginError(ctx, config.ERR_USER_NOT_FOUND, fiber.StatusUnauthorized)
}
if !user.CheckPassword(form.Password) {
- return renderLoginError(ctx, ERR_LOGIN_INVALID_CREDENTIALS, fiber.StatusUnauthorized)
+ return renderLoginError(ctx, config.ERR_LOGIN_INVALID_CREDENTIALS, fiber.StatusUnauthorized)
}
if !user.IsActive() {
- return renderLoginError(ctx, ERR_ACCOUNT_DISABLED, fiber.StatusForbidden)
+ return renderLoginError(ctx, config.ERR_ACCOUNT_DISABLED, fiber.StatusForbidden)
}
if !user.CanLogin() {
- return renderLoginError(ctx, ERR_ACCOUNT_UNABLE_TO_LOGIN, fiber.StatusForbidden)
+ return renderLoginError(ctx, config.ERR_ACCOUNT_UNABLE_TO_LOGIN, fiber.StatusForbidden)
}
sess, err := session.Store.Get(ctx)
if err != nil {
- return renderLoginError(ctx, ERR_SESSION_FAILED_TO_CREATE, fiber.StatusInternalServerError)
+ return renderLoginError(ctx, config.ERR_SESSION_FAILED_TO_CREATE, fiber.StatusInternalServerError)
}
sess.Set("user_id", user.ID)
sess.Set("username", user.Username)
if err := sess.Save(); err != nil {
- return renderLoginError(ctx, ERR_SESSION_FAILED_TO_SAVE, fiber.StatusInternalServerError)
+ return renderLoginError(ctx, config.ERR_SESSION_FAILED_TO_SAVE, fiber.StatusInternalServerError)
}
user.UpdateLastUserLogin(database.DB)
diff --git a/controllers/logout.go b/controllers/logout.go
index 20c280d..58ff545 100644
--- a/controllers/logout.go
+++ b/controllers/logout.go
@@ -1,8 +1,8 @@
package controllers
import (
+ "imageboard/config"
"imageboard/session"
- "imageboard/utils/auth"
"github.com/gofiber/fiber/v2"
)
@@ -10,7 +10,7 @@ import (
func LogoutController(ctx *fiber.Ctx) error {
sess, err := session.Store.Get(ctx)
if err != nil {
- return ctx.Redirect(auth.GetRedirectURL(ctx), fiber.StatusSeeOther)
+ return ctx.Redirect(config.URL_HOME, fiber.StatusSeeOther)
}
if err := sess.Destroy(); err != nil {
@@ -19,5 +19,10 @@ func LogoutController(ctx *fiber.Ctx) error {
sess.Save()
}
- return ctx.Redirect(auth.GetRedirectURL(ctx), fiber.StatusSeeOther)
+ next := ctx.Query("next")
+ if next != "" {
+ return ctx.Redirect(next, fiber.StatusSeeOther)
+ }
+
+ return ctx.Redirect(config.URL_HOME, fiber.StatusSeeOther)
}
diff --git a/controllers/posts.go b/controllers/posts.go
index 6fdcd26..03535c7 100644
--- a/controllers/posts.go
+++ b/controllers/posts.go
@@ -1,22 +1,38 @@
package controllers
import (
+ "imageboard/config"
+ "imageboard/database"
+ "imageboard/utils/auth"
"imageboard/utils/shortcuts"
"github.com/gofiber/fiber/v2"
)
-func PostsController(ctx *fiber.Ctx) error {
- ctx.Locals("Title", "Posts")
+func PostsPageController(ctx *fiber.Ctx) error {
+ ctx.Locals("Title", config.PT_POST_LIST)
+ preferences := ctx.Locals("Preferences")
+ prefs, ok := preferences.(config.SitePreferences)
+ if !ok {
+ return fiber.NewError(fiber.StatusInternalServerError, "Invalid preferences type")
+ }
+
+ posts, err := database.GetPosts(prefs.PostsPerPage)
- searchQuery := ctx.Query("tags", "")
+ return shortcuts.Render(ctx, config.TEMPLATE_POST_LIST, fiber.Map{
+ "Posts": posts,
+ "Error": err,
+ })
+}
- customdata := struct {
- SearchQuery string
- Posts []interface{}
- }{
- SearchQuery: searchQuery,
- Posts: []interface{}{},
+func PostsUploadPageController(ctx *fiber.Ctx) error {
+ ctx.Locals("Title", config.PT_POST_NEW)
+ if !auth.IsAuthenticated(ctx) {
+ loginURL := auth.GetLoginURLWithRedirect(ctx)
+ ctx.Set("Location", loginURL)
+ ctx.Status(fiber.StatusFound)
+ return nil
}
- return shortcuts.Render(ctx, "posts", customdata)
+
+ return shortcuts.Render(ctx, config.TEMPLATE_POST_NEW, nil)
}
diff --git a/controllers/register.go b/controllers/register.go
index acadbc5..c52d6e5 100644
--- a/controllers/register.go
+++ b/controllers/register.go
@@ -1,6 +1,7 @@
package controllers
import (
+ "imageboard/config"
"imageboard/database"
"imageboard/models"
"imageboard/utils/auth"
@@ -20,7 +21,7 @@ type RegisterForm struct {
}
func renderRegisterError(ctx *fiber.Ctx, errorMsg string, statusCode int) error {
- return shortcuts.RenderWithStatus(ctx, TEMPLATE_REGISTER, fiber.Map{
+ return shortcuts.RenderWithStatus(ctx, config.TEMPLATE_REGISTER, fiber.Map{
"Error": errorMsg,
"Username": ctx.FormValue("username"),
"Email": ctx.FormValue("email"),
@@ -28,17 +29,17 @@ func renderRegisterError(ctx *fiber.Ctx, errorMsg string, statusCode int) error
}
func RegisterPageController(ctx *fiber.Ctx) error {
- ctx.Locals("Title", PT_REGISTER)
+ ctx.Locals("Title", config.PT_REGISTER)
if auth.IsAuthenticated(ctx) {
return ctx.Redirect(auth.GetRedirectURL(ctx), fiber.StatusSeeOther)
}
- return shortcuts.Render(ctx, TEMPLATE_REGISTER, nil)
+ return shortcuts.Render(ctx, config.TEMPLATE_REGISTER, nil)
}
func RegisterPostController(ctx *fiber.Ctx) error {
- ctx.Locals("Title", PT_REGISTER)
+ ctx.Locals("Title", config.PT_REGISTER)
if auth.IsAuthenticated(ctx) {
return ctx.Redirect(auth.GetRedirectURL(ctx), fiber.StatusSeeOther)
@@ -46,11 +47,11 @@ func RegisterPostController(ctx *fiber.Ctx) error {
var form RegisterForm
if err := ctx.BodyParser(&form); err != nil {
- return renderRegisterError(ctx, ERR_INVALID_FORM_DATA, fiber.StatusBadRequest)
+ return renderRegisterError(ctx, config.ERR_INVALID_FORM_DATA, fiber.StatusBadRequest)
}
if form.Password != form.ConfirmPassword {
- return renderRegisterError(ctx, ERR_PASSWORD_MISMATCH, fiber.StatusBadRequest)
+ return renderRegisterError(ctx, config.ERR_PASSWORD_MISMATCH, fiber.StatusBadRequest)
}
user := &models.User{
@@ -77,7 +78,7 @@ func RegisterPostController(ctx *fiber.Ctx) error {
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,
+ return shortcuts.Render(ctx, config.TEMPLATE_REGISTER, fiber.Map{
+ "Success": config.SUCCESS_USER_REGISTERED,
})
}