depository-deploy 1.0.17 → 1.0.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -248,6 +248,44 @@ apply_template "$TEMPLATE_DIR/appsettings-worker.json" "$INSTALL_DIR/worker/ap
248
248
  apply_template "$TEMPLATE_DIR/appsettings-gatherer.json" "$INSTALL_DIR/gatherer/appsettings.json"
249
249
  apply_template "$TEMPLATE_DIR/appsettings-digestor.json" "$INSTALL_DIR/digestor/appsettings.json"
250
250
 
251
+ # ---- Clean database (if requested) ----
252
+ if [ "${CLEAN_DB:-false}" = "true" ]; then
253
+ warn "CLEAN_DB=true — database will be wiped on first service start."
254
+ if [ "$DB_PROVIDER" = "Oracle" ]; then
255
+ # Set OracleForceRecreate=true in api appsettings so the REST service drops all tables
256
+ if command -v python3 &>/dev/null; then
257
+ python3 -c "
258
+ import json, sys
259
+ p='$INSTALL_DIR/api/appsettings.json'
260
+ with open(p) as f: d=json.load(f)
261
+ d.setdefault('DatabaseConfiguration',{})['OracleForceRecreate']=True
262
+ with open(p,'w') as f: json.dump(d,f,indent=2)
263
+ print(' OracleForceRecreate set to true in api/appsettings.json')
264
+ "
265
+ else
266
+ sed -i 's/"OracleForceRecreate": false/"OracleForceRecreate": true/' "$INSTALL_DIR/api/appsettings.json"
267
+ info " OracleForceRecreate set to true in api/appsettings.json"
268
+ fi
269
+ elif [ "$DB_PROVIDER" = "SqlServer" ]; then
270
+ # Drop and recreate both SQL Server databases so EF migrations start fresh
271
+ info " Dropping SQL Server databases: ${SQLSERVER_DATABASE}, DEPOSITORY_Users ..."
272
+ SQLCMD=""
273
+ if command -v sqlcmd &>/dev/null; then SQLCMD="sqlcmd"; fi
274
+ if [ -z "$SQLCMD" ] && [ -f /opt/mssql-tools18/bin/sqlcmd ]; then SQLCMD="/opt/mssql-tools18/bin/sqlcmd"; fi
275
+ if [ -z "$SQLCMD" ] && [ -f /opt/mssql-tools/bin/sqlcmd ]; then SQLCMD="/opt/mssql-tools/bin/sqlcmd"; fi
276
+ if [ -n "$SQLCMD" ]; then
277
+ for DBNAME in "$SQLSERVER_DATABASE" "DEPOSITORY_Users"; do
278
+ "$SQLCMD" -S "${SQLSERVER_HOST},${SQLSERVER_PORT}" -U "$SQLSERVER_USER" -P "$SQLSERVER_PASSWORD" \
279
+ -C -Q "IF DB_ID('${DBNAME}') IS NOT NULL BEGIN ALTER DATABASE [${DBNAME}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; DROP DATABASE [${DBNAME}]; END" \
280
+ 2>/dev/null && info " Dropped database: ${DBNAME}" || warn " Could not drop ${DBNAME} (may not exist yet)"
281
+ done
282
+ else
283
+ warn " sqlcmd not found — cannot drop SQL Server databases automatically."
284
+ warn " The services will create fresh databases via EF migrations on first start."
285
+ fi
286
+ fi
287
+ fi
288
+
251
289
  # ---- Install systemd services ----
252
290
  info "Installing systemd services..."
253
291
  for svc in api auth worker gatherer digestor; do
@@ -231,6 +231,41 @@ Apply-Template "$TemplateDir\appsettings-worker.json" "$INSTALL_DIR\worker\app
231
231
  Apply-Template "$TemplateDir\appsettings-gatherer.json" "$INSTALL_DIR\gatherer\appsettings.json"
232
232
  Apply-Template "$TemplateDir\appsettings-digestor.json" "$INSTALL_DIR\digestor\appsettings.json"
233
233
 
