vaulterm/server/app/teams/repository.go

96 lines
2.0 KiB
Go

package teams
import (
"gorm.io/gorm"
"rul.sh/vaulterm/db"
"rul.sh/vaulterm/models"
"rul.sh/vaulterm/utils"
)
type Teams struct {
db *gorm.DB
User *utils.UserContext
}
func NewRepository(r *Teams) *Teams {
if r == nil {
r = &Teams{}
}
r.db = db.Get()
return r
}
func (r *Teams) GetAll() ([]*models.Team, error) {
var rows []*models.Team
query := r.db.Order("created_at ASC")
if !r.User.IsAdmin() {
query = query.
Joins("JOIN team_members ON team_members.team_id = teams.id").
Where("team_members.user_id = ?", r.User.ID)
}
ret := query.Find(&rows)
return rows, ret.Error
}
func (r *Teams) Create(data *models.Team) error {
return r.db.Transaction(func(tx *gorm.DB) error {
if err := tx.Create(data).Error; err != nil {
return err
}
if r.User.ID != "" {
ret := tx.Create(&models.TeamMembers{
UserID: r.User.ID,
TeamID: data.ID,
Role: models.TeamRoleOwner,
})
if ret.Error != nil {
return ret.Error
}
}
return nil
})
}
func (r *Teams) Get(opt GetOptions) (*models.Team, error) {
query := r.db.Where("teams.id = ?", opt.ID)
if opt.WithMembers {
query = query.Preload("Members.User", func(db *gorm.DB) *gorm.DB {
return db.Select("users.id", "users.name", "users.username", "users.email")
})
}
var data models.Team
if err := query.First(&data).Error; err != nil {
return nil, err
}
return &data, nil
}
func (r *Teams) Exists(id string) (bool, error) {
var count int64
ret := r.db.Model(&models.Team{}).Where("id = ?", id).Count(&count)
return count > 0, ret.Error
}
func (r *Teams) Update(id string, item *models.Team) error {
return r.db.Where("id = ?", id).Updates(item).Error
}
func (r *Teams) Delete(id string) error {
return r.db.Transaction(func(tx *gorm.DB) error {
if err := tx.Where("team_id = ?", id).Delete(&models.TeamMembers{}).Error; err != nil {
return err
}
if err := tx.Where("id = ?", id).Delete(&models.Team{}).Error; err != nil {
return err
}
return nil
})
}