feat: team draft

This commit is contained in:
2024-11-12 19:15:13 +07:00
parent 8159b65605
commit f5250d5361
23 changed files with 313 additions and 48 deletions
+1
View File
@@ -45,6 +45,7 @@ func Init() {
// Migrate the schema
db.AutoMigrate(Models...)
InitModels(db)
runSeeders(db)
}
+14 -1
View File
@@ -1,10 +1,23 @@
package db
import "rul.sh/vaulterm/models"
import (
"log"
"gorm.io/gorm"
"rul.sh/vaulterm/models"
)
var Models = []interface{}{
&models.User{},
&models.UserSession{},
&models.Keychain{},
&models.Host{},
&models.Team{},
&models.TeamMembers{},
}
func InitModels(db *gorm.DB) {
if err := db.SetupJoinTable(&models.Team{}, "Members", &models.TeamMembers{}); err != nil {
log.Fatal(err)
}
}
+30 -2
View File
@@ -28,7 +28,18 @@ func seedUsers(tx *gorm.DB) error {
return err
}
userList := []models.User{
teams := []*models.Team{
{
Name: "My Team",
Icon: "☘️",
},
}
if res := tx.Create(&teams); res.Error != nil {
return res.Error
}
userList := []*models.User{
{
Name: "Admin",
Username: "admin",
@@ -42,22 +53,39 @@ func seedUsers(tx *gorm.DB) error {
Password: testPasswd,
Email: "[email protected]",
},
{
Name: "Mary Doe",
Username: "user2",
Password: testPasswd,
Email: "[email protected]",
},
}
if res := tx.Create(&userList); res.Error != nil {
return res.Error
}
teamMembers := []models.TeamMembers{
{TeamID: teams[0].ID, UserID: userList[0].ID, Role: "owner"},
{TeamID: teams[0].ID, UserID: userList[1].ID, Role: "admin"},
{TeamID: teams[0].ID, UserID: userList[2].ID, Role: "user"},
}
if res := tx.Create(&teamMembers); res.Error != nil {
return res.Error
}
return nil
}
func runSeeders(db *gorm.DB) {
db.Transaction(func(tx *gorm.DB) error {
for _, seed := range seeders {
if err := seed(db); err != nil {
if err := seed(tx); err != nil {
return err
}
}
return nil
})
}
+9 -1
View File
@@ -4,6 +4,7 @@ import (
"strings"
"github.com/gofiber/fiber/v2"
"gorm.io/gorm"
"rul.sh/vaulterm/db"
"rul.sh/vaulterm/models"
)
@@ -32,7 +33,14 @@ func Auth(c *fiber.Ctx) error {
func GetUserSession(sessionId string) (*models.UserSession, error) {
var session models.UserSession
res := db.Get().Joins("User").Where("user_sessions.id = ?", sessionId).First(&session)
res := db.Get().
Joins("User").
Preload("User.Teams", func(db *gorm.DB) *gorm.DB {
return db.Select("id", "name", "icon")
}).
Where("user_sessions.id = ?", sessionId).
First(&session)
return &session, res.Error
}
+3 -1
View File
@@ -13,7 +13,9 @@ type Model struct {
}
func (m *Model) BeforeCreate(tx *gorm.DB) error {
m.ID = m.GenerateID()
if m.ID == "" {
m.ID = m.GenerateID()
}
return nil
}
+23
View File
@@ -0,0 +1,23 @@
package models
import "time"
type Team struct {
Model
Name string `json:"name" gorm:"type:varchar(32)"`
Icon string `json:"icon" gorm:"type:varchar(2)"`
Members []*User `json:"members" gorm:"many2many:team_members"`
Timestamps
SoftDeletes
}
type TeamMembers struct {
TeamID string `json:"teamId" gorm:"primarykey;type:varchar(26)"`
Team Team `json:"team"`
UserID string `json:"userId" gorm:"primarykey;type:varchar(26)"`
User User `json:"user"`
Role string `json:"role" gorm:"type:varchar(16)"`
CreatedAt time.Time `json:"createdAt"`
}
+2
View File
@@ -14,6 +14,8 @@ type User struct {
Email string `json:"email" gorm:"unique"`
Role string `json:"role" gorm:"default:user;not null;index:users_role_idx;type:varchar(8)"`
Teams []*Team `json:"teams" gorm:"many2many:team_members"`
Timestamps
SoftDeletes
}
+1 -1
View File
@@ -8,7 +8,7 @@ import (
type UserContext struct {
*models.User
IsAdmin bool
IsAdmin bool `json:"isAdmin"`
}
func getUserData(user *models.User) *UserContext {