setup 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. #!/usr/bin/env bash
  2. set -Eeuo pipefail
  3. SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
  4. ROOT_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"
  5. MIGRATIONS_DIR="${ROOT_DIR}/migrations"
  6. require_cmd() {
  7. if ! command -v "$1" >/dev/null 2>&1; then
  8. echo "[setup] ERRO: comando '$1' não encontrado. Instale-o e tente novamente." >&2
  9. exit 1
  10. fi
  11. }
  12. require_cmd psql
  13. require_cmd php
  14. if [[ -f "${ROOT_DIR}/.env" ]]; then
  15. set -a
  16. # shellcheck disable=SC1090
  17. source <(sed $'s/\r$//' "${ROOT_DIR}/.env")
  18. set +a
  19. fi
  20. for var in DB_HOST DB_PORT DB_NAME DB_USER DB_PASSWORD; do
  21. if [[ -z "${!var:-}" ]]; then
  22. echo "[setup] ERRO: variável ${var} não definida (.env)." >&2
  23. exit 1
  24. fi
  25. done
  26. DB_SUPERUSER="${DB_SUPERUSER:-${DB_USER}}"
  27. DB_SUPERUSER_PASSWORD="${DB_SUPERUSER_PASSWORD:-${DB_PASSWORD}}"
  28. DB_SUPERUSER_DB="${DB_SUPERUSER_DB:-postgres}"
  29. run_psql() {
  30. local db="$1"
  31. shift
  32. PGPASSWORD="${DB_PASSWORD}" psql -h "${DB_HOST}" -p "${DB_PORT}" -U "${DB_USER}" -d "${db}" "$@"
  33. }
  34. run_psql_super() {
  35. local db="${1:-${DB_SUPERUSER_DB}}"
  36. shift
  37. PGPASSWORD="${DB_SUPERUSER_PASSWORD}" psql -h "${DB_HOST}" -p "${DB_PORT}" -U "${DB_SUPERUSER}" -d "${db}" "$@"
  38. }
  39. database_exists() {
  40. local exists
  41. exists="$(run_psql_super "${DB_SUPERUSER_DB}" -tAc "SELECT 1 FROM pg_database WHERE datname='${DB_NAME}'" | tr -d '[:space:]')"
  42. [[ "${exists}" == "1" ]]
  43. }
  44. ensure_migrations_table() {
  45. run_psql "${DB_NAME}" -v ON_ERROR_STOP=1 <<'SQL'
  46. CREATE TABLE IF NOT EXISTS migrations_run (
  47. filename TEXT PRIMARY KEY,
  48. applied_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
  49. );
  50. SQL
  51. }
  52. migration_already_applied() {
  53. local name="$1"
  54. local result
  55. result="$(run_psql "${DB_NAME}" -tAc "SELECT 1 FROM migrations_run WHERE filename='${name//\'/''}'" | tr -d '[:space:]')"
  56. [[ "${result}" == "1" ]]
  57. }
  58. record_migration_applied() {
  59. local name="$1"
  60. run_psql "${DB_NAME}" -v ON_ERROR_STOP=1 -c "INSERT INTO migrations_run (filename) VALUES ('${name//\'/''}') ON CONFLICT (filename) DO NOTHING;"
  61. }
  62. bootstrap_migrations_state() {
  63. local count
  64. count="$(run_psql "${DB_NAME}" -tAc "SELECT COUNT(*) FROM migrations_run" | tr -d '[:space:]')"
  65. if [[ "${count}" -gt 0 ]]; then
  66. return
  67. fi
  68. local chain_reg
  69. chain_reg="$(run_psql "${DB_NAME}" -tAc "SELECT to_regclass('public.chain')" | tr -d '[:space:]')"
  70. if [[ -n "${chain_reg}" ]]; then
  71. record_migration_applied "migrations_v1.sql"
  72. fi
  73. local cpr_col
  74. cpr_col="$(run_psql "${DB_NAME}" -tAc "SELECT 1 FROM information_schema.columns WHERE table_name='cpr' AND column_name='user_id'" | tr -d '[:space:]')"
  75. if [[ "${cpr_col}" == "1" ]]; then
  76. record_migration_applied "migration_user_id.sql"
  77. fi
  78. }
  79. if [[ ! -d "${MIGRATIONS_DIR}" ]]; then
  80. echo "[setup] ERRO: diretório de migrações inexistente (${MIGRATIONS_DIR})." >&2
  81. exit 1
  82. fi
  83. collect_migrations() {
  84. local -a ordered=()
  85. local primary="${MIGRATIONS_DIR}/migrations_v1.sql"
  86. if [[ -f "${primary}" ]]; then
  87. ordered+=("${primary}")
  88. fi
  89. local -a extras=()
  90. local file
  91. shopt -s nullglob
  92. for file in "${MIGRATIONS_DIR}"/*.sql; do
  93. [[ "${file}" == "${primary}" ]] && continue
  94. extras+=("${file}")
  95. done
  96. shopt -u nullglob
  97. if (( ${#extras[@]} )); then
  98. # shellcheck disable=SC2207
  99. extras=($(printf '%s\n' "${extras[@]}" | sort))
  100. ordered+=("${extras[@]}")
  101. fi
  102. if (( ${#ordered[@]} == 0 )); then
  103. echo "[setup] ERRO: nenhum arquivo .sql encontrado em ${MIGRATIONS_DIR}." >&2
  104. exit 1
  105. fi
  106. MIGRATION_FILES=("${ordered[@]}")
  107. }
  108. collect_migrations
  109. echo "[setup] Host=${DB_HOST} Port=${DB_PORT} DB=${DB_NAME} User=${DB_USER}"
  110. echo "[setup] Verificando existência do banco '${DB_NAME}'..."
  111. if database_exists; then
  112. echo "[setup] Banco já existe. Pulando recriação."
  113. else
  114. echo "[setup] Banco não encontrado. Criando..."
  115. run_psql_super "${DB_SUPERUSER_DB}" -v ON_ERROR_STOP=1 -c "CREATE DATABASE \"${DB_NAME}\";"
  116. fi
  117. ensure_migrations_table
  118. bootstrap_migrations_state
  119. echo "[setup] Aplicando migrações..."
  120. for migration in "${MIGRATION_FILES[@]}"; do
  121. name="$(basename "${migration}")"
  122. if migration_already_applied "${name}"; then
  123. echo " -> ${name} (já aplicada, pulando)"
  124. continue
  125. fi
  126. echo " -> ${name}"
  127. run_psql "${DB_NAME}" -v ON_ERROR_STOP=1 -f "${migration}"
  128. record_migration_applied "${name}"
  129. done
  130. echo "[setup] Inserindo dados iniciais (seed)..."
  131. run_psql "${DB_NAME}" -v ON_ERROR_STOP=1 <<SQL
  132. INSERT INTO "company" (company_name, company_flag, company_cnpj)
  133. SELECT 'LumyonTech', 'a', '${COMPANY_CNPJ:-00000000000000}'
  134. WHERE NOT EXISTS (SELECT 1 FROM "company" WHERE company_name = 'LumyonTech');
  135. SQL
  136. run_psql "${DB_NAME}" -v ON_ERROR_STOP=1 <<SQL
  137. INSERT INTO "role" (company_id, role_name, role_permission, role_flag)
  138. SELECT c.company_id, 'Admin', '{}'::jsonb, 'a'
  139. FROM "company" c
  140. WHERE c.company_name = 'LumyonTech'
  141. AND NOT EXISTS (
  142. SELECT 1 FROM "role" r WHERE r.role_name = 'Admin' AND r.company_id = c.company_id
  143. );
  144. SQL
  145. run_psql "${DB_NAME}" -v ON_ERROR_STOP=1 <<SQL
  146. INSERT INTO "status" (status_id, status_status) VALUES
  147. (0, 'PENDING'),
  148. (1, 'CONFIRMED'),
  149. (2, 'EXPIRED')
  150. ON CONFLICT (status_id) DO UPDATE
  151. SET status_status = EXCLUDED.status_status;
  152. SQL
  153. run_psql "${DB_NAME}" -v ON_ERROR_STOP=1 <<SQL
  154. SELECT setval(
  155. pg_get_serial_sequence('"status"', 'status_id'),
  156. GREATEST((SELECT COALESCE(MAX(status_id), 0) FROM "status"), 1)
  157. );
  158. SQL
  159. run_psql "${DB_NAME}" -v ON_ERROR_STOP=1 <<SQL
  160. INSERT INTO "chain" (chain_name)
  161. SELECT 'polygon'
  162. WHERE NOT EXISTS (SELECT 1 FROM "chain" WHERE chain_name = 'polygon');
  163. SQL
  164. run_psql "${DB_NAME}" -v ON_ERROR_STOP=1 <<SQL
  165. INSERT INTO "commodities" (commodities_name, commodities_flag)
  166. SELECT 'soja', 'a'
  167. WHERE NOT EXISTS (SELECT 1 FROM "commodities" WHERE commodities_name = 'soja');
  168. SQL
  169. run_psql "${DB_NAME}" -v ON_ERROR_STOP=1 <<SQL
  170. INSERT INTO "wallet" (
  171. company_id,
  172. wallet_public_key,
  173. wallet_address,
  174. wallet_private_key,
  175. wallet_flag,
  176. chain_id
  177. )
  178. SELECT c.company_id,
  179. '0x04b6095043c25c42caa6bd6e9bd0245a106171cbe4dfc1014f4a710a0ef8d4f3e6911a21c5ae01e98b222b197e29ae808e127309a4d3c8ccbb99140f9949ff16b6',
  180. '0x0166117cE1C182D0Cf5cf605A2C07BB87C278F85',
  181. '0xffb107583d6829311e884f660d038be30ba4cb40263ba439fb9e082ff325c8da',
  182. 'a',
  183. ch.chain_id
  184. FROM "company" c
  185. JOIN "chain" ch ON ch.chain_name = 'polygon'
  186. WHERE c.company_name = 'LumyonTech'
  187. AND NOT EXISTS (
  188. SELECT 1 FROM "wallet" w
  189. WHERE w.wallet_address = '0x0166117cE1C182D0Cf5cf605A2C07BB87C278F85'
  190. );
  191. SQL
  192. DEFAULT_USER_NAME="${DEFAULT_USER_NAME:-Admin}"
  193. DEFAULT_USER_EMAIL="${DEFAULT_USER_EMAIL:-admin@lumyon.tech}"
  194. DEFAULT_USER_PASSWORD_HASH="$(php -r 'echo password_hash(getenv("DEFAULT_USER_PASSWORD") ?: "admin123", PASSWORD_DEFAULT);')"
  195. DEFAULT_USER_PHONE="${DEFAULT_USER_PHONE:-5511999999999}"
  196. DEFAULT_USER_ADDRESS="${DEFAULT_USER_ADDRESS:-Default Address}"
  197. DEFAULT_USER_CITY="${DEFAULT_USER_CITY:-Sao Paulo}"
  198. DEFAULT_USER_STATE="${DEFAULT_USER_STATE:-SP}"
  199. DEFAULT_USER_ZIP="${DEFAULT_USER_ZIP:-00000000}"
  200. DEFAULT_USER_COUNTRY="${DEFAULT_USER_COUNTRY:-BR}"
  201. DEFAULT_USER_KYC="${DEFAULT_USER_KYC:-0}"
  202. DEFAULT_USER_BIRTHDATE="${DEFAULT_USER_BIRTHDATE:-0}"
  203. DEFAULT_USER_CPF="${DEFAULT_USER_CPF:-00000000000}"
  204. DEFAULT_USER_KYC_EXTERNAL_ID="${DEFAULT_USER_KYC_EXTERNAL_ID:-default-kyc-id}"
  205. echo "[setup] Inserindo usuário padrão (${DEFAULT_USER_EMAIL})..."
  206. run_psql "${DB_NAME}" -v ON_ERROR_STOP=1 <<SQL
  207. INSERT INTO "user" (
  208. user_name, user_email, user_password, user_phone, user_address, user_city, user_state, user_zip, user_country,
  209. user_kyc, kyc_external_id, user_birthdate, user_cpf, company_id, role_id, user_flag
  210. )
  211. SELECT
  212. '${DEFAULT_USER_NAME}',
  213. '${DEFAULT_USER_EMAIL}',
  214. '${DEFAULT_USER_PASSWORD_HASH}',
  215. '${DEFAULT_USER_PHONE}',
  216. '${DEFAULT_USER_ADDRESS}',
  217. '${DEFAULT_USER_CITY}',
  218. '${DEFAULT_USER_STATE}',
  219. '${DEFAULT_USER_ZIP}',
  220. '${DEFAULT_USER_COUNTRY}',
  221. ${DEFAULT_USER_KYC}::int,
  222. '${DEFAULT_USER_KYC_EXTERNAL_ID}',
  223. ${DEFAULT_USER_BIRTHDATE}::int,
  224. '${DEFAULT_USER_CPF}',
  225. c.company_id,
  226. r.role_id,
  227. 'a'
  228. FROM "company" c
  229. JOIN "role" r ON r.company_id = c.company_id AND r.role_name = 'Admin'
  230. WHERE c.company_name = 'LumyonTech'
  231. AND NOT EXISTS (SELECT 1 FROM "user" u WHERE u.user_email = '${DEFAULT_USER_EMAIL}');
  232. SQL
  233. echo "[setup] Finalizado com sucesso!"
  234. run_psql "${DB_NAME}" <<'SQL'
  235. \dt+ public.*
  236. SQL