Add user registration with password hashing and restructure handlers directory

This commit is contained in:
2025-05-15 12:10:16 +03:30
parent 7aa8c26da9
commit b3fae6b80c
12 changed files with 124 additions and 45 deletions

View File

@@ -8,7 +8,6 @@ import (
"log"
"time"
"github.com/gin-gonic/gin"
)
func main() {
@@ -34,7 +33,7 @@ func main() {
var newAccounts = appContext.PostService.GetNewAccounts(existingAccountIds, newPosts)
// Save to database
log.Printf("Fetched %d posts, %d accounts; %d new posts and %d new accounts\n", len(posts), len(existingAccountIds), len(newPosts), len(newAccounts))
log.Printf("Fetched %d posts; %d existing posts; %d new posts and %d new accounts\n", len(posts), len(existingPostIds), len(newPosts), len(newAccounts))
// Additional logging
if newAccounts != nil {
@@ -56,8 +55,8 @@ func main() {
}()
// https://seefnasrul.medium.com/create-your-first-go-rest-api-with-jwt-authentication-in-gin-framework-dbe5bda72817
engine := gin.Default()
r := server.SetupRouter(engine, appContext)
r := server.SetupRouter(appContext)
err := r.Run(":8080")
if err != nil {
log.Fatal(err)

View File

@@ -10,6 +10,7 @@ import (
type AppContext struct {
Db *gorm.DB
PostService *services.PostService
UserService *services.UserService
Instance string
Tag string
}

10
internal/auth/password.go Normal file
View File

@@ -0,0 +1,10 @@
package auth
import (
"golang.org/x/crypto/bcrypt"
)
func HashPassword(password string) (string, error) {
bytes, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
return string(bytes), err
}

View File

@@ -1,35 +0,0 @@
package handlers_admin
import (
"CatsOfMastodonBotGo/internal"
"github.com/gin-gonic/gin"
)
type AdminDashboardHandler struct {
AppContext *internal.AppContext
}
func NewAdminDashboardHandler(appContext *internal.AppContext) *AdminDashboardHandler {
return &AdminDashboardHandler{
AppContext: appContext,
}
}
func (appContext *AdminDashboardHandler) AdminHomePage(c *gin.Context) {
c.JSON(200, gin.H{
"YouAreOn": "AdminDashboardHomePage",
})
}
func (appContext *AdminDashboardHandler) ApproveMedia(c *gin.Context) {
c.JSON(200, gin.H{
"YouAreOn": "ApproveMedia",
})
}
func (appContext *AdminDashboardHandler) RejectMedia(c *gin.Context) {
c.JSON(200, gin.H{
"YouAreOn": "RejectMedia",
})
}

View File

@@ -31,10 +31,14 @@ func SetupAppContext() *internal.AppContext {
//Setup PostService
var postService = services.NewPostService(db)
// Setup UserService
var userService = services.NewUserService(db)
// Inititlize AppContext
var appContext = &internal.AppContext{
Db: db,
PostService: postService,
UserService: userService,
Instance: instance,
Tag: tag,
}

View File

@@ -7,7 +7,7 @@ import (
)
func AddMigrations(db *gorm.DB) {
db.AutoMigrate(&models.Post{}, &models.MediaAttachment{}, &models.Account{})
db.AutoMigrate(&models.Post{}, &models.MediaAttachment{}, &models.Account{}, models.ComUser{})
}

View File

@@ -0,0 +1,6 @@
package requestmodels
type RegisterInput struct {
Username string `json:"username" binding:"required"`
Password string `json:"password" binding:"required"`
}

View File

@@ -2,15 +2,15 @@ package server
import (
"CatsOfMastodonBotGo/internal"
handlers_admin "CatsOfMastodonBotGo/internal/handlers/admin"
handlers_api "CatsOfMastodonBotGo/internal/handlers/api"
handlers_home "CatsOfMastodonBotGo/internal/handlers/home"
handlers_admin "CatsOfMastodonBotGo/internal/web/handlers/admin"
handlers_api "CatsOfMastodonBotGo/internal/web/handlers/api"
handlers_home "CatsOfMastodonBotGo/internal/web/handlers/home"
"github.com/gin-gonic/gin"
)
func SetupRouter(r *gin.Engine, appContext *internal.AppContext) *gin.Engine {
func SetupRouter(appContext *internal.AppContext) *gin.Engine {
r := gin.Default()
adminDashboardHandler := handlers_admin.NewAdminDashboardHandler(appContext)
homePageHandler := handlers_home.NewMainPageHandler(appContext)
@@ -19,6 +19,8 @@ func SetupRouter(r *gin.Engine, appContext *internal.AppContext) *gin.Engine {
admin := r.Group("/admin")
admin.GET("/", adminDashboardHandler.AdminHomePage)
admin.POST("/register", adminDashboardHandler.Register)
admin.POST("/login", adminDashboardHandler.Login)
admin.POST("/approve", adminDashboardHandler.ApproveMedia)
admin.POST("/reject", adminDashboardHandler.RejectMedia)

View File

@@ -1 +1,18 @@
package services
import (
"CatsOfMastodonBotGo/internal/models"
"gorm.io/gorm"
)
type UserService struct {
db *gorm.DB
}
func NewUserService(db *gorm.DB) *UserService {
return &UserService{db: db}
}
func (us *UserService) CreateUser(user models.ComUser) int {
return int(us.db.Create(&user).RowsAffected)
}

View File

@@ -0,0 +1,75 @@
package handlers_admin
import (
"CatsOfMastodonBotGo/internal"
"CatsOfMastodonBotGo/internal/models"
requestmodels "CatsOfMastodonBotGo/internal/models/requestModels"
"net/http"
"CatsOfMastodonBotGo/internal/auth"
"github.com/gin-gonic/gin"
)
type AdminDashboardHandler struct {
AppContext *internal.AppContext
}
func NewAdminDashboardHandler(appContext *internal.AppContext) *AdminDashboardHandler {
return &AdminDashboardHandler{
AppContext: appContext,
}
}
func (appContext *AdminDashboardHandler) AdminHomePage(c *gin.Context) {
c.JSON(200, gin.H{
"YouAreOn": "AdminDashboardHomePage",
})
}
func (appContext *AdminDashboardHandler) ApproveMedia(c *gin.Context) {
c.JSON(200, gin.H{
"YouAreOn": "ApproveMedia",
})
}
func (appContext *AdminDashboardHandler) RejectMedia(c *gin.Context) {
c.JSON(200, gin.H{
"YouAreOn": "RejectMedia",
})
}
func (appContext *AdminDashboardHandler) Register(c *gin.Context) {
var input requestmodels.RegisterInput
if err := c.ShouldBindJSON(&input); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
hashedPassword, err := auth.HashPassword(input.Password)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
var user = models.ComUser{
Username: input.Username,
Password: hashedPassword,
}
if appContext.AppContext.UserService.CreateUser(user) == 0 {
c.JSON(http.StatusBadRequest, gin.H{
"success": false,
"error": "failed to create user",
})
}
c.JSON(200, gin.H{
"success": true,
})
}
func (appContext *AdminDashboardHandler) Login(c *gin.Context) {
c.JSON(200, gin.H{
"YouAreOn": "Login",
})
}