76 lines
1.6 KiB
Go
76 lines
1.6 KiB
Go
package db
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"time"
|
|
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
"go.mongodb.org/mongo-driver/mongo"
|
|
"go.mongodb.org/mongo-driver/mongo/options"
|
|
)
|
|
|
|
type DB struct {
|
|
Initialized bool
|
|
Ctx context.Context
|
|
URI string
|
|
Database *mongo.Database
|
|
Client *mongo.Client
|
|
}
|
|
|
|
type EmptyStruct struct {
|
|
}
|
|
|
|
var database DB = DB{}
|
|
|
|
func Init(URI string) (DB, error) {
|
|
if (DB{}) != database {
|
|
return DB{}, errors.New("database already exists")
|
|
}
|
|
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
|
defer cancel()
|
|
client, err := mongo.Connect(ctx, options.Client().ApplyURI(URI).SetAuth(options.Credential{Username: os.Getenv("DB_USER"), Password: os.Getenv("DB_PASSWORD")}))
|
|
if err != nil {
|
|
return DB{}, err
|
|
}
|
|
db := client.Database("godotkicker")
|
|
database = DB{
|
|
URI: URI,
|
|
Database: db,
|
|
Client: client,
|
|
}
|
|
Log("startup", nil)
|
|
return database, nil
|
|
}
|
|
|
|
func Log(event string, what interface{}) {
|
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
|
defer cancel()
|
|
t := time.Now()
|
|
content := fmt.Sprintf("%v", what)
|
|
log.Printf("%v :: EVENT: %s\n%v", t, event, what)
|
|
_, err := database.Database.Collection("logs").InsertOne(ctx, bson.D{
|
|
primitive.E{Key: "time", Value: t},
|
|
primitive.E{Key: "event", Value: event},
|
|
primitive.E{Key: "what", Value: content},
|
|
})
|
|
if err != nil {
|
|
log.Print(err)
|
|
}
|
|
|
|
}
|
|
|
|
func GetDatabase() DB {
|
|
return database
|
|
}
|
|
|
|
func (d *DB) Stop() {
|
|
if err := d.Client.Disconnect(d.Ctx); err != nil {
|
|
panic(err)
|
|
}
|
|
}
|