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 }