From a637ea9c335c385985a23510a4174d837fb51faf Mon Sep 17 00:00:00 2001 From: Kyren223 Date: Sat, 2 Nov 2024 20:12:18 +0200 Subject: feat: client can now send messages and the server saves thme in DB --- go.mod | 1 + go.sum | 2 ++ internal/client/api/api.go | 32 +++++++++++++++++++++++++++++++- internal/client/client.go | 12 +++++++++++- internal/server/api/api.go | 9 ++++++++- internal/server/api/database.go | 36 +++++++++++++++++++++++++++++++++++- 6 files changed, 88 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 2495298..0387b1d 100644 --- a/go.mod +++ b/go.mod @@ -6,6 +6,7 @@ require ( github.com/charmbracelet/bubbles v0.20.0 github.com/charmbracelet/bubbletea v1.1.1 github.com/charmbracelet/lipgloss v0.13.0 + github.com/mattn/go-sqlite3 v1.14.24 github.com/stretchr/testify v1.7.0 github.com/vmihailenco/msgpack/v5 v5.4.1 ) diff --git a/go.sum b/go.sum index 24305e7..73223d3 100644 --- a/go.sum +++ b/go.sum @@ -26,6 +26,8 @@ github.com/mattn/go-localereader v0.0.1 h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2J github.com/mattn/go-localereader v0.0.1/go.mod h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88= github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= +github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI= github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo= github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= diff --git a/internal/client/api/api.go b/internal/client/api/api.go index 9cfa1d4..d52b727 100644 --- a/internal/client/api/api.go +++ b/internal/client/api/api.go @@ -11,6 +11,7 @@ import ( "github.com/kyren223/eko/internal/data" "github.com/kyren223/eko/internal/packet" "github.com/kyren223/eko/pkg/assert" + "github.com/kyren223/eko/pkg/snowflake" ) type AppendMessage data.Message @@ -18,7 +19,11 @@ type AppendMessage data.Message func SendMessage(message string) tea.Cmd { return func() tea.Msg { log.Println("request SendMessage sent") - request := packet.SendMessage{Content: message} + frequencyId := snowflake.ID(1852771536100921344) + request := packet.SendMessage{ + Content: message, + FrequencyID: &frequencyId, + } response, ok := <-gateway.Send(&request) if !ok { log.Println() @@ -36,3 +41,28 @@ func SendMessage(message string) tea.Cmd { return fmt.Errorf("received invalid response from server: %v", response.Type()) } } + +func GetMessages() tea.Msg { + log.Println("request GetMessages sent") + frequencyId := snowflake.ID(1852771536100921344) + request := packet.GetMessagesRange{ + FrequencyID: &frequencyId, + ReceiverID: nil, + From: nil, + To: nil, + } + response, ok := <-gateway.Send(&request) + if !ok { + log.Println() + return errors.New("request timeout") + } + log.Println("request GetMessages received response") + + switch response := response.(type) { + case *packet.ErrorMessage: + return errors.New(response.Error) + case *packet.Messages: + return response + } + return fmt.Errorf("received invalid response from server: %v", response.Type()) +} diff --git a/internal/client/client.go b/internal/client/client.go index b091343..2dc432c 100644 --- a/internal/client/client.go +++ b/internal/client/client.go @@ -83,7 +83,7 @@ func initialModel() model { } func (m model) Init() tea.Cmd { - return textarea.Blink + return tea.Batch(textarea.Blink, api.GetMessages) } func (m model) View() string { @@ -158,6 +158,16 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) { return m, nil } + case api.AppendMessage: + m.messages = append(m.messages, msg.Content) + + m.viewport.SetContent(strings.Join(m.messages, "\n")) + m.viewport.GotoBottom() + + var cmd tea.Cmd + m.viewport, cmd = m.viewport.Update(msg) + return m, cmd + case cursor.BlinkMsg: var cmd tea.Cmd m.textarea, cmd = m.textarea.Update(msg) diff --git a/internal/server/api/api.go b/internal/server/api/api.go index 8f9e6c6..3d4d274 100644 --- a/internal/server/api/api.go +++ b/internal/server/api/api.go @@ -15,7 +15,7 @@ func SendMessage(ctx context.Context, request *packet.SendMessage) packet.Payloa sess, ok := session.FromContext(ctx) assert.Assert(ok, "context in process packet should always have a session") - if (request.ReceiverID != nil) != (request.FrequencyID != nil) { + if (request.ReceiverID != nil) == (request.FrequencyID != nil) { return &packet.ErrorMessage{Error: "either receiver id or frequency id must exist"} } @@ -43,4 +43,11 @@ func SendMessage(ctx context.Context, request *packet.SendMessage) packet.Payloa } func GetMessages(ctx context.Context, request *packet.GetMessagesRange) packet.Payload { + queries := data.New(db) + messages, err := queries.ListMessages(ctx) + if err != nil { + log.Println("database error when retrieving messages:", err) + return &packet.ErrorMessage{Error: "internal server error"} + } + return &packet.Messages{Messages: messages} } diff --git a/internal/server/api/database.go b/internal/server/api/database.go index 7057393..3546395 100644 --- a/internal/server/api/database.go +++ b/internal/server/api/database.go @@ -1,16 +1,23 @@ package api import ( + "context" + "crypto/ed25519" "database/sql" "log" + _ "github.com/mattn/go-sqlite3" + + "github.com/kyren223/eko/internal/data" "github.com/kyren223/eko/pkg/assert" + "github.com/kyren223/eko/pkg/snowflake" ) var db *sql.DB func ConnectToDatabase() { - db, err := sql.Open("sqlite3", "server.db") + var err error + db, err = sql.Open("sqlite3", "file:server.db?cache=shared") assert.NoError(err, "DB should always be accessible") assert.AddFlush(db) log.Println("established connection with the database") @@ -30,6 +37,33 @@ func ConnectToDatabase() { } func CloseDatabase() { + assert.NotNil(db, "db should only be closed if it exists") db.Close() log.Println("connection with database closed") } + +func demo() { + ctx := context.Background() + node := snowflake.NewNode(1) + pubKey, _, _ := ed25519.GenerateKey(nil) + + queries := data.New(db) + user, _ := queries.CreateUser(ctx, data.CreateUserParams{ + ID: node.Generate(), + PublicKey: pubKey, + }) + user, _ = queries.SetUserName(ctx, data.SetUserNameParams{ + ID: user.ID, + Name: "admin", + }) + network, _ := queries.CreateNetwork(ctx, data.CreateNetworkParams{ + ID: node.Generate(), + Name: "global", + OwnerID: user.ID, + }) + _, _ = queries.CreateFrequency(ctx, data.CreateFrequencyParams{ + ID: node.Generate(), + NetworkID: network.ID, + Name: "general", + }) +} -- cgit v1.3.1