imc-vibe/backend/internal/db/imc_users.go

166 lines
4.3 KiB
Go

package db
import (
"context"
"errors"
imcdb "git.workaround.org/chaas/imc/backend/internal/db/sqlc"
)
var ErrNotFound = errors.New("record not found")
func (d *DB) GetImcUserByUsername(ctx context.Context, username string) (*imcdb.ImcUser, error) {
user, err := d.Queries.GetImcUserByUsername(ctx, username)
if err != nil {
return nil, err
}
return &user, nil
}
func (d *DB) GetImcUserByID(ctx context.Context, id uint32) (*imcdb.ImcUser, error) {
user, err := d.Queries.GetImcUserByID(ctx, id)
if err != nil {
return nil, err
}
return &user, nil
}
func (d *DB) CreateImcUser(ctx context.Context, username, passwordHash, role string, domainID uint32) error {
roleNull := imcdb.NullImcUsersRole{ImcUsersRole: imcdb.ImcUsersRole(role), Valid: true}
return d.Queries.CreateImcUser(ctx, imcdb.CreateImcUserParams{
Username: username,
PasswordHash: passwordHash,
Role: roleNull,
DomainID: domainID,
})
}
func (d *DB) UpdateImcUserPassword(ctx context.Context, id uint32, passwordHash string) error {
return d.Queries.UpdateImcUserPassword(ctx, imcdb.UpdateImcUserPasswordParams{
PasswordHash: passwordHash,
ID: id,
})
}
func (d *DB) DeleteImcUser(ctx context.Context, id uint32) error {
return d.Queries.DeleteImcUser(ctx, id)
}
func (d *DB) UpsertAdminUser(ctx context.Context, username, passwordHash string, domainID uint32) error {
user, err := d.Queries.GetImcUserByUsername(ctx, username)
if err == nil && user.ID != 0 {
return d.Queries.UpdateImcUserPassword(ctx, imcdb.UpdateImcUserPasswordParams{
PasswordHash: passwordHash,
ID: user.ID,
})
}
return d.CreateImcUser(ctx, username, passwordHash, "admin", domainID)
}
func (d *DB) GetUserAccessibleDomains(ctx context.Context, userID uint32, isAdmin bool) ([]imcdb.VirtualDomain, error) {
if isAdmin {
return d.Queries.GetAllDomains(ctx)
}
user, err := d.Queries.GetImcUserByID(ctx, userID)
if err != nil {
return nil, err
}
primaryDomain, err := d.Queries.GetDomainByID(ctx, user.DomainID)
if err != nil {
return nil, err
}
additionalDomains, err := d.Queries.GetAdditionalDomainsForUser(ctx, userID)
if err != nil {
return nil, err
}
domainMap := make(map[uint32]imcdb.VirtualDomain)
domainMap[primaryDomain.ID] = primaryDomain
for _, d := range additionalDomains {
domainMap[d.ID] = d
}
result := make([]imcdb.VirtualDomain, 0, len(domainMap))
for _, d := range domainMap {
result = append(result, d)
}
return result, nil
}
func (d *DB) CanAccessDomain(ctx context.Context, userID uint32, domainName string, isAdmin bool) (bool, error) {
if isAdmin {
return true, nil
}
user, err := d.Queries.GetImcUserByID(ctx, userID)
if err != nil {
return false, err
}
primaryDomain, err := d.Queries.GetDomainByID(ctx, user.DomainID)
if err == nil && primaryDomain.Name == domainName {
return true, nil
}
count, err := d.Queries.IsUserInDomain(ctx, imcdb.IsUserInDomainParams{UserID: userID})
if err != nil {
return false, err
}
return count > 0, nil
}
func (d *DB) GetUsersForDomain(ctx context.Context, domainID uint32) ([]imcdb.ImcUser, error) {
users, err := d.Queries.GetUsersForDomain(ctx, domainID)
if err != nil {
return nil, err
}
additionalUsers, err := d.Queries.GetUsersForDomainViaJoin(ctx, domainID)
if err != nil {
return nil, err
}
userMap := make(map[uint32]imcdb.ImcUser)
for _, u := range users {
userMap[u.ID] = u
}
for _, u := range additionalUsers {
if _, exists := userMap[u.ID]; !exists {
userMap[u.ID] = u
}
}
result := make([]imcdb.ImcUser, 0, len(userMap))
for _, u := range userMap {
result = append(result, u)
}
return result, nil
}
func (d *DB) AddUserToDomain(ctx context.Context, userID, domainID uint32) error {
return d.Queries.AddUserToDomain(ctx, imcdb.AddUserToDomainParams{
UserID: userID,
DomainID: domainID,
})
}
func (d *DB) RemoveUserFromDomain(ctx context.Context, userID, domainID uint32) error {
return d.Queries.RemoveUserFromDomain(ctx, imcdb.RemoveUserFromDomainParams{
UserID: userID,
DomainID: domainID,
})
}
func (d *DB) IsUserInDomain(ctx context.Context, userID, domainID uint32) (bool, error) {
count, err := d.Queries.IsUserInDomain(ctx, imcdb.IsUserInDomainParams{
UserID: userID,
DomainID: domainID,
})
if err != nil {
return false, err
}
return count > 0, nil
}