User existence check

Is there any other way to check user existence in the appian except with persisted value in table?

OriginalPostID-248067

  Discussion posts and replies are publicly visible

Parents
  • Can you use one of the following functions based on the requirement?

    1. isuseractive - Returns true if a given username represents an active user account.
    2. isusernametaken - Returns true if a user (active or deactivated) with the specified username (case-sensitive) exists in the system, indicating that the username is taken. Returns false otherwise.
    3. isusernameavailablefornewaccount - Returns whether a username can be used to create a new account
  • 0
    Certified Associate Developer
    in reply to rajasekhard

    in version 24.4 isuseractive function is not available, is there any other way to achieve this? I just want to validate if user is acitve or deactivated or even if doesn't exist anymore in the system, we are trying to validate the scenario if for any reason the user saved in DB was deactived or deleted from the system, cause currently we are saving the result of calling the funcion loggedInUser() in DB, this is storing a text value, however we have the requirement to display the fisrtName and lastName of the user in the frontend, therefore we would like to catch the invalid user exception assuming the user was deactivated, since we don't have a try-catch similiar function in version 24.4, we want to know if there is any other way to catch the exception or change the approach following your recomendations. Any help will be greatly appreciated, thanks and regards!

  • 0
    Certified Lead Developer
    in reply to Jose Castellot
    is there any other way to achieve this?

    zombie thread much?  Stuck out tongue

    But in all seriousness - With the current state of the User Record, I've found that the best (and arguably fastest) username-checking routine is now to use a custom-built expression rule that queries said Record type.  It's also the only solution I've found that treats the username as case-insensitive enough to work without laborious other bending-over-backwards workarounds (like you need to use with the "isUsernameTaken()" and "isusernameavailablefornewaccount()" type rules).

    a!localVariables(
      local!username: a!defaultValue(trim(ri!username), "-=-=-"),
      
      local!userQuery: a!refreshVariable(
        refreshAlways: true(),
        value: if(
          local!username = "-=-=-",
          a!map(totalCount: 0),
          a!queryRecordType(
            recordType: 'recordType!{SYSTEM_RECORD_TYPE_USER}User',
            pagingInfo: a!pagingInfo(1, 1),
            fetchTotalCount: true(),
            fields: {'recordType!{SYSTEM_RECORD_TYPE_USER}User.fields.{SYSTEM_RECORD_TYPE_USER_FIELD_username}username', 'recordType!{SYSTEM_RECORD_TYPE_USER}User.fields.{SYSTEM_RECORD_TYPE_USER_FIELD_active}active', 'recordType!{SYSTEM_RECORD_TYPE_USER}User.fields.{SYSTEM_RECORD_TYPE_USER_FIELD_uuid}uuid'},
            filters: a!queryLogicalExpression(
              operator: "OR",
              filters: {
                /* doing this to rule out lowercase username first, as it's the normal way we try to initialize them */
                a!queryFilter(
                  field: 'recordType!{SYSTEM_RECORD_TYPE_USER}User.fields.{SYSTEM_RECORD_TYPE_USER_FIELD_username}username',
                  operator: "=",
                  value: lower(local!username)
                ),
                a!queryFilter(
                  field: 'recordType!{SYSTEM_RECORD_TYPE_USER}User.fields.{SYSTEM_RECORD_TYPE_USER_FIELD_username}username',
                  operator: "=",
                  value: local!username
                )
              },
              logicalExpressions: {
                a!queryLogicalExpression(
                  operator: "AND",
          
                  /* these will require the username to match exactly except for casing */
                  filters: {
                    a!queryFilter(
                      field: 'recordType!{SYSTEM_RECORD_TYPE_USER}User.fields.{SYSTEM_RECORD_TYPE_USER_FIELD_username}username',
                      operator: "starts with",
                      value: local!username
                    ),
                    a!queryFilter(
                      field: 'recordType!{SYSTEM_RECORD_TYPE_USER}User.fields.{SYSTEM_RECORD_TYPE_USER_FIELD_username}username',
                      operator: "ends with",
                      value: local!username
                    )
                  }
                )
              }
            )
          )
        )
      ),
      
      /* tool written by: Mike Schmitt */
      
      if(
        local!userQuery.totalCount = 0,
        a!map(
          exists: false(),
          username: if(local!username = "-=-=-", "(none provided)", local!username)
        ),
        a!map(
          exists: true(),
          username: tostring(local!userQuery.data['recordType!{SYSTEM_RECORD_TYPE_USER}User.fields.{SYSTEM_RECORD_TYPE_USER_FIELD_username}username']),
          uuid: local!userQuery.data[1]['recordType!{SYSTEM_RECORD_TYPE_USER}User.fields.{SYSTEM_RECORD_TYPE_USER_FIELD_uuid}uuid'],
          isActive: local!userQuery.data[1]['recordType!{SYSTEM_RECORD_TYPE_USER}User.fields.{SYSTEM_RECORD_TYPE_USER_FIELD_active}active']
        )
      )
    )

    invalid username:

    active (test) user:

    inactive user:

    same user but with mismatched casing:

