Repo Reorg
This commit is contained in:
@@ -0,0 +1,157 @@
|
||||
package postgres
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"fmt"
|
||||
"log"
|
||||
|
||||
_ "github.com/lib/pq"
|
||||
)
|
||||
|
||||
var (
|
||||
DB *sql.DB
|
||||
)
|
||||
|
||||
func ConnectDatabase(dbConnString string) {
|
||||
db, err := sql.Open("postgres", dbConnString)
|
||||
if err != nil {
|
||||
panic(fmt.Sprintf("Can't connect to the database. %v", err))
|
||||
} else {
|
||||
fmt.Println("Database Connected.")
|
||||
}
|
||||
db.SetMaxOpenConns(75) // The RDS instance has a max of 75 open connections
|
||||
db.SetMaxIdleConns(5)
|
||||
db.SetConnMaxLifetime(300)
|
||||
DB = db
|
||||
}
|
||||
|
||||
func InitializeDatabase() {
|
||||
_, err := DB.Query("CREATE TABLE IF NOT EXISTS users(" +
|
||||
"id varchar(30) primary key," +
|
||||
"banned bool not null default false," +
|
||||
"logging bool not null default true," +
|
||||
"steam_id varchar(30) NOT NULL DEFAULT ''," +
|
||||
"is_active bool not null default true," +
|
||||
"is_staff bool not null default false," +
|
||||
"is_admin bool not null default false" +
|
||||
")")
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
_, err = DB.Query("CREATE TABLE IF NOT EXISTS guilds(" +
|
||||
"id varchar(30) primary key," +
|
||||
"welcome_message varchar(1000) NOT NULL DEFAULT ''," +
|
||||
"goodbye_message varchar(1000) NOT NULL DEFAULT ''," +
|
||||
"logging_channel varchar(30) NOT NULL DEFAULT ''," +
|
||||
"welcome_channel varchar(30) NOT NULL DEFAULT ''" +
|
||||
")")
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
_, err = DB.Query("CREATE TABLE IF NOT EXISTS prefixes(" +
|
||||
"id serial primary key," +
|
||||
"prefix varchar(10) not null unique default 'Go.'" +
|
||||
")")
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
_, err = DB.Query("CREATE TABLE IF NOT EXISTS tags(" +
|
||||
"id serial primary key," +
|
||||
"tag varchar(100) not null unique," +
|
||||
"content varchar(1000) not null," +
|
||||
"creator varchar(30) not null references users(id)," +
|
||||
"creation_time timestamp not null default NOW()," +
|
||||
"guild_id varchar(30) not null references guilds(id)" +
|
||||
")")
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
_, err = DB.Query("CREATE TABLE IF NOT EXISTS x_users_guilds(" +
|
||||
"guild_id varchar(30) not null references guilds(id)," +
|
||||
"user_id varchar(30) not null references users(id)" +
|
||||
")")
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
_, err = DB.Query("CREATE TABLE IF NOT EXISTS x_guilds_prefixes(" +
|
||||
"guild_id varchar(30) not null references guilds(id)," +
|
||||
"prefix_id int not null references prefixes(id)" +
|
||||
")")
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
_, err = DB.Query("CREATE TABLE IF NOT EXISTS tasks(" +
|
||||
"id serial primary key," +
|
||||
"type varchar(10) not null," +
|
||||
"content text not null," +
|
||||
"guild_id varchar(30) not null references guilds(id)," +
|
||||
"channel_id varchar(30) not null," +
|
||||
"user_id varchar(30) not null," +
|
||||
"creation_time timestamp not null default NOW()," +
|
||||
"trigger_time timestamp not null," +
|
||||
"completed bool not null default false," +
|
||||
"processing bool default false)")
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
_, err = DB.Query(`CREATE TABLE IF NOT EXISTS postfixes(
|
||||
id serial primary key,
|
||||
name varchar(100) not null,
|
||||
time timestamp not null default NOW())`)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
}
|
||||
_, err = DB.Exec(`CREATE TABLE IF NOT EXISTS puzzles(
|
||||
id serial primary key,
|
||||
text text not null,
|
||||
time timestamp not null
|
||||
)`)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
}
|
||||
_, err = DB.Exec(`CREATE TABLE IF NOT EXISTS x_guilds_puzzles(
|
||||
id serial primary key,
|
||||
guild_id varchar(30) not null references guilds(id),
|
||||
puzzle_id int not null references puzzles(id),
|
||||
message_id varchar(30) not null
|
||||
)`)
|
||||
RunPostfixes()
|
||||
}
|
||||
|
||||
func LoadTestData() {
|
||||
_, err := DB.Query("INSERT INTO users (id, banned, logging, steam_id, is_active, is_staff, is_admin) values " +
|
||||
"('351794468870946827', false, true, '76561198024193239', true, true, true)," +
|
||||
"('692908139506434065', false, true, '', true, false, false)," +
|
||||
"('396588996706304010', false, true, '', true, true, false)")
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
_, err = DB.Query("INSERT INTO guilds (id, welcome_message, goodbye_message) VALUES " +
|
||||
"('265828729970753537', 'Hey there is someone new here.', 'Well fine then... Just leave without saying goodbye')")
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
_, err = DB.Query("INSERT INTO prefixes (prefix) VALUES ('Godev.'), ('godev.'), ('godev,')")
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
_, err = DB.Query("INSERT INTO x_users_guilds (guild_id, user_id) VALUES " +
|
||||
"('265828729970753537', '351794468870946827')," +
|
||||
"('265828729970753537', '692908139506434065')," +
|
||||
"('265828729970753537', '396588996706304010')")
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
_, err = DB.Query("INSERT INTO x_guilds_prefixes (guild_id, prefix_id) VALUES " +
|
||||
"('265828729970753537', 1)," +
|
||||
"('265828729970753537', 2)," +
|
||||
"('265828729970753537', 3)")
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
_, err = DB.Query("INSERT INTO tags (tag, content, creator, guild_id) VALUES " +
|
||||
"('test', 'This is a test of the tag system', '351794468870946827', '265828729970753537')")
|
||||
if err != nil {
|
||||
fmt.Println(err)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
package postgres
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
|
||||
"github.com/dustinpianalto/goff"
|
||||
)
|
||||
|
||||
type GuildService struct {
|
||||
DB *sql.DB
|
||||
}
|
||||
|
||||
func (s *GuildService) Guild(id string) (*goff.Guild, error) {
|
||||
var g goff.Guild
|
||||
queryString := `SELECT id, welcome_message, goodbye_message,
|
||||
logging_channel, welcome_channel, puzzle_channel, puzzle_role
|
||||
FROM guilds
|
||||
WHERE id = $1`
|
||||
row := s.DB.QueryRow(queryString, id)
|
||||
err := row.Scan(
|
||||
&g.ID,
|
||||
&g.WelcomeMessage,
|
||||
&g.GoodbyeMessage,
|
||||
&g.LoggingChannel,
|
||||
&g.WelcomeChannel,
|
||||
&g.PuzzleChannel,
|
||||
&g.PuzzleRole,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var prefixes []string
|
||||
queryString = `SELECT p.prefix
|
||||
FROM prefixes p, x_guilds_prefixes xgp
|
||||
WHERE p.id = xgp.prefix_id AND xgp.guild_id = $1`
|
||||
rows, err := s.DB.Query(queryString, id)
|
||||
if err == nil {
|
||||
for rows.Next() {
|
||||
var prefix string
|
||||
err = rows.Scan(&prefix)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
prefixes = append(prefixes, prefix)
|
||||
}
|
||||
}
|
||||
g.Prefixes = prefixes
|
||||
return &g, nil
|
||||
}
|
||||
|
||||
func (s *GuildService) CreateGuild(g *goff.Guild) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *GuildService) DeleteGuild(g *goff.Guild) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *GuildService) GuildUsers(g *goff.Guild) ([]*goff.User, error) {
|
||||
return []*goff.User{}, nil
|
||||
}
|
||||
|
||||
func (s *GuildService) UpdateGuild(g *goff.Guild) error {
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,164 @@
|
||||
package postgres
|
||||
|
||||
import "log"
|
||||
|
||||
type postfix struct {
|
||||
Name string
|
||||
Invoke func(bool) error
|
||||
}
|
||||
|
||||
var postfixes = []postfix{
|
||||
postfix{
|
||||
Name: "1_Update_Guild_for_Puzzle",
|
||||
Invoke: updateGuildForPuzzle,
|
||||
},
|
||||
postfix{
|
||||
Name: "1_Update_X_Guild_Prefixes_to_add_ID",
|
||||
Invoke: updateXGuildPrefixesToAddID,
|
||||
},
|
||||
postfix{
|
||||
Name: "1_Update_Tags_Content_Length",
|
||||
Invoke: updateTagsContentLength,
|
||||
},
|
||||
postfix{
|
||||
Name: "2_Add_Table_Roles",
|
||||
Invoke: addTableRoles,
|
||||
},
|
||||
postfix{
|
||||
Name: "3_Update_Guild_Add_Puzzle_Role",
|
||||
Invoke: updateGuildsAddPuzzleRole,
|
||||
},
|
||||
postfix{
|
||||
Name: "4_Add_Multi_Column_Unique_XUsersGuilds",
|
||||
Invoke: addMultiColumnUniqueXUsersGuilds,
|
||||
},
|
||||
}
|
||||
|
||||
func RunPostfixes() {
|
||||
for _, postfix := range postfixes {
|
||||
queryString := "SELECT * from postfixes where name = $1"
|
||||
rows, err := DB.Query(queryString, postfix.Name)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
continue
|
||||
}
|
||||
if rows.Next() {
|
||||
continue
|
||||
} else {
|
||||
err := postfix.Invoke(false)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
_, err = DB.Exec("INSERT INTO postfixes (name) VALUES ($1)", postfix.Name)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func updateGuildForPuzzle(revert bool) error {
|
||||
var queryString string
|
||||
if !revert {
|
||||
queryString = `ALTER TABLE guilds
|
||||
ADD COLUMN puzzle_channel varchar(30) not null default ''`
|
||||
} else {
|
||||
queryString = `ALTER TABLE guilds
|
||||
DROP COLUMN puzzleChat`
|
||||
}
|
||||
_, err := DB.Exec(queryString)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func updateXGuildPrefixesToAddID(revert bool) error {
|
||||
var queryString string
|
||||
if !revert {
|
||||
queryString = `ALTER TABLE x_guilds_prefixes
|
||||
ADD COLUMN id serial primary key`
|
||||
} else {
|
||||
queryString = `ALTER TABLE x_guilds_prefixes
|
||||
DROP COLUMN id`
|
||||
}
|
||||
_, err := DB.Exec(queryString)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func updateTagsContentLength(revert bool) error {
|
||||
var queryString string
|
||||
if !revert {
|
||||
queryString = `ALTER TABLE tags
|
||||
ALTER COLUMN content TYPE varchar(2000)`
|
||||
} else {
|
||||
queryString = `ALTER TABLE tags
|
||||
ALTER COLUMN content TYPE varchar(1000)`
|
||||
}
|
||||
_, err := DB.Exec(queryString)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func addTableRoles(revert bool) error {
|
||||
var queryString string
|
||||
if !revert {
|
||||
queryString = `CREATE TABLE roles(
|
||||
id varchar(30) primary key,
|
||||
guild_id varchar(30) not null references guilds(id),
|
||||
self_assignable bool not null default false,
|
||||
admin bool not null default false,
|
||||
moderator bool not null default false
|
||||
)`
|
||||
} else {
|
||||
queryString = `DROP TABLE roles`
|
||||
}
|
||||
_, err := DB.Exec(queryString)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func updateGuildsAddPuzzleRole(revert bool) error {
|
||||
var queryString string
|
||||
if !revert {
|
||||
queryString = `ALTER TABLE guilds
|
||||
ADD COLUMN puzzle_role varchar(30) references roles(id)`
|
||||
} else {
|
||||
queryString = `ALTER TABLE guilds
|
||||
DROP COLUMN puzzle_role`
|
||||
}
|
||||
_, err := DB.Exec(queryString)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func addMultiColumnUniqueXUsersGuilds(revert bool) error {
|
||||
var queryString string
|
||||
if !revert {
|
||||
queryString = `ALTER TABLE x_users_guilds
|
||||
ADD CONSTRAINT u_user_guild UNIQUE(user_id, guild_id)`
|
||||
} else {
|
||||
queryString = `ALTER TABLE DROP CONSTRAINT u_user_guild IF EXISTS`
|
||||
}
|
||||
_, err := DB.Exec(queryString)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
package postgres
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
|
||||
"github.com/dustinpianalto/goff"
|
||||
)
|
||||
|
||||
type UserService struct {
|
||||
DB *sql.DB
|
||||
}
|
||||
|
||||
func (s *UserService) User(id string) (*goff.User, error) {
|
||||
var u goff.User
|
||||
queryString := `SELECT id, banned, logging, steam_id, is_active, is_staff, is_admin
|
||||
FROM users WHERE id=$1`
|
||||
row := s.DB.QueryRow(queryString, id)
|
||||
if err := row.Scan(&u.ID, &u.Banned, &u.Logging, &u.SteamID, &u.IsActive, &u.IsStaff, &u.IsAdmin); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var guilds []string
|
||||
queryString = `SELECT guild_id from x_users_guilds WHERE user_id=$1`
|
||||
rows, err := s.DB.Query(queryString, id)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for rows.Next() {
|
||||
var guildID string
|
||||
err = rows.Scan(&guildID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
guilds = append(guilds, guildID)
|
||||
}
|
||||
u.Guilds = guilds
|
||||
return &u, nil
|
||||
}
|
||||
|
||||
func (s *UserService) CreateUser(u *goff.User) error {
|
||||
queryString := `INSERT INTO users (id, banned, logging, steam_id, is_active, is_staff, is_admin)
|
||||
VALUES ($1, $2, $3, $4, $5, $6, $7)`
|
||||
_, err := s.DB.Exec(queryString, u.ID, u.Banned, u.Logging, u.SteamID, u.IsActive, u.IsStaff, u.IsAdmin)
|
||||
return err
|
||||
}
|
||||
|
||||
func (s *UserService) DeleteUser(u *goff.User) error {
|
||||
queryString := `DELETE FROM x_users_guilds WHERE user_id = $1; DELETE FROM users WHERE id = $1`
|
||||
_, err := s.DB.Exec(queryString, u.ID)
|
||||
return err
|
||||
}
|
||||
|
||||
func (s *UserService) MarkUserInactive(u *goff.User) error {
|
||||
queryString := `UPDATE users SET is_active = false WHERE id = $1`
|
||||
_, err := s.DB.Exec(queryString, u.ID)
|
||||
if err == nil {
|
||||
u.IsActive = false
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func (s *UserService) AddUserToGuild(u *goff.User, g *goff.Guild) error {
|
||||
queryString := `INSERT INTO x_users_guilds (user_id, guild_id) VALUES ($1, $2)`
|
||||
_, err := s.DB.Exec(queryString, u.ID, g.ID)
|
||||
return err
|
||||
}
|
||||
|
||||
func (s *UserService) RemoveUserFromGuild(u *goff.User, g *goff.Guild) error {
|
||||
queryString := `DELETE FROM x_users_guilds WHERE user_id = $1 AND guild_id = $2`
|
||||
_, err := s.DB.Exec(queryString, u.ID, g.ID)
|
||||
return err
|
||||
}
|
||||
|
||||
func (s *UserService) UpdateUser(u *goff.User) error {
|
||||
queryString := `UPDATE users SET
|
||||
banned = $1
|
||||
logging = $2
|
||||
steam_id = $3
|
||||
is_active = $4
|
||||
is_staff = $5
|
||||
is_admin = $6
|
||||
WHERE id = $7`
|
||||
_, err := s.DB.Exec(queryString, u.Banned, u.Logging, u.SteamID, u.IsActive, u.IsStaff, u.IsAdmin)
|
||||
return err
|
||||
}
|
||||
Reference in New Issue
Block a user