Add basic database setup

This commit is contained in:
Dustin Pianalto
2021-01-20 21:06:01 -09:00
parent cfe683c53c
commit df8f8f2fa6
8 changed files with 827 additions and 1 deletions
+44
View File
@@ -0,0 +1,44 @@
package database
import (
"database/sql"
"fmt"
"log"
"github.com/dustinpianalto/geeksbot/internal/database/migrations"
"github.com/golang-migrate/migrate/v4"
"github.com/golang-migrate/migrate/v4/database/postgres"
bindata "github.com/golang-migrate/migrate/v4/source/go_bindata"
)
var (
db *sql.DB
)
func ConnectDatabase(dbConnString string) {
s := bindata.Resource(migrations.AssetNames(),
func(name string) ([]byte, error) {
return migrations.Asset(name)
})
db, err := sql.Open("postgres", dbConnString)
if err != nil {
log.Fatal(fmt.Errorf("Can't connect to the database: %w", err))
}
log.Println("Database Connected.")
db.SetMaxOpenConns(75)
db.SetMaxIdleConns(5)
db.SetConnMaxLifetime(300)
d, err := bindata.WithInstance(s)
if err != nil {
log.Fatal(fmt.Errorf("Cannot load migrations: %w", err))
}
instance, err := postgres.WithInstance(db, &postgres.Config{})
if err != nil {
log.Fatal(fmt.Errorf("Cannot create db driver: %w", err))
}
m, err := migrate.NewWithInstance("go-bindata", d, "postgres", instance)
if err != nil {
log.Fatal(fmt.Errorf("Cannot create migration instance: %w", err))
}
m.Up()
}
@@ -0,0 +1,13 @@
BEGIN;
DROP TABLE IF EXISTS servers;
DROP TABLE IF EXISTS comments;
DROP TABLE IF EXISTS requests;
DROP TABLE IF EXISTS patreon_tier;
DROP TABLE IF EXISTS patreon_creator;
DROP TABLE IF EXISTS messages;
DROP TABLE IF EXISTS users;
DROP TABLE IF EXISTS channels;
DROP TABLE IF EXISTS roles;
DROP TYPE IF EXISTS role_types;
DROP TABLE IF EXISTS guilds;
COMMIT;
@@ -0,0 +1,174 @@
BEGIN;
CREATE TABLE IF NOT EXISTS guilds (
id varchar(30),
new_patron_message varchar(1000),
prefixes varchar(10)[],
PRIMARY KEY(id)
);
CREATE TYPE IF NOT EXISTS role_type as ENUM (
'normal',
'moderator',
'admin',
'patreon'
);
CREATE TABLE IF NOT EXISTS roles (
id varchar(30),
role_type role_type,
guild_id varchar(30),
PRIMARY KEY(id),
CONSTRAINT fk_guild
FOREIGN KEY(guild_id)
REFERENCES guilds(id)
ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS channels (
id varchar(30),
guild_id varchar(30),
admin boolean,
default boolean,
new_patron boolean,
PRIMARY KEY(id),
CONSTRAINT fk_guild
FOREIGN KEY(guild_id)
REFERENCES guilds(id)
ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS users (
id varchar(30),
steam_id varchar(30),
active boolean,
staff boolean,
admin boolean,
PRIMARY KEY(id)
);
CREATE TABLE IF NOT EXISTS messages (
id varchar(30),
created_at timestamp,
modified_at timestamp,
content varchar(2000)
previous_content varchar(2000)[],
channel_id varchar(30),
author_id varchar(30),
embed json,
previous_embeds json[],
PRIMARY KEY(id),
CONSTRAINT fk_channel
FOREIGN KEY(channel_id)
REFERENCES channels(id)
ON DELETE CASCADE,
CONSTRAINT fk_user
FOREIGN KEY(author_id)
REFERENCES users(id)
ON DELETE SET NULL
);
CREATE TABLE IF NOT EXISTS patreon_creator (
id integer GENERATED ALWAYS AS IDENTITY,
creator varchar(100),
link varchar(200),
guild_id varchar(30),
PRIMARY KEY(id),
CONSTRAINT fk_guild
FOREIGN KEY(guild_id)
REFERENCES guilds(id)
ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS patreon_tier (
id integer GENERATED ALWAYS AS IDENTITY,
name varchar(100),
description varchar(1000),
creator integer,
role varchar(30),
next_tier integer,
PRIMARY KEY(id),
CONSTRAINT fk_creator
FOREIGN KEY(creator)
REFERENCES patreon_creator(id)
ON DELETE CASCADE,
CONSTRAINT fk_role
FOREIGN KEY(role)
REFERENCES roles(id)
ON DELETE SET NULL,
CONSTRAINT fk_tier
FOREIGN_KEY(next_tier)
REFERENCES patreon_tier(id)
ON DELETE SET NULL
);
CREATE TABLE IF NOT EXISTS requests (
id integer GENERATED ALWAYS AS IDENTITY,
author_id varchar(30),
channel_id varchar(30),
content varchar(1000),
requested_at timestamp,
completed_at timestamp,
completed boolean,
completed_by varchar(30),
message_id varchar(30),
completed_message varchar(1000),
PRIMARY KEY(id),
CONSTRAINT fk_user
FOREIGN KEY(author_id)
REFERENCES users(id)
ON DELETE CASCADE,
CONSTRAINT fk_channel
FOREIGN KEY(channel_id)
REFERENCES channels(id)
ON DELETE CASCADE,
CONSTRAINT fk_completed_by
FOREIGN KEY(completed_by)
REFERENCES users(id)
ON DELETE SET NULL,
CONSTRAINT fk_message
FOREIGN KEY(message_id)
REFERENCES messages(id)
ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS comments (
id integer GENERATED ALWAYS AS IDENTITY,
author_id varchar(30),
request_id integer,
comment_at timestamp,
content varchar(1000),
PRIMARY KEY(id),
CONSTRAINT fk_user
FOREIGN KEY(author_id)
REFERENCES users(id)
ON DELETE CASCADE,
CONSTRAINT fk_request
FOREIGN KEY(request_id)
REFERENCES requests(id)
ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS servers (
id integer GENERATED ALWAYS AS IDENTITY,
name varchar(100),
ip_address varchar(15),
port integer,
password varchar(200),
alerts_channel_id varchar(30),
guild_id varchar(30),
info_channel_id varchar(30),
info_message_id varchar(30),
settings_message_id varchar(30),
PRIMARY KEY(id),
CONSTRAINT fk_alert_channel
FOREIGN KEY(alerts_channel_id)
REFERENCES channels(id)
ON DELETE SET NULL,
CONSTRAINT fk_guild
FOREIGN KEY(guild_id)
REFERENCES guilds(id)
ON DELETE CASCADE,
CONSTRAINT fk_info_channel
FOREIGN KEY(info_channel_id)
REFERENCES channels(id)
ON DELETE SET NULL,
CONSTRAINT fk_info_message
FOREIGN KEY(info_message_id)
REFERENCES messages(id)
ON DELETE SET NULL,
CONSTRAINT fk_settings_message
FOREIGN KEY(settings_message_id)
REFERENCES messages(id)
ON DELETE SET NULL
);
COMMIT;