🗃️ Implement the GroupHelperRepository with the different database connections
This commit is contained in:
parent
ce0f5bafa0
commit
f4e902d5f1
20
config/database.go
Normal file
20
config/database.go
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
package config
|
||||||
|
|
||||||
|
import "github.com/caarlos0/env"
|
||||||
|
|
||||||
|
type DatabaseConfig struct {
|
||||||
|
Debug bool `env:"DB_DEBUG" envDefault:"false"`
|
||||||
|
DatabaseType string `env:"DB_TYPE,required"`
|
||||||
|
Host string `env:"DB_HOST,required"`
|
||||||
|
Port int `env:"DB_PORT"`
|
||||||
|
Username string `env:"DB_USER"`
|
||||||
|
Password string `env:"DB_PASS"`
|
||||||
|
Database string `env:"DB_DATABASE"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (dc *DatabaseConfig) LoadConfig() error {
|
||||||
|
if err := env.Parse(dc); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
6
go.mod
6
go.mod
@ -1,3 +1,9 @@
|
|||||||
module git.dragon-labs.de/alphyron/group_helper
|
module git.dragon-labs.de/alphyron/group_helper
|
||||||
|
|
||||||
go 1.13
|
go 1.13
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/caarlos0/env v3.5.0+incompatible
|
||||||
|
github.com/jinzhu/gorm v1.9.12
|
||||||
|
github.com/stretchr/testify v1.5.1 // indirect
|
||||||
|
)
|
||||||
|
6
logic/repository.go
Normal file
6
logic/repository.go
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
package logic
|
||||||
|
|
||||||
|
type GroupHelperRepository interface {
|
||||||
|
GroupHelperService
|
||||||
|
InitRepository() error
|
||||||
|
}
|
@ -7,10 +7,10 @@ type GroupHelperService interface {
|
|||||||
UpdateGroup(*models.Group) (*models.Group, error)
|
UpdateGroup(*models.Group) (*models.Group, error)
|
||||||
|
|
||||||
GetGroupByID(int64) (*models.Group, error)
|
GetGroupByID(int64) (*models.Group, error)
|
||||||
GetGroupDatabaseSize(int64) (int, error)
|
GetGroupDatabaseSize(*models.Group) (int, error)
|
||||||
|
|
||||||
CreateUser(*models.User) (*models.User, error)
|
CreateUser(*models.User) (*models.User, error)
|
||||||
GetUserByID(int64) *models.User
|
GetUserByID(int64) (*models.User, error)
|
||||||
|
|
||||||
UserJoinGroup(*models.User, *models.Group) (bool, error)
|
UserJoinGroup(*models.User, *models.Group) (bool, error)
|
||||||
UserLeaveGroup(*models.User, *models.Group) (bool, error)
|
UserLeaveGroup(*models.User, *models.Group) (bool, error)
|
||||||
|
12
main.go
12
main.go
@ -1,7 +1,15 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import "log"
|
import (
|
||||||
|
"git.dragon-labs.de/alphyron/group_helper/config"
|
||||||
|
"log"
|
||||||
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
log.Println("Hello World")
|
err := config.DatabaseConfig{}.LoadConfig()
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Problem while loading database environment variables")
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,7 @@ type Group struct {
|
|||||||
UserKickMessage string `gorm:"column:msg_user_kick;type:text"`
|
UserKickMessage string `gorm:"column:msg_user_kick;type:text"`
|
||||||
ForbidWriting bool `gorm:"column:forbid_writing"`
|
ForbidWriting bool `gorm:"column:forbid_writing"`
|
||||||
OnlineCheck int `gorm:"column:kick_cooldown"`
|
OnlineCheck int `gorm:"column:kick_cooldown"`
|
||||||
|
Users []*User `gorm:"many2many:GroupUser;"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (group *Group) FillDefaultValues() {
|
func (group *Group) FillDefaultValues() {
|
||||||
|
18
repository/grouphelperrepository.go
Normal file
18
repository/grouphelperrepository.go
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
package repository
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"git.dragon-labs.de/alphyron/group_helper/config"
|
||||||
|
"git.dragon-labs.de/alphyron/group_helper/logic"
|
||||||
|
)
|
||||||
|
|
||||||
|
func NewUserHelperRepository() (*logic.GroupHelperRepository, error) {
|
||||||
|
databaseConfig := config.DatabaseConfig{}
|
||||||
|
_ = databaseConfig.LoadConfig()
|
||||||
|
|
||||||
|
switch databaseConfig.DatabaseType {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil, errors.New("cannot support given database type (" + databaseConfig.DatabaseType + ")")
|
||||||
|
}
|
186
repository/sql/grouphelprepository.go
Normal file
186
repository/sql/grouphelprepository.go
Normal file
@ -0,0 +1,186 @@
|
|||||||
|
package sql
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"git.dragon-labs.de/alphyron/group_helper/config"
|
||||||
|
"git.dragon-labs.de/alphyron/group_helper/logic"
|
||||||
|
"git.dragon-labs.de/alphyron/group_helper/models"
|
||||||
|
"github.com/jinzhu/gorm"
|
||||||
|
_ "github.com/jinzhu/gorm/dialects/mssql"
|
||||||
|
_ "github.com/jinzhu/gorm/dialects/mysql"
|
||||||
|
_ "github.com/jinzhu/gorm/dialects/postgres"
|
||||||
|
_ "github.com/jinzhu/gorm/dialects/sqlite"
|
||||||
|
)
|
||||||
|
|
||||||
|
type groupHelperRepository struct {
|
||||||
|
Conn *gorm.DB
|
||||||
|
}
|
||||||
|
|
||||||
|
func newMySQLConnection(host string, database string, user string, password string) (*gorm.DB, error) {
|
||||||
|
return gorm.Open("mysql", fmt.Sprintf("%s:%s@(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", user, password, host, database))
|
||||||
|
}
|
||||||
|
|
||||||
|
func newPostgresConnection(host string, port int, database string, user string, password string) (*gorm.DB, error) {
|
||||||
|
return gorm.Open("postgres", fmt.Sprintf("host=%s port=%d user=%s dbname=%s password=%s", host, port, user, database, password))
|
||||||
|
}
|
||||||
|
|
||||||
|
func newSQLiteConnection(path string) (*gorm.DB, error) {
|
||||||
|
return gorm.Open("sqlite3", path)
|
||||||
|
}
|
||||||
|
|
||||||
|
func newMsSqlConnection(host string, database string, user string, password string) (*gorm.DB, error) {
|
||||||
|
return gorm.Open("mssql", fmt.Sprintf("sqlserver://%s:%s@%s?database=%s", user, password, host, database))
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewUserRepository tamdp, test
|
||||||
|
func NewGroupHelperRepository(config *config.DatabaseConfig) (logic.GroupHelperRepository, error) {
|
||||||
|
var (
|
||||||
|
db *gorm.DB
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
|
||||||
|
switch config.DatabaseType {
|
||||||
|
case "mysql":
|
||||||
|
db, err = newMySQLConnection(fmt.Sprintf("%s:%d", config.Host, config.Port), config.Database, config.Username, config.Password)
|
||||||
|
break
|
||||||
|
case "postgres":
|
||||||
|
db, err = newPostgresConnection(config.Host, config.Port, config.Database, config.Username, config.Password)
|
||||||
|
break
|
||||||
|
case "sqlite3":
|
||||||
|
db, err = newSQLiteConnection(config.Host)
|
||||||
|
break
|
||||||
|
case "mssql":
|
||||||
|
db, err = newMsSqlConnection(fmt.Sprintf("%s:%d", config.Host, config.Port), config.Database, config.Username, config.Password)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if db == nil {
|
||||||
|
return nil, errors.New("no valid type given (mysql,postgres,sqlite3,mssql)")
|
||||||
|
}
|
||||||
|
|
||||||
|
db.LogMode(config.Debug)
|
||||||
|
return &groupHelperRepository{Conn: db}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewUserRepositoryDBConnection creates a user repository with an existing gorm database connection
|
||||||
|
func NewUserRepositoryDBConnection(db *gorm.DB) logic.GroupHelperRepository {
|
||||||
|
return &groupHelperRepository{Conn: db}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g groupHelperRepository) CreateGroup(group *models.Group) (*models.Group, error) {
|
||||||
|
err := g.Conn.Create(group).Error
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.New("problem while creating a group - " + err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
return group, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g groupHelperRepository) UpdateGroup(group *models.Group) (*models.Group, error) {
|
||||||
|
err := g.Conn.Where("id = ?", group.ID).Save(group).Error
|
||||||
|
return group, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g groupHelperRepository) GetGroupByID(id int64) (*models.Group, error) {
|
||||||
|
var group models.Group
|
||||||
|
err := g.Conn.Where("group_id = ?", id).First(&group).Error
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.New("problem while getting the group by his group id - " + err.Error())
|
||||||
|
}
|
||||||
|
return &group, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g groupHelperRepository) GetGroupDatabaseSize(group *models.Group) (int, error) {
|
||||||
|
association := g.Conn.Model(group).Association("Users")
|
||||||
|
|
||||||
|
if err := association.Error; err != nil {
|
||||||
|
return -1, errors.New("problem while getting the size of users connected with the group - " + err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
return association.Count(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g groupHelperRepository) CreateUser(user *models.User) (*models.User, error) {
|
||||||
|
err := g.Conn.Create(user).Error
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.New("problem while creating a user - " + err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
return user, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g groupHelperRepository) GetUserByID(userID int64) (*models.User, error) {
|
||||||
|
var user models.User
|
||||||
|
err := g.Conn.Where("user_id = ?", userID).First(&user).Error
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.New("problem while getting the user by his user id - " + err.Error())
|
||||||
|
}
|
||||||
|
return &user, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g groupHelperRepository) UserJoinGroup(user *models.User, group *models.Group) (bool, error) {
|
||||||
|
err := g.Conn.Model(user).Association("Groups").Append(group).Error
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return false, errors.New("problem while connect the user with the group - " + err.Error())
|
||||||
|
}
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g groupHelperRepository) UserLeaveGroup(user *models.User, group *models.Group) (bool, error) {
|
||||||
|
err := g.Conn.Model(user).Association("Groups").Append(group).Error
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return false, errors.New("problem while disconnecting the user from the group - " + err.Error())
|
||||||
|
}
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g groupHelperRepository) IsUserInGroup(user *models.User, group *models.Group) (bool, error) {
|
||||||
|
association := g.Conn.Model(user).Association("Groups")
|
||||||
|
|
||||||
|
if err := association.Error; err != nil {
|
||||||
|
return false, errors.New("problem while checking if the user is connected with the group - " + err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
association = association.Find(group)
|
||||||
|
|
||||||
|
if err := association.Error; err != nil {
|
||||||
|
return false, errors.New("problem while find the user is connected with the group - " + err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
return association.Count() > 0, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g groupHelperRepository) ListGroups() ([]*models.Group, error) {
|
||||||
|
var groups []*models.Group
|
||||||
|
err := g.Conn.Find(&groups).Error
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.New("problem while getting all group - " + err.Error())
|
||||||
|
}
|
||||||
|
return groups, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g groupHelperRepository) ListUsers() ([]*models.User, error) {
|
||||||
|
var users []*models.User
|
||||||
|
err := g.Conn.Find(&users).Error
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.New("problem while getting all users - " + err.Error())
|
||||||
|
}
|
||||||
|
return users, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g groupHelperRepository) InitRepository() error {
|
||||||
|
return g.Conn.AutoMigrate(models.Group{}, models.User{}).Error
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user