234
+ # ---- Clean database (if requested) ----
235
+ if ($conf.CLEAN_DB -eq "true") {
236
+ Write-Warn "CLEAN_DB=true -- database will be wiped."
237
+ if ($conf.DB_PROVIDER -eq "Oracle") {
238
+ # Set OracleForceRecreate=true in api appsettings
239
+ $apiSettings = Join-Path $INSTALL_DIR "api\appsettings.json"
240
+ $json = Get-Content $apiSettings -Raw | ConvertFrom-Json
241
+ $json.DatabaseConfiguration.OracleForceRecreate = $true
242
+ $json | ConvertTo-Json -Depth 10 | Set-Content $apiSettings -Encoding UTF8
243
+ Write-Info " OracleForceRecreate set to true in api/appsettings.json"
244
+ }
245
+ elseif ($conf.DB_PROVIDER -eq "SqlServer") {
246
+ # Drop and recreate SQL Server databases
247
+ Write-Info " Dropping SQL Server databases..."
248
+ $sqlHost = "$($conf.SQLSERVER_HOST),$($conf.SQLSERVER_PORT)"
249
+ $sqlUser = $conf.SQLSERVER_USER
250
+ $sqlPass = $conf.SQLSERVER_PASSWORD
251
+ foreach ($dbName in @($conf.SQLSERVER_DATABASE, "DEPOSITORY_Users")) {
252
+ $dropSql = "IF DB_ID('$dbName') IS NOT NULL BEGIN ALTER DATABASE [$dbName] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; DROP DATABASE [$dbName]; END"
253
+ try {
254
+ $connStr = "Server=$sqlHost;User ID=$sqlUser;Password=$sqlPass;TrustServerCertificate=true;"
255
+ $conn = New-Object System.Data.SqlClient.SqlConnection($connStr)
256
+ $conn.Open()
257
+ $cmd = $conn.CreateCommand()
258
+ $cmd.CommandText = $dropSql
259
+ $cmd.ExecuteNonQuery() | Out-Null
260
+ $conn.Close()
261
+ Write-Info " Dropped database: $dbName"
262
+ } catch {
263
+ Write-Warn " Could not drop ${dbName}: $($_.Exception.Message)"
264
+ }
265
+ }
266
+ }
267
+ }
268
+
234
269
  # ---- Register Windows Services ----
235
270
  Write-Info "Registering Windows Services..."
