github.com/greenpau/go-authcrunch@v1.1.4/pkg/authn/api_fetch_user_dashboard_data.go (about) 1 // Copyright 2024 Paul Greenberg greenpau@outlook.com 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package authn 16 17 import ( 18 "context" 19 "net/http" 20 21 "github.com/greenpau/go-authcrunch/pkg/authn/enums/operator" 22 "github.com/greenpau/go-authcrunch/pkg/identity" 23 "github.com/greenpau/go-authcrunch/pkg/ids" 24 "github.com/greenpau/go-authcrunch/pkg/requests" 25 "github.com/greenpau/go-authcrunch/pkg/user" 26 "go.uber.org/zap" 27 ) 28 29 // FetchUserDashboardData fetches user dashboard information. 30 func (p *Portal) FetchUserDashboardData( 31 ctx context.Context, 32 w http.ResponseWriter, 33 r *http.Request, 34 rr *requests.Request, 35 parsedUser *user.User, 36 resp map[string]interface{}, 37 usr *user.User, 38 backend ids.IdentityStore) error { 39 40 // Data Buckets 41 entry := make(map[string]interface{}) 42 assetCount := make(map[string]interface{}) 43 44 // General Info 45 err := backend.Request(operator.GetUser, rr) 46 if err != nil { 47 resp["message"] = "failed to extract user metadata" 48 p.logger.Debug( 49 "failed to extract user metadata", 50 zap.String("session_id", rr.Upstream.SessionID), 51 zap.String("request_id", rr.ID), 52 zap.Error(err), 53 ) 54 return handleAPIProfileResponse(w, rr, http.StatusInternalServerError, resp) 55 } 56 user := rr.Response.Payload.(*identity.User) 57 entry["metadata"] = user.GetMetadata() 58 59 // API Keys 60 rr.Key.Usage = "api" 61 rr.Key.IncludeAll = true 62 err = backend.Request(operator.GetAPIKeys, rr) 63 if err != nil { 64 resp["message"] = "failed to extract user api keys" 65 p.logger.Debug( 66 "failed to extract user api keys", 67 zap.String("session_id", rr.Upstream.SessionID), 68 zap.String("request_id", rr.ID), 69 zap.Error(err), 70 ) 71 return handleAPIProfileResponse(w, rr, http.StatusInternalServerError, resp) 72 } 73 apiKeysBundle := rr.Response.Payload.(*identity.APIKeyBundle) 74 apiKeys := apiKeysBundle.Get() 75 assetCount["api_key"] = len(apiKeys) 76 77 // SSH Keys 78 rr.Key.Usage = "ssh" 79 rr.Key.IncludeAll = true 80 err = backend.Request(operator.GetPublicKeys, rr) 81 if err != nil { 82 resp["message"] = "failed to extract user ssh keys" 83 p.logger.Debug( 84 "failed to extract user api keys", 85 zap.String("session_id", rr.Upstream.SessionID), 86 zap.String("request_id", rr.ID), 87 zap.Error(err), 88 ) 89 return handleAPIProfileResponse(w, rr, http.StatusInternalServerError, resp) 90 } 91 sshKeysBundle := rr.Response.Payload.(*identity.PublicKeyBundle) 92 sshKeys := sshKeysBundle.Get() 93 assetCount["ssh_key"] = len(sshKeys) 94 95 // GPG Keys 96 rr.Key.Usage = "gpg" 97 rr.Key.IncludeAll = true 98 err = backend.Request(operator.GetPublicKeys, rr) 99 if err != nil { 100 resp["message"] = "failed to extract user gpg keys" 101 p.logger.Debug( 102 "failed to extract user api keys", 103 zap.String("session_id", rr.Upstream.SessionID), 104 zap.String("request_id", rr.ID), 105 zap.Error(err), 106 ) 107 return handleAPIProfileResponse(w, rr, http.StatusInternalServerError, resp) 108 } 109 gpgKeysBundle := rr.Response.Payload.(*identity.PublicKeyBundle) 110 gpgKeys := gpgKeysBundle.Get() 111 assetCount["gpg_key"] = len(gpgKeys) 112 113 // MFA and 2FA 114 rr.MfaToken.IncludeAll = true 115 if err := backend.Request(operator.GetMfaTokens, rr); err != nil { 116 resp["message"] = "failed to extract user MFA/2FA" 117 return handleAPIProfileResponse(w, rr, http.StatusInternalServerError, resp) 118 } 119 mfaTokensBundle := rr.Response.Payload.(*identity.MfaTokenBundle) 120 mfaTokens := mfaTokensBundle.Get() 121 assetCount["mfa_2fa"] = len(mfaTokens) 122 123 // User Roles 124 125 entry["roles"] = parsedUser.Claims.Roles 126 127 // Finalize 128 129 entry["asset_count"] = assetCount 130 entry["connected_accounts"] = []interface{}{} 131 resp["entry"] = entry 132 return handleAPIProfileResponse(w, rr, http.StatusOK, resp) 133 }