feat(access): lazy load user keys from db

Ayman Bagabas created

Change summary

server/config/repo.go |  7 +------
server/config/user.go | 16 ++++++++++++++--
2 files changed, 15 insertions(+), 8 deletions(-)

Detailed changes

server/config/repo.go 🔗

@@ -150,14 +150,9 @@ func (r *repo) Collabs() []proto.User {
 		return collabs
 	}
 	for i, c := range cs {
-		ks, err := r.cfg.db.GetUserPublicKeys(c)
-		if err != nil {
-			log.Printf("error getting public keys for %q: %v", c.Name, err)
-			continue
-		}
 		u := &user{
+			cfg:  r.cfg,
 			user: c,
-			keys: ks,
 		}
 		collabs[i] = u
 	}

server/config/user.go 🔗

@@ -1,6 +1,7 @@
 package config
 
 import (
+	"log"
 	"net/mail"
 
 	"github.com/charmbracelet/soft-serve/proto"
@@ -11,6 +12,7 @@ import (
 var _ proto.User = &user{}
 
 type user struct {
+	cfg  *Config
 	user *types.User
 	keys []*types.PublicKey
 }
@@ -36,8 +38,18 @@ func (u *user) IsAdmin() bool {
 }
 
 func (u *user) PublicKeys() []ssh.PublicKey {
-	ks := make([]ssh.PublicKey, len(u.keys))
-	for i, k := range u.keys {
+	keys := u.keys
+	if keys == nil || len(keys) == 0 {
+		ks, err := u.cfg.db.GetUserPublicKeys(u.user)
+		if err != nil {
+			log.Printf("error getting public keys for %q: %v", u.Name(), err)
+			return nil
+		}
+		u.keys = ks
+		keys = ks
+	}
+	ks := make([]ssh.PublicKey, len(keys))
+	for i, k := range keys {
 		ks[i] = k
 	}
 	return ks