github.com/masterhung0112/hk_server/v5@v5.0.0-20220302090640-ec71aef15e1c/app/slashcommands/auto_users.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See LICENSE.txt for license information.
     3  
     4  package slashcommands
     5  
     6  import (
     7  	"errors"
     8  	"net/http"
     9  
    10  	"github.com/masterhung0112/hk_server/v5/app"
    11  	"github.com/masterhung0112/hk_server/v5/app/request"
    12  	"github.com/masterhung0112/hk_server/v5/model"
    13  	"github.com/masterhung0112/hk_server/v5/store"
    14  	"github.com/masterhung0112/hk_server/v5/utils"
    15  )
    16  
    17  type AutoUserCreator struct {
    18  	app          *app.App
    19  	client       *model.Client4
    20  	team         *model.Team
    21  	EmailLength  utils.Range
    22  	EmailCharset string
    23  	NameLength   utils.Range
    24  	NameCharset  string
    25  	Fuzzy        bool
    26  }
    27  
    28  func NewAutoUserCreator(a *app.App, client *model.Client4, team *model.Team) *AutoUserCreator {
    29  	return &AutoUserCreator{
    30  		app:          a,
    31  		client:       client,
    32  		team:         team,
    33  		EmailLength:  UserEmailLen,
    34  		EmailCharset: utils.LOWERCASE,
    35  		NameLength:   UserNameLen,
    36  		NameCharset:  utils.LOWERCASE,
    37  		Fuzzy:        false,
    38  	}
    39  }
    40  
    41  // Basic test team and user so you always know one
    42  func CreateBasicUser(a *app.App, client *model.Client4) *model.AppError {
    43  	found, _ := client.TeamExists(BTestTeamName, "")
    44  	if found {
    45  		return nil
    46  	}
    47  
    48  	newteam := &model.Team{DisplayName: BTestTeamDisplayName, Name: BTestTeamName, Email: BTestTeamEmail, Type: BTestTeamType}
    49  	basicteam, resp := client.CreateTeam(newteam)
    50  	if resp.Error != nil {
    51  		return resp.Error
    52  	}
    53  	newuser := &model.User{Email: BTestUserEmail, Nickname: BTestUserName, Password: BTestUserPassword}
    54  	ruser, resp := client.CreateUser(newuser)
    55  	if resp.Error != nil {
    56  		return resp.Error
    57  	}
    58  	_, err := a.Srv().Store.User().VerifyEmail(ruser.Id, ruser.Email)
    59  	if err != nil {
    60  		return model.NewAppError("CreateBasicUser", "app.user.verify_email.app_error", nil, err.Error(), http.StatusInternalServerError)
    61  	}
    62  	if _, nErr := a.Srv().Store.Team().SaveMember(&model.TeamMember{TeamId: basicteam.Id, UserId: ruser.Id}, *a.Config().TeamSettings.MaxUsersPerTeam); nErr != nil {
    63  		var appErr *model.AppError
    64  		var conflictErr *store.ErrConflict
    65  		var limitExceededErr *store.ErrLimitExceeded
    66  		switch {
    67  		case errors.As(nErr, &appErr): // in case we haven't converted to plain error.
    68  			return appErr
    69  		case errors.As(nErr, &conflictErr):
    70  			return model.NewAppError("CreateBasicUser", "app.create_basic_user.save_member.conflict.app_error", nil, nErr.Error(), http.StatusBadRequest)
    71  		case errors.As(nErr, &limitExceededErr):
    72  			return model.NewAppError("CreateBasicUser", "app.create_basic_user.save_member.max_accounts.app_error", nil, nErr.Error(), http.StatusBadRequest)
    73  		default: // last fallback in case it doesn't map to an existing app error.
    74  			return model.NewAppError("CreateBasicUser", "app.create_basic_user.save_member.app_error", nil, nErr.Error(), http.StatusInternalServerError)
    75  		}
    76  	}
    77  
    78  	return nil
    79  }
    80  
    81  func (cfg *AutoUserCreator) createRandomUser(c *request.Context) (*model.User, error) {
    82  	var userEmail string
    83  	var userName string
    84  	if cfg.Fuzzy {
    85  		userEmail = "success+" + model.NewId() + "@simulator.amazonses.com"
    86  		userName = utils.FuzzName()
    87  	} else {
    88  		userEmail = "success+" + model.NewId() + "@simulator.amazonses.com"
    89  		userName = utils.RandomName(cfg.NameLength, cfg.NameCharset)
    90  	}
    91  
    92  	user := &model.User{
    93  		Email:    userEmail,
    94  		Nickname: userName,
    95  		Password: UserPassword}
    96  
    97  	ruser, appErr := cfg.app.CreateUserWithInviteId(c, user, cfg.team.InviteId, "")
    98  	if appErr != nil {
    99  		return nil, appErr
   100  	}
   101  
   102  	status := &model.Status{UserId: ruser.Id, Status: model.STATUS_ONLINE, Manual: false, LastActivityAt: model.GetMillis(), ActiveChannel: ""}
   103  	if err := cfg.app.Srv().Store.Status().SaveOrUpdate(status); err != nil {
   104  		return nil, err
   105  	}
   106  
   107  	// We need to cheat to verify the user's email
   108  	_, err := cfg.app.Srv().Store.User().VerifyEmail(ruser.Id, ruser.Email)
   109  	if err != nil {
   110  		return nil, err
   111  	}
   112  
   113  	return ruser, nil
   114  }
   115  
   116  func (cfg *AutoUserCreator) CreateTestUsers(c *request.Context, num utils.Range) ([]*model.User, error) {
   117  	numUsers := utils.RandIntFromRange(num)
   118  	users := make([]*model.User, numUsers)
   119  
   120  	for i := 0; i < numUsers; i++ {
   121  		var err error
   122  		users[i], err = cfg.createRandomUser(c)
   123  		if err != nil {
   124  			return nil, err
   125  		}
   126  	}
   127  
   128  	return users, nil
   129  }