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

     1  /*
     2   * Copyright (c) 2023-present unTill Pro, Ltd.
     3   */
     4  
     5  package invite
     6  
     7  import (
     8  	"fmt"
     9  	"strings"
    10  
    11  	"github.com/voedger/voedger/pkg/appdef"
    12  	"github.com/voedger/voedger/pkg/istructs"
    13  	"github.com/voedger/voedger/pkg/itokens"
    14  	payloads "github.com/voedger/voedger/pkg/itokens-payloads"
    15  	"github.com/voedger/voedger/pkg/state"
    16  	"github.com/voedger/voedger/pkg/sys/smtp"
    17  	coreutils "github.com/voedger/voedger/pkg/utils"
    18  	"github.com/voedger/voedger/pkg/utils/federation"
    19  )
    20  
    21  func asyncProjectorApplyUpdateInviteRoles(timeFunc coreutils.TimeFunc, federation federation.IFederation, tokens itokens.ITokens, smtpCfg smtp.Cfg) istructs.Projector {
    22  	return istructs.Projector{
    23  		Name: qNameAPApplyUpdateInviteRoles,
    24  		Func: applyUpdateInviteRolesProjector(timeFunc, federation, tokens, smtpCfg),
    25  	}
    26  }
    27  
    28  func applyUpdateInviteRolesProjector(timeFunc coreutils.TimeFunc, federation federation.IFederation, tokens itokens.ITokens, smtpCfg smtp.Cfg) func(event istructs.IPLogEvent, state istructs.IState, intents istructs.IIntents) (err error) {
    29  	return func(event istructs.IPLogEvent, s istructs.IState, intents istructs.IIntents) (err error) {
    30  		skbCDocInvite, err := s.KeyBuilder(state.Record, qNameCDocInvite)
    31  		if err != nil {
    32  			return
    33  		}
    34  		skbCDocInvite.PutRecordID(state.Field_ID, event.ArgumentObject().AsRecordID(field_InviteID))
    35  		svCDocInvite, err := s.MustExist(skbCDocInvite)
    36  		if err != nil {
    37  			return
    38  		}
    39  
    40  		skbCDocSubject, err := s.KeyBuilder(state.Record, QNameCDocSubject)
    41  		if err != nil {
    42  			return
    43  		}
    44  		skbCDocSubject.PutRecordID(state.Field_ID, svCDocInvite.AsRecordID(field_SubjectID))
    45  		svCDocSubject, err := s.MustExist(skbCDocSubject)
    46  		if err != nil {
    47  			return
    48  		}
    49  
    50  		appQName := s.App()
    51  
    52  		token, err := payloads.GetSystemPrincipalToken(tokens, appQName)
    53  		if err != nil {
    54  			return
    55  		}
    56  
    57  		//Update subject
    58  		_, err = federation.Func(
    59  			fmt.Sprintf("api/%s/%d/c.sys.CUD", appQName, event.Workspace()),
    60  			fmt.Sprintf(`{"cuds":[{"sys.ID":%d,"fields":{"Roles":"%s"}}]}`, svCDocSubject.AsRecordID(appdef.SystemField_ID), event.ArgumentObject().AsString(Field_Roles)),
    61  			coreutils.WithAuthorizeBy(token),
    62  			coreutils.WithDiscardResponse())
    63  		if err != nil {
    64  			return
    65  		}
    66  
    67  		//Update joined workspace roles
    68  		_, err = federation.Func(
    69  			fmt.Sprintf("api/%s/%d/c.sys.UpdateJoinedWorkspaceRoles", appQName, svCDocInvite.AsInt64(field_InviteeProfileWSID)),
    70  			fmt.Sprintf(`{"args":{"Roles":"%s","InvitingWorkspaceWSID":%d}}`, event.ArgumentObject().AsString(Field_Roles), event.Workspace()),
    71  			coreutils.WithAuthorizeBy(token),
    72  			coreutils.WithDiscardResponse())
    73  		if err != nil {
    74  			return
    75  		}
    76  
    77  		emailTemplate := coreutils.TruncateEmailTemplate(event.ArgumentObject().AsString(field_EmailTemplate))
    78  
    79  		replacer := strings.NewReplacer(EmailTemplatePlaceholder_Roles, event.ArgumentObject().AsString(Field_Roles))
    80  
    81  		//Send roles update email
    82  		skbSendMail, err := s.KeyBuilder(state.SendMail, appdef.NullQName)
    83  		if err != nil {
    84  			return
    85  		}
    86  		skbSendMail.PutString(state.Field_Subject, event.ArgumentObject().AsString(field_EmailSubject))
    87  		skbSendMail.PutString(state.Field_To, svCDocInvite.AsString(field_Email))
    88  		skbSendMail.PutString(state.Field_Body, replacer.Replace(emailTemplate))
    89  		skbSendMail.PutString(state.Field_From, smtpCfg.GetFrom())
    90  		skbSendMail.PutString(state.Field_Host, smtpCfg.Host)
    91  		skbSendMail.PutInt32(state.Field_Port, smtpCfg.Port)
    92  		skbSendMail.PutString(state.Field_Username, smtpCfg.Username)
    93  
    94  		pwd := ""
    95  		if !coreutils.IsTest() {
    96  			skbAppSecretsStorage, err := s.KeyBuilder(state.AppSecret, appdef.NullQName)
    97  			if err != nil {
    98  				return err
    99  			}
   100  			skbAppSecretsStorage.PutString(state.Field_Secret, smtpCfg.PwdSecret)
   101  			svAppSecretsStorage, err := s.MustExist(skbAppSecretsStorage)
   102  			if err != nil {
   103  				return err
   104  			}
   105  			pwd = svAppSecretsStorage.AsString("")
   106  		}
   107  		skbSendMail.PutString(state.Field_Password, pwd)
   108  
   109  		_, err = intents.NewValue(skbSendMail)
   110  		if err != nil {
   111  			return
   112  		}
   113  
   114  		//Update invite
   115  		_, err = federation.Func(
   116  			fmt.Sprintf("api/%s/%d/c.sys.CUD", appQName, event.Workspace()),
   117  			fmt.Sprintf(`{"cuds":[{"sys.ID":%d,"fields":{"State":%d,"Updated":%d,"Roles":"%s"}}]}`, event.ArgumentObject().AsRecordID(field_InviteID), State_Joined, timeFunc().UnixMilli(), event.ArgumentObject().AsString(Field_Roles)),
   118  			coreutils.WithAuthorizeBy(token),
   119  			coreutils.WithDiscardResponse())
   120  
   121  		return err
   122  	}
   123  }