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  }