Source: tree/treeQueue/treeRemove.familyAction.js

// @ts-check
/**
 * @import {treeAction} from './../../types.js'
 */
import { query, HEX2uuid } from '@commtool/sql-query'
import rebuildFees from '../rebuildFees.js'
import { errorLoggerUpdate } from '../../utils/requestLogger.js'

/**
 * Handles the `family` remove action.
 *
 * Deletes the `family` / `familyFees` link from the family object.
 * If that was the last member the orphaned Member row is cleaned up;
 * otherwise membership fees are recalculated for the affected family.
 *
 * @param {treeAction} action
 * @returns {Promise<void>}
 */
export const removeFamilyAction = async (action) => {
    try {
        await query(
            `DELETE FROM Links WHERE UID=? AND Type IN ('family','familyFees') AND UIDTarget=?`,
            [action.UIDObjectID, action.UIDoldTarget],
        )

        const rest = await query(
            `SELECT Member.UID FROM Links
             INNER JOIN Member ON (Member.UID=Links.UID AND Links.Type IN ('family','familyFees'))
             WHERE Links.UIDTarget=?`,
            [action.UIDoldTarget],
        )

        if (rest.length > 0) {
            rebuildFees(action.UIDoldTarget, HEX2uuid(action.UIDroot))
        } else {
            query(`DELETE FROM Member WHERE UID=?`, [action.UIDoldTarget])
        }
    } catch (e) {
        errorLoggerUpdate(e || new Error('removeFamilyAction: Unknown error occurred'))
    }
}