Files
sicabe-core/deploy/scripts/seed-source-postgres.sh
2026-10-09 02:35:14 +07:00

100 lines
5.3 KiB
Bash
Executable File

#!/usr/bin/env bash
# =============================================================================
# eBdesk SiCABE — Seed Sumber PostgreSQL: sicabe_data.public.orders
# =============================================================================
# Membuat database `sicabe_data` + tabel `public.orders` (8 kolom, konsisten
# dengan dbt sources.yml dan tabel Iceberg `bronze.orders`) lalu mengisinya
# dengan 6 baris contoh.
#
# Tabel ini adalah SUMBER untuk tugas DAG `sicabe_batch_daily.ingest_to_bronze`
# (Sling: POSTGRES_DB.public.orders → ICEBERG bronze.orders).
#
# CATATAN: `scripts/seed-sample-data.sh` mengisi sisi Iceberg (bronze.orders)
# secara langsung — script INI mengisi sisi PostgreSQL (sumbernya), sehingga
# jalur Sling → Iceberg → dbt → GE dapat berjalan end-to-end.
#
# Idempoten: aman dijalankan berulang (CREATE ... IF NOT EXISTS; INSERT hanya
# bila tabel kosong).
#
# Pemakaian:
# cd deploy
# ./scripts/seed-source-postgres.sh
#
# Env opsional (ada default):
# PG_CONTAINER (sicabe-postgres), SEED_SOURCE_DB (sicabe_data),
# SEED_SOURCE_TABLE (orders), POSTGRES_USER (sicabe_admin)
# =============================================================================
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
# shellcheck source=../lib/common.sh
source "${SCRIPT_DIR}/lib/common.sh"
# shellcheck source=../config/environment.defaults.sh
source "${SCRIPT_DIR}/config/environment.defaults.sh"
sicabe_load_env "${SCRIPT_DIR}" "$@"
PG_CONTAINER="${PG_CONTAINER:-sicabe-postgres}"
SEED_DB="${SEED_SOURCE_DB:-sicabe_data}"
SEED_TABLE="${SEED_SOURCE_TABLE:-orders}"
PG_USER="${POSTGRES_USER:-sicabe_admin}"
# Multi-host: PostgreSQL ada di host `state` dan `docker exec` bersifat lokal →
# bila bukan di host ini, beri instruksi & keluar rapi (kode 3), bukan gagal.
sicabe_require_local_container "${PG_CONTAINER}" "PostgreSQL" "state" || exit $?
on_err() { echo -e "${ERR} Gagal pada baris $1."; exit 1; }
trap 'on_err $LINENO' ERR
# psql di dalam container (tanpa password: koneksi lokal container).
pg() { docker exec -i "${PG_CONTAINER}" psql -v ON_ERROR_STOP=1 -qtA -U "${PG_USER}" "$@"; }
echo -e "${BOLD}${BLUE}=== Seed Sumber PostgreSQL: ${SEED_DB}.public.${SEED_TABLE} ===${NC}"
# ─── [1/3] Database ─────────────────────────────────────────────────────────
echo -e "${INFO} [1/3] Database '${SEED_DB}'..."
if [[ "$(pg -d postgres -c "SELECT 1 FROM pg_database WHERE datname='${SEED_DB}'")" == "1" ]]; then
echo -e "${OK} Database '${SEED_DB}' sudah ada."
else
pg -d postgres -c "CREATE DATABASE ${SEED_DB} OWNER ${PG_USER}" >/dev/null
echo -e "${OK} Database '${SEED_DB}' dibuat."
fi
# ─── [2/3] Tabel sumber ─────────────────────────────────────────────────────
echo -e "${INFO} [2/3] Tabel 'public.${SEED_TABLE}'..."
pg -d "${SEED_DB}" -c "CREATE TABLE IF NOT EXISTS public.${SEED_TABLE} (
id bigint PRIMARY KEY,
order_date date,
komoditas varchar(64),
harga_per_kg double precision,
stok_kg bigint,
region varchar(64),
created_at timestamp,
updated_at timestamp
)" >/dev/null
echo -e "${OK} Tabel 'public.${SEED_TABLE}' siap."
# ─── [3/3] Data contoh ──────────────────────────────────────────────────────
echo -e "${INFO} [3/3] Data contoh (bila kosong)..."
COUNT="$(pg -d "${SEED_DB}" -c "SELECT count(*) FROM public.${SEED_TABLE}")"
if [[ "${COUNT}" -gt 0 ]]; then
echo -e "${OK} Sudah berisi ${COUNT} baris (skip seed)."
else
pg -d "${SEED_DB}" -c "INSERT INTO public.${SEED_TABLE} VALUES
(1, DATE '2026-09-01', 'beras', 12000.0, 500, 'jakarta', TIMESTAMP '2026-09-01 08:00:00', TIMESTAMP '2026-09-01 08:00:00'),
(2, DATE '2026-09-01', 'gula', 15000.0, 300, 'bandung', TIMESTAMP '2026-09-01 09:00:00', TIMESTAMP '2026-09-01 09:00:00'),
(3, DATE '2026-09-02', 'minyak', 18000.0, 200, 'surabaya', TIMESTAMP '2026-09-02 08:00:00', TIMESTAMP '2026-09-02 08:00:00'),
(4, DATE '2026-09-02', 'beras', 12500.0, 450, 'jakarta', TIMESTAMP '2026-09-02 10:00:00', TIMESTAMP '2026-09-02 10:00:00'),
(5, DATE '2026-09-03', 'tepung', 11000.0, 350, 'medan', TIMESTAMP '2026-09-03 08:00:00', TIMESTAMP '2026-09-03 08:00:00'),
(6, DATE '2026-09-03', 'gula', 15500.0, 250, 'bandung', TIMESTAMP '2026-09-03 11:00:00', TIMESTAMP '2026-09-03 11:00:00')" >/dev/null
echo -e "${OK} 6 baris contoh dimasukkan."
fi
# ─── Verifikasi ─────────────────────────────────────────────────────────────
echo -e "${INFO} Verifikasi (sumber PostgreSQL):"
pg -d "${SEED_DB}" -c "SELECT id, order_date, komoditas, harga_per_kg, stok_kg, region
FROM public.${SEED_TABLE} ORDER BY id" \
| while IFS='|' read -r a b c d e f; do printf ' %-3s %-12s %-8s %-10s %-6s %s\n' "$a" "$b" "$c" "$d" "$e" "$f"; done
echo -e "${OK} Selesai. Lanjutkan dengan DAG 'sicabe_batch_daily' (task ingest_to_bronze)."