Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 14 additions & 12 deletions packages/api/internal/handlers/apikey.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,6 @@ import (
"github.com/e2b-dev/infra/packages/api/internal/team"
"github.com/e2b-dev/infra/packages/api/internal/utils"
"github.com/e2b-dev/infra/packages/db/queries"
"github.com/e2b-dev/infra/packages/shared/pkg/models"
"github.com/e2b-dev/infra/packages/shared/pkg/models/teamapikey"
"github.com/e2b-dev/infra/packages/shared/pkg/telemetry"
)

Expand Down Expand Up @@ -114,16 +112,20 @@ func (a *APIStore) DeleteApiKeysApiKeyID(c *gin.Context, apiKeyID string) {

teamID := a.GetTeamInfo(c).Team.ID

err = a.db.Client.TeamAPIKey.DeleteOneID(apiKeyIDParsed).Where(teamapikey.TeamID(teamID)).Exec(ctx)
if models.IsNotFound(err) {
c.String(http.StatusNotFound, "id not found")
return
} else if err != nil {
ids, err := a.sqlcDB.DeleteTeamAPIKey(ctx, queries.DeleteTeamAPIKeyParams{
ID: apiKeyIDParsed,
TeamID: teamID,
})
if err != nil {
a.sendAPIStoreError(c, http.StatusInternalServerError, fmt.Sprintf("Error when deleting API key: %s", err))

telemetry.ReportCriticalError(ctx, "error when deleting API key", err)
return
}
if len(ids) == 0 {
c.String(http.StatusNotFound, "id not found")
return
}

c.Status(http.StatusNoContent)
}
Expand All @@ -143,7 +145,7 @@ func (a *APIStore) PostApiKeys(c *gin.Context) {
return
}

apiKey, err := team.CreateAPIKey(ctx, a.db, teamID, userID, body.Name)
apiKey, err := team.CreateAPIKey(ctx, a.sqlcDB, teamID, userID, body.Name)
if err != nil {
a.sendAPIStoreError(c, http.StatusInternalServerError, fmt.Sprintf("Error when creating team API key: %s", err))

Expand All @@ -166,10 +168,10 @@ func (a *APIStore) PostApiKeys(c *gin.Context) {
Name: apiKey.Name,
Key: apiKey.RawAPIKey,
Mask: api.IdentifierMaskingDetails{
Prefix: apiKey.APIKeyPrefix,
ValueLength: apiKey.APIKeyLength,
MaskedValuePrefix: apiKey.APIKeyMaskPrefix,
MaskedValueSuffix: apiKey.APIKeyMaskSuffix,
Prefix: apiKey.ApiKeyPrefix,
ValueLength: int(apiKey.ApiKeyLength),
MaskedValuePrefix: apiKey.ApiKeyMaskPrefix,
MaskedValueSuffix: apiKey.ApiKeyMaskSuffix,
},
CreatedBy: &api.TeamUser{
Id: user.ID,
Expand Down
2 changes: 1 addition & 1 deletion packages/api/internal/handlers/teams.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ func (a *APIStore) GetTeams(c *gin.Context) {
teams := make([]api.Team, len(results))
for i, row := range results {
// We create a new API key for the CLI and backwards compatibility with API Keys hashing
apiKey, err := team.CreateAPIKey(ctx, a.db, row.Team.ID, userID, "CLI login/configure")
apiKey, err := team.CreateAPIKey(ctx, a.sqlcDB, row.Team.ID, userID, "CLI login/configure")
if err != nil {
telemetry.ReportCriticalError(ctx, "error when creating team API key", err)
a.sendAPIStoreError(c, http.StatusInternalServerError, "Error when creating team API key")
Expand Down
33 changes: 15 additions & 18 deletions packages/api/internal/team/apikeys.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,50 +3,47 @@ package team
import (
"context"
"fmt"
"time"

"github.com/google/uuid"

"github.com/e2b-dev/infra/packages/shared/pkg/db"
"github.com/e2b-dev/infra/packages/db/client"
"github.com/e2b-dev/infra/packages/db/queries"
"github.com/e2b-dev/infra/packages/shared/pkg/keys"
"github.com/e2b-dev/infra/packages/shared/pkg/models"
"github.com/e2b-dev/infra/packages/shared/pkg/telemetry"
)

type CreateAPIKeyResponse struct {
*models.TeamAPIKey
*queries.TeamApiKey

RawAPIKey string
}

func CreateAPIKey(ctx context.Context, db *db.DB, teamID uuid.UUID, userID uuid.UUID, name string) (CreateAPIKeyResponse, error) {
func CreateAPIKey(ctx context.Context, sqlcDB *client.Client, teamID uuid.UUID, userID uuid.UUID, name string) (CreateAPIKeyResponse, error) {
teamApiKey, err := keys.GenerateKey(keys.ApiKeyPrefix)
if err != nil {
telemetry.ReportCriticalError(ctx, "error when generating team API key", err)

return CreateAPIKeyResponse{}, fmt.Errorf("error when generating team API key: %w", err)
}

apiKey, err := db.Client.TeamAPIKey.
Create().
SetTeamID(teamID).
SetCreatedBy(userID).
SetUpdatedAt(time.Now()).
SetAPIKeyHash(teamApiKey.HashedValue).
SetAPIKeyPrefix(teamApiKey.Masked.Prefix).
SetAPIKeyLength(teamApiKey.Masked.ValueLength).
SetAPIKeyMaskPrefix(teamApiKey.Masked.MaskedValuePrefix).
SetAPIKeyMaskSuffix(teamApiKey.Masked.MaskedValueSuffix).
SetName(name).
Save(ctx)
apiKey, err := sqlcDB.CreateTeamAPIKey(ctx, queries.CreateTeamAPIKeyParams{
TeamID: teamID,
CreatedBy: &userID,
ApiKeyHash: teamApiKey.HashedValue,
ApiKeyPrefix: teamApiKey.Masked.Prefix,
ApiKeyLength: int32(teamApiKey.Masked.ValueLength),
ApiKeyMaskPrefix: teamApiKey.Masked.MaskedValuePrefix,
ApiKeyMaskSuffix: teamApiKey.Masked.MaskedValueSuffix,
Name: name,
})
if err != nil {
telemetry.ReportCriticalError(ctx, "error when creating API key", err)

return CreateAPIKeyResponse{}, fmt.Errorf("error when creating API key: %w", err)
}

return CreateAPIKeyResponse{
TeamAPIKey: apiKey,
TeamApiKey: &apiKey,
RawAPIKey: teamApiKey.PrefixedRawValue,
}, nil
}
24 changes: 24 additions & 0 deletions packages/db/queries/create_team_api_key.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
-- name: CreateTeamAPIKey :one
INSERT INTO "public"."team_api_keys" (
team_id,
created_by,
updated_at,
api_key_hash,
api_key_prefix,
api_key_length,
api_key_mask_prefix,
api_key_mask_suffix,
name,
created_at
) VALUES (
@team_id,
@created_by,
NOW(),
@api_key_hash,
@api_key_prefix,
@api_key_length,
@api_key_mask_prefix,
@api_key_mask_suffix,
@name,
NOW()
) RETURNING *;
78 changes: 78 additions & 0 deletions packages/db/queries/create_team_api_key.sql.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions packages/db/queries/delete_team_api_key.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
-- name: DeleteTeamAPIKey :many
DELETE FROM "public"."team_api_keys"
WHERE id = @id AND team_id = @team_id
RETURNING id;
43 changes: 43 additions & 0 deletions packages/db/queries/delete_team_api_key.sql.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 12 additions & 1 deletion packages/local-dev/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,13 @@ module github.com/e2b-dev/infra/packages/local-dev

go 1.24.7

replace github.com/e2b-dev/infra/packages/shared v0.0.0 => ../shared

replace github.com/e2b-dev/infra/packages/db v0.0.0 => ../db

require (
github.com/e2b-dev/infra/packages/shared v0.0.0-20251009172140-4e9923514a2e
github.com/e2b-dev/infra/packages/db v0.0.0
github.com/e2b-dev/infra/packages/shared v0.0.0
github.com/google/uuid v1.6.0
github.com/lib/pq v1.10.9
github.com/stretchr/testify v1.11.1
Expand Down Expand Up @@ -41,7 +46,10 @@ require (
github.com/gogo/protobuf v1.3.2 // indirect
github.com/google/go-cmp v0.7.0 // indirect
github.com/hashicorp/hcl/v2 v2.19.1 // indirect
github.com/jackc/pgpassfile v1.0.0 // indirect
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
github.com/jackc/pgx/v5 v5.7.4 // indirect
github.com/jackc/puddle/v2 v2.2.2 // indirect
github.com/klauspost/compress v1.18.0 // indirect
github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683 // indirect
github.com/magiconair/properties v1.8.10 // indirect
Expand Down Expand Up @@ -71,8 +79,11 @@ require (
go.opentelemetry.io/otel v1.38.0 // indirect
go.opentelemetry.io/otel/metric v1.38.0 // indirect
go.opentelemetry.io/otel/trace v1.38.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
golang.org/x/crypto v0.42.0 // indirect
golang.org/x/mod v0.27.0 // indirect
golang.org/x/sync v0.17.0 // indirect
golang.org/x/sys v0.36.0 // indirect
golang.org/x/text v0.29.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
Expand Down
9 changes: 7 additions & 2 deletions packages/local-dev/go.sum

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading
Loading