migrate_water_mini_sms.php 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. <?php
  2. /** Additive SMS login schema. Creates no codes, binds no phone and touches no grant. */
  3. require dirname(__DIR__) . '/vendor/autoload.php';
  4. \Dotenv\Dotenv::createUnsafeMutable(dirname(__DIR__))->load();
  5. \support\App::loadAllConfig(['route']);
  6. if (!in_array('--apply', $argv, true)) {
  7. echo "Plan: create sa_water_mini_sms_code and add sa_water_mini_user.phone.\n";
  8. exit;
  9. }
  10. $db = (new \app\miniapi\model\MiniUser())->getConnection();
  11. $codeTable = 'sa_water_mini_sms_code';
  12. $db->statement("CREATE TABLE IF NOT EXISTS `$codeTable` (
  13. id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  14. phone VARCHAR(20) NOT NULL,
  15. purpose VARCHAR(20) NOT NULL DEFAULT 'login',
  16. code_hash CHAR(64) NOT NULL,
  17. attempts TINYINT UNSIGNED NOT NULL DEFAULT 0,
  18. expires_at DATETIME NOT NULL,
  19. consumed_at DATETIME NULL,
  20. request_ip VARCHAR(45) NOT NULL DEFAULT '',
  21. created_at DATETIME NOT NULL,
  22. KEY phone_recent(phone, created_at),
  23. KEY expiry(expires_at)
  24. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");
  25. $userTable = 'sa_water_mini_user';
  26. $columns = array_map(
  27. static fn ($row) => (string) ($row->COLUMN_NAME ?? ''),
  28. $db->select("SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=?", [$userTable])
  29. );
  30. if (!in_array('phone', $columns, true)) {
  31. $db->statement("ALTER TABLE `$userTable` ADD COLUMN phone VARCHAR(20) NULL AFTER nickname");
  32. }
  33. // NULLs are exempt from a unique index, so existing WeChat-only accounts stay valid.
  34. $indexes = array_map(
  35. static fn ($row) => (string) ($row->Key_name ?? ''),
  36. $db->select("SHOW INDEX FROM `$userTable` WHERE Column_name='phone'")
  37. );
  38. if (!in_array('phone_key', $indexes, true)) {
  39. $db->statement("ALTER TABLE `$userTable` ADD UNIQUE KEY phone_key(phone)");
  40. }
  41. echo "Applied SMS login schema; no code, phone binding or grant was created.\n";