group_helper/repository/sql/grouphelprepository.go
2021-04-01 22:14:25 +02:00

235 lines
7.0 KiB
Go

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"
"log"
)
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.Model(&models.Group{}).Where("id = ?", group.ID).Update(models.Group{
Size: group.Size,
UserJoinMessage: group.UserJoinMessage,
UserVerifiedMessage: group.UserVerifiedMessage,
UserLeaveMessage: group.UserLeaveMessage,
UserKickMessage: group.UserKickMessage,
ForbidWriting: group.ForbidWriting,
OnlineCheck: group.OnlineCheck,
KickCooldown: group.KickCooldown,
AdminGroupID: group.AdminGroupID,
}).Error
return group, err
}
func (g groupHelperRepository) GetGroupByID(id int64) (*models.Group, error) {
var group models.Group
defaultGroup := &models.Group{}
defaultGroup.FillDefaultValues()
defaultGroup.GroupID = id
err := g.Conn.Preload("ControlledGroups").Where("group_id = ?", id).First(&group)
if err.RecordNotFound() {
return g.CreateGroup(defaultGroup)
}
return &group, err.Error
}
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
db := g.Conn.Where("user_id = ?", userID).First(&user)
if db.RecordNotFound() {
return g.CreateUser(&models.User{
UserID: userID,
})
}
if db.Error != nil {
return nil, errors.New("problem while getting the user by his user id - " + db.Error.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) {
log.Println("DELETE")
err := g.Conn.Exec("DELETE FROM `GroupUser` WHERE `group_id` = ? AND `user_id` = ?", group.ID, user.ID).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) ListGroupUsers(group *models.Group) ([]*models.User, error) {
err := g.Conn.Model(group).Preload("Users").Find(group).Error
if err != nil {
return nil, errors.New("problem while getting all users from group - " + err.Error())
}
return group.Users, 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
}
func (g groupHelperRepository) GetGroupByDBID(id uint64) (*models.Group, error) {
var group models.Group
defaultGroup := &models.Group{}
defaultGroup.FillDefaultValues()
defaultGroup.ID = id
err := g.Conn.Preload("ControlledGroups").Where("id = ?", id).First(&group)
if err.RecordNotFound() {
return g.CreateGroup(defaultGroup)
}
return &group, err.Error
}