memos/store/memo_share.go

79 lines
2.2 KiB
Go

package store
import (
"context"
"errors"
)
// MemoShare is an access grant that permits read-only access to a memo via a bearer token.
type MemoShare struct {
ID int32
UID string
MemoID int32
CreatorID int32
CreatedTs int64
ExpiresTs *int64 // nil means the share never expires
Policy *MemoWritePolicy
}
// FindMemoShare is used to filter memo shares in list/get queries.
type FindMemoShare struct {
ID *int32
UID *string
MemoID *int32
CreatorID *int32
}
// DeleteMemoShare identifies a share grant to remove.
type DeleteMemoShare struct {
ID *int32
UID *string
MemoID *int32
// Policy is required for transport-facing revocation and is revalidated in
// the same transaction as the delete.
Policy *MemoWritePolicy
}
// CreateMemoShare creates a new share grant.
func (s *Store) CreateMemoShare(ctx context.Context, create *MemoShare) (*MemoShare, error) {
if create == nil {
return nil, errors.New("memo share is required")
}
if err := validateMemoWritePolicy(create.Policy); err != nil {
return nil, err
}
if create.Policy == nil {
return s.driver.CreateMemoShare(ctx, create)
}
return s.driver.CreateMemoShare(ctx, create)
}
// ListMemoShares returns all share grants matching the filter.
func (s *Store) ListMemoShares(ctx context.Context, find *FindMemoShare) ([]*MemoShare, error) {
return s.driver.ListMemoShares(ctx, find)
}
// GetMemoShare returns the first share grant matching the filter, or nil if none found.
func (s *Store) GetMemoShare(ctx context.Context, find *FindMemoShare) (*MemoShare, error) {
return s.driver.GetMemoShare(ctx, find)
}
// DeleteMemoShare removes a share grant.
func (s *Store) DeleteMemoShare(ctx context.Context, delete *DeleteMemoShare) error {
if delete == nil {
return errors.New("memo share deletion is required")
}
if delete.ID == nil && delete.UID == nil {
return errors.New("memo share deletion requires id or uid")
}
if err := validateMemoWritePolicy(delete.Policy); err != nil {
return err
}
if delete.Policy == nil {
return s.driver.DeleteMemoShare(ctx, delete)
}
if delete.MemoID == nil || *delete.MemoID <= 0 {
return errors.New("authorized memo share deletion requires memo")
}
return s.driver.DeleteMemoShare(ctx, delete)
}