| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 | package logicimport (	"encoding/json"	"errors"	"sort"	"github.com/gravitl/netmaker/database"	"github.com/gravitl/netmaker/models")// GetUser - gets a user// TODO support "masteradmin"func GetUser(username string) (*models.User, error) {	var user models.User	record, err := database.FetchRecord(database.USERS_TABLE_NAME, username)	if err != nil {		return &user, err	}	if err = json.Unmarshal([]byte(record), &user); err != nil {		return &models.User{}, err	}	return &user, err}// GetReturnUser - gets a userfunc GetReturnUser(username string) (models.ReturnUser, error) {	var user models.ReturnUser	record, err := database.FetchRecord(database.USERS_TABLE_NAME, username)	if err != nil {		return user, err	}	if err = json.Unmarshal([]byte(record), &user); err != nil {		return models.ReturnUser{}, err	}	return user, err}// ToReturnUser - gets a user as a return userfunc ToReturnUser(user models.User) models.ReturnUser {	return models.ReturnUser{		UserName:       user.UserName,		PlatformRoleID: user.PlatformRoleID,		AuthType:       user.AuthType,		UserGroups:     user.UserGroups,		NetworkRoles:   user.NetworkRoles,		RemoteGwIDs:    user.RemoteGwIDs,		LastLoginTime:  user.LastLoginTime,	}}// SetUserDefaults - sets the defaults of a user to avoid empty fieldsfunc SetUserDefaults(user *models.User) {	if user.RemoteGwIDs == nil {		user.RemoteGwIDs = make(map[string]struct{})	}	if len(user.NetworkRoles) == 0 {		user.NetworkRoles = make(map[models.NetworkID]map[models.UserRoleID]struct{})	}	if len(user.UserGroups) == 0 {		user.UserGroups = make(map[models.UserGroupID]struct{})	}}// SortUsers - Sorts slice of Users by usernamefunc SortUsers(unsortedUsers []models.ReturnUser) {	sort.Slice(unsortedUsers, func(i, j int) bool {		return unsortedUsers[i].UserName < unsortedUsers[j].UserName	})}// GetSuperAdmin - fetches superadmin userfunc GetSuperAdmin() (models.ReturnUser, error) {	users, err := GetUsers()	if err != nil {		return models.ReturnUser{}, err	}	for _, user := range users {		if user.IsSuperAdmin {			return user, nil		}	}	return models.ReturnUser{}, errors.New("superadmin not found")}func InsertPendingUser(u *models.User) error {	data, err := json.Marshal(u)	if err != nil {		return err	}	return database.Insert(u.UserName, string(data), database.PENDING_USERS_TABLE_NAME)}func DeletePendingUser(username string) error {	return database.DeleteRecord(database.PENDING_USERS_TABLE_NAME, username)}func IsPendingUser(username string) bool {	records, err := database.FetchRecords(database.PENDING_USERS_TABLE_NAME)	if err != nil {		return false	}	for _, record := range records {		u := models.ReturnUser{}		err := json.Unmarshal([]byte(record), &u)		if err == nil && u.UserName == username {			return true		}	}	return false}func ListPendingUsers() ([]models.ReturnUser, error) {	pendingUsers := []models.ReturnUser{}	records, err := database.FetchRecords(database.PENDING_USERS_TABLE_NAME)	if err != nil && !database.IsEmptyRecord(err) {		return pendingUsers, err	}	for _, record := range records {		u := models.ReturnUser{}		err = json.Unmarshal([]byte(record), &u)		if err == nil {			pendingUsers = append(pendingUsers, u)		}	}	return pendingUsers, nil}func GetUserMap() (map[string]models.User, error) {	userMap := make(map[string]models.User)	records, err := database.FetchRecords(database.USERS_TABLE_NAME)	if err != nil && !database.IsEmptyRecord(err) {		return userMap, err	}	for _, record := range records {		u := models.User{}		err = json.Unmarshal([]byte(record), &u)		if err == nil {			userMap[u.UserName] = u		}	}	return userMap, nil}func InsertUserInvite(invite models.UserInvite) error {	data, err := json.Marshal(invite)	if err != nil {		return err	}	return database.Insert(invite.Email, string(data), database.USER_INVITES_TABLE_NAME)}func GetUserInvite(email string) (in models.UserInvite, err error) {	d, err := database.FetchRecord(database.USER_INVITES_TABLE_NAME, email)	if err != nil {		return	}	err = json.Unmarshal([]byte(d), &in)	return}func ListUserInvites() ([]models.UserInvite, error) {	invites := []models.UserInvite{}	records, err := database.FetchRecords(database.USER_INVITES_TABLE_NAME)	if err != nil && !database.IsEmptyRecord(err) {		return invites, err	}	for _, record := range records {		in := models.UserInvite{}		err = json.Unmarshal([]byte(record), &in)		if err == nil {			invites = append(invites, in)		}	}	return invites, nil}func DeleteUserInvite(email string) error {	return database.DeleteRecord(database.USER_INVITES_TABLE_NAME, email)}func ValidateAndApproveUserInvite(email, code string) error {	in, err := GetUserInvite(email)	if err != nil {		return err	}	if code != in.InviteCode {		return errors.New("invalid code")	}	return nil}
 |