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  }