github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/pkg/sys/invite/impl_applycancelacceptedinvite.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/istructs"
    12  	"github.com/voedger/voedger/pkg/itokens"
    13  	payloads "github.com/voedger/voedger/pkg/itokens-payloads"
    14  	"github.com/voedger/voedger/pkg/state"
    15  	coreutils "github.com/voedger/voedger/pkg/utils"
    16  	"github.com/voedger/voedger/pkg/utils/federation"
    17  )
    18  
    19  func asyncProjectorApplyCancelAcceptedInvite(timeFunc coreutils.TimeFunc, federation federation.IFederation, tokens itokens.ITokens) istructs.Projector {
    20  	return istructs.Projector{
    21  		Name: qNameAPApplyCancelAcceptedInvite,
    22  		Func: applyCancelAcceptedInvite(timeFunc, federation, tokens),
    23  	}
    24  }
    25  
    26  // AFTER EXEC c.sys.InitiateCancelAcceptedInvite
    27  func applyCancelAcceptedInvite(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  		skbCDocInvite, err := s.KeyBuilder(state.Record, qNameCDocInvite)
    30  		if err != nil {
    31  			return
    32  		}
    33  		skbCDocInvite.PutRecordID(state.Field_ID, event.ArgumentObject().AsRecordID(field_InviteID))
    34  		svCDocInvite, err := s.MustExist(skbCDocInvite)
    35  		if err != nil {
    36  			return
    37  		}
    38  
    39  		skbCDocSubject, err := s.KeyBuilder(state.Record, QNameCDocSubject)
    40  		if err != nil {
    41  			return
    42  		}
    43  		skbCDocSubject.PutRecordID(state.Field_ID, svCDocInvite.AsRecordID(field_SubjectID))
    44  		svCDocSubject, err := s.MustExist(skbCDocSubject)
    45  		if err != nil {
    46  			return
    47  		}
    48  
    49  		appQName := s.App()
    50  
    51  		token, err := payloads.GetSystemPrincipalToken(tokens, appQName)
    52  		if err != nil {
    53  			return
    54  		}
    55  
    56  		// Update subject
    57  		_, err = federation.Func(
    58  			fmt.Sprintf("api/%s/%d/c.sys.CUD", appQName, event.Workspace()),
    59  			fmt.Sprintf(`{"cuds":[{"sys.ID":%d,"fields":{"sys.IsActive":false}}]}`, svCDocSubject.AsRecordID(appdef.SystemField_ID)),
    60  			coreutils.WithAuthorizeBy(token),
    61  			coreutils.WithDiscardResponse())
    62  		if err != nil {
    63  			return
    64  		}
    65  
    66  		// Deactivate joined workspace
    67  		_, err = federation.Func(
    68  			fmt.Sprintf("api/%s/%d/c.sys.DeactivateJoinedWorkspace", appQName, svCDocInvite.AsInt64(field_InviteeProfileWSID)),
    69  			fmt.Sprintf(`{"args":{"InvitingWorkspaceWSID":%d}}`, event.Workspace()),
    70  			coreutils.WithAuthorizeBy(token),
    71  			coreutils.WithDiscardResponse())
    72  		if err != nil {
    73  			return
    74  		}
    75  
    76  		// Update invite
    77  		_, err = federation.Func(
    78  			fmt.Sprintf("api/%s/%d/c.sys.CUD", appQName, event.Workspace()),
    79  			fmt.Sprintf(`{"cuds":[{"sys.ID":%d,"fields":{"State":%d,"Updated":%d}}]}`, event.ArgumentObject().AsRecordID(field_InviteID), State_Cancelled, timeFunc().UnixMilli()),
    80  			coreutils.WithAuthorizeBy(token),
    81  			coreutils.WithDiscardResponse())
    82  
    83  		return err
    84  	}
    85  }