thecatontheflat / atlassian-connect-bundle

Symfony Bundle for Atlassian Connect platform
MIT License
36 stars 19 forks source link

Implement license activation hook #2

Open thecatontheflat opened 9 years ago

zhil commented 8 years ago

@thecatontheflat just wonder - does atlassian connect have hook for licence activation/deactivation?

Right now we use this bundle for cloud application and we do not get "lic" flag in _GET request. As a solution I propose such a way

1) add flag licenceState to Tenant entity (smallint) + constants for statuses STATUS_UNKNOWN (default) STATUS_ACTIVE STATUS_EXPIRED

2) in Listener/LicenceListener if system get "lic" field - update licence status in Tenant entity

3) add console command CheckLicenceCommand, it get all tenants and update states using code like

$tenant = $this->getContainer()->get("doctrine")->getManager()->find("AtlassianConnectBundle:Tenant",1);
        $jwtRequest = new JWTRequest($tenant);
        var_dump($jwtRequest->get("/rest/atlassian-connect/latest/addons/".$tenant->getAddonKey()));

SAMPLE REST RESPONSE

array(5) {
  ["key"]=>
  string(33) "...skipped..."
  ["version"]=>
  string(8) "1.0.0-AC"
  ["state"]=>
  string(7) "ENABLED"
  ["host"]=>
  array(2) {
    ["product"]=>
    string(4) "JIRA"
    ["contacts"]=>
    array(1) {
      [0]=>
      array(2) {
        ["name"]=>
        string(6) "Andrew"
        ["email"]=>
        string(21) "...skipped..."
      }
    }
  }
  ["links"]=>
  array(2) {
    ["marketplace"]=>
    array(1) {
      [0]=>
      array(1) {
        ["href"]=>
        string(75) "...skipped..."
      }
    }
    ["self"]=>
    array(1) {
      [0]=>
      array(1) {
        ["href"]=>
        string(94) "...skipped..."
      }
    }
  }
}

What do you think about such an implementation?

thecatontheflat commented 8 years ago

Hey @zhil

does atlassian connect have hook for licence activation/deactivation?

I think I was referring to connect_addon_disabled and connect_addon_enabled hooks.

we do not get "lic" flag in _GET request

Most likely you're not getting lic param in the query, because you don't set license enabled in your descriptor. Could you confirm it is not the case?

Regarding storing the license in the Tenant — I am not sure about this, because I would like to rely on the request data. If you need to double-check the license status — you should request a license end-point

zhil commented 8 years ago

@thecatontheflat

I think I was referring to connect_addon_disabled and connect_addon_enabled hooks.

well, as I understand, enabling/disabling licence is actually not the same, as licence expiration. But I will test it more

Most likely you're not getting lic param in the query, because you don't set license enabled in your descriptor. Could you confirm it is not the case?

Its not the case. Jira simply doesnt set that flag for webhooks.

Regarding storing the license in the Tenant — I am not sure about this, because I would like to rely on the request data. If you need to double-check the license status — you should request a license

We get a lot of webhook calls, checking licence each time is not a solution. It should be either updated by hook or checked from cron. Anyway, licence state should be stored somewhere, tenant entity looks like logical location.

thecatontheflat commented 8 years ago

Ah, I didn't get it at first that the flag is missing in the webhook.

Yeah, in this case I think your proposal would work.

I suggest to store licenseEnabled as nullable boolean instead of having 3 states there. NULL would stand for the unknown.

What do you think?

zhil commented 8 years ago

@thecatontheflat I will need to do some tests and check if enabled/disabled is the same as expired/active. If its the same - nullable boolean licenseEnabled would work If its not the same - probably I will add some flag like status with const null = unknown STATUS_ACTIVE STATUS_EXPIRED STATUS_DISABLED

because expired and disabled states plugin could handle in different ways.