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  }