AssignVariable with condition

Hello

I would like to set a variable to manage token expiration according to custom attribute coming from application or product

Instead of having different steps in preflow I would like to manage this in only one AssignMessage Policy as following

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><AssignMessage async="false" continueOnError="false" enabled="true" name="SetExpirationTime">   
 <DisplayName>SettExpirationTime</DisplayName>     
 <Properties/>     
  <AssignVariable>         
   <Condition>verifyapikey.VerifyClientId.token_expiration != null</Condition>   
   <Name>opevar.token_expiration</Name>
   <Ref>verifyapikey.VerifyClientId.token_expiration</Ref>
  </AssignVariable>
  <AssignVariable>
   <Condition>(verifyapikey.VerifyClientId.apiproduct.token_expiration != null)      and (opevar.token_expiration = null) </Condition>
   <Name>opevar.token_expiration</Name>
   <Ref>verifyapikey.VerifyClientId.apiproduct.token_expiration</Ref>
  </AssignVariable>
  <AssignVariable>
   <Condition>opevar.token_expiration = null</Condition>
   <Name>opevar.token_expiration</Name>
   <Value>3600</Value>
  </AssignVariable>
<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
<AssignTo createNew="false" transport="http" type="request"/></AssignMessage>

Condition section seems to be available by AssignMessage policy, but the execution doesn't work

Ant idea ?

Thank you

1 2 1,100
2 REPLIES 2

No, you cannot insert a Condition as a child of the AssignVariable element. The configuration you are suggesting will not work.

I suggest you accomplish your goal with a JS policy.

<Javascript name='JS-SetExpirationTime' timeLimit='200' >
  <Source>
    var exp = context.getVariable('verifyapikey.VerifyClientId.apiproduct.token_expiration');
    if (exp) {
      context.setVariable('opevar.token_expiration', exp);
    }
    else {
      exp = context.getVariable('verifyapikey.VerifyClientId.apiproduct.token_expiration');
      if (exp) {
        context.setVariable('opevar.token_expiration', exp);
      }
      else {
        context.setVariable('opevar.token_expiration', '3600');
      }
   }
  </Source>
</Javascript>

It might be interesting for Apigee to introduce a new function "coalesce" which would return the first non-null value. It would allow a more compact expression of what you want to accomplish, something like:

  <AssignVariable>
   <Name>opevar.token_expiration</Name>
   <Template>{coalesce(verifyapikey.VerifyClientId.token_expiration,verifyapikey.VerifyClientId.apiproduct.token_expiration,3600)}</Template>
  </AssignVariable>