diff options
Diffstat (limited to 'internal/server/api')
| -rw-r--r-- | internal/server/api/api.go | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/internal/server/api/api.go b/internal/server/api/api.go index 3d4d274..f932fbb 100644 --- a/internal/server/api/api.go +++ b/internal/server/api/api.go @@ -2,13 +2,17 @@ package api import ( "context" + "crypto/ed25519" + "database/sql" "log" + "strconv" "strings" "github.com/kyren223/eko/internal/data" "github.com/kyren223/eko/internal/packet" "github.com/kyren223/eko/internal/server/session" "github.com/kyren223/eko/pkg/assert" + "github.com/kyren223/eko/pkg/snowflake" ) func SendMessage(ctx context.Context, request *packet.SendMessage) packet.Payload { @@ -51,3 +55,33 @@ func GetMessages(ctx context.Context, request *packet.GetMessagesRange) packet.P } return &packet.Messages{Messages: messages} } + +func GetUserById(ctx context.Context, request *packet.GetUserByID) packet.Payload { + queries := data.New(db) + user, err := queries.GetUserById(ctx, request.UserID) + if err == sql.ErrNoRows { + return &packet.Users{Users: []data.User{}} + } + if err != nil { + log.Println("database error when retrieving user by id:", err) + return &packet.ErrorMessage{Error: "internal server error"} + } + return &packet.Users{Users: []data.User{user}} +} + +func CreateOrGetUser(ctx context.Context, node *snowflake.Node, pubKey ed25519.PublicKey) (data.User, error) { + queries := data.New(db) + user, err := queries.GetUserByPublicKey(ctx, pubKey) + if err == sql.ErrNoRows { + id := node.Generate() + user, err = queries.CreateUser(ctx, data.CreateUserParams{ + ID: id, + Name: "User" + strconv.FormatInt(id.Time() % 1000, 10), + PublicKey: pubKey, + }) + } + if err != nil { + return data.User{}, err + } + return user, nil +} |
