Source: api-documentation.js

/**
 * Class representing user data access operations using localStorage.
 */
class UserDataAccess {
    
    /**
     * Creates an instance of UserDataAccess.
     * Initializes the localStorage database with dummy data if not present.
     */
    constructor() {
        // Wipe out the database before testing
        localStorage.clear();
        
        if (!localStorage.getItem("userData")) {
            localStorage.setItem("userData", JSON.stringify(this.#dummyData));
        }
    }

    /**
     * Retrieves all users from the localStorage database.
     * @returns {Array<Object>} An array of user objects.
     */
    getAllUsers() {
        const str = localStorage.getItem("userData");
        return JSON.parse(str);
    }

    /**
     * Retrieves a user by their ID.
     * @param {number} id - The ID of the user.
     * @returns {Object|null} The user object if found, otherwise null.
     */
    getUserById(id) {
        const str = localStorage.getItem("userData");
        const users = JSON.parse(str);
        return users.find((u) => u.id == id) || null;
    }

    /**
     * Inserts a new user into the localStorage database.
     * @param {Object} newUser - The new user object.
     */
    insertUser(newUser) {
        newUser.id = this.#getMaxId() + 1;
        const str = localStorage.getItem("userData");
        const users = JSON.parse(str);
        users.push(newUser);
        localStorage.setItem("userData", JSON.stringify(users));
    }

    /**
     * Updates an existing user in the localStorage database.
     * @param {Object} updatedUser - The updated user object.
     */
    updateUser(updatedUser) {
        const str = localStorage.getItem("userData");
        const users = JSON.parse(str);
        const indexOfUserToUpdate = users.findIndex(u => updatedUser.id == u.id);
        if (indexOfUserToUpdate !== -1) {
            users[indexOfUserToUpdate] = updatedUser;
            localStorage.setItem("userData", JSON.stringify(users));
        }
    }

    /**
     * Deletes a user from the localStorage database.
     * @param {number} id - The ID of the user to delete.
     */
    deleteUser(id) {
        const str = localStorage.getItem("userData");
        const users = JSON.parse(str);
        const indexOfUserToRemove = users.findIndex(u => id == u.id);
        if (indexOfUserToRemove !== -1) {
            users.splice(indexOfUserToRemove, 1);
            localStorage.setItem("userData", JSON.stringify(users));
        }
    }

    /**
     * Retrieves the maximum user ID in the database.
     * @returns {number} The maximum user ID.
     * @private
     */
    #getMaxId() {
        const str = localStorage.getItem("userData");
        const users = JSON.parse(str);
        return users.reduce((max, user) => (user.id > max ? user.id : max), 0);
    }

    /**
     * Dummy data used to populate the localStorage database initially.
     * @type {Array<Object>}
     * @private
     */
    #dummyData = [
        { id: 1, firstName: "Jane", lastName: "Doe", email: "jdoe@acme.com" },
        { id: 2, firstName: "Tony", lastName: "Thompsom", email: "tony@acme.com" },
        { id: 3, firstName: "Jesse", lastName: "Jones", email: "jesse@acme.com" }
    ];
}