github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/pkg/sys/invite/impl_applyleaveworkspace.go (about) 1 /* 2 * Copyright (c) 2023-present unTill Pro, Ltd. 3 */ 4 5 package invite 6 7 import ( 8 "fmt" 9 10 "github.com/voedger/voedger/pkg/appdef" 11 "github.com/voedger/voedger/pkg/goutils/iterate" 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 coreutils "github.com/voedger/voedger/pkg/utils" 17 "github.com/voedger/voedger/pkg/utils/federation" 18 ) 19 20 func asyncProjectorApplyLeaveWorkspace(timeFunc coreutils.TimeFunc, federation federation.IFederation, tokens itokens.ITokens) istructs.Projector { 21 return istructs.Projector{ 22 Name: qNameAPApplyLeaveWorkspace, 23 Func: applyLeaveWorkspace(timeFunc, federation, tokens), 24 } 25 } 26 27 func applyLeaveWorkspace(timeFunc coreutils.TimeFunc, federation federation.IFederation, tokens itokens.ITokens) func(event istructs.IPLogEvent, state istructs.IState, intents istructs.IIntents) (err error) { 28 return func(event istructs.IPLogEvent, s istructs.IState, intents istructs.IIntents) (err error) { 29 return iterate.ForEachError(event.CUDs, func(rec istructs.ICUDRow) error { 30 //TODO additional check that CUD only once? 31 if rec.QName() != qNameCDocInvite { 32 return nil 33 } 34 35 skbCDocInvite, err := s.KeyBuilder(state.Record, qNameCDocInvite) 36 if err != nil { 37 return err 38 } 39 skbCDocInvite.PutRecordID(state.Field_ID, rec.ID()) 40 svCDocInvite, err := s.MustExist(skbCDocInvite) 41 if err != nil { 42 return err 43 } 44 45 skbCDocSubject, err := s.KeyBuilder(state.Record, QNameCDocSubject) 46 if err != nil { 47 return err 48 } 49 skbCDocSubject.PutRecordID(state.Field_ID, svCDocInvite.AsRecordID(field_SubjectID)) 50 svCDocSubject, err := s.MustExist(skbCDocSubject) 51 if err != nil { 52 return err 53 } 54 55 appQName := s.App() 56 57 token, err := payloads.GetSystemPrincipalToken(tokens, appQName) 58 if err != nil { 59 return err 60 } 61 62 //Update subject 63 _, err = federation.Func( 64 fmt.Sprintf("api/%s/%d/c.sys.CUD", appQName, event.Workspace()), 65 fmt.Sprintf(`{"cuds":[{"sys.ID":%d,"fields":{"sys.IsActive":false}}]}`, svCDocSubject.AsRecordID(appdef.SystemField_ID)), 66 coreutils.WithAuthorizeBy(token), 67 coreutils.WithDiscardResponse()) 68 if err != nil { 69 return err 70 } 71 72 //Deactivate joined workspace 73 _, err = federation.Func( 74 fmt.Sprintf("api/%s/%d/c.sys.DeactivateJoinedWorkspace", appQName, svCDocInvite.AsInt64(field_InviteeProfileWSID)), 75 fmt.Sprintf(`{"args":{"InvitingWorkspaceWSID":%d}}`, event.Workspace()), 76 coreutils.WithAuthorizeBy(token), 77 coreutils.WithDiscardResponse()) 78 if err != nil { 79 return err 80 } 81 82 //Update invite 83 _, err = federation.Func( 84 fmt.Sprintf("api/%s/%d/c.sys.CUD", appQName, event.Workspace()), 85 fmt.Sprintf(`{"cuds":[{"sys.ID":%d,"fields":{"State":%d,"Updated":%d}}]}`, rec.ID(), State_Left, timeFunc().UnixMilli()), 86 coreutils.WithAuthorizeBy(token), 87 coreutils.WithDiscardResponse()) 88 89 return err 90 }) 91 } 92 }