github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/pkg/sys/invite/impl_initiateinvitationbyemail.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 coreutils "github.com/voedger/voedger/pkg/utils" 15 ) 16 17 func provideCmdInitiateInvitationByEMail(cfg *istructsmem.AppConfigType, timeFunc coreutils.TimeFunc) { 18 cfg.Resources.Add(istructsmem.NewCommandFunction( 19 qNameCmdInitiateInvitationByEMail, 20 execCmdInitiateInvitationByEMail(timeFunc), 21 )) 22 } 23 24 func execCmdInitiateInvitationByEMail(timeFunc coreutils.TimeFunc) func(args istructs.ExecCommandArgs) (err error) { 25 return func(args istructs.ExecCommandArgs) (err error) { 26 if !coreutils.IsValidEmailTemplate(args.ArgumentObject.AsString(field_EmailTemplate)) { 27 return coreutils.NewHTTPError(http.StatusBadRequest, errInviteTemplateInvalid) 28 } 29 30 login := args.ArgumentObject.AsString(field_Email) 31 subjectExists, actualLogin, err := SubjectExistByBothLogins(login, args.State) // for backward compatibility 32 if err != nil { 33 return 34 } 35 36 skbViewInviteIndex, err := args.State.KeyBuilder(state.View, qNameViewInviteIndex) 37 if err != nil { 38 return 39 } 40 skbViewInviteIndex.PutInt32(field_Dummy, value_Dummy_One) 41 skbViewInviteIndex.PutString(Field_Login, args.ArgumentObject.AsString(field_Email)) 42 svViewInviteIndex, ok, err := args.State.CanExist(skbViewInviteIndex) 43 if err != nil { 44 return 45 } 46 47 if ok { 48 skbCDocInvite, err := args.State.KeyBuilder(state.Record, qNameCDocInvite) 49 if err != nil { 50 return err 51 } 52 skbCDocInvite.PutRecordID(state.Field_ID, svViewInviteIndex.AsRecordID(field_InviteID)) 53 svCDocInvite, err := args.State.MustExist(skbCDocInvite) 54 if err != nil { 55 return err 56 } 57 58 if subjectExists && !reInviteAllowedForState[svCDocInvite.AsInt32(field_State)] { 59 // If Subject exists by token.Login and state is not ToBeInvited and not Invited -> subject already exists error 60 return coreutils.NewHTTPError(http.StatusBadRequest, ErrSubjectAlreadyExists) 61 } 62 63 if !isValidInviteState(svCDocInvite.AsInt32(field_State), qNameCmdInitiateInvitationByEMail) { 64 return coreutils.NewHTTPError(http.StatusBadRequest, ErrInviteStateInvalid) 65 } 66 67 svbCDocInvite, err := args.Intents.UpdateValue(skbCDocInvite, svCDocInvite) 68 if err != nil { 69 return err 70 } 71 svbCDocInvite.PutString(Field_Roles, args.ArgumentObject.AsString(Field_Roles)) 72 svbCDocInvite.PutInt64(field_ExpireDatetime, args.ArgumentObject.AsInt64(field_ExpireDatetime)) 73 svbCDocInvite.PutInt32(field_State, State_ToBeInvited) 74 svbCDocInvite.PutInt64(field_Updated, timeFunc().UnixMilli()) 75 svbCDocInvite.PutString(field_ActualLogin, actualLogin) 76 77 return nil 78 } 79 80 skbCDocInvite, err := args.State.KeyBuilder(state.Record, qNameCDocInvite) 81 if err != nil { 82 return err 83 } 84 svbCDocInvite, err := args.Intents.NewValue(skbCDocInvite) 85 if err != nil { 86 return err 87 } 88 now := timeFunc().UnixMilli() 89 svbCDocInvite.PutRecordID(appdef.SystemField_ID, istructs.RecordID(1)) 90 svbCDocInvite.PutString(Field_Login, args.ArgumentObject.AsString(field_Email)) 91 svbCDocInvite.PutString(field_Email, args.ArgumentObject.AsString(field_Email)) 92 svbCDocInvite.PutString(Field_Roles, args.ArgumentObject.AsString(Field_Roles)) 93 svbCDocInvite.PutInt64(field_ExpireDatetime, args.ArgumentObject.AsInt64(field_ExpireDatetime)) 94 svbCDocInvite.PutInt64(field_Created, now) 95 svbCDocInvite.PutInt64(field_Updated, now) 96 svbCDocInvite.PutInt32(field_State, State_ToBeInvited) 97 svbCDocInvite.PutString(field_ActualLogin, actualLogin) 98 99 return 100 } 101 }