From f13506cfba2da90764620dab2c624ac74767de62 Mon Sep 17 00:00:00 2001 From: Bobby Date: Wed, 16 Jul 2025 13:18:20 +0530 Subject: constants and types refactor; next value for proper redirect on login --- controllers/account.go | 17 +++++++++-------- controllers/constants.go | 48 ------------------------------------------------ controllers/home.go | 5 +++-- controllers/login.go | 26 +++++++++++++++----------- controllers/logout.go | 11 ++++++++--- controllers/posts.go | 36 ++++++++++++++++++++++++++---------- controllers/register.go | 17 +++++++++-------- 7 files changed, 70 insertions(+), 90 deletions(-) delete mode 100644 controllers/constants.go (limited to 'controllers') 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 register?` - ERR_LOGIN_INVALID_CREDENTIALS = `The credentials you provided are incorrect. Did you forget your password?` - 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 request a new one.` - 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 new verification email.` - ERR_VERIFY_EMAIL_INVALID_OR_EXPIRED_TOKEN = `The verification token is either invalid or has expired. Try requesting a new verification email.` - 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 request a new one." - SUCCESS_VERIFY_EMAIL = `Your email has been successfully verified. You can now log in 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, }) } -- cgit v1.2.3