~ knotless Search/
↑↓ move↵ open⇧↵ all results
0
0
main
56 lines · 1.9 KB Raw History
package componentcore

import (
	"context"
	"errors"
	"strings"

	"github.com/johnandersen777/socialweb-computer-kcp/internal/component"
	"github.com/johnandersen777/socialweb-computer-kcp/internal/credentials"
	"github.com/johnandersen777/socialweb-computer-kcp/internal/kcplibs/impl/kcpstore"
	"github.com/johnandersen777/socialweb-computer-kcp/internal/marketidentity/atproto"
	"github.com/johnandersen777/socialweb-computer-kcp/internal/vault/openbao"

	commonv1 "github.com/johnandersen777/socialweb-computer-kcp/api/common/v1alpha1"
)

type identityVaultStore struct {
	resolver *credentials.Resolver
}

func newIdentityVaultStore(store *kcpstore.Store, workspace, client, server string) (*identityVaultStore, error) {
	if strings.TrimSpace(client) == "" || strings.TrimSpace(server) == "" {
		return nil, errors.New("componentcore: the identity vault needs a credential client and server")
	}
	if store == nil {
		return nil, errors.New("componentcore: the identity vault needs the kcp store")
	}
	resolver, err := credentials.NewKCPResolver(store, workspace, client, server)
	if err != nil {
		return nil, err
	}
	return &identityVaultStore{resolver: resolver}, nil
}

func (s *identityVaultStore) ref(ref commonv1.SecretRef) component.CredentialRef {
	return credentialRef(ref)
}

func (s *identityVaultStore) Get(ctx context.Context, ref commonv1.SecretRef) (map[string]any, error) {
	credential, err := s.resolver.Resolve(ctx, s.ref(ref))
	if err != nil {
		if errors.Is(err, openbao.ErrNotFound) {
			return nil, atproto.ErrSecretNotFound
		}
		return nil, err
	}
	return credential.Data, nil
}

func (s *identityVaultStore) Put(ctx context.Context, ref commonv1.SecretRef, data map[string]any) error {
	return s.resolver.WriteCredential(ctx, s.ref(ref), data)
}

func (s *identityVaultStore) Delete(ctx context.Context, ref commonv1.SecretRef) error {
	return s.resolver.DeleteCredential(ctx, s.ref(ref))
}