diff --git a/guild.go b/guild.go index b4771c5..faf1195 100644 --- a/guild.go +++ b/guild.go @@ -1,8 +1,10 @@ package geeksbot +import "database/sql" + type Guild struct { ID string - NewPatronMessage string + NewPatronMessage sql.NullString Prefixes []string } diff --git a/internal/database/migrations/000003_set_column_not_null.down.sql b/internal/database/migrations/000003_set_column_not_null.down.sql new file mode 100644 index 0000000..9b37ca6 --- /dev/null +++ b/internal/database/migrations/000003_set_column_not_null.down.sql @@ -0,0 +1,45 @@ +BEGIN; + ALTER TABLE users + ALTER COLUMN active DROP NOT NULL, + ALTER COLUMN staff DROP NOT NULL, + ALTER COLUMN admin DROP NOT NULL; + ALTER TABLE channels + ALTER COLUMN guild_id DROP NOT NULL, + ALTER COLUMN admin DROP NOT NULL, + ALTER COLUMN default_channel DROP NOT NULL, + ALTER COLUMN new_patron DROP NOT NULL; + ALTER TABLE messages + ALTER COLUMN created_at DROP NOT NULL, + ALTER COLUMN content DROP NOT NULL, + ALTER COLUMN channel_id DROP NOT NULL, + ALTER COLUMN author_id DROP NOT NULL, + ADD COLUMN embed json, + ADD COLUMN previous_embeds json[]; + ALTER TABLE patreon_creators + RENAME TO patreon_creator, + ALTER COLUMN creator DROP NOT NULL, + ALTER COLUMN link DROP NOT NULL, + ALTER COLUMN guild_id DROP NOT NULL; + ALTER TABLE patreon_tiers + RENAME TO patreon_tier, + ALTER COLUMN name DROP NOT NULL, + ALTER COLUMN creator DROP NOT NULL, + ALTER COLUMN role DROP NOT NULL; + ALTER TABLE requests + ALTER COLUMN author_id DROP NOT NULL, + ALTER COLUMN channel_id DROP NOT NULL, + ALTER COLUMN content DROP NOT NULL, + ALTER COLUMN requested_at DROP NOT NULL, + ALTER COLUMN completed DROP NOT NULL, + ALTER COLUMN message_id DROP NOT NULL, + ALTER COLUMN guild_id DROP NOT NULL; + ALTER TABLE roles + ALTER COLUMN role_type DROP NOT NULL, + ALTER COLUMN guild_id DROP NOT NULL; + ALTER TABLE servers + ALTER COLUMN name DROP NOT NULL, + ALTER COLUMN ip_address DROP NOT NULL, + ALTER COLUMN port DROP NOT NULL, + ALTER COLUMN password DROP NOT NULL, + ALTER COLUMN guild_id DROP NOT NULL; +COMMIT; diff --git a/internal/database/migrations/000003_set_column_not_null.up.sql b/internal/database/migrations/000003_set_column_not_null.up.sql new file mode 100644 index 0000000..1865317 --- /dev/null +++ b/internal/database/migrations/000003_set_column_not_null.up.sql @@ -0,0 +1,45 @@ +BEGIN; + ALTER TABLE users + ALTER COLUMN active SET NOT NULL, + ALTER COLUMN staff SET NOT NULL, + ALTER COLUMN admin SET NOT NULL; + ALTER TABLE channels + ALTER COLUMN guild_id SET NOT NULL, + ALTER COLUMN admin SET NOT NULL, + ALTER COLUMN default_channel SET NOT NULL, + ALTER COLUMN new_patron SET NOT NULL; + ALTER TABLE messages + ALTER COLUMN created_at SET NOT NULL, + ALTER COLUMN content SET NOT NULL, + ALTER COLUMN channel_id SET NOT NULL, + ALTER COLUMN author_id SET NOT NULL, + DROP COLUMN embed, + DROP COLUMN previous_embeds; + ALTER TABLE patreon_creator + RENAME TO patreon_creators, + ALTER COLUMN creator SET NOT NULL, + ALTER COLUMN link SET NOT NULL, + ALTER COLUMN guild_id SET NOT NULL; + ALTER TABLE patreon_tier + RENAME TO patreon_tiers, + ALTER COLUMN name SET NOT NULL, + ALTER COLUMN creator SET NOT NULL, + ALTER COLUMN role SET NOT NULL; + ALTER TABLE requests + ALTER COLUMN author_id SET NOT NULL, + ALTER COLUMN channel_id SET NOT NULL, + ALTER COLUMN content SET NOT NULL, + ALTER COLUMN requested_at SET NOT NULL, + ALTER COLUMN completed SET NOT NULL, + ALTER COLUMN message_id SET NOT NULL, + ALTER COLUMN guild_id SET NOT NULL; + ALTER TABLE roles + ALTER COLUMN role_type SET NOT NULL, + ALTER COLUMN guild_id SET NOT NULL; + ALTER TABLE servers + ALTER COLUMN name SET NOT NULL, + ALTER COLUMN ip_address SET NOT NULL, + ALTER COLUMN port SET NOT NULL, + ALTER COLUMN password SET NOT NULL, + ALTER COLUMN guild_id SET NOT NULL; +COMMIT; diff --git a/internal/database/request.go b/internal/database/request.go index 0f428f7..97d9e7e 100644 --- a/internal/database/request.go +++ b/internal/database/request.go @@ -16,7 +16,7 @@ func (s requestService) Request(id int64) (geeksbot.Request, error) { var aID string var cID string var gID string - var uID string + var uID sql.NullString var mID string queryString := `SELECT id, author_id, channel_id, guild_id, content, requested_at, completed, completed_at, completed_by, message_id, completed_message @@ -39,9 +39,14 @@ func (s requestService) Request(id int64) (geeksbot.Request, error) { if err != nil { return geeksbot.Request{}, err } - completedBy, err := UserService.User(uID) - if err != nil { - return geeksbot.Request{}, err + if !uID.Valid { + r.CompletedBy = nil + } else { + completedBy, err := UserService.User(uID.String) + if err != nil { + return geeksbot.Request{}, err + } + r.CompletedBy = &completedBy } message, err := MessageService.Message(mID) if err != nil { @@ -50,7 +55,6 @@ func (s requestService) Request(id int64) (geeksbot.Request, error) { r.Author = author r.Guild = guild r.Channel = channel - r.CompletedBy = completedBy r.Message = message return r, nil } diff --git a/internal/database/server.go b/internal/database/server.go index 8a9c3a8..5498160 100644 --- a/internal/database/server.go +++ b/internal/database/server.go @@ -14,10 +14,10 @@ type serverService struct { func (s serverService) ServerByID(id int) (geeksbot.Server, error) { var server geeksbot.Server var guildID string - var aChanID string - var iChanID string - var iMsgID string - var sMsgID string + var aChanID sql.NullString + var iChanID sql.NullString + var iMsgID sql.NullString + var sMsgID sql.NullString queryString := `SELECT id, name, ip_address, port, password, alerts_channel_id, guild_id, info_channel_id, info_message_id, settings_message_id FROM servers WHERE id = $1` @@ -31,27 +31,43 @@ func (s serverService) ServerByID(id int) (geeksbot.Server, error) { if err != nil { return geeksbot.Server{}, err } - alertChannel, err := ChannelService.Channel(aChanID) - if err != nil { - return geeksbot.Server{}, err + if !aChanID.Valid { + server.AlertsChannel = nil + } else { + alertChannel, err := ChannelService.Channel(aChanID.String) + if err != nil { + return geeksbot.Server{}, err + } + server.AlertsChannel = &alertChannel } - infoChannel, err := ChannelService.Channel(iChanID) - if err != nil { - return geeksbot.Server{}, err + if !iChanID.Valid { + server.InfoChannel = nil + } else { + infoChannel, err := ChannelService.Channel(iChanID.String) + if err != nil { + return geeksbot.Server{}, err + } + server.InfoChannel = &infoChannel } - infoMessage, err := MessageService.Message(iMsgID) - if err != nil { - return geeksbot.Server{}, err + if !iMsgID.Valid { + server.InfoMessage = nil + } else { + infoMessage, err := MessageService.Message(iMsgID.String) + if err != nil { + return geeksbot.Server{}, err + } + server.InfoMessage = &infoMessage } - settingsMessage, err := MessageService.Message(sMsgID) - if err != nil { - return geeksbot.Server{}, err + if !sMsgID.Valid { + server.SettingsMessage = nil + } else { + settingsMessage, err := MessageService.Message(sMsgID.String) + if err != nil { + return geeksbot.Server{}, err + } + server.SettingsMessage = &settingsMessage } server.Guild = guild - server.AlertsChannel = alertChannel - server.InfoChannel = infoChannel - server.InfoMessage = infoMessage - server.SettingsMessage = settingsMessage return server, nil } diff --git a/message.go b/message.go index 7316e91..8445bac 100644 --- a/message.go +++ b/message.go @@ -1,9 +1,11 @@ package geeksbot +import "database/sql" + type Message struct { ID string CreatedAt int64 - ModifiedAt int64 + ModifiedAt sql.NullTime Content string PreviousContent []string Channel Channel diff --git a/patreon.go b/patreon.go index 0ceaa6a..1a564a3 100644 --- a/patreon.go +++ b/patreon.go @@ -1,5 +1,7 @@ package geeksbot +import "database/sql" + type PatreonCreator struct { ID int Creator string @@ -10,7 +12,7 @@ type PatreonCreator struct { type PatreonTier struct { ID int Name string - Description string + Description sql.NullString Creator PatreonCreator Role Role NextTier *PatreonTier diff --git a/request.go b/request.go index bd7fd8a..0c66856 100644 --- a/request.go +++ b/request.go @@ -1,6 +1,9 @@ package geeksbot -import "time" +import ( + "database/sql" + "time" +) type Request struct { ID int64 @@ -10,10 +13,10 @@ type Request struct { Content string RequestedAt time.Time Completed bool - CompletedAt time.Time - CompletedBy User + CompletedAt sql.NullTime + CompletedBy *User Message Message - CompletedMessage string + CompletedMessage sql.NullString } type Comment struct { diff --git a/server.go b/server.go index a7ebe53..4e71ac9 100644 --- a/server.go +++ b/server.go @@ -6,11 +6,11 @@ type Server struct { IPAddr string Port int Password string - AlertsChannel Channel + AlertsChannel *Channel Guild Guild - InfoChannel Channel - InfoMessage Message - SettingsMessage Message + InfoChannel *Channel + InfoMessage *Message + SettingsMessage *Message } type ServerService interface {