Reply
  • 0
    Certified Lead Developer
    in reply to Jose Castellot
    is there any other way to achieve this?

    zombie thread much?  Stuck out tongue

    But in all seriousness - With the current state of the User Record, I've found that the best (and arguably fastest) username-checking routine is now to use a custom-built expression rule that queries said Record type.  It's also the only solution I've found that treats the username as case-insensitive enough to work without laborious other bending-over-backwards workarounds (like you need to use with the "isUsernameTaken()" and "isusernameavailablefornewaccount()" type rules).

    a!localVariables(
      local!username: a!defaultValue(trim(ri!username), "-=-=-"),
      
      local!userQuery: a!refreshVariable(
        refreshAlways: true(),
        value: if(
          local!username = "-=-=-",
          a!map(totalCount: 0),
          a!queryRecordType(
            recordType: 'recordType!{SYSTEM_RECORD_TYPE_USER}User',
            pagingInfo: a!pagingInfo(1, 1),
            fetchTotalCount: true(),
            fields: {'recordType!{SYSTEM_RECORD_TYPE_USER}User.fields.{SYSTEM_RECORD_TYPE_USER_FIELD_username}username', 'recordType!{SYSTEM_RECORD_TYPE_USER}User.fields.{SYSTEM_RECORD_TYPE_USER_FIELD_active}active', 'recordType!{SYSTEM_RECORD_TYPE_USER}User.fields.{SYSTEM_RECORD_TYPE_USER_FIELD_uuid}uuid'},
            filters: a!queryLogicalExpression(
              operator: "OR",
              filters: {
                /* doing this to rule out lowercase username first, as it's the normal way we try to initialize them */
                a!queryFilter(
                  field: 'recordType!{SYSTEM_RECORD_TYPE_USER}User.fields.{SYSTEM_RECORD_TYPE_USER_FIELD_username}username',
                  operator: "=",
                  value: lower(local!username)
                ),
                a!queryFilter(
                  field: 'recordType!{SYSTEM_RECORD_TYPE_USER}User.fields.{SYSTEM_RECORD_TYPE_USER_FIELD_username}username',
                  operator: "=",
                  value: local!username
                )
              },
              logicalExpressions: {
                a!queryLogicalExpression(
                  operator: "AND",
          
                  /* these will require the username to match exactly except for casing */
                  filters: {
                    a!queryFilter(
                      field: 'recordType!{SYSTEM_RECORD_TYPE_USER}User.fields.{SYSTEM_RECORD_TYPE_USER_FIELD_username}username',
                      operator: "starts with",
                      value: local!username
                    ),
                    a!queryFilter(
                      field: 'recordType!{SYSTEM_RECORD_TYPE_USER}User.fields.{SYSTEM_RECORD_TYPE_USER_FIELD_username}username',
                      operator: "ends with",
                      value: local!username
                    )
                  }
                )
              }
            )
          )
        )
      ),
      
      /* tool written by: Mike Schmitt */
      
      if(
        local!userQuery.totalCount = 0,
        a!map(
          exists: false(),
          username: if(local!username = "-=-=-", "(none provided)", local!username)
        ),
        a!map(
          exists: true(),
          username: tostring(local!userQuery.data['recordType!{SYSTEM_RECORD_TYPE_USER}User.fields.{SYSTEM_RECORD_TYPE_USER_FIELD_username}username']),
          uuid: local!userQuery.data[1]['recordType!{SYSTEM_RECORD_TYPE_USER}User.fields.{SYSTEM_RECORD_TYPE_USER_FIELD_uuid}uuid'],
          isActive: local!userQuery.data[1]['recordType!{SYSTEM_RECORD_TYPE_USER}User.fields.{SYSTEM_RECORD_TYPE_USER_FIELD_active}active']
        )
      )
    )

    invalid username:

    active (test) user:

    inactive user:

    same user but with mismatched casing:

Children
No Data