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

     1  /*
     2   * Copyright (c) 2023-present unTill Pro, Ltd.
     3   */
     4  
     5  package invite
     6  
     7  import (
     8  	"net/http"
     9  
    10  	"github.com/voedger/voedger/pkg/appdef"
    11  	"github.com/voedger/voedger/pkg/istructs"
    12  	"github.com/voedger/voedger/pkg/istructsmem"
    13  	"github.com/voedger/voedger/pkg/state"
    14  	"github.com/voedger/voedger/pkg/sys/authnz"
    15  	coreutils "github.com/voedger/voedger/pkg/utils"
    16  )
    17  
    18  func provideCmdInitiateJoinWorkspace(cfg *istructsmem.AppConfigType, timeFunc coreutils.TimeFunc) {
    19  	cfg.Resources.Add(istructsmem.NewCommandFunction(
    20  		qNameCmdInitiateJoinWorkspace,
    21  		execCmdInitiateJoinWorkspace(timeFunc),
    22  	))
    23  }
    24  
    25  func execCmdInitiateJoinWorkspace(timeFunc coreutils.TimeFunc) func(args istructs.ExecCommandArgs) (err error) {
    26  	return func(args istructs.ExecCommandArgs) (err error) {
    27  		skbCDocInvite, err := args.State.KeyBuilder(state.Record, qNameCDocInvite)
    28  		if err != nil {
    29  			return
    30  		}
    31  		skbCDocInvite.PutRecordID(state.Field_ID, args.ArgumentObject.AsRecordID(field_InviteID))
    32  		svCDocInvite, ok, err := args.State.CanExist(skbCDocInvite)
    33  		if err != nil {
    34  			return
    35  		}
    36  		if !ok {
    37  			return coreutils.NewHTTPError(http.StatusBadRequest, ErrInviteNotExists)
    38  		}
    39  
    40  		if !isValidInviteState(svCDocInvite.AsInt32(field_State), qNameCmdInitiateJoinWorkspace) {
    41  			return coreutils.NewHTTPError(http.StatusBadRequest, ErrInviteStateInvalid)
    42  		}
    43  		if svCDocInvite.AsInt64(field_ExpireDatetime) < timeFunc().UnixMilli() {
    44  			return coreutils.NewHTTPError(http.StatusBadRequest, errInviteExpired)
    45  		}
    46  		if svCDocInvite.AsString(field_VerificationCode) != args.ArgumentObject.AsString(field_VerificationCode) {
    47  			return coreutils.NewHTTPError(http.StatusBadRequest, errInviteVerificationCodeInvalid)
    48  		}
    49  
    50  		skbPrincipal, err := args.State.KeyBuilder(state.RequestSubject, appdef.NullQName)
    51  		if err != nil {
    52  			return
    53  		}
    54  		svPrincipal, err := args.State.MustExist(skbPrincipal)
    55  		if err != nil {
    56  			return
    57  		}
    58  
    59  		svbCDocInvite, err := args.Intents.UpdateValue(skbCDocInvite, svCDocInvite)
    60  		if err != nil {
    61  			return
    62  		}
    63  		svbCDocInvite.PutInt64(field_InviteeProfileWSID, svPrincipal.AsInt64(state.Field_ProfileWSID))
    64  		svbCDocInvite.PutInt32(authnz.Field_SubjectKind, svPrincipal.AsInt32(state.Field_Kind))
    65  		svbCDocInvite.PutInt64(field_Updated, timeFunc().UnixMilli())
    66  		svbCDocInvite.PutInt32(field_State, State_ToBeJoined)
    67  		svbCDocInvite.PutChars(field_ActualLogin, svPrincipal.AsString(state.Field_Name))
    68  
    69  		return
    70  	}
    71  }