migrate from github
This commit is contained in:
@@ -0,0 +1,127 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"strings"
|
||||
|
||||
"github.com/XingfenD/yoresee_doc/internal/model"
|
||||
"github.com/XingfenD/yoresee_doc/internal/utils"
|
||||
"github.com/sirupsen/logrus"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
type seedUserGroup struct {
|
||||
Name string
|
||||
Description string
|
||||
MemberUsers []string
|
||||
}
|
||||
|
||||
func initializeUserGroupsInTx(tx *gorm.DB) error {
|
||||
logrus.Println("Creating user groups in transaction...")
|
||||
|
||||
adminUser, err := getUserByUsername(tx, "admin")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
user2, err := getUserByUsername(tx, "user2")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
seedGroups := []seedUserGroup{
|
||||
{
|
||||
Name: "Admin Group",
|
||||
Description: "Group for admin only",
|
||||
MemberUsers: []string{"admin"},
|
||||
},
|
||||
{
|
||||
Name: "User2 Group",
|
||||
Description: "Group for user2 only",
|
||||
MemberUsers: []string{"user2"},
|
||||
},
|
||||
{
|
||||
Name: "Admin & User2 Group",
|
||||
Description: "Group for admin and user2",
|
||||
MemberUsers: []string{"admin", "user2"},
|
||||
},
|
||||
{
|
||||
Name: "Empty Group",
|
||||
Description: "Group with no members",
|
||||
MemberUsers: []string{},
|
||||
},
|
||||
}
|
||||
|
||||
for _, seed := range seedGroups {
|
||||
group, err := findOrCreateGroup(tx, seed.Name, seed.Description, adminUser.ID)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for _, username := range seed.MemberUsers {
|
||||
var userID int64
|
||||
switch username {
|
||||
case "admin":
|
||||
userID = adminUser.ID
|
||||
case "user2":
|
||||
userID = user2.ID
|
||||
default:
|
||||
continue
|
||||
}
|
||||
if err := ensureMembership(tx, group.ID, userID); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
logrus.Println("User groups initialized successfully in transaction.")
|
||||
return nil
|
||||
}
|
||||
|
||||
func getUserByUsername(tx *gorm.DB, username string) (*model.User, error) {
|
||||
var user model.User
|
||||
if err := tx.Where("username = ?", username).First(&user).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &user, nil
|
||||
}
|
||||
|
||||
func findOrCreateGroup(tx *gorm.DB, name, description string, creatorID int64) (*model.UserGroupMeta, error) {
|
||||
name = strings.TrimSpace(name)
|
||||
if name == "" {
|
||||
return nil, gorm.ErrInvalidValue
|
||||
}
|
||||
|
||||
var group model.UserGroupMeta
|
||||
if err := tx.Where("name = ?", name).First(&group).Error; err == nil {
|
||||
return &group, nil
|
||||
} else if !errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
group = model.UserGroupMeta{
|
||||
ExternalID: utils.GenerateExternalID(utils.ExternalIDContextUserGroup),
|
||||
Name: name,
|
||||
Description: strings.TrimSpace(description),
|
||||
CreatorID: creatorID,
|
||||
}
|
||||
if err := tx.Create(&group).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &group, nil
|
||||
}
|
||||
|
||||
func ensureMembership(tx *gorm.DB, groupID, userID int64) error {
|
||||
var count int64
|
||||
if err := tx.Model(&model.MembershipRelation{}).
|
||||
Where("type = ? AND membership_id = ? AND user_id = ?", model.MembershipType_UserGroup, groupID, userID).
|
||||
Count(&count).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
if count > 0 {
|
||||
return nil
|
||||
}
|
||||
return tx.Create(&model.MembershipRelation{
|
||||
Type: model.MembershipType_UserGroup,
|
||||
MembershipID: groupID,
|
||||
UserID: userID,
|
||||
}).Error
|
||||
}
|
||||
Reference in New Issue
Block a user