github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/pkg/sys/invite/impl_initiateinvitationbyemail.go (about)

     1  /*
     2   * Copyright (c) 2023-present unTill Pro, Ltd.
     3   */
     4  
     5  package invite
     6  
     7  import (
     8  	"net/http"
     9  
    10  	"github.com/voedger/voedger/pkg/appdef"
    11  	"github.com/voedger/voedger/pkg/istructs"
    12  	"github.com/voedger/voedger/pkg/istructsmem"
    13  	"github.com/voedger/voedger/pkg/state"
    14  	coreutils "github.com/voedger/voedger/pkg/utils"
    15  )
    16  
    17  func provideCmdInitiateInvitationByEMail(cfg *istructsmem.AppConfigType, timeFunc coreutils.TimeFunc) {
    18  	cfg.Resources.Add(istructsmem.NewCommandFunction(
    19  		qNameCmdInitiateInvitationByEMail,
    20  		execCmdInitiateInvitationByEMail(timeFunc),
    21  	))
    22  }
    23  
    24  func execCmdInitiateInvitationByEMail(timeFunc coreutils.TimeFunc) func(args istructs.ExecCommandArgs) (err error) {
    25  	return func(args istructs.ExecCommandArgs) (err error) {
    26  		if !coreutils.IsValidEmailTemplate(args.ArgumentObject.AsString(field_EmailTemplate)) {
    27  			return coreutils.NewHTTPError(http.StatusBadRequest, errInviteTemplateInvalid)
    28  		}
    29  
    30  		login := args.ArgumentObject.AsString(field_Email)
    31  		subjectExists, actualLogin, err := SubjectExistByBothLogins(login, args.State) // for backward compatibility
    32  		if err != nil {
    33  			return
    34  		}
    35  
    36  		skbViewInviteIndex, err := args.State.KeyBuilder(state.View, qNameViewInviteIndex)
    37  		if err != nil {
    38  			return
    39  		}
    40  		skbViewInviteIndex.PutInt32(field_Dummy, value_Dummy_One)
    41  		skbViewInviteIndex.PutString(Field_Login, args.ArgumentObject.AsString(field_Email))
    42  		svViewInviteIndex, ok, err := args.State.CanExist(skbViewInviteIndex)
    43  		if err != nil {
    44  			return
    45  		}
    46  
    47  		if ok {
    48  			skbCDocInvite, err := args.State.KeyBuilder(state.Record, qNameCDocInvite)
    49  			if err != nil {
    50  				return err
    51  			}
    52  			skbCDocInvite.PutRecordID(state.Field_ID, svViewInviteIndex.AsRecordID(field_InviteID))
    53  			svCDocInvite, err := args.State.MustExist(skbCDocInvite)
    54  			if err != nil {
    55  				return err
    56  			}
    57  
    58  			if subjectExists && !reInviteAllowedForState[svCDocInvite.AsInt32(field_State)] {
    59  				// If Subject exists by token.Login and state is not ToBeInvited and not Invited -> subject already exists error
    60  				return coreutils.NewHTTPError(http.StatusBadRequest, ErrSubjectAlreadyExists)
    61  			}
    62  
    63  			if !isValidInviteState(svCDocInvite.AsInt32(field_State), qNameCmdInitiateInvitationByEMail) {
    64  				return coreutils.NewHTTPError(http.StatusBadRequest, ErrInviteStateInvalid)
    65  			}
    66  
    67  			svbCDocInvite, err := args.Intents.UpdateValue(skbCDocInvite, svCDocInvite)
    68  			if err != nil {
    69  				return err
    70  			}
    71  			svbCDocInvite.PutString(Field_Roles, args.ArgumentObject.AsString(Field_Roles))
    72  			svbCDocInvite.PutInt64(field_ExpireDatetime, args.ArgumentObject.AsInt64(field_ExpireDatetime))
    73  			svbCDocInvite.PutInt32(field_State, State_ToBeInvited)
    74  			svbCDocInvite.PutInt64(field_Updated, timeFunc().UnixMilli())
    75  			svbCDocInvite.PutString(field_ActualLogin, actualLogin)
    76  
    77  			return nil
    78  		}
    79  
    80  		skbCDocInvite, err := args.State.KeyBuilder(state.Record, qNameCDocInvite)
    81  		if err != nil {
    82  			return err
    83  		}
    84  		svbCDocInvite, err := args.Intents.NewValue(skbCDocInvite)
    85  		if err != nil {
    86  			return err
    87  		}
    88  		now := timeFunc().UnixMilli()
    89  		svbCDocInvite.PutRecordID(appdef.SystemField_ID, istructs.RecordID(1))
    90  		svbCDocInvite.PutString(Field_Login, args.ArgumentObject.AsString(field_Email))
    91  		svbCDocInvite.PutString(field_Email, args.ArgumentObject.AsString(field_Email))
    92  		svbCDocInvite.PutString(Field_Roles, args.ArgumentObject.AsString(Field_Roles))
    93  		svbCDocInvite.PutInt64(field_ExpireDatetime, args.ArgumentObject.AsInt64(field_ExpireDatetime))
    94  		svbCDocInvite.PutInt64(field_Created, now)
    95  		svbCDocInvite.PutInt64(field_Updated, now)
    96  		svbCDocInvite.PutInt32(field_State, State_ToBeInvited)
    97  		svbCDocInvite.PutString(field_ActualLogin, actualLogin)
    98  
    99  		return
   100  	}
   101  }