Skip to content
Merged

Dev #53

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions Internal/adapters/repository/dynamicDBRepo.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package repository

import (
"github.com/Arjuna-Ragil/Localbase/Internal/core/domain"
"gorm.io/gorm"
)

type DynamicDBRepo struct {
DB *DBContainer
}

func NewDynamicDB(db *DBContainer) *DynamicDBRepo {
return &DynamicDBRepo{DB: db}
}

func (dr *DynamicDBRepo) RunDynamicQuery(tx *gorm.DB, query string) error {
if err := tx.Exec(query).Error; err != nil {
return err
}
return nil
}

// Dynamic database note

func (dr *DynamicDBRepo) CreateDynTable(tx *gorm.DB, dynTable *domain.DynTableDef) (*domain.DynTableDef, error) {
if err := tx.Create(&dynTable).Error; err != nil {
return nil, err
}
return dynTable, nil
}

func (dr *DynamicDBRepo) CreateDynCol(tx *gorm.DB, dynCol *domain.DynColDef) error {
if err := tx.Create(&dynCol).Error; err != nil {
return err
}
return nil
}

func (dr *DynamicDBRepo) GetTables(projectID uint) ([]domain.DynTableDef, error) {
var tables []domain.DynTableDef
if err := dr.DB.Gorm.Preload("Columns").Where("project_id = ?", projectID).Find(&tables).Error; err != nil {
return nil, err
}
return tables, nil
}
4 changes: 4 additions & 0 deletions Internal/adapters/repository/postgres.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,10 @@ func (db *DBContainer) Migrate() error {
err := db.Gorm.AutoMigrate(
&domain.User{},
&domain.Invitation{},
&domain.Project{},
&domain.ProjectUser{},
&domain.DynTableDef{},
&domain.DynColDef{},
)
if err != nil {
log.Fatalf("Failed to migrate users: %v", err)
Expand Down
58 changes: 58 additions & 0 deletions Internal/adapters/repository/projectRepo.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package repository

import (
"github.com/Arjuna-Ragil/Localbase/Internal/core/domain"
)

type ProjectRepo struct {
DB *DBContainer
}

func NewProjectRepo(db *DBContainer) *ProjectRepo {
return &ProjectRepo{DB: db}
}

func (pr *ProjectRepo) CreateProject(project *domain.Project) (*domain.Project, error) {
if err := pr.DB.Gorm.Create(project).Error; err != nil {
return nil, err
}
return project, nil
}

func (pr *ProjectRepo) FetchProjects(projects []domain.Project) ([]domain.Project, error) {
if err := pr.DB.Gorm.Find(&projects).Error; err != nil {
return nil, err
}
return projects, nil
}

func (pr *ProjectRepo) ProjectById(id string) (*domain.Project, error) {
var project domain.Project
if err := pr.DB.Gorm.Preload("ProjectUsers.User").First(&project, id).Error; err != nil {
return nil, err
}
return &project, nil
}

func (pr *ProjectRepo) InviteProject(projectuser *domain.ProjectUser) (*domain.ProjectUser, error) {
if err := pr.DB.Gorm.Create(projectuser).Error; err != nil {
return nil, err
}
return projectuser, nil
}

func (pr *ProjectRepo) ProjectUserCheck(userID uint) (*domain.ProjectUser, error) {
var projectuser domain.ProjectUser
if err := pr.DB.Gorm.First(&projectuser, userID).Error; err != nil {
return nil, err
}
return &projectuser, nil
}

func (pr *ProjectRepo) RemoveProjectUser(id uint) error {
var projectuser domain.ProjectUser
if err := pr.DB.Gorm.Delete(&projectuser, id).Error; err != nil {
return err
}
return nil
}
11 changes: 10 additions & 1 deletion Internal/adapters/repository/userRepo.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,21 @@ func NewUserRepository(db *DBContainer) *UserRepository {
// Query

func (ur *UserRepository) save(user *domain.User) error {

return ur.db.Gorm.Create(user).Error
}

func (ur *UserRepository) FindById(id uint) (*domain.User, error) {
var user domain.User
err := ur.db.Gorm.First(&user, id).Error
if err := ur.db.Gorm.Preload("Projects.Project").First(&user, id).Error; err != nil {
return nil, err
}
return &user, nil
}

func (ur *UserRepository) FindByEmail(email string) (*domain.User, error) {
var user domain.User
err := ur.db.Gorm.Where("email = ?", email).First(&user).Error
if err != nil {
return nil, err
}
Expand Down
27 changes: 22 additions & 5 deletions Internal/api/Routes/routev1.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,13 @@ import (
)

type Deps struct {
User *handlers.UserHandler
Auth *handlers.AuthHandler
System *handlers.SystemHandler
UserRepo *repository.UserRepository
Config *config.Config
User *handlers.UserHandler
Auth *handlers.AuthHandler
System *handlers.SystemHandler
Project *handlers.ProjectHandler
DynamicDB *handlers.DynamicDBHandler
UserRepo *repository.UserRepository
Config *config.Config
}

func SetupRouterV1(r *gin.Engine, deps Deps) {
Expand Down Expand Up @@ -45,6 +47,21 @@ func SetupRouterV1(r *gin.Engine, deps Deps) {
admin.POST("/invite", deps.Auth.CreateInviteHandler)
admin.GET("/alluser", deps.User.AllUserHandler)
admin.PUT("/updaterole", deps.User.UpdateRoleHandler)
admin.POST("/createproject", deps.Project.CreateProjectHandler)
}
project := protected.Group("/project")
{
project.GET("/projects", deps.Project.GetAllProjectHandler)
project.GET("/:projectid", deps.Project.GetProjectHandler)
project.GET("/:projectid/tables", deps.DynamicDB.GetDynTablesHandler)

manage := project.Group("/manage")
{
manage.POST("/invite/:projectid", deps.Project.InviteProjectHandler)
manage.DELETE("/remove/:projuserid", deps.Project.RemoveProjectUserHandler)
manage.POST("/create/table/:projectid", deps.DynamicDB.CreateDynamicDBHandler)
manage.POST("/create/col/:projectid/:tableid", deps.DynamicDB.AddDynamicColHandler)
}
}
}
}
Expand Down
119 changes: 119 additions & 0 deletions Internal/api/handlers/dynamicDBHandler.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
package handlers

import (
"strconv"

"github.com/Arjuna-Ragil/Localbase/Internal/core/services"
"github.com/gin-gonic/gin"
)

type DynamicDBHandler struct {
Serv *services.DynamicDBService
}

func NewDynamicDBHandler(serv *services.DynamicDBService) *DynamicDBHandler {
return &DynamicDBHandler{Serv: serv}
}

func (dh *DynamicDBHandler) CreateDynamicDBHandler(c *gin.Context) {
projectIDStr := c.Param("projectid")
projectID, err := strconv.Atoi(projectIDStr)
if err != nil {
c.JSON(400, gin.H{
"message": "Project ID not valid",
"error": err.Error(),
})
return
}
var input services.DDLTableReq
if err = c.ShouldBindJSON(&input); err != nil {
c.JSON(400, gin.H{
"message": "Invalid json body",
"error": err.Error(),
})
return
}
DynTable, err := dh.Serv.CreateDynamicTable(uint(projectID), input)
if nil != err {
c.JSON(500, gin.H{
"message": "Failed to create dynamic table",
"error": err.Error(),
})
return
}
if err = dh.Serv.CreateDynamicCols(DynTable.ID, uint(projectID), input); nil != err {
c.JSON(500, gin.H{
"message": "Failed to create dynamic cols",
"error": err.Error(),
})
return
}
c.JSON(200, gin.H{
"message": "Successfully created dynamic table",
"data": nil,
})
}

func (dh *DynamicDBHandler) AddDynamicColHandler(c *gin.Context) {
projectIDStr := c.Param("projectid")
projectID, err := strconv.Atoi(projectIDStr)
if err != nil {
c.JSON(400, gin.H{
"message": "Project ID not valid",
"error": err.Error(),
})
return
}
tableIDStr := c.Param("tableid")
tableID, err := strconv.Atoi(tableIDStr)
if err != nil {
c.JSON(400, gin.H{
"message": "Table ID not valid",
"error": err.Error(),
})
return
}
var input services.DDLTableReq
if err = c.ShouldBindJSON(&input); err != nil {
c.JSON(400, gin.H{
"message": "Invalid json body",
"error": err.Error(),
})
return
}
if err = dh.Serv.CreateDynamicCols(uint(tableID), uint(projectID), input); nil != err {
c.JSON(500, gin.H{
"message": "Failed to create dynamic cols",
"error": err.Error(),
})
return
}
c.JSON(200, gin.H{
"message": "Successfully added dynamic col",
"data": nil,
})
}

func (dh *DynamicDBHandler) GetDynTablesHandler(c *gin.Context) {
projectIDStr := c.Param("projectid")
projectID, err := strconv.Atoi(projectIDStr)
if err != nil {
c.JSON(400, gin.H{
"message": "Project ID not valid",
"error": err.Error(),
})
return
}
tables, err := dh.Serv.GetDynamicTables(uint(projectID))
if err != nil {
c.JSON(500, gin.H{
"message": "Failed to get dynamic table",
"error": err.Error(),
})
return
}
c.JSON(200, gin.H{
"message": "Successfully get dynamic table",
"data": tables,
})
}
Loading
Loading