metainfo: per-project and user-agent eventkit-based usage tracking
Add eventkit events for each satellite RPC type, tagged with user agent and public project id. Change-Id: I838401683298d4594495de18563c55031e82f881
This commit is contained in:
parent
1588bf9606
commit
5fc493b276
@ -53,6 +53,7 @@ type CreateAPIKeyResponse struct {
|
|||||||
type APIKeyInfo struct {
|
type APIKeyInfo struct {
|
||||||
ID uuid.UUID `json:"id"`
|
ID uuid.UUID `json:"id"`
|
||||||
ProjectID uuid.UUID `json:"projectId"`
|
ProjectID uuid.UUID `json:"projectId"`
|
||||||
|
ProjectPublicID uuid.UUID `json:"projectPublicId"`
|
||||||
UserAgent []byte `json:"userAgent"`
|
UserAgent []byte `json:"userAgent"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
Head []byte `json:"-"`
|
Head []byte `json:"-"`
|
||||||
|
@ -5,8 +5,10 @@ package metainfo
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/jtolio/eventkit"
|
||||||
"github.com/spacemonkeygo/monkit/v3"
|
"github.com/spacemonkeygo/monkit/v3"
|
||||||
"github.com/zeebo/errs"
|
"github.com/zeebo/errs"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
@ -38,6 +40,8 @@ const (
|
|||||||
|
|
||||||
var (
|
var (
|
||||||
mon = monkit.Package()
|
mon = monkit.Package()
|
||||||
|
evs = eventkit.Package()
|
||||||
|
|
||||||
// Error general metainfo error.
|
// Error general metainfo error.
|
||||||
Error = errs.Class("metainfo")
|
Error = errs.Class("metainfo")
|
||||||
// ErrNodeAlreadyExists pointer already has a piece for a node err.
|
// ErrNodeAlreadyExists pointer already has a piece for a node err.
|
||||||
@ -153,6 +157,7 @@ func (endpoint *Endpoint) ProjectInfo(ctx context.Context, req *pb.ProjectInfoRe
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
endpoint.usageTracking(keyInfo, req.Header, fmt.Sprintf("%T", req))
|
||||||
|
|
||||||
salt, err := endpoint.projects.GetSalt(ctx, keyInfo.ProjectID)
|
salt, err := endpoint.projects.GetSalt(ctx, keyInfo.ProjectID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -160,6 +165,7 @@ func (endpoint *Endpoint) ProjectInfo(ctx context.Context, req *pb.ProjectInfoRe
|
|||||||
}
|
}
|
||||||
|
|
||||||
return &pb.ProjectInfoResponse{
|
return &pb.ProjectInfoResponse{
|
||||||
|
ProjectPublicId: keyInfo.ProjectPublicID.Bytes(),
|
||||||
ProjectSalt: salt,
|
ProjectSalt: salt,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
@ -178,6 +184,7 @@ func (endpoint *Endpoint) RevokeAPIKey(ctx context.Context, req *pb.RevokeAPIKey
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
endpoint.usageTracking(keyInfo, req.Header, fmt.Sprintf("%T", req))
|
||||||
|
|
||||||
err = endpoint.revocations.Revoke(ctx, macToRevoke.Tail(), keyInfo.ID[:])
|
err = endpoint.revocations.Revoke(ctx, macToRevoke.Tail(), keyInfo.ID[:])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -312,3 +319,11 @@ func (endpoint *Endpoint) convertMetabaseErr(err error) error {
|
|||||||
return rpcstatus.Error(rpcstatus.Internal, err.Error())
|
return rpcstatus.Error(rpcstatus.Internal, err.Error())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (endpoint *Endpoint) usageTracking(keyInfo *console.APIKeyInfo, header *pb.RequestHeader, name string, tags ...eventkit.Tag) {
|
||||||
|
evs.Event("usage", append([]eventkit.Tag{
|
||||||
|
eventkit.Bytes("project-public-id", keyInfo.ProjectPublicID[:]),
|
||||||
|
eventkit.String("user-agent", string(header.UserAgent)),
|
||||||
|
eventkit.String("request", name),
|
||||||
|
}, tags...)...)
|
||||||
|
}
|
||||||
|
@ -33,6 +33,7 @@ func (endpoint *Endpoint) GetBucket(ctx context.Context, req *pb.BucketGetReques
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
endpoint.usageTracking(keyInfo, req.Header, fmt.Sprintf("%T", req))
|
||||||
|
|
||||||
bucket, err := endpoint.buckets.GetMinimalBucket(ctx, req.GetName(), keyInfo.ProjectID)
|
bucket, err := endpoint.buckets.GetMinimalBucket(ctx, req.GetName(), keyInfo.ProjectID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -68,6 +69,7 @@ func (endpoint *Endpoint) CreateBucket(ctx context.Context, req *pb.BucketCreate
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
endpoint.usageTracking(keyInfo, req.Header, fmt.Sprintf("%T", req))
|
||||||
|
|
||||||
err = endpoint.validateBucket(ctx, req.Name)
|
err = endpoint.validateBucket(ctx, req.Name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -175,6 +177,7 @@ func (endpoint *Endpoint) DeleteBucket(ctx context.Context, req *pb.BucketDelete
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
endpoint.usageTracking(keyInfo, req.Header, fmt.Sprintf("%T", req))
|
||||||
|
|
||||||
err = endpoint.validateBucket(ctx, req.Name)
|
err = endpoint.validateBucket(ctx, req.Name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -310,6 +313,7 @@ func (endpoint *Endpoint) ListBuckets(ctx context.Context, req *pb.BucketListReq
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
endpoint.usageTracking(keyInfo, req.Header, fmt.Sprintf("%T", req))
|
||||||
|
|
||||||
allowedBuckets, err := getAllowedBuckets(ctx, req.Header, action)
|
allowedBuckets, err := getAllowedBuckets(ctx, req.Header, action)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -9,6 +9,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/jtolio/eventkit"
|
||||||
"github.com/spacemonkeygo/monkit/v3"
|
"github.com/spacemonkeygo/monkit/v3"
|
||||||
"go.uber.org/zap"
|
"go.uber.org/zap"
|
||||||
|
|
||||||
@ -60,6 +61,7 @@ func (endpoint *Endpoint) BeginObject(ctx context.Context, req *pb.ObjectBeginRe
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
endpoint.usageTracking(keyInfo, req.Header, fmt.Sprintf("%T", req))
|
||||||
|
|
||||||
if !req.ExpiresAt.IsZero() && !req.ExpiresAt.After(time.Now()) {
|
if !req.ExpiresAt.IsZero() && !req.ExpiresAt.After(time.Now()) {
|
||||||
return nil, rpcstatus.Error(rpcstatus.InvalidArgument, "Invalid expiration time")
|
return nil, rpcstatus.Error(rpcstatus.InvalidArgument, "Invalid expiration time")
|
||||||
@ -206,6 +208,20 @@ func (endpoint *Endpoint) CommitObject(ctx context.Context, req *pb.ObjectCommit
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
var committedObject *metabase.Object
|
||||||
|
defer func() {
|
||||||
|
var tags []eventkit.Tag
|
||||||
|
if committedObject != nil {
|
||||||
|
tags = []eventkit.Tag{
|
||||||
|
eventkit.Bool("expires", committedObject.ExpiresAt != nil),
|
||||||
|
eventkit.Int64("segment_count", int64(committedObject.SegmentCount)),
|
||||||
|
eventkit.Int64("total_plain_size", committedObject.TotalPlainSize),
|
||||||
|
eventkit.Int64("total_encrypted_size", committedObject.TotalEncryptedSize),
|
||||||
|
eventkit.Int64("fixed_segment_size", int64(committedObject.FixedSegmentSize)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
endpoint.usageTracking(keyInfo, req.Header, fmt.Sprintf("%T", req), tags...)
|
||||||
|
}()
|
||||||
|
|
||||||
id, err := uuid.FromBytes(streamID.StreamId)
|
id, err := uuid.FromBytes(streamID.StreamId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -217,7 +233,9 @@ func (endpoint *Endpoint) CommitObject(ctx context.Context, req *pb.ObjectCommit
|
|||||||
streamMeta := &pb.StreamMeta{}
|
streamMeta := &pb.StreamMeta{}
|
||||||
encryption := storj.EncryptionParameters{}
|
encryption := storj.EncryptionParameters{}
|
||||||
err = pb.Unmarshal(req.EncryptedMetadata, streamMeta)
|
err = pb.Unmarshal(req.EncryptedMetadata, streamMeta)
|
||||||
if err == nil {
|
if err != nil {
|
||||||
|
// TODO: what if this is an error we don't expect?
|
||||||
|
} else {
|
||||||
encryption.CipherSuite = storj.CipherSuite(streamMeta.EncryptionType)
|
encryption.CipherSuite = storj.CipherSuite(streamMeta.EncryptionType)
|
||||||
encryption.BlockSize = streamMeta.EncryptionBlockSize
|
encryption.BlockSize = streamMeta.EncryptionBlockSize
|
||||||
}
|
}
|
||||||
@ -259,10 +277,11 @@ func (endpoint *Endpoint) CommitObject(ctx context.Context, req *pb.ObjectCommit
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = endpoint.metabase.CommitObject(ctx, request)
|
object, err := endpoint.metabase.CommitObject(ctx, request)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, endpoint.convertMetabaseErr(err)
|
return nil, endpoint.convertMetabaseErr(err)
|
||||||
}
|
}
|
||||||
|
committedObject = &object
|
||||||
|
|
||||||
mon.Meter("req_commit_object").Mark(1)
|
mon.Meter("req_commit_object").Mark(1)
|
||||||
|
|
||||||
@ -293,6 +312,7 @@ func (endpoint *Endpoint) GetObject(ctx context.Context, req *pb.ObjectGetReques
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
endpoint.usageTracking(keyInfo, req.Header, fmt.Sprintf("%T", req))
|
||||||
|
|
||||||
err = endpoint.validateBucket(ctx, req.Bucket)
|
err = endpoint.validateBucket(ctx, req.Bucket)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -310,6 +330,17 @@ func (endpoint *Endpoint) GetObject(ctx context.Context, req *pb.ObjectGetReques
|
|||||||
return nil, endpoint.convertMetabaseErr(err)
|
return nil, endpoint.convertMetabaseErr(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
tags := []eventkit.Tag{
|
||||||
|
eventkit.Bool("expires", mbObject.ExpiresAt != nil),
|
||||||
|
eventkit.Int64("segment_count", int64(mbObject.SegmentCount)),
|
||||||
|
eventkit.Int64("total_plain_size", mbObject.TotalPlainSize),
|
||||||
|
eventkit.Int64("total_encrypted_size", mbObject.TotalEncryptedSize),
|
||||||
|
eventkit.Int64("fixed_segment_size", int64(mbObject.FixedSegmentSize)),
|
||||||
|
}
|
||||||
|
endpoint.usageTracking(keyInfo, req.Header, fmt.Sprintf("%T", req), tags...)
|
||||||
|
}
|
||||||
|
|
||||||
var segmentRS *pb.RedundancyScheme
|
var segmentRS *pb.RedundancyScheme
|
||||||
// TODO this code is triggered only by very old uplink library and we will remove it eventually.
|
// TODO this code is triggered only by very old uplink library and we will remove it eventually.
|
||||||
if !req.RedundancySchemePerSegment && mbObject.SegmentCount > 0 {
|
if !req.RedundancySchemePerSegment && mbObject.SegmentCount > 0 {
|
||||||
@ -423,6 +454,22 @@ func (endpoint *Endpoint) DownloadObject(ctx context.Context, req *pb.ObjectDown
|
|||||||
return nil, rpcstatus.Error(rpcstatus.InvalidArgument, err.Error())
|
return nil, rpcstatus.Error(rpcstatus.InvalidArgument, err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
tags := []eventkit.Tag{
|
||||||
|
eventkit.Bool("expires", object.ExpiresAt != nil),
|
||||||
|
eventkit.Int64("segment_count", int64(object.SegmentCount)),
|
||||||
|
eventkit.Int64("total_plain_size", object.TotalPlainSize),
|
||||||
|
eventkit.Int64("total_encrypted_size", object.TotalEncryptedSize),
|
||||||
|
eventkit.Int64("fixed_segment_size", int64(object.FixedSegmentSize)),
|
||||||
|
}
|
||||||
|
if streamRange != nil {
|
||||||
|
tags = append(tags,
|
||||||
|
eventkit.Int64("range_start", streamRange.PlainStart),
|
||||||
|
eventkit.Int64("range_end", streamRange.PlainLimit))
|
||||||
|
}
|
||||||
|
endpoint.usageTracking(keyInfo, req.Header, fmt.Sprintf("%T", req), tags...)
|
||||||
|
}
|
||||||
|
|
||||||
segments, err := endpoint.metabase.ListSegments(ctx, metabase.ListSegments{
|
segments, err := endpoint.metabase.ListSegments(ctx, metabase.ListSegments{
|
||||||
StreamID: object.StreamID,
|
StreamID: object.StreamID,
|
||||||
Range: streamRange,
|
Range: streamRange,
|
||||||
@ -759,6 +806,7 @@ func (endpoint *Endpoint) ListObjects(ctx context.Context, req *pb.ObjectListReq
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
endpoint.usageTracking(keyInfo, req.Header, fmt.Sprintf("%T", req))
|
||||||
|
|
||||||
err = endpoint.validateBucket(ctx, req.Bucket)
|
err = endpoint.validateBucket(ctx, req.Bucket)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -898,6 +946,7 @@ func (endpoint *Endpoint) ListPendingObjectStreams(ctx context.Context, req *pb.
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
endpoint.usageTracking(keyInfo, req.Header, fmt.Sprintf("%T", req))
|
||||||
|
|
||||||
err = endpoint.validateBucket(ctx, req.Bucket)
|
err = endpoint.validateBucket(ctx, req.Bucket)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -1010,6 +1059,7 @@ func (endpoint *Endpoint) BeginDeleteObject(ctx context.Context, req *pb.ObjectB
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
endpoint.usageTracking(keyInfo, req.Header, fmt.Sprintf("%T", req))
|
||||||
|
|
||||||
err = endpoint.validateBucket(ctx, req.Bucket)
|
err = endpoint.validateBucket(ctx, req.Bucket)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -1098,6 +1148,7 @@ func (endpoint *Endpoint) GetObjectIPs(ctx context.Context, req *pb.ObjectGetIPs
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
endpoint.usageTracking(keyInfo, req.Header, fmt.Sprintf("%T", req))
|
||||||
|
|
||||||
err = endpoint.validateBucket(ctx, req.Bucket)
|
err = endpoint.validateBucket(ctx, req.Bucket)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -1174,6 +1225,7 @@ func (endpoint *Endpoint) UpdateObjectMetadata(ctx context.Context, req *pb.Obje
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
endpoint.usageTracking(keyInfo, req.Header, fmt.Sprintf("%T", req))
|
||||||
|
|
||||||
err = endpoint.validateBucket(ctx, req.Bucket)
|
err = endpoint.validateBucket(ctx, req.Bucket)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -1399,6 +1451,7 @@ func (endpoint *Endpoint) objectEntryToProtoListItem(ctx context.Context, bucket
|
|||||||
//
|
//
|
||||||
// NOTE: this method is exported for being able to individually test it without
|
// NOTE: this method is exported for being able to individually test it without
|
||||||
// having import cycles.
|
// having import cycles.
|
||||||
|
// TODO: see note on DeleteObjectAnyStatus.
|
||||||
func (endpoint *Endpoint) DeleteCommittedObject(
|
func (endpoint *Endpoint) DeleteCommittedObject(
|
||||||
ctx context.Context, projectID uuid.UUID, bucket string, object metabase.ObjectKey,
|
ctx context.Context, projectID uuid.UUID, bucket string, object metabase.ObjectKey,
|
||||||
) (deletedObjects []*pb.Object, err error) {
|
) (deletedObjects []*pb.Object, err error) {
|
||||||
@ -1441,6 +1494,12 @@ func (endpoint *Endpoint) DeleteCommittedObject(
|
|||||||
//
|
//
|
||||||
// NOTE: this method is exported for being able to individually test it without
|
// NOTE: this method is exported for being able to individually test it without
|
||||||
// having import cycles.
|
// having import cycles.
|
||||||
|
// TODO regarding the above note: exporting for testing is fine, but we should name
|
||||||
|
// it something that will definitely never ever be added to the rpc set in DRPC
|
||||||
|
// definitions. If we ever decide to add an RPC method called "DeleteObjectAnyStatus",
|
||||||
|
// DRPC interface definitions is all that is standing in the way from someone
|
||||||
|
// remotely calling this. We should name this InternalDeleteObjectAnyStatus or
|
||||||
|
// something.
|
||||||
func (endpoint *Endpoint) DeleteObjectAnyStatus(ctx context.Context, location metabase.ObjectLocation,
|
func (endpoint *Endpoint) DeleteObjectAnyStatus(ctx context.Context, location metabase.ObjectLocation,
|
||||||
) (deletedObjects []*pb.Object, err error) {
|
) (deletedObjects []*pb.Object, err error) {
|
||||||
defer mon.Task()(&ctx, location.ProjectID.String(), location.BucketName, location.ObjectKey)(&err)
|
defer mon.Task()(&ctx, location.ProjectID.String(), location.BucketName, location.ObjectKey)(&err)
|
||||||
@ -1479,6 +1538,7 @@ func (endpoint *Endpoint) DeleteObjectAnyStatus(ctx context.Context, location me
|
|||||||
//
|
//
|
||||||
// NOTE: this method is exported for being able to individually test it without
|
// NOTE: this method is exported for being able to individually test it without
|
||||||
// having import cycles.
|
// having import cycles.
|
||||||
|
// TODO: see note on DeleteObjectAnyStatus.
|
||||||
func (endpoint *Endpoint) DeletePendingObject(ctx context.Context, stream metabase.ObjectStream) (deletedObjects []*pb.Object, err error) {
|
func (endpoint *Endpoint) DeletePendingObject(ctx context.Context, stream metabase.ObjectStream) (deletedObjects []*pb.Object, err error) {
|
||||||
req := metabase.DeletePendingObject{
|
req := metabase.DeletePendingObject{
|
||||||
ObjectStream: stream,
|
ObjectStream: stream,
|
||||||
@ -1586,6 +1646,7 @@ func (endpoint *Endpoint) BeginMoveObject(ctx context.Context, req *pb.ObjectBeg
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
endpoint.usageTracking(keyInfo, req.Header, fmt.Sprintf("%T", req))
|
||||||
|
|
||||||
for _, bucket := range [][]byte{req.Bucket, req.NewBucket} {
|
for _, bucket := range [][]byte{req.Bucket, req.NewBucket} {
|
||||||
err = endpoint.validateBucket(ctx, bucket)
|
err = endpoint.validateBucket(ctx, bucket)
|
||||||
@ -1732,6 +1793,7 @@ func (endpoint *Endpoint) FinishMoveObject(ctx context.Context, req *pb.ObjectFi
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, rpcstatus.Error(rpcstatus.Unauthenticated, err.Error())
|
return nil, rpcstatus.Error(rpcstatus.Unauthenticated, err.Error())
|
||||||
}
|
}
|
||||||
|
endpoint.usageTracking(keyInfo, req.Header, fmt.Sprintf("%T", req))
|
||||||
|
|
||||||
err = endpoint.validateBucket(ctx, req.NewBucket)
|
err = endpoint.validateBucket(ctx, req.NewBucket)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -1809,6 +1871,7 @@ func (endpoint *Endpoint) BeginCopyObject(ctx context.Context, req *pb.ObjectBeg
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
endpoint.usageTracking(keyInfo, req.Header, fmt.Sprintf("%T", req))
|
||||||
|
|
||||||
for _, bucket := range [][]byte{req.Bucket, req.NewBucket} {
|
for _, bucket := range [][]byte{req.Bucket, req.NewBucket} {
|
||||||
err = endpoint.validateBucket(ctx, bucket)
|
err = endpoint.validateBucket(ctx, bucket)
|
||||||
@ -1921,6 +1984,7 @@ func (endpoint *Endpoint) FinishCopyObject(ctx context.Context, req *pb.ObjectFi
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, rpcstatus.Error(rpcstatus.Unauthenticated, err.Error())
|
return nil, rpcstatus.Error(rpcstatus.Unauthenticated, err.Error())
|
||||||
}
|
}
|
||||||
|
endpoint.usageTracking(keyInfo, req.Header, fmt.Sprintf("%T", req))
|
||||||
|
|
||||||
err = endpoint.validateBucket(ctx, req.NewBucket)
|
err = endpoint.validateBucket(ctx, req.NewBucket)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -48,6 +48,7 @@ func (endpoint *Endpoint) BeginSegment(ctx context.Context, req *pb.SegmentBegin
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
endpoint.usageTracking(keyInfo, req.Header, fmt.Sprintf("%T", req))
|
||||||
|
|
||||||
// no need to validate streamID fields because it was validated during BeginObject
|
// no need to validate streamID fields because it was validated during BeginObject
|
||||||
|
|
||||||
@ -168,6 +169,7 @@ func (endpoint *Endpoint) RetryBeginSegmentPieces(ctx context.Context, req *pb.R
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
endpoint.usageTracking(keyInfo, req.Header, fmt.Sprintf("%T", req))
|
||||||
|
|
||||||
if len(req.RetryPieceNumbers) == 0 {
|
if len(req.RetryPieceNumbers) == 0 {
|
||||||
return nil, rpcstatus.Error(rpcstatus.InvalidArgument, "piece numbers to exchange cannot be empty")
|
return nil, rpcstatus.Error(rpcstatus.InvalidArgument, "piece numbers to exchange cannot be empty")
|
||||||
@ -258,6 +260,7 @@ func (endpoint *Endpoint) CommitSegment(ctx context.Context, req *pb.SegmentComm
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
endpoint.usageTracking(keyInfo, req.Header, fmt.Sprintf("%T", req))
|
||||||
|
|
||||||
// cheap basic verification
|
// cheap basic verification
|
||||||
if numResults := len(req.UploadResult); numResults < int(endpoint.defaultRS.GetSuccessThreshold()) {
|
if numResults := len(req.UploadResult); numResults < int(endpoint.defaultRS.GetSuccessThreshold()) {
|
||||||
@ -436,6 +439,7 @@ func (endpoint *Endpoint) MakeInlineSegment(ctx context.Context, req *pb.Segment
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
endpoint.usageTracking(keyInfo, req.Header, fmt.Sprintf("%T", req))
|
||||||
|
|
||||||
if req.Position.Index < 0 {
|
if req.Position.Index < 0 {
|
||||||
return nil, rpcstatus.Error(rpcstatus.InvalidArgument, "segment index must be greater then 0")
|
return nil, rpcstatus.Error(rpcstatus.InvalidArgument, "segment index must be greater then 0")
|
||||||
@ -517,7 +521,7 @@ func (endpoint *Endpoint) ListSegments(ctx context.Context, req *pb.SegmentListR
|
|||||||
return nil, rpcstatus.Error(rpcstatus.InvalidArgument, err.Error())
|
return nil, rpcstatus.Error(rpcstatus.InvalidArgument, err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = endpoint.validateAuth(ctx, req.Header, macaroon.Action{
|
keyInfo, err := endpoint.validateAuth(ctx, req.Header, macaroon.Action{
|
||||||
Op: macaroon.ActionRead,
|
Op: macaroon.ActionRead,
|
||||||
Bucket: streamID.Bucket,
|
Bucket: streamID.Bucket,
|
||||||
EncryptedPath: streamID.EncryptedObjectKey,
|
EncryptedPath: streamID.EncryptedObjectKey,
|
||||||
@ -526,6 +530,7 @@ func (endpoint *Endpoint) ListSegments(ctx context.Context, req *pb.SegmentListR
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
endpoint.usageTracking(keyInfo, req.Header, fmt.Sprintf("%T", req))
|
||||||
|
|
||||||
cursor := req.CursorPosition
|
cursor := req.CursorPosition
|
||||||
if cursor == nil {
|
if cursor == nil {
|
||||||
@ -614,6 +619,7 @@ func (endpoint *Endpoint) DownloadSegment(ctx context.Context, req *pb.SegmentDo
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
endpoint.usageTracking(keyInfo, req.Header, fmt.Sprintf("%T", req))
|
||||||
|
|
||||||
bucket := metabase.BucketLocation{ProjectID: keyInfo.ProjectID, BucketName: string(streamID.Bucket)}
|
bucket := metabase.BucketLocation{ProjectID: keyInfo.ProjectID, BucketName: string(streamID.Bucket)}
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ var _ console.APIKeys = (*apikeys)(nil)
|
|||||||
// apikeys is an implementation of satellite.APIKeys.
|
// apikeys is an implementation of satellite.APIKeys.
|
||||||
type apikeys struct {
|
type apikeys struct {
|
||||||
methods dbx.Methods
|
methods dbx.Methods
|
||||||
lru *lrucache.ExpiringLRUOf[*dbx.ApiKey]
|
lru *lrucache.ExpiringLRUOf[*dbx.ApiKey_Project_PublicId_Row]
|
||||||
db *satelliteDB
|
db *satelliteDB
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -74,9 +74,10 @@ func (keys *apikeys) GetPagedByProjectID(ctx context.Context, projectID uuid.UUI
|
|||||||
}
|
}
|
||||||
|
|
||||||
repoundQuery := keys.db.Rebind(`
|
repoundQuery := keys.db.Rebind(`
|
||||||
SELECT ak.id, ak.project_id, ak.name, ak.user_agent, ak.created_at
|
SELECT ak.id, ak.project_id, ak.name, ak.user_agent, ak.created_at, p.public_id
|
||||||
FROM api_keys ak
|
FROM api_keys ak, projects p
|
||||||
WHERE ak.project_id = ?
|
WHERE ak.project_id = ?
|
||||||
|
AND ak.project_id = p.id
|
||||||
AND lower(ak.name) LIKE ?
|
AND lower(ak.name) LIKE ?
|
||||||
ORDER BY ` + sanitizedAPIKeyOrderColumnName(cursor.Order) + `
|
ORDER BY ` + sanitizedAPIKeyOrderColumnName(cursor.Order) + `
|
||||||
` + sanitizeOrderDirectionName(page.OrderDirection) + `
|
` + sanitizeOrderDirectionName(page.OrderDirection) + `
|
||||||
@ -98,7 +99,7 @@ func (keys *apikeys) GetPagedByProjectID(ctx context.Context, projectID uuid.UUI
|
|||||||
for rows.Next() {
|
for rows.Next() {
|
||||||
ak := console.APIKeyInfo{}
|
ak := console.APIKeyInfo{}
|
||||||
|
|
||||||
err = rows.Scan(&ak.ID, &ak.ProjectID, &ak.Name, &ak.UserAgent, &ak.CreatedAt)
|
err = rows.Scan(&ak.ID, &ak.ProjectID, &ak.Name, &ak.UserAgent, &ak.CreatedAt, &ak.ProjectPublicID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -127,7 +128,7 @@ func (keys *apikeys) GetPagedByProjectID(ctx context.Context, projectID uuid.UUI
|
|||||||
// Get implements satellite.APIKeys.
|
// Get implements satellite.APIKeys.
|
||||||
func (keys *apikeys) Get(ctx context.Context, id uuid.UUID) (_ *console.APIKeyInfo, err error) {
|
func (keys *apikeys) Get(ctx context.Context, id uuid.UUID) (_ *console.APIKeyInfo, err error) {
|
||||||
defer mon.Task()(&ctx)(&err)
|
defer mon.Task()(&ctx)(&err)
|
||||||
dbKey, err := keys.methods.Get_ApiKey_By_Id(ctx, dbx.ApiKey_Id(id[:]))
|
dbKey, err := keys.methods.Get_ApiKey_Project_PublicId_By_ApiKey_Id(ctx, dbx.ApiKey_Id(id[:]))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -139,8 +140,8 @@ func (keys *apikeys) Get(ctx context.Context, id uuid.UUID) (_ *console.APIKeyIn
|
|||||||
func (keys *apikeys) GetByHead(ctx context.Context, head []byte) (_ *console.APIKeyInfo, err error) {
|
func (keys *apikeys) GetByHead(ctx context.Context, head []byte) (_ *console.APIKeyInfo, err error) {
|
||||||
defer mon.Task()(&ctx)(&err)
|
defer mon.Task()(&ctx)(&err)
|
||||||
|
|
||||||
dbKey, err := keys.lru.Get(ctx, string(head), func() (*dbx.ApiKey, error) {
|
dbKey, err := keys.lru.Get(ctx, string(head), func() (*dbx.ApiKey_Project_PublicId_Row, error) {
|
||||||
return keys.methods.Get_ApiKey_By_Head(ctx, dbx.ApiKey_Head(head))
|
return keys.methods.Get_ApiKey_Project_PublicId_By_ApiKey_Head(ctx, dbx.ApiKey_Head(head))
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -151,7 +152,7 @@ func (keys *apikeys) GetByHead(ctx context.Context, head []byte) (_ *console.API
|
|||||||
// GetByNameAndProjectID implements satellite.APIKeys.
|
// GetByNameAndProjectID implements satellite.APIKeys.
|
||||||
func (keys *apikeys) GetByNameAndProjectID(ctx context.Context, name string, projectID uuid.UUID) (_ *console.APIKeyInfo, err error) {
|
func (keys *apikeys) GetByNameAndProjectID(ctx context.Context, name string, projectID uuid.UUID) (_ *console.APIKeyInfo, err error) {
|
||||||
defer mon.Task()(&ctx)(&err)
|
defer mon.Task()(&ctx)(&err)
|
||||||
dbKey, err := keys.methods.Get_ApiKey_By_Name_And_ProjectId(ctx,
|
dbKey, err := keys.methods.Get_ApiKey_Project_PublicId_By_ApiKey_Name_And_ApiKey_ProjectId(ctx,
|
||||||
dbx.ApiKey_Name(name),
|
dbx.ApiKey_Name(name),
|
||||||
dbx.ApiKey_ProjectId(projectID[:]))
|
dbx.ApiKey_ProjectId(projectID[:]))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -174,7 +175,7 @@ func (keys *apikeys) Create(ctx context.Context, head []byte, info console.APIKe
|
|||||||
optional.UserAgent = dbx.ApiKey_UserAgent(info.UserAgent)
|
optional.UserAgent = dbx.ApiKey_UserAgent(info.UserAgent)
|
||||||
}
|
}
|
||||||
|
|
||||||
dbKey, err := keys.methods.Create_ApiKey(
|
_, err = keys.methods.Create_ApiKey(
|
||||||
ctx,
|
ctx,
|
||||||
dbx.ApiKey_Id(id[:]),
|
dbx.ApiKey_Id(id[:]),
|
||||||
dbx.ApiKey_ProjectId(info.ProjectID[:]),
|
dbx.ApiKey_ProjectId(info.ProjectID[:]),
|
||||||
@ -188,7 +189,7 @@ func (keys *apikeys) Create(ctx context.Context, head []byte, info console.APIKe
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
return fromDBXAPIKey(ctx, dbKey)
|
return keys.Get(ctx, id)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update implements satellite.APIKeys.
|
// Update implements satellite.APIKeys.
|
||||||
@ -211,8 +212,9 @@ func (keys *apikeys) Delete(ctx context.Context, id uuid.UUID) (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// fromDBXAPIKey converts dbx.ApiKey to satellite.APIKeyInfo.
|
// fromDBXAPIKey converts dbx.ApiKey to satellite.APIKeyInfo.
|
||||||
func fromDBXAPIKey(ctx context.Context, key *dbx.ApiKey) (_ *console.APIKeyInfo, err error) {
|
func fromDBXAPIKey(ctx context.Context, row *dbx.ApiKey_Project_PublicId_Row) (_ *console.APIKeyInfo, err error) {
|
||||||
defer mon.Task()(&ctx)(&err)
|
defer mon.Task()(&ctx)(&err)
|
||||||
|
key := &row.ApiKey
|
||||||
id, err := uuid.FromBytes(key.Id)
|
id, err := uuid.FromBytes(key.Id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -222,10 +224,15 @@ func fromDBXAPIKey(ctx context.Context, key *dbx.ApiKey) (_ *console.APIKeyInfo,
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
projectPublicID, err := uuid.FromBytes(row.Project_PublicId)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
result := &console.APIKeyInfo{
|
result := &console.APIKeyInfo{
|
||||||
ID: id,
|
ID: id,
|
||||||
ProjectID: projectID,
|
ProjectID: projectID,
|
||||||
|
ProjectPublicID: projectPublicID,
|
||||||
Name: key.Name,
|
Name: key.Name,
|
||||||
CreatedAt: key.CreatedAt,
|
CreatedAt: key.CreatedAt,
|
||||||
Head: key.Head,
|
Head: key.Head,
|
||||||
|
@ -53,7 +53,7 @@ func (db *ConsoleDB) APIKeys() console.APIKeys {
|
|||||||
options.Name = "satellitedb-apikeys"
|
options.Name = "satellitedb-apikeys"
|
||||||
db.apikeys = &apikeys{
|
db.apikeys = &apikeys{
|
||||||
methods: db.methods,
|
methods: db.methods,
|
||||||
lru: lrucache.NewOf[*dbx.ApiKey](options),
|
lru: lrucache.NewOf[*dbx.ApiKey_Project_PublicId_Row](options),
|
||||||
db: db.db,
|
db: db.db,
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -177,15 +177,18 @@ update api_key (
|
|||||||
delete api_key ( where api_key.id = ? )
|
delete api_key ( where api_key.id = ? )
|
||||||
|
|
||||||
read one (
|
read one (
|
||||||
select api_key
|
select api_key project.public_id
|
||||||
|
join project.id = api_key.project_id
|
||||||
where api_key.id = ?
|
where api_key.id = ?
|
||||||
)
|
)
|
||||||
read one (
|
read one (
|
||||||
select api_key
|
select api_key project.public_id
|
||||||
|
join project.id = api_key.project_id
|
||||||
where api_key.head = ?
|
where api_key.head = ?
|
||||||
)
|
)
|
||||||
read one (
|
read one (
|
||||||
select api_key
|
select api_key project.public_id
|
||||||
|
join project.id = api_key.project_id
|
||||||
where api_key.name = ?
|
where api_key.name = ?
|
||||||
where api_key.project_id = ?
|
where api_key.project_id = ?
|
||||||
)
|
)
|
@ -11817,6 +11817,11 @@ func (h *__sqlbundle_Hole) Render() string {
|
|||||||
// end runtime support for building sql statements
|
// end runtime support for building sql statements
|
||||||
//
|
//
|
||||||
|
|
||||||
|
type ApiKey_Project_PublicId_Row struct {
|
||||||
|
ApiKey ApiKey
|
||||||
|
Project_PublicId []byte
|
||||||
|
}
|
||||||
|
|
||||||
type Balance_Row struct {
|
type Balance_Row struct {
|
||||||
Balance int64
|
Balance int64
|
||||||
}
|
}
|
||||||
@ -15829,12 +15834,12 @@ func (obj *pgxImpl) All_ProjectMember_By_MemberId(ctx context.Context,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (obj *pgxImpl) Get_ApiKey_By_Id(ctx context.Context,
|
func (obj *pgxImpl) Get_ApiKey_Project_PublicId_By_ApiKey_Id(ctx context.Context,
|
||||||
api_key_id ApiKey_Id_Field) (
|
api_key_id ApiKey_Id_Field) (
|
||||||
api_key *ApiKey, err error) {
|
row *ApiKey_Project_PublicId_Row, err error) {
|
||||||
defer mon.Task()(&ctx)(&err)
|
defer mon.Task()(&ctx)(&err)
|
||||||
|
|
||||||
var __embed_stmt = __sqlbundle_Literal("SELECT api_keys.id, api_keys.project_id, api_keys.head, api_keys.name, api_keys.secret, api_keys.partner_id, api_keys.user_agent, api_keys.created_at FROM api_keys WHERE api_keys.id = ?")
|
var __embed_stmt = __sqlbundle_Literal("SELECT api_keys.id, api_keys.project_id, api_keys.head, api_keys.name, api_keys.secret, api_keys.partner_id, api_keys.user_agent, api_keys.created_at, projects.public_id FROM projects JOIN api_keys ON projects.id = api_keys.project_id WHERE api_keys.id = ?")
|
||||||
|
|
||||||
var __values []interface{}
|
var __values []interface{}
|
||||||
__values = append(__values, api_key_id.value())
|
__values = append(__values, api_key_id.value())
|
||||||
@ -15842,21 +15847,21 @@ func (obj *pgxImpl) Get_ApiKey_By_Id(ctx context.Context,
|
|||||||
var __stmt = __sqlbundle_Render(obj.dialect, __embed_stmt)
|
var __stmt = __sqlbundle_Render(obj.dialect, __embed_stmt)
|
||||||
obj.logStmt(__stmt, __values...)
|
obj.logStmt(__stmt, __values...)
|
||||||
|
|
||||||
api_key = &ApiKey{}
|
row = &ApiKey_Project_PublicId_Row{}
|
||||||
err = obj.queryRowContext(ctx, __stmt, __values...).Scan(&api_key.Id, &api_key.ProjectId, &api_key.Head, &api_key.Name, &api_key.Secret, &api_key.PartnerId, &api_key.UserAgent, &api_key.CreatedAt)
|
err = obj.queryRowContext(ctx, __stmt, __values...).Scan(&row.ApiKey.Id, &row.ApiKey.ProjectId, &row.ApiKey.Head, &row.ApiKey.Name, &row.ApiKey.Secret, &row.ApiKey.PartnerId, &row.ApiKey.UserAgent, &row.ApiKey.CreatedAt, &row.Project_PublicId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return (*ApiKey)(nil), obj.makeErr(err)
|
return (*ApiKey_Project_PublicId_Row)(nil), obj.makeErr(err)
|
||||||
}
|
}
|
||||||
return api_key, nil
|
return row, nil
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (obj *pgxImpl) Get_ApiKey_By_Head(ctx context.Context,
|
func (obj *pgxImpl) Get_ApiKey_Project_PublicId_By_ApiKey_Head(ctx context.Context,
|
||||||
api_key_head ApiKey_Head_Field) (
|
api_key_head ApiKey_Head_Field) (
|
||||||
api_key *ApiKey, err error) {
|
row *ApiKey_Project_PublicId_Row, err error) {
|
||||||
defer mon.Task()(&ctx)(&err)
|
defer mon.Task()(&ctx)(&err)
|
||||||
|
|
||||||
var __embed_stmt = __sqlbundle_Literal("SELECT api_keys.id, api_keys.project_id, api_keys.head, api_keys.name, api_keys.secret, api_keys.partner_id, api_keys.user_agent, api_keys.created_at FROM api_keys WHERE api_keys.head = ?")
|
var __embed_stmt = __sqlbundle_Literal("SELECT api_keys.id, api_keys.project_id, api_keys.head, api_keys.name, api_keys.secret, api_keys.partner_id, api_keys.user_agent, api_keys.created_at, projects.public_id FROM projects JOIN api_keys ON projects.id = api_keys.project_id WHERE api_keys.head = ?")
|
||||||
|
|
||||||
var __values []interface{}
|
var __values []interface{}
|
||||||
__values = append(__values, api_key_head.value())
|
__values = append(__values, api_key_head.value())
|
||||||
@ -15864,22 +15869,22 @@ func (obj *pgxImpl) Get_ApiKey_By_Head(ctx context.Context,
|
|||||||
var __stmt = __sqlbundle_Render(obj.dialect, __embed_stmt)
|
var __stmt = __sqlbundle_Render(obj.dialect, __embed_stmt)
|
||||||
obj.logStmt(__stmt, __values...)
|
obj.logStmt(__stmt, __values...)
|
||||||
|
|
||||||
api_key = &ApiKey{}
|
row = &ApiKey_Project_PublicId_Row{}
|
||||||
err = obj.queryRowContext(ctx, __stmt, __values...).Scan(&api_key.Id, &api_key.ProjectId, &api_key.Head, &api_key.Name, &api_key.Secret, &api_key.PartnerId, &api_key.UserAgent, &api_key.CreatedAt)
|
err = obj.queryRowContext(ctx, __stmt, __values...).Scan(&row.ApiKey.Id, &row.ApiKey.ProjectId, &row.ApiKey.Head, &row.ApiKey.Name, &row.ApiKey.Secret, &row.ApiKey.PartnerId, &row.ApiKey.UserAgent, &row.ApiKey.CreatedAt, &row.Project_PublicId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return (*ApiKey)(nil), obj.makeErr(err)
|
return (*ApiKey_Project_PublicId_Row)(nil), obj.makeErr(err)
|
||||||
}
|
}
|
||||||
return api_key, nil
|
return row, nil
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (obj *pgxImpl) Get_ApiKey_By_Name_And_ProjectId(ctx context.Context,
|
func (obj *pgxImpl) Get_ApiKey_Project_PublicId_By_ApiKey_Name_And_ApiKey_ProjectId(ctx context.Context,
|
||||||
api_key_name ApiKey_Name_Field,
|
api_key_name ApiKey_Name_Field,
|
||||||
api_key_project_id ApiKey_ProjectId_Field) (
|
api_key_project_id ApiKey_ProjectId_Field) (
|
||||||
api_key *ApiKey, err error) {
|
row *ApiKey_Project_PublicId_Row, err error) {
|
||||||
defer mon.Task()(&ctx)(&err)
|
defer mon.Task()(&ctx)(&err)
|
||||||
|
|
||||||
var __embed_stmt = __sqlbundle_Literal("SELECT api_keys.id, api_keys.project_id, api_keys.head, api_keys.name, api_keys.secret, api_keys.partner_id, api_keys.user_agent, api_keys.created_at FROM api_keys WHERE api_keys.name = ? AND api_keys.project_id = ?")
|
var __embed_stmt = __sqlbundle_Literal("SELECT api_keys.id, api_keys.project_id, api_keys.head, api_keys.name, api_keys.secret, api_keys.partner_id, api_keys.user_agent, api_keys.created_at, projects.public_id FROM projects JOIN api_keys ON projects.id = api_keys.project_id WHERE api_keys.name = ? AND api_keys.project_id = ?")
|
||||||
|
|
||||||
var __values []interface{}
|
var __values []interface{}
|
||||||
__values = append(__values, api_key_name.value(), api_key_project_id.value())
|
__values = append(__values, api_key_name.value(), api_key_project_id.value())
|
||||||
@ -15887,12 +15892,12 @@ func (obj *pgxImpl) Get_ApiKey_By_Name_And_ProjectId(ctx context.Context,
|
|||||||
var __stmt = __sqlbundle_Render(obj.dialect, __embed_stmt)
|
var __stmt = __sqlbundle_Render(obj.dialect, __embed_stmt)
|
||||||
obj.logStmt(__stmt, __values...)
|
obj.logStmt(__stmt, __values...)
|
||||||
|
|
||||||
api_key = &ApiKey{}
|
row = &ApiKey_Project_PublicId_Row{}
|
||||||
err = obj.queryRowContext(ctx, __stmt, __values...).Scan(&api_key.Id, &api_key.ProjectId, &api_key.Head, &api_key.Name, &api_key.Secret, &api_key.PartnerId, &api_key.UserAgent, &api_key.CreatedAt)
|
err = obj.queryRowContext(ctx, __stmt, __values...).Scan(&row.ApiKey.Id, &row.ApiKey.ProjectId, &row.ApiKey.Head, &row.ApiKey.Name, &row.ApiKey.Secret, &row.ApiKey.PartnerId, &row.ApiKey.UserAgent, &row.ApiKey.CreatedAt, &row.Project_PublicId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return (*ApiKey)(nil), obj.makeErr(err)
|
return (*ApiKey_Project_PublicId_Row)(nil), obj.makeErr(err)
|
||||||
}
|
}
|
||||||
return api_key, nil
|
return row, nil
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -23523,12 +23528,12 @@ func (obj *pgxcockroachImpl) All_ProjectMember_By_MemberId(ctx context.Context,
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (obj *pgxcockroachImpl) Get_ApiKey_By_Id(ctx context.Context,
|
func (obj *pgxcockroachImpl) Get_ApiKey_Project_PublicId_By_ApiKey_Id(ctx context.Context,
|
||||||
api_key_id ApiKey_Id_Field) (
|
api_key_id ApiKey_Id_Field) (
|
||||||
api_key *ApiKey, err error) {
|
row *ApiKey_Project_PublicId_Row, err error) {
|
||||||
defer mon.Task()(&ctx)(&err)
|
defer mon.Task()(&ctx)(&err)
|
||||||
|
|
||||||
var __embed_stmt = __sqlbundle_Literal("SELECT api_keys.id, api_keys.project_id, api_keys.head, api_keys.name, api_keys.secret, api_keys.partner_id, api_keys.user_agent, api_keys.created_at FROM api_keys WHERE api_keys.id = ?")
|
var __embed_stmt = __sqlbundle_Literal("SELECT api_keys.id, api_keys.project_id, api_keys.head, api_keys.name, api_keys.secret, api_keys.partner_id, api_keys.user_agent, api_keys.created_at, projects.public_id FROM projects JOIN api_keys ON projects.id = api_keys.project_id WHERE api_keys.id = ?")
|
||||||
|
|
||||||
var __values []interface{}
|
var __values []interface{}
|
||||||
__values = append(__values, api_key_id.value())
|
__values = append(__values, api_key_id.value())
|
||||||
@ -23536,21 +23541,21 @@ func (obj *pgxcockroachImpl) Get_ApiKey_By_Id(ctx context.Context,
|
|||||||
var __stmt = __sqlbundle_Render(obj.dialect, __embed_stmt)
|
var __stmt = __sqlbundle_Render(obj.dialect, __embed_stmt)
|
||||||
obj.logStmt(__stmt, __values...)
|
obj.logStmt(__stmt, __values...)
|
||||||
|
|
||||||
api_key = &ApiKey{}
|
row = &ApiKey_Project_PublicId_Row{}
|
||||||
err = obj.queryRowContext(ctx, __stmt, __values...).Scan(&api_key.Id, &api_key.ProjectId, &api_key.Head, &api_key.Name, &api_key.Secret, &api_key.PartnerId, &api_key.UserAgent, &api_key.CreatedAt)
|
err = obj.queryRowContext(ctx, __stmt, __values...).Scan(&row.ApiKey.Id, &row.ApiKey.ProjectId, &row.ApiKey.Head, &row.ApiKey.Name, &row.ApiKey.Secret, &row.ApiKey.PartnerId, &row.ApiKey.UserAgent, &row.ApiKey.CreatedAt, &row.Project_PublicId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return (*ApiKey)(nil), obj.makeErr(err)
|
return (*ApiKey_Project_PublicId_Row)(nil), obj.makeErr(err)
|
||||||
}
|
}
|
||||||
return api_key, nil
|
return row, nil
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (obj *pgxcockroachImpl) Get_ApiKey_By_Head(ctx context.Context,
|
func (obj *pgxcockroachImpl) Get_ApiKey_Project_PublicId_By_ApiKey_Head(ctx context.Context,
|
||||||
api_key_head ApiKey_Head_Field) (
|
api_key_head ApiKey_Head_Field) (
|
||||||
api_key *ApiKey, err error) {
|
row *ApiKey_Project_PublicId_Row, err error) {
|
||||||
defer mon.Task()(&ctx)(&err)
|
defer mon.Task()(&ctx)(&err)
|
||||||
|
|
||||||
var __embed_stmt = __sqlbundle_Literal("SELECT api_keys.id, api_keys.project_id, api_keys.head, api_keys.name, api_keys.secret, api_keys.partner_id, api_keys.user_agent, api_keys.created_at FROM api_keys WHERE api_keys.head = ?")
|
var __embed_stmt = __sqlbundle_Literal("SELECT api_keys.id, api_keys.project_id, api_keys.head, api_keys.name, api_keys.secret, api_keys.partner_id, api_keys.user_agent, api_keys.created_at, projects.public_id FROM projects JOIN api_keys ON projects.id = api_keys.project_id WHERE api_keys.head = ?")
|
||||||
|
|
||||||
var __values []interface{}
|
var __values []interface{}
|
||||||
__values = append(__values, api_key_head.value())
|
__values = append(__values, api_key_head.value())
|
||||||
@ -23558,22 +23563,22 @@ func (obj *pgxcockroachImpl) Get_ApiKey_By_Head(ctx context.Context,
|
|||||||
var __stmt = __sqlbundle_Render(obj.dialect, __embed_stmt)
|
var __stmt = __sqlbundle_Render(obj.dialect, __embed_stmt)
|
||||||
obj.logStmt(__stmt, __values...)
|
obj.logStmt(__stmt, __values...)
|
||||||
|
|
||||||
api_key = &ApiKey{}
|
row = &ApiKey_Project_PublicId_Row{}
|
||||||
err = obj.queryRowContext(ctx, __stmt, __values...).Scan(&api_key.Id, &api_key.ProjectId, &api_key.Head, &api_key.Name, &api_key.Secret, &api_key.PartnerId, &api_key.UserAgent, &api_key.CreatedAt)
|
err = obj.queryRowContext(ctx, __stmt, __values...).Scan(&row.ApiKey.Id, &row.ApiKey.ProjectId, &row.ApiKey.Head, &row.ApiKey.Name, &row.ApiKey.Secret, &row.ApiKey.PartnerId, &row.ApiKey.UserAgent, &row.ApiKey.CreatedAt, &row.Project_PublicId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return (*ApiKey)(nil), obj.makeErr(err)
|
return (*ApiKey_Project_PublicId_Row)(nil), obj.makeErr(err)
|
||||||
}
|
}
|
||||||
return api_key, nil
|
return row, nil
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (obj *pgxcockroachImpl) Get_ApiKey_By_Name_And_ProjectId(ctx context.Context,
|
func (obj *pgxcockroachImpl) Get_ApiKey_Project_PublicId_By_ApiKey_Name_And_ApiKey_ProjectId(ctx context.Context,
|
||||||
api_key_name ApiKey_Name_Field,
|
api_key_name ApiKey_Name_Field,
|
||||||
api_key_project_id ApiKey_ProjectId_Field) (
|
api_key_project_id ApiKey_ProjectId_Field) (
|
||||||
api_key *ApiKey, err error) {
|
row *ApiKey_Project_PublicId_Row, err error) {
|
||||||
defer mon.Task()(&ctx)(&err)
|
defer mon.Task()(&ctx)(&err)
|
||||||
|
|
||||||
var __embed_stmt = __sqlbundle_Literal("SELECT api_keys.id, api_keys.project_id, api_keys.head, api_keys.name, api_keys.secret, api_keys.partner_id, api_keys.user_agent, api_keys.created_at FROM api_keys WHERE api_keys.name = ? AND api_keys.project_id = ?")
|
var __embed_stmt = __sqlbundle_Literal("SELECT api_keys.id, api_keys.project_id, api_keys.head, api_keys.name, api_keys.secret, api_keys.partner_id, api_keys.user_agent, api_keys.created_at, projects.public_id FROM projects JOIN api_keys ON projects.id = api_keys.project_id WHERE api_keys.name = ? AND api_keys.project_id = ?")
|
||||||
|
|
||||||
var __values []interface{}
|
var __values []interface{}
|
||||||
__values = append(__values, api_key_name.value(), api_key_project_id.value())
|
__values = append(__values, api_key_name.value(), api_key_project_id.value())
|
||||||
@ -23581,12 +23586,12 @@ func (obj *pgxcockroachImpl) Get_ApiKey_By_Name_And_ProjectId(ctx context.Contex
|
|||||||
var __stmt = __sqlbundle_Render(obj.dialect, __embed_stmt)
|
var __stmt = __sqlbundle_Render(obj.dialect, __embed_stmt)
|
||||||
obj.logStmt(__stmt, __values...)
|
obj.logStmt(__stmt, __values...)
|
||||||
|
|
||||||
api_key = &ApiKey{}
|
row = &ApiKey_Project_PublicId_Row{}
|
||||||
err = obj.queryRowContext(ctx, __stmt, __values...).Scan(&api_key.Id, &api_key.ProjectId, &api_key.Head, &api_key.Name, &api_key.Secret, &api_key.PartnerId, &api_key.UserAgent, &api_key.CreatedAt)
|
err = obj.queryRowContext(ctx, __stmt, __values...).Scan(&row.ApiKey.Id, &row.ApiKey.ProjectId, &row.ApiKey.Head, &row.ApiKey.Name, &row.ApiKey.Secret, &row.ApiKey.PartnerId, &row.ApiKey.UserAgent, &row.ApiKey.CreatedAt, &row.Project_PublicId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return (*ApiKey)(nil), obj.makeErr(err)
|
return (*ApiKey_Project_PublicId_Row)(nil), obj.makeErr(err)
|
||||||
}
|
}
|
||||||
return api_key, nil
|
return row, nil
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -28314,35 +28319,35 @@ func (rx *Rx) Get_AccountFreezeEvent_By_UserId_And_Event(ctx context.Context,
|
|||||||
return tx.Get_AccountFreezeEvent_By_UserId_And_Event(ctx, account_freeze_event_user_id, account_freeze_event_event)
|
return tx.Get_AccountFreezeEvent_By_UserId_And_Event(ctx, account_freeze_event_user_id, account_freeze_event_event)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rx *Rx) Get_ApiKey_By_Head(ctx context.Context,
|
func (rx *Rx) Get_ApiKey_Project_PublicId_By_ApiKey_Head(ctx context.Context,
|
||||||
api_key_head ApiKey_Head_Field) (
|
api_key_head ApiKey_Head_Field) (
|
||||||
api_key *ApiKey, err error) {
|
row *ApiKey_Project_PublicId_Row, err error) {
|
||||||
var tx *Tx
|
var tx *Tx
|
||||||
if tx, err = rx.getTx(ctx); err != nil {
|
if tx, err = rx.getTx(ctx); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
return tx.Get_ApiKey_By_Head(ctx, api_key_head)
|
return tx.Get_ApiKey_Project_PublicId_By_ApiKey_Head(ctx, api_key_head)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rx *Rx) Get_ApiKey_By_Id(ctx context.Context,
|
func (rx *Rx) Get_ApiKey_Project_PublicId_By_ApiKey_Id(ctx context.Context,
|
||||||
api_key_id ApiKey_Id_Field) (
|
api_key_id ApiKey_Id_Field) (
|
||||||
api_key *ApiKey, err error) {
|
row *ApiKey_Project_PublicId_Row, err error) {
|
||||||
var tx *Tx
|
var tx *Tx
|
||||||
if tx, err = rx.getTx(ctx); err != nil {
|
if tx, err = rx.getTx(ctx); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
return tx.Get_ApiKey_By_Id(ctx, api_key_id)
|
return tx.Get_ApiKey_Project_PublicId_By_ApiKey_Id(ctx, api_key_id)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rx *Rx) Get_ApiKey_By_Name_And_ProjectId(ctx context.Context,
|
func (rx *Rx) Get_ApiKey_Project_PublicId_By_ApiKey_Name_And_ApiKey_ProjectId(ctx context.Context,
|
||||||
api_key_name ApiKey_Name_Field,
|
api_key_name ApiKey_Name_Field,
|
||||||
api_key_project_id ApiKey_ProjectId_Field) (
|
api_key_project_id ApiKey_ProjectId_Field) (
|
||||||
api_key *ApiKey, err error) {
|
row *ApiKey_Project_PublicId_Row, err error) {
|
||||||
var tx *Tx
|
var tx *Tx
|
||||||
if tx, err = rx.getTx(ctx); err != nil {
|
if tx, err = rx.getTx(ctx); err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
return tx.Get_ApiKey_By_Name_And_ProjectId(ctx, api_key_name, api_key_project_id)
|
return tx.Get_ApiKey_Project_PublicId_By_ApiKey_Name_And_ApiKey_ProjectId(ctx, api_key_name, api_key_project_id)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (rx *Rx) Get_BillingBalance_Balance_By_UserId(ctx context.Context,
|
func (rx *Rx) Get_BillingBalance_Balance_By_UserId(ctx context.Context,
|
||||||
@ -29788,18 +29793,18 @@ type Methods interface {
|
|||||||
account_freeze_event_event AccountFreezeEvent_Event_Field) (
|
account_freeze_event_event AccountFreezeEvent_Event_Field) (
|
||||||
account_freeze_event *AccountFreezeEvent, err error)
|
account_freeze_event *AccountFreezeEvent, err error)
|
||||||
|
|
||||||
Get_ApiKey_By_Head(ctx context.Context,
|
Get_ApiKey_Project_PublicId_By_ApiKey_Head(ctx context.Context,
|
||||||
api_key_head ApiKey_Head_Field) (
|
api_key_head ApiKey_Head_Field) (
|
||||||
api_key *ApiKey, err error)
|
row *ApiKey_Project_PublicId_Row, err error)
|
||||||
|
|
||||||
Get_ApiKey_By_Id(ctx context.Context,
|
Get_ApiKey_Project_PublicId_By_ApiKey_Id(ctx context.Context,
|
||||||
api_key_id ApiKey_Id_Field) (
|
api_key_id ApiKey_Id_Field) (
|
||||||
api_key *ApiKey, err error)
|
row *ApiKey_Project_PublicId_Row, err error)
|
||||||
|
|
||||||
Get_ApiKey_By_Name_And_ProjectId(ctx context.Context,
|
Get_ApiKey_Project_PublicId_By_ApiKey_Name_And_ApiKey_ProjectId(ctx context.Context,
|
||||||
api_key_name ApiKey_Name_Field,
|
api_key_name ApiKey_Name_Field,
|
||||||
api_key_project_id ApiKey_ProjectId_Field) (
|
api_key_project_id ApiKey_ProjectId_Field) (
|
||||||
api_key *ApiKey, err error)
|
row *ApiKey_Project_PublicId_Row, err error)
|
||||||
|
|
||||||
Get_BillingBalance_Balance_By_UserId(ctx context.Context,
|
Get_BillingBalance_Balance_By_UserId(ctx context.Context,
|
||||||
billing_balance_user_id BillingBalance_UserId_Field) (
|
billing_balance_user_id BillingBalance_UserId_Field) (
|
||||||
|
Loading…
Reference in New Issue
Block a user