--
-- API
--
CREATE TABLE IF NOT EXISTS Language (
  `uid`  int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `code` VARCHAR(5) UNIQUE NOT NULL,
  `name` VARCHAR(32) UNIQUE NOT NULL
);

INSERT INTO Language (`uid`, `code`, `name`) VALUES
  (1, 'en_US', 'American English'),
  (2, 'de_DE', 'Deutsch Standard')
  ON DUPLICATE KEY UPDATE name=name;

CREATE TABLE IF NOT EXISTS User (
  `uid` INTEGER NOT NULL AUTO_INCREMENT,
  `email` VARCHAR(256) UNIQUE DEFAULT NULL,
  `name` VARCHAR(32) UNIQUE NOT NULL,
  `salt` varchar(16) NOT NULL,
  `password` varchar(64) NOT NULL,
  `language_id` int(11) DEFAULT 1,
  PRIMARY KEY (`uid`),
  FOREIGN KEY (`language_id`) REFERENCES `Language` (`uid`) ON DELETE SET DEFAULT
);

CREATE TABLE IF NOT EXISTS UserInvitation (
  `email` VARCHAR(256) NOT NULL,
  `token` VARCHAR(36) UNIQUE NOT NULL,
  `valid_until` DATETIME NOT NULL
);

CREATE TABLE IF NOT EXISTS UserToken (
  `user_id` INTEGER NOT NULL,
  `token` VARCHAR(36) NOT NULL,
  `type` ENUM('password_reset', 'confirmation') NOT NULL,
  `valid_until` DATETIME NOT NULL,
  FOREIGN KEY (`user_id`) REFERENCES `User` (`uid`) ON DELETE CASCADE
);

CREATE TABLE IF NOT EXISTS `Group` (
  `gid` INTEGER NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(32) NOT NULL,
  PRIMARY KEY (`gid`),
  UNIQUE (`name`)
);

INSERT INTO `Group` (gid, name) VALUES (1, "Default"), (2, "Administrator")
  ON DUPLICATE KEY UPDATE name=name;

CREATE TABLE IF NOT EXISTS UserGroup (
  `uid` INTEGER NOT NULL,
  `gid` INTEGER NOT NULL,
  UNIQUE (`uid`, `gid`),
  FOREIGN KEY (`uid`) REFERENCES `User` (`uid`),
  FOREIGN KEY (`gid`) REFERENCES `Group` (`gid`)
);

CREATE TABLE IF NOT EXISTS Session (
  `uid` int(11) NOT NULL AUTO_INCREMENT,
  `expires` timestamp NOT NULL,
  `user_id` int(11) NOT NULL,
  `ipAddress` varchar(45) NOT NULL,
  `os` varchar(64) NOT NULL,
  `browser` varchar(64) NOT NULL,
  `data` JSON NOT NULL DEFAULT '{}',
  `stay_logged_in` BOOLEAN DEFAULT TRUE,
  PRIMARY KEY (`uid`),
  FOREIGN KEY (`user_id`) REFERENCES `User` (`uid`) ON DELETE CASCADE
);

CREATE TABLE IF NOT EXISTS ApiKey (
  `uid` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `api_key` VARCHAR(64) NOT NULL,
  `valid_until` DATETIME NOT NULL,
  PRIMARY KEY (`uid`),
  FOREIGN KEY (`user_id`) REFERENCES `User` (`uid`)
);

CREATE TABLE IF NOT EXISTS ExternalSiteCache (
  `url` VARCHAR(256) PRIMARY KEY,
  `data` TEXT NOT NULL,
  `expires` DATETIME DEFAULT NULL
);
