github.com/Axway/agent-sdk@v1.1.101/pkg/apic/provisioning/accessrequestdefinitionbuilder.go (about) 1 package provisioning 2 3 import ( 4 "fmt" 5 6 management "github.com/Axway/agent-sdk/pkg/apic/apiserver/models/management/v1alpha1" 7 "github.com/Axway/agent-sdk/pkg/apic/definitions" 8 "github.com/Axway/agent-sdk/pkg/util" 9 ) 10 11 // RegisterAccessRequestDefinition - the function signature used when calling the NewAccessRequestBuilder function 12 type RegisterAccessRequestDefinition func(accessRequestDefinition *management.AccessRequestDefinition) (*management.AccessRequestDefinition, error) 13 14 type accessRequestDef struct { 15 name string 16 title string 17 provisionSchema map[string]interface{} 18 requestSchema map[string]interface{} 19 provisionEqualsRequest bool 20 registerFunc RegisterAccessRequestDefinition 21 err error 22 } 23 24 // AccessRequestBuilder - aids in creating a new access request 25 type AccessRequestBuilder interface { 26 SetName(name string) AccessRequestBuilder 27 SetTitle(title string) AccessRequestBuilder 28 SetRequestSchema(schema SchemaBuilder) AccessRequestBuilder 29 SetProvisionSchema(schema SchemaBuilder) AccessRequestBuilder 30 SetProvisionSchemaToRequestSchema() AccessRequestBuilder 31 Register() (*management.AccessRequestDefinition, error) 32 } 33 34 // NewAccessRequestBuilder - called by the agent package and sends in the function that registers this access request 35 func NewAccessRequestBuilder(registerFunc RegisterAccessRequestDefinition) AccessRequestBuilder { 36 return &accessRequestDef{ 37 registerFunc: registerFunc, 38 } 39 } 40 41 // SetName - set the name of the access request 42 func (a *accessRequestDef) SetName(name string) AccessRequestBuilder { 43 a.name = name 44 return a 45 } 46 47 // SetTitle - set the title of the access request 48 func (a *accessRequestDef) SetTitle(title string) AccessRequestBuilder { 49 a.title = title 50 return a 51 } 52 53 // SetRequestSchema - set the schema to be used for access requests request data 54 func (a *accessRequestDef) SetRequestSchema(schema SchemaBuilder) AccessRequestBuilder { 55 if a.err != nil { 56 return a 57 } 58 59 if schema != nil { 60 a.requestSchema, a.err = schema.Build() 61 } else { 62 a.err = fmt.Errorf("expected a SchemaBuilder argument but received nil") 63 } 64 65 return a 66 } 67 68 // SetProvisionSchemaToRequestSchema - set the schema to be used for access requests provisioning data 69 func (a *accessRequestDef) SetProvisionSchemaToRequestSchema() AccessRequestBuilder { 70 if a.err != nil { 71 return a 72 } 73 74 if a.provisionSchema != nil { 75 a.err = fmt.Errorf("can't duplicate request schema as provisioning schema is set") 76 return a 77 } 78 79 a.provisionEqualsRequest = true 80 return a 81 } 82 83 // SetProvisionSchema - set the schema to be used for access requests provisioning data 84 func (a *accessRequestDef) SetProvisionSchema(schema SchemaBuilder) AccessRequestBuilder { 85 if a.err != nil { 86 return a 87 } 88 89 if schema != nil { 90 a.provisionSchema, a.err = schema.Build() 91 } else { 92 a.err = fmt.Errorf("expected a SchemaBuilder argument but received nil") 93 } 94 95 return a 96 } 97 98 // Register - create the access request defintion and send it to Central 99 func (a *accessRequestDef) Register() (*management.AccessRequestDefinition, error) { 100 if a.err != nil { 101 return nil, a.err 102 } 103 104 if a.requestSchema == nil { 105 a.requestSchema, _ = NewSchemaBuilder().Build() 106 } 107 108 if a.provisionSchema == nil { 109 if a.provisionEqualsRequest { 110 a.provisionSchema = util.MergeMapStringInterface(a.requestSchema) 111 } else { 112 a.provisionSchema, _ = NewSchemaBuilder().Build() 113 } 114 } 115 116 if a.title == "" { 117 a.title = a.name 118 } 119 120 spec := management.AccessRequestDefinitionSpec{ 121 Schema: a.requestSchema, 122 Provision: &management.AccessRequestDefinitionSpecProvision{ 123 Schema: a.provisionSchema, 124 }, 125 } 126 127 hashInt, _ := util.ComputeHash(spec) 128 129 if a.name == "" { 130 a.name = util.ConvertUnitToString(hashInt) 131 } 132 133 ard := management.NewAccessRequestDefinition(a.name, "") 134 ard.Title = a.title 135 ard.Spec = spec 136 137 util.SetAgentDetailsKey(ard, definitions.AttrSpecHash, fmt.Sprintf("%v", hashInt)) 138 139 return a.registerFunc(ard) 140 }