setup 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. #!/bin/bash
  2. set -euo pipefail
  3. # Caminhos
  4. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  5. ROOT_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"
  6. MIGRATIONS_FILE="${ROOT_DIR}/migrations/migrations_v1.sql"
  7. # Carrega variáveis do .env se existir
  8. if [[ -f "${ROOT_DIR}/.env" ]]; then
  9. set -a
  10. # shellcheck disable=SC1090
  11. source "${ROOT_DIR}/.env"
  12. set +a
  13. fi
  14. # Configurações de conexão (PostgreSQL)
  15. DB_HOST=${DB_HOST}
  16. DB_PORT=${DB_PORT}
  17. DB_NAME=${DB_NAME}
  18. DB_USER=${DB_USER}
  19. DB_PASSWORD=${DB_PASSWORD}
  20. echo "[setup] Host=${DB_HOST} Port=${DB_PORT} DB=${DB_NAME} User=${DB_USER}"
  21. if [[ ! -f "${MIGRATIONS_FILE}" ]]; then
  22. echo "[setup] ERRO: Arquivo de migração não encontrado: ${MIGRATIONS_FILE}" >&2
  23. exit 1
  24. fi
  25. echo "[setup] Resetando banco '${DB_NAME}' (DROP/CREATE)..."
  26. PGPASSWORD="${DB_PASSWORD}" psql -h "${DB_HOST}" -p "${DB_PORT}" -U "${DB_USER}" -d postgres -v ON_ERROR_STOP=1 -c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname='${DB_NAME}' AND pid <> pg_backend_pid();"
  27. PGPASSWORD="${DB_PASSWORD}" psql -h "${DB_HOST}" -p "${DB_PORT}" -U "${DB_USER}" -d postgres -v ON_ERROR_STOP=1 -c "DROP DATABASE IF EXISTS \"${DB_NAME}\";"
  28. PGPASSWORD="${DB_PASSWORD}" psql -h "${DB_HOST}" -p "${DB_PORT}" -U "${DB_USER}" -d postgres -v ON_ERROR_STOP=1 -c "CREATE DATABASE \"${DB_NAME}\";"
  29. # 2) Executa migração (schema) somente se ainda não existir
  30. echo "[setup] Verificando schema..."
  31. if [[ -z "$(PGPASSWORD="${DB_PASSWORD}" psql -h "${DB_HOST}" -p "${DB_PORT}" -U "${DB_USER}" -d "${DB_NAME}" -tAc "SELECT to_regclass('public.company')")" ]]; then
  32. echo "[setup] Aplicando migrações do arquivo: ${MIGRATIONS_FILE}"
  33. PGPASSWORD="${DB_PASSWORD}" psql -h "${DB_HOST}" -p "${DB_PORT}" -U "${DB_USER}" -d "${DB_NAME}" -v ON_ERROR_STOP=1 -f "${MIGRATIONS_FILE}"
  34. else
  35. echo "[setup] Schema já existente. Pulando migrações."
  36. fi
  37. # 3) Seed inicial (idempotente)
  38. echo "[setup] Inserindo dados iniciais (seed)..."
  39. PGPASSWORD="${DB_PASSWORD}" psql -h "${DB_HOST}" -p "${DB_PORT}" -U "${DB_USER}" -d "${DB_NAME}" -v ON_ERROR_STOP=1 -c "
  40. INSERT INTO \"company\" (company_name, company_flag, company_cnpj)
  41. SELECT 'LumyonTech', 'a', '${COMPANY_CNPJ:-00000000000000}'
  42. WHERE NOT EXISTS (SELECT 1 FROM \"company\" WHERE company_name = 'LumyonTech');
  43. "
  44. PGPASSWORD="${DB_PASSWORD}" psql -h "${DB_HOST}" -p "${DB_PORT}" -U "${DB_USER}" -d "${DB_NAME}" -v ON_ERROR_STOP=1 -c "
  45. INSERT INTO \"role\" (company_id, role_name, role_permission, role_flag)
  46. SELECT c.company_id, 'Admin', '{}'::jsonb, 'a'
  47. FROM \"company\" c
  48. WHERE c.company_name = 'LumyonTech'
  49. AND NOT EXISTS (
  50. SELECT 1 FROM \"role\" r WHERE r.role_name = 'Admin' AND r.company_id = c.company_id
  51. );
  52. "
  53. PGPASSWORD="${DB_PASSWORD}" psql -h "${DB_HOST}" -p "${DB_PORT}" -U "${DB_USER}" -d "${DB_NAME}" -v ON_ERROR_STOP=1 -c "
  54. INSERT INTO \"status\" (status_status)
  55. SELECT 'PENDING'
  56. WHERE NOT EXISTS (SELECT 1 FROM \"status\" WHERE status_status = 'PENDING');
  57. "
  58. PGPASSWORD="${DB_PASSWORD}" psql -h "${DB_HOST}" -p "${DB_PORT}" -U "${DB_USER}" -d "${DB_NAME}" -v ON_ERROR_STOP=1 -c "
  59. INSERT INTO \"chain\" (chain_name)
  60. SELECT 'polygon'
  61. WHERE NOT EXISTS (SELECT 1 FROM \"chain\" WHERE chain_name = 'polygon');
  62. "
  63. PGPASSWORD="${DB_PASSWORD}" psql -h "${DB_HOST}" -p "${DB_PORT}" -U "${DB_USER}" -d "${DB_NAME}" -v ON_ERROR_STOP=1 -c "
  64. INSERT INTO \"commodities\" (commodities_name, commodities_flag)
  65. SELECT 'soja', 'a'
  66. WHERE NOT EXISTS (SELECT 1 FROM \"commodities\" WHERE commodities_name = 'soja');
  67. "
  68. PGPASSWORD="${DB_PASSWORD}" psql -h "${DB_HOST}" -p "${DB_PORT}" -U "${DB_USER}" -d "${DB_NAME}" -v ON_ERROR_STOP=1 -c "
  69. INSERT INTO \"wallet\" (
  70. company_id,
  71. wallet_public_key,
  72. wallet_address,
  73. wallet_private_key,
  74. wallet_flag,
  75. chain_id
  76. )
  77. SELECT c.company_id,
  78. '0x04b6095043c25c42caa6bd6e9bd0245a106171cbe4dfc1014f4a710a0ef8d4f3e6911a21c5ae01e98b222b197e29ae808e127309a4d3c8ccbb99140f9949ff16b6',
  79. '0x0166117cE1C182D0Cf5cf605A2C07BB87C278F85',
  80. '0xffb107583d6829311e884f660d038be30ba4cb40263ba439fb9e082ff325c8da',
  81. 'a',
  82. ch.chain_id
  83. FROM "company" c
  84. JOIN "chain" ch ON ch.chain_name = 'polygon'
  85. WHERE c.company_name = 'LumyonTech'
  86. AND NOT EXISTS (
  87. SELECT 1 FROM "wallet" w
  88. WHERE w.wallet_address = '0x0166117cE1C182D0Cf5cf605A2C07BB87C278F85'
  89. );
  90. "
  91. DEFAULT_USER_NAME="${DEFAULT_USER_NAME:-Admin}"
  92. DEFAULT_USER_EMAIL="${DEFAULT_USER_EMAIL:-admin@lumyon.tech}"
  93. DEFAULT_USER_PASSWORD_HASH="$(php -r 'echo password_hash(getenv("DEFAULT_USER_PASSWORD") ?: "admin123", PASSWORD_DEFAULT);')"
  94. DEFAULT_USER_PHONE="${DEFAULT_USER_PHONE:-5511999999999}"
  95. DEFAULT_USER_ADDRESS="${DEFAULT_USER_ADDRESS:-Default Address}"
  96. DEFAULT_USER_CITY="${DEFAULT_USER_CITY:-Sao Paulo}"
  97. DEFAULT_USER_STATE="${DEFAULT_USER_STATE:-SP}"
  98. DEFAULT_USER_ZIP="${DEFAULT_USER_ZIP:-00000000}"
  99. DEFAULT_USER_COUNTRY="${DEFAULT_USER_COUNTRY:-BR}"
  100. DEFAULT_USER_KYC="${DEFAULT_USER_KYC:-0}"
  101. DEFAULT_USER_BIRTHDATE="${DEFAULT_USER_BIRTHDATE:-0}"
  102. DEFAULT_USER_CPF="${DEFAULT_USER_CPF:-00000000000}"
  103. echo "[setup] Inserindo usuário padrão (${DEFAULT_USER_EMAIL})..."
  104. PGPASSWORD="${DB_PASSWORD}" psql -h "${DB_HOST}" -p "${DB_PORT}" -U "${DB_USER}" -d "${DB_NAME}" -v ON_ERROR_STOP=1 -c "
  105. INSERT INTO \"user\" (
  106. user_name, user_email, user_password, user_phone, user_address, user_city, user_state, user_zip, user_country,
  107. user_kyc, user_birthdate, user_cpf, company_id, role_id, user_flag
  108. )
  109. SELECT
  110. '${DEFAULT_USER_NAME}',
  111. '${DEFAULT_USER_EMAIL}',
  112. '${DEFAULT_USER_PASSWORD_HASH}',
  113. '${DEFAULT_USER_PHONE}',
  114. '${DEFAULT_USER_ADDRESS}',
  115. '${DEFAULT_USER_CITY}',
  116. '${DEFAULT_USER_STATE}',
  117. '${DEFAULT_USER_ZIP}',
  118. '${DEFAULT_USER_COUNTRY}',
  119. ${DEFAULT_USER_KYC}::int,
  120. ${DEFAULT_USER_BIRTHDATE}::int,
  121. '${DEFAULT_USER_CPF}',
  122. c.company_id,
  123. r.role_id,
  124. 'a'
  125. FROM \"company\" c
  126. JOIN \"role\" r ON r.company_id = c.company_id AND r.role_name = 'Admin'
  127. WHERE c.company_name = 'LumyonTech'
  128. AND NOT EXISTS (SELECT 1 FROM \"user\" u WHERE u.user_email = '${DEFAULT_USER_EMAIL}');
  129. "
  130. # 4) Resumo
  131. echo "[setup] Finalizado com sucesso!"
  132. echo "[setup] Tabelas seed (amostra):"
  133. PGPASSWORD="${DB_PASSWORD}" psql -h "${DB_HOST}" -p "${DB_PORT}" -U "${DB_USER}" -d "${DB_NAME}" -c "
  134. TABLE \"company\";
  135. TABLE \"role\";
  136. TABLE \"status\";
  137. TABLE \"chain\";
  138. TABLE \"user\";
  139. " | sed 's/\x1b\[[0-9;]*m//g'