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 }