From 6c1f34c682b2e7b10ecfaeadda2cb23fb7bad2a9 Mon Sep 17 00:00:00 2001 From: ACoolName Date: Tue, 18 Mar 2025 23:27:27 +0200 Subject: [PATCH] refactored --- auth/auth.go | 59 +++--- auth/go.mod | 2 +- db_handler/go.mod | 3 - db_handler/mongo/users.go | 105 ----------- db_handler/users.go | 14 -- {db_handler => dbhandler}/db_handler.go | 0 dbhandler/go.mod | 3 + {db_handler => dbhandler}/mongo/go.mod | 2 +- {db_handler => dbhandler}/mongo/go.sum | 0 {db_handler => dbhandler}/mongo/servers.go | 4 +- .../mongo/servers_authorization.go | 4 +- .../mongo/user_pass_authentication.go | 4 +- {db_handler => dbhandler}/oidc_auth.go | 2 +- {db_handler => dbhandler}/servers.go | 2 +- .../servers_authorization.go | 2 +- {db_handler => dbhandler}/user_pass_auth.go | 2 +- factories/dbhandlers.go | 174 ++++++++++++++++++ factories/go.mod | 3 + factories/instancemanagers.go | 56 ++++++ go.mod | 2 +- go.work | 12 +- instance_manager/docker/go.mod | 3 - instance_manager/go.mod | 3 - instance_manager/kubernetes/go.mod | 3 - instancemanager/docker/go.mod | 3 + .../docker/instance_manager.go | 4 +- .../docker/labels.go | 0 .../docker/utils.go | 4 +- instancemanager/go.mod | 3 + .../instance_manager.go | 2 +- instancemanager/kubernetes/go.mod | 3 + .../kubernetes/instance_manager.go | 4 +- mail/go.mod | 2 +- mail/mail.go | 2 +- main.go | 44 ++--- models/config.go | 12 +- models/go.mod | 2 +- servers/browsers.go | 46 ++--- servers/go.mod | 2 +- servers/images.go | 45 ++--- servers/servers.go | 76 +++----- users/go.mod | 2 +- users/users.go | 47 ++--- utils/constructors.go | 41 ----- utils/go.mod | 3 - 45 files changed, 398 insertions(+), 413 deletions(-) delete mode 100644 db_handler/go.mod delete mode 100644 db_handler/mongo/users.go delete mode 100644 db_handler/users.go rename {db_handler => dbhandler}/db_handler.go (100%) create mode 100644 dbhandler/go.mod rename {db_handler => dbhandler}/mongo/go.mod (88%) rename {db_handler => dbhandler}/mongo/go.sum (100%) rename {db_handler => dbhandler}/mongo/servers.go (97%) rename {db_handler => dbhandler}/mongo/servers_authorization.go (96%) rename {db_handler => dbhandler}/mongo/user_pass_authentication.go (97%) rename {db_handler => dbhandler}/oidc_auth.go (96%) rename {db_handler => dbhandler}/servers.go (91%) rename {db_handler => dbhandler}/servers_authorization.go (90%) rename {db_handler => dbhandler}/user_pass_auth.go (94%) create mode 100644 factories/dbhandlers.go create mode 100644 factories/go.mod create mode 100644 factories/instancemanagers.go delete mode 100644 instance_manager/docker/go.mod delete mode 100644 instance_manager/go.mod delete mode 100644 instance_manager/kubernetes/go.mod create mode 100644 instancemanager/docker/go.mod rename {instance_manager => instancemanager}/docker/instance_manager.go (98%) rename {instance_manager => instancemanager}/docker/labels.go (100%) rename {instance_manager => instancemanager}/docker/utils.go (96%) create mode 100644 instancemanager/go.mod rename {instance_manager => instancemanager}/instance_manager.go (95%) create mode 100644 instancemanager/kubernetes/go.mod rename {instance_manager => instancemanager}/kubernetes/instance_manager.go (92%) delete mode 100644 utils/constructors.go delete mode 100644 utils/go.mod diff --git a/auth/auth.go b/auth/auth.go index 4ebbb95..ec4674a 100644 --- a/auth/auth.go +++ b/auth/auth.go @@ -8,14 +8,14 @@ import ( "strings" "time" - "git.acooldomain.co/server-manager/backend-kubernetes-go/db_handler/mongo" - "git.acooldomain.co/server-manager/backend-kubernetes-go/dbhandler" - "git.acooldomain.co/server-manager/backend-kubernetes-go/models" + "git.acooldomain.co/server-manager/backend/dbhandler" + "git.acooldomain.co/server-manager/backend/factories" + "git.acooldomain.co/server-manager/backend/models" "github.com/gin-gonic/gin" "github.com/golang-jwt/jwt" ) -type Connection struct { +type AuthApi struct { config models.GlobalConfig tokenHandler dbhandler.InviteTokenDbHandler @@ -35,7 +35,7 @@ type AuthClaims struct { Claims } -func (con *Connection) signToken(token Claims) (string, error) { +func (con *AuthApi) signToken(token Claims) (string, error) { t := jwt.New(jwt.GetSigningMethod(con.config.Signing.Algorithm)) t.Claims = &AuthClaims{ @@ -70,7 +70,7 @@ func AuthorizedTo(requiredPermissions models.Permission) gin.HandlerFunc { } } -func (con *Connection) LoggedIn(ctx *gin.Context) { +func (con *AuthApi) LoggedIn(ctx *gin.Context) { authCookie, err := ctx.Request.Cookie("auth") if err != nil { ctx.AbortWithError(403, err) @@ -110,7 +110,7 @@ type SignUpRequest struct { Password string } -func (con Connection) signUp(ctx *gin.Context) { +func (con AuthApi) signUp(ctx *gin.Context) { var request SignUpRequest err := json.NewDecoder(ctx.Request.Body).Decode(&request) @@ -145,7 +145,7 @@ type SignInRequest struct { Password string } -func (con Connection) signIn(ctx *gin.Context) { +func (con AuthApi) signIn(ctx *gin.Context) { var request SignInRequest err := json.NewDecoder(ctx.Request.Body).Decode(&request) @@ -175,7 +175,7 @@ func (con Connection) signIn(ctx *gin.Context) { ctx.IndentedJSON(http.StatusOK, signedToken) } -func (con Connection) Verify(ctx *gin.Context) { +func (con AuthApi) Verify(ctx *gin.Context) { claimsPointer, exists := ctx.Get("claims") if !exists { ctx.Status(403) @@ -215,39 +215,26 @@ func (con Connection) Verify(ctx *gin.Context) { ctx.Redirect(303, fmt.Sprintf("http://%s/login", con.config.Domain)) } -func LoadGroup(group *gin.RouterGroup, client *mongo.Client, config models.GlobalConfig) { - var userAuthHandler dbhandler.UserPassAuthanticationDbHandler - var inviteHandler dbhandler.InviteTokenDbHandler - var serverAuthHandler dbhandler.ServersAuthorizationDbHandler - - var err error - - if config.Authentication.UserPass.Type == models.MONGO { - userAuthHandler, err = mongo.NewUserPassAuthHandler(*config.Authentication.UserPass.Mongo) - if err != nil { - panic(err) - } +func LoadGroup(group *gin.RouterGroup, config models.GlobalConfig) gin.HandlerFunc { + userAuthHandler, err := factories.GetUserPassAuthDbHandler(config.Authentication.UserPass) + if err != nil { + panic(err) } - if config.Authentication.UserPass.InviteTokenDatabase.Type == models.MONGO { - inviteHandler, err = mongo.NewInviteTokenDbHandler(*config.Authentication.UserPass.Mongo) - if err != nil { - panic(err) - } + inviteHandler, err := factories.GetInviteTokenDbHandler(config.Authentication.UserPass.InviteTokenDatabase) + if err != nil { + panic(err) } - mailClient = *mail.NewMailClient(config.Email) - - connection := Connection{ - userPassAuthHandler: userAuthHandler, - tokenHandler: inviteHandler, - mailClient: mailClient, - config: &config, + connection := AuthApi{ + userAuthDbHandler: userAuthHandler, + tokenHandler: inviteHandler, + config: config, } - connection := Connection{DatabaseConnection: client} - group.POST("/signin", connection.signIn) - group.POST("/signup", AuthorizedTo(models.Admin), connection.signUp) + group.POST("/signup", connection.LoggedIn, AuthorizedTo(models.Admin), connection.signUp) group.Any("/verify", connection.Verify) + + return connection.LoggedIn } diff --git a/auth/go.mod b/auth/go.mod index 1d7acb6..6e83744 100644 --- a/auth/go.mod +++ b/auth/go.mod @@ -1,4 +1,4 @@ -module git.acooldomain.co/server-manager/backend-kubernetes-go/auth +module git.acooldomain.co/server-manager/backend/auth go 1.22.0 diff --git a/db_handler/go.mod b/db_handler/go.mod deleted file mode 100644 index 9b067bb..0000000 --- a/db_handler/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module git.acooldomain.co/server-manager/backend-kubernetes-go/dbhandler - -go 1.22.0 diff --git a/db_handler/mongo/users.go b/db_handler/mongo/users.go deleted file mode 100644 index b794b02..0000000 --- a/db_handler/mongo/users.go +++ /dev/null @@ -1,105 +0,0 @@ -package mongo - -import ( - "context" - "fmt" - "time" - - "git.acooldomain.co/server-manager/backend-kubernetes-go/dbhandler" - "git.acooldomain.co/server-manager/backend-kubernetes-go/models" - "go.mongodb.org/mongo-driver/bson" - "go.mongodb.org/mongo-driver/mongo" - "go.mongodb.org/mongo-driver/mongo/options" -) - -type User struct { - Username string `bson:"username"` - Email string `bson:"email"` - Nickname string `bson:"nickname"` -} - -type UsersDbHandler struct { - dbhandler.UsersDBHandler - collection *mongo.Collection -} - -func (self *UsersDbHandler) GetUser(ctx context.Context, username string) (*dbhandler.User, error) { - var user User - - err := self.collection.FindOne(ctx, bson.M{"username": username}).Decode(&user) - - if err != nil { - return nil, err - } - - return &dbhandler.User{ - Username: user.Username, - Email: user.Email, - Nickname: user.Nickname, - }, nil -} - -func (self *UsersDbHandler) ListUsers(ctx context.Context) ([]dbhandler.User, error) { - cursor, err := self.collection.Find(ctx, bson.M{}) - - if err != nil { - return nil, err - } - defer cursor.Close(ctx) - - var users []User - - cursor.All(nil, &users) - - response := make([]dbhandler.User, len(users)) - - for i, user := range users { - response[i] = dbhandler.User{ - Username: user.Username, - Nickname: user.Nickname, - Email: user.Email, - } - } - - return response, nil -} - -func (self *UsersDbHandler) CreateUser(ctx context.Context, user dbhandler.User) error { - _, err := self.collection.InsertOne(ctx, &User{ - Username: user.Username, - Email: user.Email, - Nickname: user.Nickname, - }, &options.InsertOneOptions{}) - - if err != nil { - return err - } - - return nil -} - -func (self *UsersDbHandler) DeleteUser(ctx context.Context, username string) error { - _, err := self.collection.DeleteOne(ctx, bson.M{"username": username}) - - return err -} - -func NewUsersHandler(config models.MongoDBConfig) (*UsersDbHandler, error) { - clientOptions := options.Client().ApplyURI(config.Url).SetAuth(options.Credential{ - Username: config.Username, - Password: config.Password, - }) - - ctx, cancel := context.WithTimeoutCause(context.Background(), 30*time.Second, fmt.Errorf("Timeout")) - defer cancel() - - client, err := mongo.Connect(ctx, clientOptions) - - if err != nil { - return nil, err - } - - return &UsersDbHandler{ - collection: client.Database(config.Database).Collection(config.Collection), - }, nil -} diff --git a/db_handler/users.go b/db_handler/users.go deleted file mode 100644 index 911b596..0000000 --- a/db_handler/users.go +++ /dev/null @@ -1,14 +0,0 @@ -package dbhandler - -type User struct { - Username string - Nickname string - Email string -} - -type UsersDBHandler interface { - GetUser(username string) (User, error) - ListUsers() ([]User, error) - CreateUser(user User) error - DeleteUser(username string) error -} diff --git a/db_handler/db_handler.go b/dbhandler/db_handler.go similarity index 100% rename from db_handler/db_handler.go rename to dbhandler/db_handler.go diff --git a/dbhandler/go.mod b/dbhandler/go.mod new file mode 100644 index 0000000..0c699a9 --- /dev/null +++ b/dbhandler/go.mod @@ -0,0 +1,3 @@ +module git.acooldomain.co/server-manager/backend/dbhandler + +go 1.22.0 diff --git a/db_handler/mongo/go.mod b/dbhandler/mongo/go.mod similarity index 88% rename from db_handler/mongo/go.mod rename to dbhandler/mongo/go.mod index dfbcea5..981561d 100644 --- a/db_handler/mongo/go.mod +++ b/dbhandler/mongo/go.mod @@ -1,4 +1,4 @@ -module git.acooldomain.co/server-manager/backend-kubernetes-go/db_handler/mongo +module git.acooldomain.co/server-manager/backend/dbhandler/mongo go 1.24.1 diff --git a/db_handler/mongo/go.sum b/dbhandler/mongo/go.sum similarity index 100% rename from db_handler/mongo/go.sum rename to dbhandler/mongo/go.sum diff --git a/db_handler/mongo/servers.go b/dbhandler/mongo/servers.go similarity index 97% rename from db_handler/mongo/servers.go rename to dbhandler/mongo/servers.go index 8ae3240..0b40a4c 100644 --- a/db_handler/mongo/servers.go +++ b/dbhandler/mongo/servers.go @@ -5,8 +5,8 @@ import ( "fmt" "time" - "git.acooldomain.co/server-manager/backend-kubernetes-go/dbhandler" - "git.acooldomain.co/server-manager/backend-kubernetes-go/models" + "git.acooldomain.co/server-manager/backend/dbhandler" + "git.acooldomain.co/server-manager/backend/models" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" diff --git a/db_handler/mongo/servers_authorization.go b/dbhandler/mongo/servers_authorization.go similarity index 96% rename from db_handler/mongo/servers_authorization.go rename to dbhandler/mongo/servers_authorization.go index 1865db9..7d78b68 100644 --- a/db_handler/mongo/servers_authorization.go +++ b/dbhandler/mongo/servers_authorization.go @@ -5,8 +5,8 @@ import ( "fmt" "time" - "git.acooldomain.co/server-manager/backend-kubernetes-go/dbhandler" - "git.acooldomain.co/server-manager/backend-kubernetes-go/models" + "git.acooldomain.co/server-manager/backend/dbhandler" + "git.acooldomain.co/server-manager/backend/models" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" diff --git a/db_handler/mongo/user_pass_authentication.go b/dbhandler/mongo/user_pass_authentication.go similarity index 97% rename from db_handler/mongo/user_pass_authentication.go rename to dbhandler/mongo/user_pass_authentication.go index f31c1a2..30fce0c 100644 --- a/db_handler/mongo/user_pass_authentication.go +++ b/dbhandler/mongo/user_pass_authentication.go @@ -5,8 +5,8 @@ import ( "fmt" "time" - "git.acooldomain.co/server-manager/backend-kubernetes-go/dbhandler" - "git.acooldomain.co/server-manager/backend-kubernetes-go/models" + "git.acooldomain.co/server-manager/backend/dbhandler" + "git.acooldomain.co/server-manager/backend/models" "github.com/google/uuid" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" diff --git a/db_handler/oidc_auth.go b/dbhandler/oidc_auth.go similarity index 96% rename from db_handler/oidc_auth.go rename to dbhandler/oidc_auth.go index 3638cdd..fd8442e 100644 --- a/db_handler/oidc_auth.go +++ b/dbhandler/oidc_auth.go @@ -7,7 +7,7 @@ import ( "fmt" "log" - "git.acooldomain.co/server-manager/backend-kubernetes-go/models" + "git.acooldomain.co/server-manager/backend/models" "github.com/coreos/go-oidc" "golang.org/x/oauth2" ) diff --git a/db_handler/servers.go b/dbhandler/servers.go similarity index 91% rename from db_handler/servers.go rename to dbhandler/servers.go index 3ffa2ec..e8ae89d 100644 --- a/db_handler/servers.go +++ b/dbhandler/servers.go @@ -3,7 +3,7 @@ package dbhandler import ( "context" - "git.acooldomain.co/server-manager/backend-kubernetes-go/models" + "git.acooldomain.co/server-manager/backend/models" ) type Server struct { diff --git a/db_handler/servers_authorization.go b/dbhandler/servers_authorization.go similarity index 90% rename from db_handler/servers_authorization.go rename to dbhandler/servers_authorization.go index 7982793..3fca410 100644 --- a/db_handler/servers_authorization.go +++ b/dbhandler/servers_authorization.go @@ -3,7 +3,7 @@ package dbhandler import ( "context" - "git.acooldomain.co/server-manager/backend-kubernetes-go/models" + "git.acooldomain.co/server-manager/backend/models" ) type ServersAuthorizationDbHandler interface { diff --git a/db_handler/user_pass_auth.go b/dbhandler/user_pass_auth.go similarity index 94% rename from db_handler/user_pass_auth.go rename to dbhandler/user_pass_auth.go index d1fcb13..4cac147 100644 --- a/db_handler/user_pass_auth.go +++ b/dbhandler/user_pass_auth.go @@ -3,7 +3,7 @@ package dbhandler import ( "context" - "git.acooldomain.co/server-manager/backend-kubernetes-go/models" + "git.acooldomain.co/server-manager/backend/models" "golang.org/x/crypto/bcrypt" ) diff --git a/factories/dbhandlers.go b/factories/dbhandlers.go new file mode 100644 index 0000000..b5ef46c --- /dev/null +++ b/factories/dbhandlers.go @@ -0,0 +1,174 @@ +package factories + +import ( + "errors" + "sync" + + "git.acooldomain.co/server-manager/backend/dbhandler/mongo" + "git.acooldomain.co/server-manager/backend/dbhandler" + "git.acooldomain.co/server-manager/backend/models" +) + +var ( + serversDbHandlers = make(map[string]dbhandler.ServersDbHandler) + serversAuthDbHandlers = make(map[string]dbhandler.ServersAuthorizationDbHandler) + userPassAuthDbHandlers = make(map[string]dbhandler.UserPassAuthanticationDbHandler) + inviteTokenDbHandlers = make(map[string]dbhandler.InviteTokenDbHandler) + + serversDbMutex sync.Mutex + serversAuthDbMutex sync.Mutex + userPassAuthDbMutex sync.Mutex + inviteTokenDbMutex sync.Mutex +) + +func getMongoCacheKey(config *models.MongoDBConfig) string { + return "Mongo/" + config.Username + "/" + config.Password + "/" + config.Url + "/" + config.Database + "/" + config.Collection +} + +func GetServersDbHandler(config models.ServersDatabaseConfig) (dbhandler.ServersDbHandler, error) { + var key string + var handler dbhandler.ServersDbHandler + var err error + var exists bool + + switch config.Type { + case models.MONGO: + if config.Mongo == nil { + return nil, errors.New("missing MongoDB configuration") + } + key = getMongoCacheKey(config.Mongo) + default: + return nil, errors.New("unsupported database type") + } + + serversDbMutex.Lock() + defer serversDbMutex.Unlock() + + if handler, exists = serversDbHandlers[key]; exists { + return handler, nil + } + + switch config.Type { + case models.MONGO: + handler, err = mongo.NewServersDbHandler(*config.Mongo) + if err != nil { + return nil, err + } + default: + return nil, errors.New("unsupported database type") + } + + serversDbHandlers[key] = handler + return handler, nil +} + +func GetServersAuthorizationDbHandler(config models.ServersAuthorizationDatabaseConfig) (dbhandler.ServersAuthorizationDbHandler, error) { + var key string + var handler dbhandler.ServersAuthorizationDbHandler + var err error + var exists bool + + switch config.Type { + case models.MONGO: + if config.Mongo == nil { + return nil, errors.New("missing MongoDB configuration") + } + key = getMongoCacheKey(config.Mongo) + default: + return nil, errors.New("unsupported database type") + } + + serversAuthDbMutex.Lock() + defer serversAuthDbMutex.Unlock() + + if handler, exists = serversAuthDbHandlers[key]; exists { + return handler, nil + } + + switch config.Type { + case models.MONGO: + handler, err = mongo.NewServersAuthorizationHandler(*config.Mongo) + if err != nil { + return nil, err + } + default: + return nil, errors.New("unsupported database type") + } + + serversAuthDbHandlers[key] = handler + return handler, nil +} + +func GetUserPassAuthDbHandler(config models.UserPassAuthConfig) (dbhandler.UserPassAuthanticationDbHandler, error) { + var key string + var handler dbhandler.UserPassAuthanticationDbHandler + var err error + var exists bool + + switch config.Type { + case models.MONGO: + if config.Mongo == nil { + return nil, errors.New("missing MongoDB configuration") + } + key = getMongoCacheKey(config.Mongo) + default: + return nil, errors.New("unsupported database type") + } + + userPassAuthDbMutex.Lock() + defer userPassAuthDbMutex.Unlock() + + if handler, exists = userPassAuthDbHandlers[key]; exists { + return handler, nil + } + + switch config.Type { + case models.MONGO: + handler, err = mongo.NewUserPassAuthHandler(*config.Mongo) + if err != nil { + return nil, err + } + default: + return nil, errors.New("unsupported database type") + } + + userPassAuthDbHandlers[key] = handler + return handler, nil +} + +func GetInviteTokenDbHandler(config models.InviteTokenDatabaseConfig) (dbhandler.InviteTokenDbHandler, error) { + var key string + var handler dbhandler.InviteTokenDbHandler + var err error + var exists bool + + switch config.Type { + case models.MONGO: + if config.Mongo == nil { + return nil, errors.New("missing MongoDB configuration") + } + key = getMongoCacheKey(config.Mongo) + default: + return nil, errors.New("unsupported database type") + } + + inviteTokenDbMutex.Lock() + defer inviteTokenDbMutex.Unlock() + + if handler, exists = inviteTokenDbHandlers[key]; exists { + return handler, nil + } + + switch config.Type { + case models.MONGO: + handler, err = mongo.NewInviteTokenDbHandler(*config.Mongo) + if err != nil { + return nil, err + } + default: + return nil, errors.New("unsupported database type") + } + + inviteTokenDbHandlers[key] = handler + return handler, nil +} diff --git a/factories/go.mod b/factories/go.mod new file mode 100644 index 0000000..63f2e47 --- /dev/null +++ b/factories/go.mod @@ -0,0 +1,3 @@ +module git.acooldomain.co/server-manager/backend/factories + +go 1.22.0 diff --git a/factories/instancemanagers.go b/factories/instancemanagers.go new file mode 100644 index 0000000..18d56cd --- /dev/null +++ b/factories/instancemanagers.go @@ -0,0 +1,56 @@ +package factories + +import ( + "errors" + "sync" + + instancemanager "git.acooldomain.co/server-manager/backend/instancemanager" + "git.acooldomain.co/server-manager/backend/instancemanager/docker" + "git.acooldomain.co/server-manager/backend/models" +) + +var ( + instanceManagerHandlers = make(map[string]instancemanager.InstanceManager) + instanceManagerMutex sync.Mutex +) + +func getDockerCacheKey(config *models.DockerInstanceManagerConfig) string { + return "Docker" +} + +func GetInstanceManager(config models.InstanceManagerConfig) (instancemanager.InstanceManager, error) { + var key string + var handler instancemanager.InstanceManager + var err error + var exists bool + + switch config.Type { + case models.DOCKER: + if config.Docker == nil { + return nil, errors.New("missing Docker configuration") + } + key = getDockerCacheKey(config.Docker) + default: + return nil, errors.New("unsupported database type") + } + + instanceManagerMutex.Lock() + defer instanceManagerMutex.Unlock() + + if handler, exists = instanceManagerHandlers[key]; exists { + return handler, nil + } + + switch config.Type { + case models.DOCKER: + handler, err = docker.NewInstanceManager(*config.Docker) + if err != nil { + return nil, err + } + default: + return nil, errors.New("unsupported database type") + } + + instanceManagerHandlers[key] = handler + return handler, nil +} diff --git a/go.mod b/go.mod index 9d6d538..fddfbc0 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,4 @@ -module git.acooldomain.co/server-manager/backend-kubernetes-go +module git.acooldomain.co/server-manager/backend go 1.23.0 diff --git a/go.work b/go.work index 25bea09..79aae7b 100644 --- a/go.work +++ b/go.work @@ -3,14 +3,14 @@ go 1.24.1 use ( . ./auth - ./db_handler - ./db_handler/mongo + ./dbhandler + ./dbhandler/mongo ./mail ./models - ./instance_manager - ./instance_manager/docker - ./instance_manager/kubernetes + ./instancemanager + ./instancemanager/docker + ./instancemanager/kubernetes ./servers ./users - ./utils + ./factories ) diff --git a/instance_manager/docker/go.mod b/instance_manager/docker/go.mod deleted file mode 100644 index 592149f..0000000 --- a/instance_manager/docker/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module git.acooldomain.co/server-manager/backend-kubernetes-go/instance_manager/docker - -go 1.22.0 diff --git a/instance_manager/go.mod b/instance_manager/go.mod deleted file mode 100644 index 4f38f02..0000000 --- a/instance_manager/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module git.acooldomain.co/server-manager/backend-kubernetes-go/instance_manager - -go 1.22.0 diff --git a/instance_manager/kubernetes/go.mod b/instance_manager/kubernetes/go.mod deleted file mode 100644 index 62c5a4a..0000000 --- a/instance_manager/kubernetes/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module git.acooldomain.co/server-manager/backend-kubernetes-go/instance_manager/kubernetes - -go 1.22.0 diff --git a/instancemanager/docker/go.mod b/instancemanager/docker/go.mod new file mode 100644 index 0000000..52ddf5b --- /dev/null +++ b/instancemanager/docker/go.mod @@ -0,0 +1,3 @@ +module git.acooldomain.co/server-manager/backend/instancemanager/docker + +go 1.22.0 diff --git a/instance_manager/docker/instance_manager.go b/instancemanager/docker/instance_manager.go similarity index 98% rename from instance_manager/docker/instance_manager.go rename to instancemanager/docker/instance_manager.go index 2d70267..b6f5be7 100644 --- a/instance_manager/docker/instance_manager.go +++ b/instancemanager/docker/instance_manager.go @@ -6,8 +6,8 @@ import ( "fmt" "net" - instancemanager "git.acooldomain.co/server-manager/backend-kubernetes-go/instance_manager" - "git.acooldomain.co/server-manager/backend-kubernetes-go/models" + instancemanager "git.acooldomain.co/server-manager/backend/instancemanager" + "git.acooldomain.co/server-manager/backend/models" "github.com/buildkite/shellwords" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" diff --git a/instance_manager/docker/labels.go b/instancemanager/docker/labels.go similarity index 100% rename from instance_manager/docker/labels.go rename to instancemanager/docker/labels.go diff --git a/instance_manager/docker/utils.go b/instancemanager/docker/utils.go similarity index 96% rename from instance_manager/docker/utils.go rename to instancemanager/docker/utils.go index 64c83f0..2fbd403 100644 --- a/instance_manager/docker/utils.go +++ b/instancemanager/docker/utils.go @@ -6,8 +6,8 @@ import ( "log" "strings" - instancemanager "git.acooldomain.co/server-manager/backend-kubernetes-go/instance_manager" - "git.acooldomain.co/server-manager/backend-kubernetes-go/models" + instancemanager "git.acooldomain.co/server-manager/backend/instancemanager" + "git.acooldomain.co/server-manager/backend/models" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/filters" "github.com/docker/go-connections/nat" diff --git a/instancemanager/go.mod b/instancemanager/go.mod new file mode 100644 index 0000000..180cd46 --- /dev/null +++ b/instancemanager/go.mod @@ -0,0 +1,3 @@ +module git.acooldomain.co/server-manager/backend/instancemanager + +go 1.22.0 diff --git a/instance_manager/instance_manager.go b/instancemanager/instance_manager.go similarity index 95% rename from instance_manager/instance_manager.go rename to instancemanager/instance_manager.go index a52400e..74ca3d1 100644 --- a/instance_manager/instance_manager.go +++ b/instancemanager/instance_manager.go @@ -4,7 +4,7 @@ import ( "context" "net" - "git.acooldomain.co/server-manager/backend-kubernetes-go/models" + "git.acooldomain.co/server-manager/backend/models" ) type Server struct { diff --git a/instancemanager/kubernetes/go.mod b/instancemanager/kubernetes/go.mod new file mode 100644 index 0000000..d060725 --- /dev/null +++ b/instancemanager/kubernetes/go.mod @@ -0,0 +1,3 @@ +module git.acooldomain.co/server-manager/backend/instancemanager/kubernetes + +go 1.22.0 diff --git a/instance_manager/kubernetes/instance_manager.go b/instancemanager/kubernetes/instance_manager.go similarity index 92% rename from instance_manager/kubernetes/instance_manager.go rename to instancemanager/kubernetes/instance_manager.go index 0268227..11dfe7b 100644 --- a/instance_manager/kubernetes/instance_manager.go +++ b/instancemanager/kubernetes/instance_manager.go @@ -4,8 +4,8 @@ import ( "context" "net" - "git.acooldomain.co/server-manager/backend-kubernetes-go/instance_manager" - "git.acooldomain.co/server-manager/backend-kubernetes-go/models" + "git.acooldomain.co/server-manager/backend/instancemanager" + "git.acooldomain.co/server-manager/backend/models" ) type InstanceManager struct { diff --git a/mail/go.mod b/mail/go.mod index 93a4bc4..96c16b1 100644 --- a/mail/go.mod +++ b/mail/go.mod @@ -1,3 +1,3 @@ - module git.acooldomain.co/server-manager/backend-kubernetes-go/mail + module git.acooldomain.co/server-manager/backend/mail go 1.22.0 diff --git a/mail/mail.go b/mail/mail.go index 8e9821c..cfec187 100644 --- a/mail/mail.go +++ b/mail/mail.go @@ -6,7 +6,7 @@ import ( "net/mail" "net/smtp" - "git.acooldomain.co/server-manager/backend-kubernetes-go/models" + "git.acooldomain.co/server-manager/backend/models" ) type MailClient struct { diff --git a/main.go b/main.go index c41a72e..cb2d9dc 100644 --- a/main.go +++ b/main.go @@ -1,22 +1,19 @@ package main import ( - "context" "encoding/json" "fmt" "os" - "git.acooldomain.co/server-manager/backend-kubernetes-go/auth" - "git.acooldomain.co/server-manager/backend-kubernetes-go/dbhandler" - "git.acooldomain.co/server-manager/backend-kubernetes-go/mail" - "git.acooldomain.co/server-manager/backend-kubernetes-go/models" - "git.acooldomain.co/server-manager/backend-kubernetes-go/servers" - "git.acooldomain.co/server-manager/backend-kubernetes-go/users" + "git.acooldomain.co/server-manager/backend/auth" + "git.acooldomain.co/server-manager/backend/models" + "git.acooldomain.co/server-manager/backend/servers" + "git.acooldomain.co/server-manager/backend/users" "github.com/gin-contrib/cors" "github.com/gin-gonic/gin" ) -const CONFIG_SECRET_NAME = "CONFIG_PATH" +const CONFIG_PATH = "CONFIG_PATH" func main() { router := gin.Default() @@ -24,7 +21,7 @@ func main() { cors_config := cors.DefaultConfig() cors_config.AllowCredentials = true cors_config.ExposeHeaders = []string{"set-cookie"} - file, err := os.Open(fmt.Sprintf("/run/secrets/%s", os.Getenv(CONFIG_SECRET_NAME))) + file, err := os.Open(fmt.Sprintf("%s", os.Getenv(CONFIG_PATH))) if err != nil { panic(err) } @@ -40,24 +37,23 @@ func main() { if err != nil { panic(err) } + loggedIn := auth.LoadGroup(router.Group("/auth"), config) - client, err := dbhandler.Connect(config.UsersDatabase.Mongo) - defer func() { - if err = client.Disconnect(context.TODO()); err != nil { - panic(err) - } - }() + usersGroup := router.Group("/users") + usersGroup.Use(loggedIn) + users.LoadGroup(usersGroup, config) - if err != nil { - panic(err) - } - mail.InitializeClient(config.Email) + serversGroup := router.Group("/servers") + serversGroup.Use(loggedIn) + servers.LoadGroup(serversGroup, config) - users.LoadGroup(router.Group("/users"), client, config) - auth.LoadGroup(router.Group("/auth"), client, config) - servers.LoadGroup(router.Group("/servers"), client, config) - servers.LoadBrowsersGroup(router.Group("/browsers"), client, config) - servers.LoadeImagesGroup(router.Group("/images"), client, config) + browsersGroup := router.Group("/browsers") + browsersGroup.Use(loggedIn) + servers.LoadBrowsersGroup(browsersGroup, config) + + imagesGroup := router.Group("/images") + imagesGroup.Use(loggedIn) + servers.LoadeImagesGroup(imagesGroup, config) router.Run("0.0.0.0:8080") } diff --git a/models/config.go b/models/config.go index 587c9e7..ed33f9b 100644 --- a/models/config.go +++ b/models/config.go @@ -43,11 +43,6 @@ type AuthenticationConfig struct { UserPass UserPassAuthConfig `yaml:"user_pass"` } -type UsersDatabaseConfig struct { - Type DatabaseType `yaml:"type"` - Mongo *MongoDBConfig `yaml:"mongo"` -} - type FileBrowserConfig struct { Image Image `yaml:"image"` Command string `yaml:"command"` @@ -62,8 +57,8 @@ type DockerInstanceManagerConfig struct { } type InstanceManagerConfig struct { - Type InstanceManagerType `yaml:"type"` - Docker DockerInstanceManagerConfig `yaml:"docker"` + Type InstanceManagerType `yaml:"type"` + Docker *DockerInstanceManagerConfig `yaml:"docker"` } type ServersDatabaseConfig struct { @@ -86,11 +81,10 @@ type GlobalConfig struct { Domain string `yaml:"domain"` Signing SigningConfig `yaml:"signing"` Authentication AuthenticationConfig `yaml:"authentication"` - InstanceManager InstanceManagerConfig `yaml:"instance_manager"` + InstanceManager InstanceManagerConfig `yaml:"instancemanager"` Users UsersConfig `yaml:"users"` // Database Configs ServersDatabase ServersDatabaseConfig `yaml:"servers_database"` - UsersDatabase UsersDatabaseConfig `yaml:"users_database"` ServersAuthorizationDatabase ServersAuthorizationDatabaseConfig `yaml:"servers_authorization_database"` } diff --git a/models/go.mod b/models/go.mod index e6beb83..8fb51c6 100644 --- a/models/go.mod +++ b/models/go.mod @@ -1,3 +1,3 @@ - module git.acooldomain.co/server-manager/backend-kubernetes-go/models + module git.acooldomain.co/server-manager/backend/models go 1.22.0 diff --git a/servers/browsers.go b/servers/browsers.go index f30ee8b..d68eafe 100644 --- a/servers/browsers.go +++ b/servers/browsers.go @@ -1,16 +1,13 @@ package servers import ( - "git.acooldomain.co/server-manager/backend-kubernetes-go/auth" - "git.acooldomain.co/server-manager/backend-kubernetes-go/db_handler/mongo" - "git.acooldomain.co/server-manager/backend-kubernetes-go/dbhandler" - instancemanager "git.acooldomain.co/server-manager/backend-kubernetes-go/instance_manager" - "git.acooldomain.co/server-manager/backend-kubernetes-go/instance_manager/docker" - "git.acooldomain.co/server-manager/backend-kubernetes-go/models" + "git.acooldomain.co/server-manager/backend/auth" + "git.acooldomain.co/server-manager/backend/factories" + "git.acooldomain.co/server-manager/backend/models" "github.com/gin-gonic/gin" ) -func (con Connection) GetBrowsers(ctx *gin.Context) { +func (con ServersApi) GetBrowsers(ctx *gin.Context) { fileBrowsers, err := con.InstanceManager.ListFileBrowsers(ctx) if err != nil { @@ -20,7 +17,7 @@ func (con Connection) GetBrowsers(ctx *gin.Context) { ctx.JSON(200, fileBrowsers) } -func (con Connection) StopBrowser(ctx *gin.Context) { +func (con ServersApi) StopBrowser(ctx *gin.Context) { serverId := ctx.Param("server_id") err := con.InstanceManager.StopFileBrowser(ctx, serverId) if err != nil { @@ -32,35 +29,22 @@ func (con Connection) StopBrowser(ctx *gin.Context) { } func LoadBrowsersGroup(group *gin.RouterGroup, config models.GlobalConfig) { - var instanceManager instancemanager.InstanceManager - var serversDbHandler dbhandler.ServersDbHandler - var serversAuthorizationHandler dbhandler.ServersAuthorizationDbHandler - - var err error - - if config.InstanceManager.Type == models.DOCKER { - instanceManager, err = docker.NewInstanceManager(config.InstanceManager.Docker) - if err != nil { - panic(err) - } + serversDbHandler, err := factories.GetServersDbHandler(config.ServersDatabase) + if err != nil { + panic(err) } - if config.ServersDatabase.Type == models.MONGO { - serversDbHandler, err = mongo.NewServersDbHandler(*config.ServersDatabase.Mongo) - if err != nil { - panic(err) - } + serversAuthorizationHandler, err := factories.GetServersAuthorizationDbHandler(config.ServersAuthorizationDatabase) + if err != nil { + panic(err) } - if config.ServersAuthorizationDatabase.Type == models.MONGO { - serversAuthorizationHandler, err = mongo.NewAuthorizationHandler(*config.ServersAuthorizationDatabase.Mongo) - if err != nil { - panic(err) - } - + instanceManager, err := factories.GetInstanceManager(config.InstanceManager) + if err != nil { + panic(err) } - connection := Connection{ + connection := ServersApi{ ServersDbHandler: serversDbHandler, ServerAuthorization: serversAuthorizationHandler, InstanceManager: instanceManager, diff --git a/servers/go.mod b/servers/go.mod index e92bdf3..ec5fef8 100644 --- a/servers/go.mod +++ b/servers/go.mod @@ -1,4 +1,4 @@ -module git.acooldomain.co/server-manager/backend-kubernetes-go/servers +module git.acooldomain.co/server-manager/backend/servers go 1.22.0 diff --git a/servers/images.go b/servers/images.go index e43050a..05acbbb 100644 --- a/servers/images.go +++ b/servers/images.go @@ -3,12 +3,10 @@ package servers import ( "fmt" - "git.acooldomain.co/server-manager/backend-kubernetes-go/auth" - "git.acooldomain.co/server-manager/backend-kubernetes-go/db_handler/mongo" - "git.acooldomain.co/server-manager/backend-kubernetes-go/dbhandler" - instancemanager "git.acooldomain.co/server-manager/backend-kubernetes-go/instance_manager" - "git.acooldomain.co/server-manager/backend-kubernetes-go/instance_manager/docker" - "git.acooldomain.co/server-manager/backend-kubernetes-go/models" + "git.acooldomain.co/server-manager/backend/auth" + "git.acooldomain.co/server-manager/backend/factories" + instancemanager "git.acooldomain.co/server-manager/backend/instancemanager" + "git.acooldomain.co/server-manager/backend/models" "github.com/gin-gonic/gin" ) @@ -29,7 +27,7 @@ func convertImageToImageData(instanceImage instancemanager.Image) *ImageData { DisplayName: fmt.Sprintf("%s %s", instanceImage.Registry, instanceImage.Tag), } } -func (con Connection) GetImages(ctx *gin.Context) { +func (con ServersApi) GetImages(ctx *gin.Context) { images, err := con.InstanceManager.ListImages(ctx) if err != nil { ctx.AbortWithError(500, err) @@ -51,35 +49,22 @@ func (con Connection) GetImages(ctx *gin.Context) { } func LoadeImagesGroup(group *gin.RouterGroup, config models.GlobalConfig) { - var instanceManager instancemanager.InstanceManager - var serversDbHandler dbhandler.ServersDbHandler - var serversAuthorizationHandler dbhandler.ServersAuthorizationDbHandler - - var err error - - if config.InstanceManager.Type == models.DOCKER { - instanceManager, err = docker.NewInstanceManager(config.InstanceManager.Docker) - if err != nil { - panic(err) - } + instanceManager, err := factories.GetInstanceManager(config.InstanceManager) + if err != nil { + panic(err) } - if config.ServersDatabase.Type == models.MONGO { - serversDbHandler, err = mongo.NewServersDbHandler(*config.ServersDatabase.Mongo) - if err != nil { - panic(err) - } + serversDbHandler, err := factories.GetServersDbHandler(config.ServersDatabase) + if err != nil { + panic(err) } - if config.ServersAuthorizationDatabase.Type == models.MONGO { - serversAuthorizationHandler, err = mongo.NewAuthorizationHandler(*config.ServersAuthorizationDatabase.Mongo) - if err != nil { - panic(err) - } - + serversAuthorizationHandler, err := factories.GetServersAuthorizationDbHandler(config.ServersAuthorizationDatabase) + if err != nil { + panic(err) } - connection := Connection{ + connection := ServersApi{ ServersDbHandler: serversDbHandler, ServerAuthorization: serversAuthorizationHandler, InstanceManager: instanceManager, diff --git a/servers/servers.go b/servers/servers.go index 0802f8b..d905b3c 100644 --- a/servers/servers.go +++ b/servers/servers.go @@ -10,12 +10,11 @@ import ( "strings" "time" - "git.acooldomain.co/server-manager/backend-kubernetes-go/auth" - "git.acooldomain.co/server-manager/backend-kubernetes-go/db_handler/mongo" - "git.acooldomain.co/server-manager/backend-kubernetes-go/dbhandler" - instancemanager "git.acooldomain.co/server-manager/backend-kubernetes-go/instance_manager" - "git.acooldomain.co/server-manager/backend-kubernetes-go/instance_manager/docker" - "git.acooldomain.co/server-manager/backend-kubernetes-go/models" + "git.acooldomain.co/server-manager/backend/auth" + "git.acooldomain.co/server-manager/backend/dbhandler" + "git.acooldomain.co/server-manager/backend/factories" + instancemanager "git.acooldomain.co/server-manager/backend/instancemanager" + "git.acooldomain.co/server-manager/backend/models" "github.com/gin-gonic/gin" "github.com/gorilla/websocket" ) @@ -28,7 +27,7 @@ var upgrader = websocket.Upgrader{ }, } -type Connection struct { +type ServersApi struct { ServersDbHandler dbhandler.ServersDbHandler InstanceManager instancemanager.InstanceManager ServerAuthorization dbhandler.ServersAuthorizationDbHandler @@ -65,7 +64,7 @@ type CreateServerRequest struct { Nickname string `json:"Nickname"` } -func (con Connection) ServerAuthorized(permissions models.Permission) func(*gin.Context) { +func (con ServersApi) ServerAuthorized(permissions models.Permission) func(*gin.Context) { return func(ctx *gin.Context) { claimsPointer, exists := ctx.Get("claims") if !exists { @@ -96,7 +95,7 @@ func (con Connection) ServerAuthorized(permissions models.Permission) func(*gin. } } -func (con Connection) CreateServer(ctx *gin.Context) { +func (con ServersApi) CreateServer(ctx *gin.Context) { claims, exists := ctx.Get("claims") if !exists { ctx.AbortWithStatus(500) @@ -157,7 +156,7 @@ type StartServerRequest struct { Ports []PortMappingRequest `json:"Ports"` } -func (con Connection) StartServer(ctx *gin.Context) { +func (con ServersApi) StartServer(ctx *gin.Context) { serverId := ctx.Param("server_id") var request StartServerRequest @@ -194,7 +193,7 @@ func (con Connection) StartServer(ctx *gin.Context) { ctx.JSON(200, instanceServer.Id) } -func (con Connection) GetServers(ctx *gin.Context) { +func (con ServersApi) GetServers(ctx *gin.Context) { instanceServers, err := con.InstanceManager.ListServers(ctx) if err != nil { ctx.AbortWithError(500, err) @@ -246,7 +245,7 @@ func (con Connection) GetServers(ctx *gin.Context) { ctx.JSON(200, servers) } -func (con Connection) StopServer(ctx *gin.Context) { +func (con ServersApi) StopServer(ctx *gin.Context) { serverId := ctx.Param("server_id") err := con.InstanceManager.StopServer(ctx, serverId) if err != nil { @@ -257,7 +256,7 @@ func (con Connection) StopServer(ctx *gin.Context) { ctx.Status(200) } -func (con Connection) DeleteServer(ctx *gin.Context) { +func (con ServersApi) DeleteServer(ctx *gin.Context) { serverId := ctx.Param("server_id") err := con.InstanceManager.DeleteServer(ctx, serverId) @@ -279,7 +278,7 @@ type RunCommandRequest struct { Command string `json:"Command"` } -func (con Connection) RunCommand(ctx *gin.Context) { +func (con ServersApi) RunCommand(ctx *gin.Context) { var request RunCommandRequest err := json.NewDecoder(ctx.Request.Body).Decode(&request) if err != nil { @@ -312,7 +311,7 @@ type Commands struct { Arguments string `json:"Arguments"` } -func (con Connection) AttachServer(ctx *gin.Context) { +func (con ServersApi) AttachServer(ctx *gin.Context) { serverId := ctx.Param("server_id") stop := false var err error @@ -355,13 +354,10 @@ func (con Connection) AttachServer(ctx *gin.Context) { hijackedPointer, err := con.InstanceManager.InteractiveTerminal(ctx, serverId) if err != nil { ctx.AbortWithError(500, err) + stop = true return } hijacked = *hijackedPointer - if err != nil { - stop = true - break - } } if count > 0 { containerRead <- string(data[:count]) @@ -444,7 +440,7 @@ type UpdateServerRequest struct { UserPermissions map[string]models.Permission `json:"UserPermissions"` } -func (con Connection) UpdateServer(ctx *gin.Context) { +func (con ServersApi) UpdateServer(ctx *gin.Context) { serverId := ctx.Param("server_id") var request UpdateServerRequest err := json.NewDecoder(ctx.Request.Body).Decode(&request) @@ -478,7 +474,7 @@ func (con Connection) UpdateServer(ctx *gin.Context) { } -func (con Connection) BrowseServer(ctx *gin.Context) { +func (con ServersApi) BrowseServer(ctx *gin.Context) { serverId := ctx.Param("server_id") browserInfo, err := con.InstanceManager.StartFileBrowser(ctx, serverId) @@ -489,7 +485,7 @@ func (con Connection) BrowseServer(ctx *gin.Context) { ctx.JSON(200, browserInfo.Url) } -func (con Connection) GetServerUserPermissions(ctx *gin.Context) { +func (con ServersApi) GetServerUserPermissions(ctx *gin.Context) { claims, exists := ctx.Get("claims") if !exists { ctx.AbortWithStatus(500) @@ -516,7 +512,7 @@ type SetServerUserPermissionsRequest struct { Permissions models.Permission } -func (con Connection) SetServerUserPermissions(ctx *gin.Context) { +func (con ServersApi) SetServerUserPermissions(ctx *gin.Context) { serverId := ctx.Param("server_id") if serverId == "" { ctx.AbortWithStatus(500) @@ -541,36 +537,22 @@ func (con Connection) SetServerUserPermissions(ctx *gin.Context) { } func LoadGroup(group *gin.RouterGroup, config models.GlobalConfig) { - - var instanceManager instancemanager.InstanceManager - var serversDbHandler dbhandler.ServersDbHandler - var serversAuthorizationHandler dbhandler.ServersAuthorizationDbHandler - - var err error - - if config.InstanceManager.Type == models.DOCKER { - instanceManager, err = docker.NewInstanceManager(config.InstanceManager.Docker) - if err != nil { - panic(err) - } + instanceManager, err := factories.GetInstanceManager(config.InstanceManager) + if err != nil { + panic(err) } - if config.ServersDatabase.Type == models.MONGO { - serversDbHandler, err = mongo.NewServersDbHandler(*config.ServersDatabase.Mongo) - if err != nil { - panic(err) - } + serversDbHandler, err := factories.GetServersDbHandler(config.ServersDatabase) + if err != nil { + panic(err) } - if config.ServersAuthorizationDatabase.Type == models.MONGO { - serversAuthorizationHandler, err = mongo.NewAuthorizationHandler(*config.ServersAuthorizationDatabase.Mongo) - if err != nil { - panic(err) - } - + serversAuthorizationHandler, err := factories.GetServersAuthorizationDbHandler(config.ServersAuthorizationDatabase) + if err != nil { + panic(err) } - connection := Connection{ + connection := ServersApi{ ServersDbHandler: serversDbHandler, ServerAuthorization: serversAuthorizationHandler, InstanceManager: instanceManager, diff --git a/users/go.mod b/users/go.mod index 1affd75..002ee8b 100644 --- a/users/go.mod +++ b/users/go.mod @@ -1,4 +1,4 @@ -module git.acooldomain.co/server-manager/backend-kubernetes-go/users +module git.acooldomain.co/server-manager/backend/users go 1.22.0 diff --git a/users/users.go b/users/users.go index ebd0ac2..059322f 100644 --- a/users/users.go +++ b/users/users.go @@ -4,15 +4,15 @@ import ( "encoding/json" "net/http" - "git.acooldomain.co/server-manager/backend-kubernetes-go/auth" - "git.acooldomain.co/server-manager/backend-kubernetes-go/db_handler/mongo" - "git.acooldomain.co/server-manager/backend-kubernetes-go/dbhandler" - "git.acooldomain.co/server-manager/backend-kubernetes-go/mail" - "git.acooldomain.co/server-manager/backend-kubernetes-go/models" + "git.acooldomain.co/server-manager/backend/auth" + "git.acooldomain.co/server-manager/backend/dbhandler" + "git.acooldomain.co/server-manager/backend/factories" + "git.acooldomain.co/server-manager/backend/mail" + "git.acooldomain.co/server-manager/backend/models" "github.com/gin-gonic/gin" ) -type Connection struct { +type UsersApi struct { userPassAuthHandler dbhandler.UserPassAuthanticationDbHandler tokenHandler dbhandler.InviteTokenDbHandler mailClient mail.MailClient @@ -25,7 +25,7 @@ type UserResponse struct { Permissions models.Permission `json:"Permissions"` } -func (con Connection) GetUsers(ctx *gin.Context) { +func (con UsersApi) GetUsers(ctx *gin.Context) { users, err := con.userPassAuthHandler.ListUsers(ctx) if err != nil { @@ -36,7 +36,7 @@ func (con Connection) GetUsers(ctx *gin.Context) { ctx.JSON(http.StatusOK, users) } -func (con Connection) GetUser(ctx *gin.Context) { +func (con UsersApi) GetUser(ctx *gin.Context) { claims, exists := ctx.Get("claims") if !exists { ctx.AbortWithStatus(403) @@ -54,7 +54,7 @@ type InviteUser struct { Permissions models.Permission `json:"Permissions"` } -func (con Connection) InviteUser(ctx *gin.Context) { +func (con UsersApi) InviteUser(ctx *gin.Context) { var request InviteUser json.NewDecoder(ctx.Request.Body).Decode(&request) @@ -78,7 +78,7 @@ type SetUserPermissionsRequest struct { Permissions models.Permission `json:"Permissions"` } -func (con Connection) SetUserPermissions(ctx *gin.Context) { +func (con UsersApi) SetUserPermissions(ctx *gin.Context) { var request SetUserPermissionsRequest json.NewDecoder(ctx.Request.Body).Decode(&request) username := ctx.Param("user_id") @@ -92,7 +92,7 @@ func (con Connection) SetUserPermissions(ctx *gin.Context) { ctx.JSON(200, "OK") } -func (con Connection) DeleteUser(ctx *gin.Context) { +func (con UsersApi) DeleteUser(ctx *gin.Context) { username := ctx.Param("user_id") err := con.userPassAuthHandler.RemoveUser(ctx, username) @@ -106,29 +106,16 @@ func (con Connection) DeleteUser(ctx *gin.Context) { } func LoadGroup(group *gin.RouterGroup, config models.GlobalConfig) { - var userAuthHandler dbhandler.UserPassAuthanticationDbHandler - var inviteHandler dbhandler.InviteTokenDbHandler - var mailClient mail.MailClient - - var err error - - if config.Authentication.UserPass.Type == models.MONGO { - userAuthHandler, err = mongo.NewUserPassAuthHandler(*config.Authentication.UserPass.Mongo) - if err != nil { - panic(err) - } + userAuthHandler, err := factories.GetUserPassAuthDbHandler(config.Authentication.UserPass) + if err != nil { + panic(err) } - if config.Authentication.UserPass.InviteTokenDatabase.Type == models.MONGO { - inviteHandler, err = mongo.NewInviteTokenDbHandler(*config.Authentication.UserPass.Mongo) - if err != nil { - panic(err) - } - } + inviteHandler, err := factories.GetInviteTokenDbHandler(config.Authentication.UserPass.InviteTokenDatabase) - mailClient = *mail.NewMailClient(config.Email) + mailClient := *mail.NewMailClient(config.Email) - connection := Connection{ + connection := UsersApi{ userPassAuthHandler: userAuthHandler, tokenHandler: inviteHandler, mailClient: mailClient, diff --git a/utils/constructors.go b/utils/constructors.go deleted file mode 100644 index 69d2514..0000000 --- a/utils/constructors.go +++ /dev/null @@ -1,41 +0,0 @@ -package dbhandler - -import ( - "fmt" - "sync" - - "git.acooldomain.co/server-manager/backend-kubernetes-go/db_handler/mongo" - "git.acooldomain.co/server-manager/backend-kubernetes-go/dbhandler" - "git.acooldomain.co/server-manager/backend-kubernetes-go/models" -) - -var ( - mu sync.Mutex - existingServerAuthHandlers = make(map[string]dbhandler.ServersAuthorizationDbHandler) -) - -func configToKey(config any) (string, error) { - switch c := config.(type) { - case models.MongoDBConfig: - return fmt.Sprintf("mongo:%s:%s:%s:%s:%s", c.Url, c.Database, c.Collection, c.Username, c.Password), nil - default: - return "", fmt.Errorf("unknown config format") - } -} - -func GetServersAuthDbHandler(config any) (dbhandler.ServersAuthorizationDbHandler, error) { - mu.Lock() - defer mu.Unlock() - key, err := configToKey(config) - if handler, exists := existingServerAuthHandlers[key]; err != nil && exists { - return handler, nil - } - - switch c := config.(type) { - case models.MongoDBConfig: - handler, err := mongo.NewServersAuthorizationHandler(c) - return handler, err - } - - return nil, fmt.Errorf("Unknown config format") -} diff --git a/utils/go.mod b/utils/go.mod deleted file mode 100644 index 6d8d73d..0000000 --- a/utils/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module git.acooldomain.co/server-manager/backend-kubernetes-go/utils - -go 1.22.0