166 lines
4.3 KiB
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
|
|
}
|