diff --git a/cmd/main.go b/cmd/main.go index 404e826..31c817a 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -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) diff --git a/internal/AppContext.go b/internal/AppContext.go index b24e3aa..eb6e5f1 100644 --- a/internal/AppContext.go +++ b/internal/AppContext.go @@ -10,6 +10,7 @@ import ( type AppContext struct { Db *gorm.DB PostService *services.PostService + UserService *services.UserService Instance string Tag string } \ No newline at end of file diff --git a/internal/auth/password.go b/internal/auth/password.go new file mode 100644 index 0000000..5a55df5 --- /dev/null +++ b/internal/auth/password.go @@ -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 +} \ No newline at end of file diff --git a/internal/handlers/admin/adminDash.go b/internal/handlers/admin/adminDash.go deleted file mode 100644 index 98812d5..0000000 --- a/internal/handlers/admin/adminDash.go +++ /dev/null @@ -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", - }) -} \ No newline at end of file diff --git a/internal/helpers/SetupAppContext.go b/internal/helpers/SetupAppContext.go index 8f5af7e..6bc6822 100644 --- a/internal/helpers/SetupAppContext.go +++ b/internal/helpers/SetupAppContext.go @@ -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, } diff --git a/internal/helpers/dbHelpers.go b/internal/helpers/dbHelpers.go index b6caeb4..c9543df 100644 --- a/internal/helpers/dbHelpers.go +++ b/internal/helpers/dbHelpers.go @@ -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{}) } diff --git a/internal/models/requestModels/register.go b/internal/models/requestModels/register.go new file mode 100644 index 0000000..e810410 --- /dev/null +++ b/internal/models/requestModels/register.go @@ -0,0 +1,6 @@ +package requestmodels + +type RegisterInput struct { + Username string `json:"username" binding:"required"` + Password string `json:"password" binding:"required"` +} \ No newline at end of file diff --git a/internal/server/router.go b/internal/server/router.go index 0743a4d..ae287d5 100644 --- a/internal/server/router.go +++ b/internal/server/router.go @@ -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) diff --git a/internal/services/userService.go b/internal/services/userService.go index 5e568ea..a0dd5dc 100644 --- a/internal/services/userService.go +++ b/internal/services/userService.go @@ -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) +} \ No newline at end of file diff --git a/internal/web/handlers/admin/adminDash.go b/internal/web/handlers/admin/adminDash.go new file mode 100644 index 0000000..90c2014 --- /dev/null +++ b/internal/web/handlers/admin/adminDash.go @@ -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", + }) +} diff --git a/internal/handlers/api/apiEndpoint.go b/internal/web/handlers/api/apiEndpoint.go similarity index 100% rename from internal/handlers/api/apiEndpoint.go rename to internal/web/handlers/api/apiEndpoint.go diff --git a/internal/handlers/home/mainPage.go b/internal/web/handlers/home/mainPage.go similarity index 100% rename from internal/handlers/home/mainPage.go rename to internal/web/handlers/home/mainPage.go