core_backup_constants.js

'use strict';

/**
 * @fileoverview Backup system constants and path utilities.
 * @module backup/constants
 */

const path = require('path');

const BACKUP_ROOT = '.i18nkit';
const BACKUP_DIR = 'backups';
const LATEST_FILE = 'latest.txt';
const MANIFEST_FILE = 'manifest.json';
const STATUS_FILE = '.status';
const GITIGNORE_FILE = '.gitignore';

const SessionStatus = Object.freeze({
  PENDING: 'pending',
  BACKING_UP: 'backing-up',
  READY: 'ready',
  IN_PROGRESS: 'in-progress',
  COMPLETED: 'completed',
  ROLLED_BACK: 'rolled-back',
  FAILED: 'failed',
});

const VALID_TRANSITIONS = Object.freeze({
  [SessionStatus.PENDING]: [SessionStatus.BACKING_UP, SessionStatus.FAILED],
  [SessionStatus.BACKING_UP]: [SessionStatus.READY, SessionStatus.FAILED],
  [SessionStatus.READY]: [SessionStatus.IN_PROGRESS, SessionStatus.FAILED],
  [SessionStatus.IN_PROGRESS]: [
    SessionStatus.COMPLETED,
    SessionStatus.ROLLED_BACK,
    SessionStatus.FAILED,
  ],
  [SessionStatus.COMPLETED]: [],
  [SessionStatus.ROLLED_BACK]: [],
  [SessionStatus.FAILED]: [],
});

const DEFAULT_CONFIG = Object.freeze({
  maxSessions: 10,
  maxAgeDays: 30,
  autoCleanup: true,
});

/**
 * @param {string} cwd
 * @returns {string}
 */
function getBackupRoot(cwd) {
  return path.join(cwd, BACKUP_ROOT);
}

/**
 * @param {string} cwd
 * @returns {string}
 */
function getBackupsDir(cwd) {
  return path.join(cwd, BACKUP_ROOT, BACKUP_DIR);
}

/**
 * @param {string} cwd
 * @returns {string}
 */
function getLatestFile(cwd) {
  return path.join(cwd, BACKUP_ROOT, BACKUP_DIR, LATEST_FILE);
}

/**
 * @param {string} cwd
 * @param {string} sessionId
 * @returns {string}
 */
function getSessionDir(cwd, sessionId) {
  return path.join(cwd, BACKUP_ROOT, BACKUP_DIR, sessionId);
}

/**
 * @param {string} cwd
 * @param {string} sessionId
 * @returns {string}
 */
function getManifestPath(cwd, sessionId) {
  return path.join(getSessionDir(cwd, sessionId), MANIFEST_FILE);
}

/**
 * @param {string} cwd
 * @param {string} sessionId
 * @returns {string}
 */
function getStatusPath(cwd, sessionId) {
  return path.join(getSessionDir(cwd, sessionId), STATUS_FILE);
}

module.exports = {
  BACKUP_ROOT,
  BACKUP_DIR,
  LATEST_FILE,
  MANIFEST_FILE,
  STATUS_FILE,
  GITIGNORE_FILE,
  SessionStatus,
  VALID_TRANSITIONS,
  DEFAULT_CONFIG,
  getBackupRoot,
  getBackupsDir,
  getLatestFile,
  getSessionDir,
  getManifestPath,
  getStatusPath,
};