mirror of
https://github.com/netbirdio/netbird.git
synced 2025-02-08 14:29:39 +01:00
80 lines
1.9 KiB
Go
80 lines
1.9 KiB
Go
package handler
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
|
|
"github.com/netbirdio/netbird/management/server"
|
|
"github.com/netbirdio/netbird/management/server/jwtclaims"
|
|
)
|
|
|
|
type UserHandler struct {
|
|
accountManager server.AccountManager
|
|
authAudience string
|
|
jwtExtractor jwtclaims.ClaimsExtractor
|
|
}
|
|
|
|
type UserResponse struct {
|
|
ID string `json:"id"`
|
|
Email string `json:"email"`
|
|
Name string `json:"name"`
|
|
Role string `json:"role"`
|
|
}
|
|
|
|
func NewUserHandler(accountManager server.AccountManager, authAudience string) *UserHandler {
|
|
return &UserHandler{
|
|
accountManager: accountManager,
|
|
authAudience: authAudience,
|
|
jwtExtractor: *jwtclaims.NewClaimsExtractor(nil),
|
|
}
|
|
}
|
|
|
|
func (u *UserHandler) getAccountId(r *http.Request) (*server.Account, error) {
|
|
jwtClaims := u.jwtExtractor.ExtractClaimsFromRequestContext(r, u.authAudience)
|
|
|
|
account, err := u.accountManager.GetAccountWithAuthorizationClaims(jwtClaims)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed getting account of a user %s: %v", jwtClaims.UserId, err)
|
|
}
|
|
|
|
return account, nil
|
|
}
|
|
|
|
// GetUsers returns a list of users of the account this user belongs to.
|
|
// It also gathers additional user data (like email and name) from the IDP manager.
|
|
func (u *UserHandler) GetUsers(w http.ResponseWriter, r *http.Request) {
|
|
if r.Method != http.MethodGet {
|
|
http.Error(w, "", http.StatusBadRequest)
|
|
}
|
|
|
|
account, err := u.getAccountId(r)
|
|
if err != nil {
|
|
log.Error(err)
|
|
}
|
|
|
|
data, err := u.accountManager.GetUsersFromAccount(account.Id)
|
|
if err != nil {
|
|
log.Error(err)
|
|
http.Redirect(w, r, "/", http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
users := []*UserResponse{}
|
|
for _, r := range data {
|
|
users = append(users, toUserResponse(r))
|
|
}
|
|
|
|
writeJSONObject(w, users)
|
|
}
|
|
|
|
func toUserResponse(user *server.UserInfo) *UserResponse {
|
|
return &UserResponse{
|
|
ID: user.ID,
|
|
Name: user.Name,
|
|
Email: user.Email,
|
|
Role: user.Role,
|
|
}
|
|
}
|