aligned users to new design
This commit is contained in:
@@ -7,6 +7,7 @@ import (
|
||||
|
||||
"git.acooldomain.co/server-manager/backend-kubernetes-go/dbhandler"
|
||||
"git.acooldomain.co/server-manager/backend-kubernetes-go/models"
|
||||
"github.com/google/uuid"
|
||||
"go.mongodb.org/mongo-driver/bson"
|
||||
"go.mongodb.org/mongo-driver/mongo"
|
||||
"go.mongodb.org/mongo-driver/mongo/options"
|
||||
@@ -14,14 +15,11 @@ import (
|
||||
|
||||
type AuthUser struct {
|
||||
Username string `json:"username"`
|
||||
Nickname string `json:"nickname"`
|
||||
HashedPassword string `json:"hashed_password"`
|
||||
Permissions models.Permission `json:"permissions"`
|
||||
}
|
||||
|
||||
type Invite struct {
|
||||
Email string `json:"email"`
|
||||
InvitingUser string `json:"inviting_user"`
|
||||
Token string `json:"token"`
|
||||
MaxOwnedSevers uint `json:"max_owned_severs"`
|
||||
Email string `json:"email"`
|
||||
}
|
||||
|
||||
type UserPassAuthenticationDbHandler struct {
|
||||
@@ -29,6 +27,29 @@ type UserPassAuthenticationDbHandler struct {
|
||||
collection *mongo.Collection
|
||||
}
|
||||
|
||||
func (self *UserPassAuthenticationDbHandler) ListUsers(ctx context.Context) ([]models.User, error) {
|
||||
cursor, err := self.collection.Find(ctx, nil)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var authUsers []AuthUser
|
||||
|
||||
cursor.All(ctx, &authUsers)
|
||||
|
||||
modelUsers := make([]models.User, len(authUsers))
|
||||
for i, authUser := range authUsers {
|
||||
modelUsers[i] = models.User{
|
||||
Username: authUser.Username,
|
||||
Nickname: authUser.Nickname,
|
||||
Email: authUser.Email,
|
||||
}
|
||||
}
|
||||
|
||||
return modelUsers, nil
|
||||
}
|
||||
|
||||
func (self *UserPassAuthenticationDbHandler) AuthenticateUser(ctx context.Context, username string, password string) (models.Permission, error) {
|
||||
var user AuthUser
|
||||
err := self.collection.FindOne(ctx, bson.M{"username": username}).Decode(&user)
|
||||
@@ -55,6 +76,8 @@ func (self *UserPassAuthenticationDbHandler) CreateUser(
|
||||
username string,
|
||||
password string,
|
||||
permissions models.Permission,
|
||||
email string,
|
||||
maxOwnedServers uint,
|
||||
) error {
|
||||
hashedPassword, err := dbhandler.HashPassword(password)
|
||||
|
||||
@@ -66,6 +89,8 @@ func (self *UserPassAuthenticationDbHandler) CreateUser(
|
||||
Username: username,
|
||||
HashedPassword: hashedPassword,
|
||||
Permissions: permissions,
|
||||
Email: email,
|
||||
MaxOwnedSevers: maxOwnedServers,
|
||||
})
|
||||
|
||||
return err
|
||||
@@ -121,3 +146,63 @@ func NewUserPassAuthHandler(config models.MongoDBConfig) (*UserPassAuthenticatio
|
||||
collection: client.Database(config.Database).Collection(config.Collection),
|
||||
}, nil
|
||||
}
|
||||
|
||||
type InviteToken struct {
|
||||
Email string `json:"email"`
|
||||
Token string `json:"token"`
|
||||
Permissions models.Permission `json:"permissions"`
|
||||
}
|
||||
|
||||
type InviteTokenDbHandler struct {
|
||||
dbhandler.InviteTokenDbHandler
|
||||
collection *mongo.Collection
|
||||
}
|
||||
|
||||
func (self *ServersDbHandler) SaveInviteToken(ctx context.Context, email string, permissions models.Permission) (string, error) {
|
||||
token := uuid.NewString()
|
||||
|
||||
_, err := self.collection.InsertOne(ctx, &InviteToken{
|
||||
Permissions: permissions,
|
||||
Email: email,
|
||||
Token: token,
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return token, nil
|
||||
}
|
||||
|
||||
func (self *ServersDbHandler) GetInviteToken(ctx context.Context, token string) (*dbhandler.InviteToken, error) {
|
||||
var inviteToken InviteToken
|
||||
err := self.collection.FindOne(ctx, bson.M{"token": token}).Decode(&inviteToken)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &dbhandler.InviteToken{
|
||||
Email: inviteToken.Email,
|
||||
Permissions: inviteToken.Permissions,
|
||||
Token: inviteToken.Token,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func NewInviteTokenDbHandler(config models.MongoDBConfig) (*InviteTokenDbHandler, 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 &InviteTokenDbHandler{
|
||||
collection: client.Database(config.Database).Collection(config.Collection),
|
||||
}, nil
|
||||
}
|
||||
|
@@ -1,6 +1,8 @@
|
||||
package dbhandler
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"git.acooldomain.co/server-manager/backend-kubernetes-go/models"
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
)
|
||||
@@ -10,33 +12,31 @@ func HashPassword(password string) (string, error) {
|
||||
return string(bytes), err
|
||||
}
|
||||
|
||||
type InviteUserRequest struct {
|
||||
Email string `json:"email"`
|
||||
InvitingUser string `json:"inviting_user"`
|
||||
Permissions models.Permission `json:"permissions"`
|
||||
}
|
||||
|
||||
type InviteToken struct {
|
||||
Email string `json:"email"`
|
||||
Permissions models.Permission `json:"permissions"`
|
||||
Token string `json:"token"`
|
||||
Email string
|
||||
Permissions models.Permission
|
||||
Token string
|
||||
}
|
||||
|
||||
type UserSignupRequest struct {
|
||||
Token InviteToken `json:"token"`
|
||||
Username string `json:"username"`
|
||||
Password string `json:"password"`
|
||||
Token InviteToken
|
||||
Username string
|
||||
Password string
|
||||
}
|
||||
|
||||
type UserPassAuthanticationDbHandler interface {
|
||||
AuthenticateUser(username string, password string) (models.Permission, error)
|
||||
CreateUser(username string, password string, permissions models.Permission) error
|
||||
RemoveUser(username string) error
|
||||
SetPermissions(username string, permissions models.Permission) error
|
||||
SetPassword(username string, password string) error
|
||||
// Read Only
|
||||
AuthenticateUser(ctx context.Context, username string, password string) (models.Permission, error)
|
||||
ListUsers(ctx context.Context) ([]models.User, error)
|
||||
|
||||
// Write
|
||||
CreateUser(ctx context.Context, username string, password string, permissions models.Permission, email string, maxOwnedServers uint) error
|
||||
RemoveUser(ctx context.Context, username string) error
|
||||
SetPermissions(ctx context.Context, username string, permissions models.Permission) error
|
||||
SetPassword(ctx context.Context, username string, password string) error
|
||||
}
|
||||
|
||||
type InviteTokenDbHandler interface {
|
||||
SaveInviteToken(token string, email string, permissions models.Permission) error
|
||||
GetInviteToken(token string) (*InviteToken, error)
|
||||
SaveInviteToken(ctx context.Context, email string, permissions models.Permission) (string, error)
|
||||
GetInviteToken(ctx context.Context, token string) (*InviteToken, error)
|
||||
}
|
||||
|
Reference in New Issue
Block a user