Add last used at to personal api key
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
This commit is contained in:
2
pkg/coredata/migrations/20260105T150000Z.sql
Normal file
2
pkg/coredata/migrations/20260105T150000Z.sql
Normal file
@@ -0,0 +1,2 @@
|
||||
ALTER TABLE iam_personal_api_keys ADD COLUMN last_used_at TIMESTAMPTZ;
|
||||
|
||||
@@ -33,6 +33,7 @@ type (
|
||||
Name string `db:"name"`
|
||||
ExpiresAt time.Time `db:"expires_at"`
|
||||
ExpireReason *ExpireReason `db:"expire_reason"`
|
||||
LastUsedAt *time.Time `db:"last_used_at"`
|
||||
CreatedAt time.Time `db:"created_at"`
|
||||
UpdatedAt time.Time `db:"updated_at"`
|
||||
}
|
||||
@@ -61,6 +62,7 @@ SELECT
|
||||
name,
|
||||
expires_at,
|
||||
expire_reason,
|
||||
last_used_at,
|
||||
created_at,
|
||||
updated_at
|
||||
FROM
|
||||
@@ -117,6 +119,7 @@ SELECT
|
||||
name,
|
||||
expires_at,
|
||||
expire_reason,
|
||||
last_used_at,
|
||||
created_at,
|
||||
updated_at
|
||||
FROM
|
||||
@@ -170,13 +173,14 @@ func (a *PersonalAPIKey) Insert(
|
||||
) error {
|
||||
q := `
|
||||
INSERT INTO
|
||||
iam_personal_api_keys (id, identity_id, name, expires_at, expire_reason, created_at, updated_at)
|
||||
iam_personal_api_keys (id, identity_id, name, expires_at, expire_reason, last_used_at, created_at, updated_at)
|
||||
VALUES (
|
||||
@api_key_id,
|
||||
@identity_id,
|
||||
@name,
|
||||
@expires_at,
|
||||
@expire_reason,
|
||||
@last_used_at,
|
||||
@created_at,
|
||||
@updated_at
|
||||
)
|
||||
@@ -188,6 +192,7 @@ VALUES (
|
||||
"name": a.Name,
|
||||
"expires_at": a.ExpiresAt,
|
||||
"expire_reason": a.ExpireReason,
|
||||
"last_used_at": a.LastUsedAt,
|
||||
"created_at": a.CreatedAt,
|
||||
"updated_at": a.UpdatedAt,
|
||||
}
|
||||
@@ -211,6 +216,7 @@ SET
|
||||
name = @name,
|
||||
expires_at = @expires_at,
|
||||
expire_reason = @expire_reason,
|
||||
last_used_at = @last_used_at,
|
||||
updated_at = @updated_at
|
||||
WHERE
|
||||
id = @api_key_id
|
||||
@@ -221,6 +227,7 @@ WHERE
|
||||
"name": a.Name,
|
||||
"expires_at": a.ExpiresAt,
|
||||
"expire_reason": a.ExpireReason,
|
||||
"last_used_at": a.LastUsedAt,
|
||||
"updated_at": a.UpdatedAt,
|
||||
}
|
||||
|
||||
|
||||
@@ -66,6 +66,13 @@ func (s *APIKeyService) GetAPIKey(ctx context.Context, keyID gid.GID) (*coredata
|
||||
return NewPersonalAPIKeyExpiredError(keyID)
|
||||
}
|
||||
|
||||
apiKey.LastUsedAt = &now
|
||||
apiKey.UpdatedAt = now
|
||||
|
||||
if err := apiKey.Update(ctx, tx); err != nil {
|
||||
return fmt.Errorf("cannot update personal api key last used at: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
},
|
||||
)
|
||||
|
||||
@@ -312,6 +312,7 @@ type PersonalAPIKey implements Node {
|
||||
id: ID!
|
||||
name: String!
|
||||
expiresAt: Datetime!
|
||||
lastUsedAt: Datetime
|
||||
createdAt: Datetime!
|
||||
|
||||
token: String @goField(forceResolver: true)
|
||||
|
||||
@@ -276,6 +276,7 @@ type ComplexityRoot struct {
|
||||
CreatedAt func(childComplexity int) int
|
||||
ExpiresAt func(childComplexity int) int
|
||||
ID func(childComplexity int) int
|
||||
LastUsedAt func(childComplexity int) int
|
||||
Name func(childComplexity int) int
|
||||
Permission func(childComplexity int, action string) int
|
||||
Token func(childComplexity int) int
|
||||
@@ -1530,6 +1531,12 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin
|
||||
}
|
||||
|
||||
return e.complexity.PersonalAPIKey.ID(childComplexity), true
|
||||
case "PersonalAPIKey.lastUsedAt":
|
||||
if e.complexity.PersonalAPIKey.LastUsedAt == nil {
|
||||
break
|
||||
}
|
||||
|
||||
return e.complexity.PersonalAPIKey.LastUsedAt(childComplexity), true
|
||||
case "PersonalAPIKey.name":
|
||||
if e.complexity.PersonalAPIKey.Name == nil {
|
||||
break
|
||||
@@ -2598,6 +2605,7 @@ type PersonalAPIKey implements Node {
|
||||
id: ID!
|
||||
name: String!
|
||||
expiresAt: Datetime!
|
||||
lastUsedAt: Datetime
|
||||
createdAt: Datetime!
|
||||
|
||||
token: String @goField(forceResolver: true)
|
||||
@@ -9070,6 +9078,35 @@ func (ec *executionContext) fieldContext_PersonalAPIKey_expiresAt(_ context.Cont
|
||||
return fc, nil
|
||||
}
|
||||
|
||||
func (ec *executionContext) _PersonalAPIKey_lastUsedAt(ctx context.Context, field graphql.CollectedField, obj *types.PersonalAPIKey) (ret graphql.Marshaler) {
|
||||
return graphql.ResolveField(
|
||||
ctx,
|
||||
ec.OperationContext,
|
||||
field,
|
||||
ec.fieldContext_PersonalAPIKey_lastUsedAt,
|
||||
func(ctx context.Context) (any, error) {
|
||||
return obj.LastUsedAt, nil
|
||||
},
|
||||
nil,
|
||||
ec.marshalODatetime2ᚖtimeᚐTime,
|
||||
true,
|
||||
false,
|
||||
)
|
||||
}
|
||||
|
||||
func (ec *executionContext) fieldContext_PersonalAPIKey_lastUsedAt(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
|
||||
fc = &graphql.FieldContext{
|
||||
Object: "PersonalAPIKey",
|
||||
Field: field,
|
||||
IsMethod: false,
|
||||
IsResolver: false,
|
||||
Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
|
||||
return nil, errors.New("field of type Datetime does not have child fields")
|
||||
},
|
||||
}
|
||||
return fc, nil
|
||||
}
|
||||
|
||||
func (ec *executionContext) _PersonalAPIKey_createdAt(ctx context.Context, field graphql.CollectedField, obj *types.PersonalAPIKey) (ret graphql.Marshaler) {
|
||||
return graphql.ResolveField(
|
||||
ctx,
|
||||
@@ -9320,6 +9357,8 @@ func (ec *executionContext) fieldContext_PersonalAPIKeyEdge_node(_ context.Conte
|
||||
return ec.fieldContext_PersonalAPIKey_name(ctx, field)
|
||||
case "expiresAt":
|
||||
return ec.fieldContext_PersonalAPIKey_expiresAt(ctx, field)
|
||||
case "lastUsedAt":
|
||||
return ec.fieldContext_PersonalAPIKey_lastUsedAt(ctx, field)
|
||||
case "createdAt":
|
||||
return ec.fieldContext_PersonalAPIKey_createdAt(ctx, field)
|
||||
case "token":
|
||||
@@ -17483,6 +17522,8 @@ func (ec *executionContext) _PersonalAPIKey(ctx context.Context, sel ast.Selecti
|
||||
if out.Values[i] == graphql.Null {
|
||||
atomic.AddUint32(&out.Invalids, 1)
|
||||
}
|
||||
case "lastUsedAt":
|
||||
out.Values[i] = ec._PersonalAPIKey_lastUsedAt(ctx, field, obj)
|
||||
case "createdAt":
|
||||
out.Values[i] = ec._PersonalAPIKey_createdAt(ctx, field, obj)
|
||||
if out.Values[i] == graphql.Null {
|
||||
|
||||
@@ -61,9 +61,10 @@ func NewPersonalAPIKeyEdge(personalAPIKey *coredata.PersonalAPIKey, orderField c
|
||||
|
||||
func NewPersonalAPIKey(personalAPIKey *coredata.PersonalAPIKey) *PersonalAPIKey {
|
||||
return &PersonalAPIKey{
|
||||
ID: personalAPIKey.ID,
|
||||
Name: personalAPIKey.Name,
|
||||
ExpiresAt: personalAPIKey.ExpiresAt,
|
||||
CreatedAt: personalAPIKey.CreatedAt,
|
||||
ID: personalAPIKey.ID,
|
||||
Name: personalAPIKey.Name,
|
||||
ExpiresAt: personalAPIKey.ExpiresAt,
|
||||
LastUsedAt: personalAPIKey.LastUsedAt,
|
||||
CreatedAt: personalAPIKey.CreatedAt,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -281,12 +281,13 @@ type PasswordRequired struct {
|
||||
func (PasswordRequired) IsAssumeOrganizationSessionResult() {}
|
||||
|
||||
type PersonalAPIKey struct {
|
||||
ID gid.GID `json:"id"`
|
||||
Name string `json:"name"`
|
||||
ExpiresAt time.Time `json:"expiresAt"`
|
||||
CreatedAt time.Time `json:"createdAt"`
|
||||
Token *string `json:"token,omitempty"`
|
||||
Permission bool `json:"permission"`
|
||||
ID gid.GID `json:"id"`
|
||||
Name string `json:"name"`
|
||||
ExpiresAt time.Time `json:"expiresAt"`
|
||||
LastUsedAt *time.Time `json:"lastUsedAt,omitempty"`
|
||||
CreatedAt time.Time `json:"createdAt"`
|
||||
Token *string `json:"token,omitempty"`
|
||||
Permission bool `json:"permission"`
|
||||
}
|
||||
|
||||
func (PersonalAPIKey) IsNode() {}
|
||||
|
||||
Reference in New Issue
Block a user