Files
drive/apps/backend/internal/account/service.go

81 lines
1.8 KiB
Go
Raw Normal View History

2025-11-30 17:12:50 +00:00
package account
import (
"context"
"database/sql"
"errors"
"github.com/get-drexa/drexa/internal/database"
"github.com/google/uuid"
"github.com/uptrace/bun"
)
2026-01-01 18:29:52 +00:00
type Service struct{}
2025-11-30 17:12:50 +00:00
2026-01-01 18:29:52 +00:00
func NewService() *Service {
return &Service{}
2025-11-30 17:12:50 +00:00
}
2026-01-01 18:29:52 +00:00
func (s *Service) CreateAccount(ctx context.Context, db bun.IDB, orgID uuid.UUID, userID uuid.UUID, role Role, status Status) (*Account, error) {
2025-11-30 17:12:50 +00:00
id, err := newAccountID()
if err != nil {
return nil, err
}
2026-01-01 18:29:52 +00:00
acc := &Account{
ID: id,
OrgID: orgID,
UserID: userID,
Role: role,
Status: status,
2025-11-30 17:12:50 +00:00
}
2026-01-01 18:29:52 +00:00
_, err = db.NewInsert().Model(acc).Returning("*").Exec(ctx)
2025-11-30 17:12:50 +00:00
if err != nil {
if database.IsUniqueViolation(err) {
return nil, ErrAccountAlreadyExists
}
return nil, err
}
2026-01-01 18:29:52 +00:00
return acc, nil
2025-11-30 17:12:50 +00:00
}
func (s *Service) ListAccounts(ctx context.Context, db bun.IDB, userID uuid.UUID) ([]*Account, error) {
var accounts []*Account
err := db.NewSelect().Model(&accounts).Where("user_id = ?", userID).Scan(ctx)
if err != nil {
if errors.Is(err, sql.ErrNoRows) {
return make([]*Account, 0), nil
}
return nil, err
}
return accounts, nil
}
2026-01-01 18:29:52 +00:00
func (s *Service) AccountByID(ctx context.Context, db bun.IDB, userID uuid.UUID, id uuid.UUID) (*Account, error) {
var acc Account
err := db.NewSelect().Model(&acc).Where("user_id = ?", userID).Where("id = ?", id).Scan(ctx)
2025-11-30 17:12:50 +00:00
if err != nil {
if errors.Is(err, sql.ErrNoRows) {
return nil, ErrAccountNotFound
}
return nil, err
}
2026-01-01 18:29:52 +00:00
return &acc, nil
2025-11-30 17:12:50 +00:00
}
2026-01-01 18:29:52 +00:00
func (s *Service) FindUserAccountInOrg(ctx context.Context, db bun.IDB, orgID uuid.UUID, userID uuid.UUID) (*Account, error) {
var acc Account
err := db.NewSelect().Model(&acc).
Where("org_id = ?", orgID).
Where("user_id = ?", userID).
Scan(ctx)
2025-11-30 17:12:50 +00:00
if err != nil {
if errors.Is(err, sql.ErrNoRows) {
return nil, ErrAccountNotFound
}
return nil, err
}
2026-01-01 18:29:52 +00:00
return &acc, nil
2025-11-30 17:12:50 +00:00
}