236
271
  $svcDefs = @(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "depository-deploy",
3
- "version": "1.0.17",
3
+ "version": "1.0.20",
4
4
  "description": "Depository document management system – deployment wizard and installers",
5
5
  "license": "UNLICENSED",
6
6
  "publishConfig": {
@@ -25,9 +25,9 @@
25
25
  "scripts/publish.mjs"
26
26
  ],
27
27
  "optionalDependencies": {
28
- "depository-deploy-linux": "1.0.17",
29
- "depository-deploy-macos": "1.0.17",
30
- "depository-deploy-windows": "1.0.17"
28
+ "depository-deploy-linux": "1.0.20",
29
+ "depository-deploy-macos": "1.0.20",
30
+ "depository-deploy-windows": "1.0.20"
31
31
  },
32
32
  "scripts": {
33
33
  "start": "node wizard-server.mjs"
package/wizard.html CHANGED
@@ -635,6 +635,27 @@ input.err { border-color: var(--err) !important; box-shadow: 0 0 0 3px rgba(220,
635
635
  <span class="test-badge" id="testBadge-ora"></span>
636
636
  </div>
637
637
  </div>
638
+
639
+ <!-- Clean Database toggle -->
640
+ <div style="margin-top:18px;padding:14px 16px;border:1px solid #fca5a5;border-radius:8px;background:#fef2f2">
641
+ <div class="toggle-row" style="margin-bottom:0">
642
+ <label class="toggle">
643
+ <input type="checkbox" id="clean_db" onchange="toggleCleanDb()">
644
+ <div class="toggle-slider" style="background:#e5e7eb"></div>
645
+ </label>
646
+ <div class="toggle-text">
647
+ <div class="toggle-label" data-i18n="clean_db_toggle" onclick="document.getElementById('clean_db').click()" style="color:#991b1b;font-weight:600">Clean Database (Drop All Tables)</div>
648
+ <div class="toggle-sub" data-i18n="clean_db_sub" style="color:#b91c1c">Removes ALL existing data before installation. Use only for a fresh start.</div>
649
+ </div>
650
+ </div>
651
+ <div id="cleanDbConfirm" style="display:none;margin-top:10px;padding:10px 12px;background:#fee2e2;border-radius:6px;border:1px solid #fca5a5">
652
+ <div style="font-size:12px;color:#991b1b;font-weight:600;margin-bottom:6px" data-i18n="clean_db_warn">&#9888; WARNING: This will permanently delete all documents, users, batches, and configuration from the database. This action cannot be undone.</div>
653
+ <label style="display:flex;align-items:center;gap:8px;cursor:pointer;font-size:13px;color:#991b1b">
654
+ <input type="checkbox" id="clean_db_confirm" onchange="validateCleanDb()">
655
+ <span data-i18n="clean_db_confirm">I understand that ALL data will be permanently deleted</span>
656
+ </label>
657
+ </div>
658
+ </div>
638
659
  </div>
639
660
 
640
661
  <!-- Step 2: Auth DB -->
@@ -960,6 +981,12 @@ const T = {
960
981
  prev_install_warn:"A previous Depository installation was detected at this path.",
961
982
  prev_install_confirm:"I understand — overwrite the existing installation",
962
983
  err_overwrite:"Please confirm that you want to overwrite the existing installation.",
984
+ clean_db_toggle:"Clean Database (Drop All Tables)",
985
+ clean_db_sub:"Removes ALL existing data before installation. Use only for a fresh start.",
986
+ clean_db_warn:"\u26A0 WARNING: This will permanently delete all documents, users, batches, and configuration from the database. This action cannot be undone.",
987
+ clean_db_confirm:"I understand that ALL data will be permanently deleted",
988
+ err_clean_db:"Please confirm that you want to delete all database data.",
989
+ review_clean_db:"Clean Database",
963
990
  update_available:"A newer version is available:",
964
991
  update_btn:"Update Now",
965
992
  update_updating:"Updating…",
@@ -1052,6 +1079,12 @@ const T = {
1052
1079
  prev_install_warn:"Bu yolda önceki bir Depository kurulumu algılandı.",
1053
1080
  prev_install_confirm:"Anlıyorum — mevcut kurulumun üzerine yaz",
1054
1081
  err_overwrite:"Lütfen mevcut kurulumun üzerine yazmak istediğinizi onaylayın.",
1082
+ clean_db_toggle:"Veritabanını Temizle (Tüm Tabloları Sil)",
1083
+ clean_db_sub:"Kurulum öncesinde TÜM mevcut verileri siler. Yalnızca temiz başlangıç için kullanın.",
1084
+ clean_db_warn:"\u26A0 UYARI: Bu işlem veritabanındaki tüm belgeleri, kullanıcıları, iş gruplarını ve yapılandırmayı kalıcı olarak silecektir. Bu işlem geri alınamaz.",
1085
+ clean_db_confirm:"TÜM verilerin kalıcı olarak silineceğini anlıyorum",
1086
+ err_clean_db:"Lütfen tüm veritabanı verilerini silmek istediğinizi onaylayın.",
1087
+ review_clean_db:"Veritabanı Temizliği",
1055
1088
  update_available:"Daha yeni bir sürüm mevcut:",
1056
1089
  update_btn:"Şimdi Güncelle",
1057
1090
  update_updating:"Güncelleniyor…",
@@ -1144,6 +1177,12 @@ const T = {
1144
1177
  prev_install_warn:"Une installation précédente de Depository a été détectée à cet emplacement.",
1145
1178
  prev_install_confirm:"Je comprends — écraser l'installation existante",
1146
1179
  err_overwrite:"Veuillez confirmer que vous souhaitez écraser l'installation existante.",
1180
+ clean_db_toggle:"Nettoyer la base de données (Supprimer toutes les tables)",
1181
+ clean_db_sub:"Supprime TOUTES les données existantes avant l'installation. À utiliser uniquement pour un nouveau départ.",
1182
+ clean_db_warn:"\u26A0 ATTENTION : Cette action supprimera définitivement tous les documents, utilisateurs, lots et configurations de la base de données. Cette action est irréversible.",
1183
+ clean_db_confirm:"Je comprends que TOUTES les données seront définitivement supprimées",
1184
+ err_clean_db:"Veuillez confirmer la suppression de toutes les données.",
1185
+ review_clean_db:"Nettoyage de la base",
1147
1186
  update_available:"Une version plus récente est disponible :",
1148
1187
  update_btn:"Mettre à jour",
1149
1188
  update_updating:"Mise à jour…",
@@ -1236,6 +1275,12 @@ const T = {
1236
1275
  prev_install_warn:"An diesem Pfad wurde eine vorherige Depository-Installation erkannt.",
1237
1276
  prev_install_confirm:"Verstanden — vorhandene Installation überschreiben",
1238
1277
  err_overwrite:"Bitte bestätigen Sie, dass Sie die vorhandene Installation überschreiben möchten.",
1278
+ clean_db_toggle:"Datenbank bereinigen (Alle Tabellen löschen)",
1279
+ clean_db_sub:"Entfernt ALLE vorhandenen Daten vor der Installation. Nur für einen Neustart verwenden.",
1280
+ clean_db_warn:"\u26A0 WARNUNG: Alle Dokumente, Benutzer, Stapel und Konfigurationen in der Datenbank werden unwiderruflich gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.",
1281
+ clean_db_confirm:"Ich verstehe, dass ALLE Daten unwiderruflich gelöscht werden",
1282
+ err_clean_db:"Bitte bestätigen Sie die Löschung aller Datenbankdaten.",
1283
+ review_clean_db:"Datenbank bereinigen",
1239
1284
  update_available:"Eine neuere Version ist verfügbar:",
1240
1285
  update_btn:"Jetzt aktualisieren",
1241
1286
  update_updating:"Aktualisierung…",
@@ -1328,6 +1373,12 @@ const T = {
1328
1373
  prev_install_warn:"Se detectó una instalación previa de Depository en esta ruta.",
1329
1374
  prev_install_confirm:"Entiendo — sobrescribir la instalación existente",
1330
1375
  err_overwrite:"Por favor confirme que desea sobrescribir la instalación existente.",
1376
+ clean_db_toggle:"Limpiar base de datos (Eliminar todas las tablas)",
1377
+ clean_db_sub:"Elimina TODOS los datos existentes antes de la instalación. Usar solo para un inicio limpio.",
1378
+ clean_db_warn:"\u26A0 ADVERTENCIA: Esto eliminará permanentemente todos los documentos, usuarios, lotes y configuraciones de la base de datos. Esta acción no se puede deshacer.",
1379
+ clean_db_confirm:"Entiendo que TODOS los datos serán eliminados permanentemente",
1380
+ err_clean_db:"Por favor confirme que desea eliminar todos los datos de la base de datos.",
1381
+ review_clean_db:"Limpiar base de datos",
1331
1382
  update_available:"Hay una versión más reciente disponible:",
1332
1383
  update_btn:"Actualizar ahora",
1333
1384
  update_updating:"Actualizando…",
@@ -1420,6 +1471,12 @@ const T = {
1420
1471
  prev_install_warn:"تم اكتشاف تثبيت سابق لـ Depository في هذا المسار.",
1421
1472
  prev_install_confirm:"أفهم ذلك — الكتابة فوق التثبيت الحالي",
1422
1473
  err_overwrite:"يرجى تأكيد رغبتك في الكتابة فوق التثبيت الحالي.",
1474
+ clean_db_toggle:"تنظيف قاعدة البيانات (حذف جميع الجداول)",
1475
+ clean_db_sub:"يحذف جميع البيانات الموجودة قبل التثبيت. استخدمه فقط للبدء من جديد.",
1476
+ clean_db_warn:"\u26A0 تحذير: سيؤدي هذا إلى حذف جميع المستندات والمستخدمين والدفعات والتكوينات من قاعدة البيانات نهائيًا. لا يمكن التراجع عن هذا الإجراء.",
1477
+ clean_db_confirm:"أفهم أنه سيتم حذف جميع البيانات نهائيًا",
1478
+ err_clean_db:"يرجى تأكيد رغبتك في حذف جميع بيانات قاعدة البيانات.",
1479
+ review_clean_db:"تنظيف قاعدة البيانات",
1423
1480
  update_available:"يتوفر إصدار أحدث:",
1424
1481
  update_btn:"تحديث الآن",
1425
1482
  update_updating:"جارٍ التحديث…",
@@ -1557,6 +1614,10 @@ function validateStep(s) {
1557
1614
  if (!val('ora_svc')) return {msg:t('err_ora_svc'), field:'ora_svc'};
1558
1615
  if (!val('ora_user')) return {msg:t('err_ora_user'), field:'ora_user'};
1559
1616
  }
1617
+ if (document.getElementById('clean_db').checked && !document.getElementById('clean_db_confirm').checked) {
1618
+ document.getElementById('cleanDbConfirm').scrollIntoView({behavior:'smooth',block:'center'});
1619
+ return {msg:t('err_clean_db'), field:'clean_db_confirm'};
1620
+ }
1560
1621
  break;
1561
1622
  case 2:
1562
1623
  if (dbType() === 'SqlServer') {
@@ -1635,6 +1696,16 @@ function toggleAd() {
1635
1696
  document.getElementById('adFields').classList.toggle('off', !on);
1636
1697
  }
1637
1698
 
1699
+ function toggleCleanDb() {
1700
+ const on = document.getElementById('clean_db').checked;
1701
+ document.getElementById('cleanDbConfirm').style.display = on ? 'block' : 'none';
1702
+ if (!on) document.getElementById('clean_db_confirm').checked = false;
1703
+ }
1704
+ function validateCleanDb() {
1705
+ // If clean_db is on but confirm is not checked, disable Next until confirmed.
1706
+ // This is checked in validateStep() below.
1707
+ }
1708
+
1638
1709
  // ── JWT generator ─────────────────────────────────────────────
1639
1710
  function generateJwt() {
1640
1711
  const chars = 'ABCDEFGHJKMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789!@#%^&*';
@@ -1665,6 +1736,7 @@ function buildConf() {
1665
1736
  AD_GROUP_ADMIN: val('ad_admin'), AD_GROUP_ORG_ADMIN: val('ad_orgadmin'),
1666
1737
  AD_GROUP_USER: val('ad_user'), AD_GROUP_READONLY: val('ad_readonly'),
1667
1738
  OPENAI_API_KEY: '',
1739
+ CLEAN_DB: document.getElementById('clean_db').checked?'true':'false',
1668
1740
  };
1669
1741
  }
1670
1742
 
@@ -1686,6 +1758,7 @@ function populateReview() {
1686
1758
  [t('review_ports'), `UI=${c.UI_PORT} API=${c.API_PORT} Auth=${c.AUTH_PORT} Gatherer=${c.GATHERER_PORT}`],
1687
1759
  [t('review_jwt'), c.JWT_SECRET.substring(0,12)+'… ('+c.JWT_SECRET.length+' chars)', true],
1688
1760
  [t('review_ad'), c.WINDOWS_AUTH_ENABLED==='true'?`✓ ${c.AD_EMAIL_DOMAIN}`:'✗'],
1761
+ [t('review_clean_db'), c.CLEAN_DB==='true'?'<span style="color:#dc2626;font-weight:700">\u26A0 YES — All data will be deleted</span>':'No'],
1689
1762
  ];
1690
1763
  document.getElementById('reviewGrid').innerHTML = rows.map(([k,v,mono]) =>
1691
1764
  `<div class="review-row"><div class="review-key">${k}</div><div class="review-val${mono?' mono':''}">${v}</div></div>`
@@ -1741,6 +1814,8 @@ function downloadConf() {
1741
1814
  'WINDOWS_AUTH_ENABLED=' + c.WINDOWS_AUTH_ENABLED, 'AD_EMAIL_DOMAIN=' + c.AD_EMAIL_DOMAIN,
1742
1815
  'AD_GROUP_ADMIN=' + c.AD_GROUP_ADMIN, 'AD_GROUP_ORG_ADMIN=' + c.AD_GROUP_ORG_ADMIN,
1743
1816
  'AD_GROUP_USER=' + c.AD_GROUP_USER, 'AD_GROUP_READONLY=' + c.AD_GROUP_READONLY,
1817
+ '', '# Clean database (drop all tables before install)',
1818
+ 'CLEAN_DB=' + c.CLEAN_DB,
1744
1819
  '', '# OpenAI (optional)',
1745
1820
  'OPENAI_API_KEY=',
1746
1821
  ];