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 }