From 0e96cfc3af6567e828f0ef1272e6a5db19d6ec4d Mon Sep 17 00:00:00 2001 From: "Gustavo \"Guz\" L. de Mello" Date: Thu, 8 Aug 2024 20:26:55 -0300 Subject: [PATCH] feat(guilddd,sqlite): messages implementation --- internals/guilddb/guilddb.go | 35 ++++++++++ internals/guilddb/sqlite.go | 120 +++++++++++++++++++++++++++++++++++ 2 files changed, 155 insertions(+) create mode 100644 internals/guilddb/guilddb.go create mode 100644 internals/guilddb/sqlite.go diff --git a/internals/guilddb/guilddb.go b/internals/guilddb/guilddb.go new file mode 100644 index 0000000..f2d04ad --- /dev/null +++ b/internals/guilddb/guilddb.go @@ -0,0 +1,35 @@ +package guilddb + +import ( + "dislate/internals/lang" + "errors" +) + +type Message struct { + ID string + ChannelID string + Language lang.Language + OriginID *string + OriginChannelID *string +} + +type Channel struct { + ID string + Language lang.Language +} + +type ChannelGroup []Channel + +type UserWebhook struct { + ID string + ChannelID string + UserID string + Token string +} + +type GuildDB interface { +} + +var ErrNoAffect = errors.New("Not able to affect anything in the database") +var ErrNoMessages = errors.New("Messages not found in database") +var ErrInternal = errors.New("Internal error while trying to use database") diff --git a/internals/guilddb/sqlite.go b/internals/guilddb/sqlite.go new file mode 100644 index 0000000..87e0933 --- /dev/null +++ b/internals/guilddb/sqlite.go @@ -0,0 +1,120 @@ +package guilddb + +import ( + "database/sql" + "errors" + "fmt" + "slices" + "strings" + + "dislate/internals/lang" +) + +type SQLiteDB struct { + sql *sql.DB +} + +func NewSQLiteDB(db *sql.DB) SQLiteDB { + return SQLiteDB{db} +} + +func (db *SQLiteDB) Prepare() error { + _, err := db.sql.Exec(` + INSERT TABLE IF NOT EXISTS guild.messages ( + ID text NOT NULL, + ChannelID text NOT NULL, + Language text NOT NULL, + OriginID text, + OriginChannelID text, + PRIMARY KEY(ID, ChannelID) + FOREIGN KEY(ChannelID) REFERENCES guild.channels(ID), + FOREIGN KEY(OriginalID) REFERENCES guild.messages(ID) + ); + `) + if err != nil { + return errors.Join(ErrInternal, err) + } + + _, err = db.sql.Exec(` + INSERT TABLE IF NOT EXISTS guild-v1.channels ( + ID text NOT NULL, + Language text NOT NULL, + PRIMARY KEY(ID) + ); + INSERT TABLE IF NOT EXISTS guild-v1.channel-groups ( + Channels text NOT NULL PRIMARY KEY + ); + `) + if err != nil { + return errors.Join(ErrInternal, err) + } + + _, err = db.sql.Exec(` + INSERT TABLE IF NOT EXISTS guild-v1.user-webhooks ( + ID text NOT NULL, + ChannelID text NOT NULL, + UserID text NOT NULL, + Token text NOT NULL, + PRIMARY KEY(ID, ChannelID, UserID) + ); + `) + if err != nil { + return errors.Join(ErrInternal, err) + } + + return nil +} + +func (db *SQLiteDB) Message(channelID, messageID string) (Message, error) { + return db.selectMessage(` + SELECT * FROM guild-v1.messages + WHERE "ID" = $1 AND "ChannelID" = $2 + `, channelID, messageID) +} + +func (db *SQLiteDB) MessageInsert(m Message) error { + r, err := db.sql.Exec(` + INSERT INTO guild-v1.messages (ID, ChannelID, Language, OriginID, OriginChannelID) + VALUES ($1, $2, $3, $4, $5) + `, m.ID, m.ChannelID, m.Language, m.OriginID, m.OriginChannelID) + + if err != nil { + return errors.Join(ErrInternal, err) + } else if rows, _ := r.RowsAffected(); rows == 0 { + return ErrNoAffect + } + + return nil +} + +func (db *SQLiteDB) selectMessages(query string, args ...any) ([]Message, error) { + r, err := db.sql.Query(query, args...) + + if err != nil { + return []Message{}, errors.Join(ErrInternal, err) + } + + var ms []Message + for r.Next() { + var m Message + + err = r.Scan(&m.ID, &m.ChannelID, &m.Language, &m.OriginID, &m.OriginChannelID) + if err != nil { + return ms, errors.Join( + ErrInternal, + fmt.Errorf("Query: %s\nArguments: %v", query, args), + err, + ) + } + + ms = append(ms, m) + } + + if len(ms) == 0 { + return ms, errors.Join( + ErrNoMessages, + fmt.Errorf("Query: %s\nArguments: %v", query, args), + ) + } + return ms, err +}