src/plugins/reuseDeletedIds.mjs

import get from 'lodash-es/get.js'
import map from 'lodash-es/map.js'
import each from 'lodash-es/each.js'


/**
 * 新增列沿用資料庫既有 id 時之正規化 (標的清單專用, 其 id 為可就地改寫之標的路徑; ADR-025)
 *
 * 同一次儲存中刪除(或把 id 改掉)某既有列, 又新增一列並把 id 改成該既有列之 id, 淨效果為「修改該列」:
 * 該新增列改為一般列送出(_isNew 設 false), 建立者 / 建立時間沿用資料庫之值(修改者 / 修改時間由後端寫入).
 * 否則後端之「新增列已存在即拒絕」(saveNewRowExists, 擋同一包重送) 會把它當重送擋下, 且重新整理後重做仍被擋;
 * 亦避免以前端佔位字({待自動給予})覆寫建立者 / 建立時間.
 * 只處理 id 於 rows 內唯一者; 重複 id 不處理, 由後端 ckKey 回 saveRowFieldDuplicate.
 * 使用者 / 群組 / 權限清單之 id 為系統產生且不可編輯, 新增列不會與既有列同 id, 不需此處理.
 *
 * @param {Array} rows 輸入欲送出之列陣列(清單之 opt.rows), 不修改
 * @param {Array} rowsDb 輸入資料庫之列陣列(前端 store 之同表資料)
 * @returns {Array} 回傳正規化後之新陣列
 */
function reuseDeletedIds(rows, rowsDb) {

    //kpDb, kpCount: 以 Map 存放, 不以 lodash get 取值(標的 id 為路徑, 可能含「.」而被當成巢狀路徑)
    let kpDb = new Map()
    each(rowsDb, (r) => {
        kpDb.set(get(r, 'id', ''), r)
    })
    let kpCount = new Map()
    each(rows, (r) => {
        let id = get(r, 'id', '')
        kpCount.set(id, (kpCount.get(id) || 0) + 1)
    })

    let rs = map(rows, (r) => {
        let id = get(r, 'id', '')

        //非新增列
        if (get(r, '_isNew') !== true) {
            return r
        }

        //資料庫無此 id: 真正之新增
        if (!kpDb.has(id)) {
            return r
        }
        let rDb = kpDb.get(id)

        //rows 內重複 id: 不處理
        if (kpCount.get(id) !== 1) {
            return r
        }

        return {
            ...r,
            _isNew: false,
            userId: get(rDb, 'userId', ''),
            timeCreate: get(rDb, 'timeCreate', ''),
        }
    })

    return rs
}


export default reuseDeletedIds