blob: a0c6ee2ef8ca28f1458f65e45bcf16500f178d45 [file] [log] [blame]
package resource
import (
"context"
"errors"
"fmt"
"github.com/apache/servicecomb-service-center/datasource/rbac"
"github.com/apache/servicecomb-service-center/pkg/log"
v1sync "github.com/apache/servicecomb-service-center/syncer/api/v1"
rbacmodel "github.com/go-chassis/cari/rbac"
)
const (
Account = "account"
)
func NewAccount(e *v1sync.Event) Resource {
a := &account{
event: e,
}
a.manager = a
return a
}
type accountManager interface {
CreateAccount(ctx context.Context, a *rbacmodel.Account) error
GetAccount(ctx context.Context, name string) (*rbacmodel.Account, error)
UpdateAccount(ctx context.Context, account *rbacmodel.Account) error
DeleteAccount(ctx context.Context, name string) error
}
type account struct {
event *v1sync.Event
input *rbacmodel.Account
accountName string
cur *rbacmodel.Account
defaultFailHandler
manager accountManager
}
func (a *account) loadInput() error {
a.input = new(rbacmodel.Account)
callback := func() {
a.accountName = a.input.Name
}
param := newInputParam(a.input, callback)
return newInputLoader(
a.event,
param,
param,
param,
).loadInput()
}
func (a *account) LoadCurrentResource(ctx context.Context) *Result {
err := a.loadInput()
if err != nil {
return FailResult(err)
}
cur, err := a.manager.GetAccount(ctx, a.accountName)
if err != nil {
if errors.Is(err, rbac.ErrAccountNotExist) {
return nil
}
return FailResult(err)
}
a.cur = cur
return nil
}
func (a *account) NeedOperate(ctx context.Context) *Result {
c := &checker{
curNotNil: a.cur != nil,
event: a.event,
updateTime: func() (int64, error) {
return formatUpdateTimeSecond(a.cur.UpdateTime)
},
resourceID: a.input.Name,
}
c.tombstoneLoader = c
return c.needOperate(ctx)
}
func (a *account) CreateHandle(ctx context.Context) error {
if a.cur != nil {
log.Warn(fmt.Sprintf("create action but account exist, %s",
a.accountName))
return a.UpdateHandle(ctx)
}
return a.manager.CreateAccount(ctx, a.input)
}
func (a *account) UpdateHandle(ctx context.Context) error {
if a.cur == nil {
log.Warn(fmt.Sprintf("update action but account not exist, %s",
a.accountName))
return a.CreateHandle(ctx)
}
return a.manager.UpdateAccount(ctx, a.input)
}
func (a *account) DeleteHandle(ctx context.Context) error {
return a.manager.DeleteAccount(ctx, a.input.Name)
}
func (a *account) Operate(ctx context.Context) *Result {
return newOperator(a).operate(ctx, a.event.Action)
}
func (a *account) CreateAccount(ctx context.Context, at *rbacmodel.Account) error {
return rbac.Instance().CreateAccount(ctx, at)
}
func (a *account) GetAccount(ctx context.Context, name string) (*rbacmodel.Account, error) {
return rbac.Instance().GetAccount(ctx, name)
}
func (a *account) UpdateAccount(ctx context.Context, account *rbacmodel.Account) error {
return rbac.Instance().UpdateAccount(ctx, account.Name, account)
}
func (a *account) DeleteAccount(ctx context.Context, name string) error {
_, err := rbac.Instance().DeleteAccount(ctx, []string{name})
return err
}