CREATE TABLE `oauth_clients` (
  `id` CHAR(40) NOT NULL,
  `secret` CHAR(40) NOT NULL,
  `name` VARCHAR(255) NOT NULL,
  `auto_approve` TINYINT(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `u_oacl_clse_clid` (`secret`,`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

CREATE TABLE `oauth_client_endpoints` (
  `endpoint_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `client_id` CHAR(40) NOT NULL,
  `redirect_uri` VARCHAR(255) NOT NULL,
  PRIMARY KEY (`endpoint_id`),
  KEY `i_oaclen_clid` (`client_id`),
  CONSTRAINT `f_oaclen_clid` FOREIGN KEY (`client_id`) REFERENCES `oauth_clients` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=INNODB DEFAULT CHARSET=utf8;

CREATE TABLE `oauth_session` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `client_id` CHAR(40) NOT NULL,
  `owner_type` ENUM('user','client') NOT NULL DEFAULT 'user',
  `owner_id` VARCHAR(255) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `i_uase_clid_owty_owid` (`client_id`,`owner_type`,`owner_id`),
  CONSTRAINT `f_oase_clid` FOREIGN KEY (`client_id`) REFERENCES `oauth_clients` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=INNODB DEFAULT CHARSET=utf8;

CREATE TABLE `oauth_session_access_token` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `session_id` INT(10) UNSIGNED NOT NULL,
  `access_token` CHAR(40) CHARACTER SET utf8 NOT NULL DEFAULT '',
  `access_token_expires` INT(10) UNSIGNED NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `u_oaseacto_acto_seid` (`access_token`,`session_id`),
  KEY `f_oaseto_seid` (`session_id`),
  CONSTRAINT `f_oaseto_seid` FOREIGN KEY (`session_id`) REFERENCES `oauth_session` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=INNODB DEFAULT CHARSET=utf8;

CREATE TABLE `oauth_session_authcode` (
  `session_id` INT(10) UNSIGNED NOT NULL,
  `session_access_token_id` INT(10) UNSIGNED DEFAULT NULL,
  `auth_code` CHAR(40) CHARACTER SET utf8 NOT NULL DEFAULT '',
  `auth_code_expires` INT(10) UNSIGNED NOT NULL,
  PRIMARY KEY (`session_id`),
  KEY `f_oaseau_setoid` (`session_access_token_id`),
  CONSTRAINT `f_oaseau_seid` FOREIGN KEY (`session_id`) REFERENCES `oauth_session` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION,
  CONSTRAINT `f_oaseau_setoid` FOREIGN KEY (`session_access_token_id`) REFERENCES `oauth_session_access_token` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `oauth_session_redirect` (
  `session_id` INT(10) UNSIGNED NOT NULL,
  `redirect_uri` VARCHAR(255) CHARACTER SET utf8 NOT NULL DEFAULT '',
  PRIMARY KEY (`session_id`),
  CONSTRAINT `f_oasere_seid` FOREIGN KEY (`session_id`) REFERENCES `oauth_session` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=INNODB DEFAULT CHARSET=utf8;

CREATE TABLE `oauth_session_refresh_token` (
  `session_access_token_id` INT(10) UNSIGNED NOT NULL,
  `refresh_token` CHAR(40) CHARACTER SET utf8 NOT NULL DEFAULT '',
  PRIMARY KEY (`session_access_token_id`),
  CONSTRAINT `f_oasetore_setoid` FOREIGN KEY (`session_access_token_id`) REFERENCES `oauth_session_access_token` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=INNODB DEFAULT CHARSET=utf8;

CREATE TABLE `oauth_scopes` (
  `id` SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
  `key` VARCHAR(255) NOT NULL,
  `name` VARCHAR(255) NOT NULL,
  `description` VARCHAR(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `u_oasc_sc` (`key`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

CREATE TABLE `oauth_session_token_scope` (
  `session_token_scope_id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
  `session_access_token_id` INT(10) UNSIGNED NOT NULL,
  `scope_id` SMALLINT(5) UNSIGNED NOT NULL,
  PRIMARY KEY (`session_token_scope_id`),
  UNIQUE KEY `u_setosc_setoid_scid` (`session_access_token_id`,`scope_id`),
  KEY `f_oasetosc_scid` (`scope_id`),
  CONSTRAINT `f_oasetosc_setoid` FOREIGN KEY (`session_access_token_id`) REFERENCES `oauth_session_access_token` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION,
  CONSTRAINT `f_oasetosc_scid` FOREIGN KEY (`scope_id`) REFERENCES `oauth_scopes` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=INNODB DEFAULT CHARSET=utf8;