Source: lib/api.js

export async function createDream(data) {
  const body = JSON.stringify(data);

  try {
    const response = await fetch("/api/data", {
      method: "POST",
      headers: { "content-type": "application/json" },
      body,
    });

    const data = await response.json();

    return { success: true, data };
  } catch (error) {
    console.error({
      error,
      service: "web",
      pathname: "/api/data",
      component: "createDream",
    });
    return { success: false };
  }
}

export async function saveDream(dreamId, dreamData) {
  const body = JSON.stringify({ dreamId, dreamData });

  try {
    const response = await fetch("/api/data", {
      method: "PATCH",
      headers: { "content-type": "application/json" },
      body,
    });

    return { success: true, data: response };
  } catch (error) {
    console.error({
      error,
      service: "web",
      pathname: "/api/data",
      component: "saveDream",
    });
    return { success: false };
  }
}

export async function updateDreamVisibility(dreamId, visibility) {
  const body = JSON.stringify({ dreamId, visibility });

  try {
    const response = await fetch("/api/data/publish", {
      method: "PATCH",
      headers: { "content-type": "application/json" },
      body,
    });

    return { success: true, data: response };
  } catch (error) {
    console.error({
      error,
      service: "web",
      pathname: "/api/data/publish",
      component: "updateDreamVisibility",
    });
    return { success: false };
  }
}

export async function deleteAccount() {
  try {
    const response = await fetch("/api/account", {
      method: "DELETE",
      headers: { "content-type": "application/json" },
    });

    const data = await response.json();

    return data;
  } catch (error) {
    console.error({
      error,
      service: "web",
      pathname: "/api/account",
      component: "deleteAccount",
    });
    return { success: false };
  }
}

/**
 * Updates the user's data.
 *
 * @param {object} data
 * @returns {Promise<boolean>}
 */
export async function updateUser(data) {
  const response = await fetch("/api/account", {
    method: "PATCH",
    headers: {
      "Content-Type": "application/json",
    },
    body: JSON.stringify(data),
  });

  if (response.ok) {
    return true;
  }

  console.error({
    error: await response.text(),
    response,
    service: "web",
    pathname: "/api/account",
    component: "updateUser",
  });

  return false;
}

export async function deleteDream(dreamId) {
  const body = JSON.stringify({ dreamId });

  try {
    const response = await fetch("/api/data", {
      method: "DELETE",
      headers: { "content-type": "application/json" },
      body,
    });

    const data = await response.json();

    return data;
  } catch (error) {
    console.error({
      error,
      service: "web",
      pathname: "/api/data",
      component: "deleteDream",
    });
    return { success: false };
  }
}

export async function searchDreams(query) {
  try {
    const response = await fetch(`/api/data?query=${encodeURI(query)}`, {
      method: "GET",
      headers: { "content-type": "application/json" },
    });

    const data = await response.json();

    return data;
  } catch (error) {
    console.error({
      error,
      service: "web",
      pathname: "/api/data",
      component: "searchDreams",
    });
    return { success: false };
  }
}

export async function createComment(data) {
  const body = JSON.stringify(data);

  try {
    const response = await fetch("/api/data/comments", {
      method: "POST",
      headers: { "content-type": "application/json" },
      body,
    });

    const data = await response.json();

    return { success: true, data };
  } catch (error) {
    console.error({
      error,
      service: "web",
      pathname: "/api/data/comments",
      component: "createComment",
    });
    return { success: false };
  }
}

export async function deleteComment(commentId, dreamId) {
  const body = JSON.stringify({ commentId, dreamId });

  try {
    const response = await fetch("/api/data/comments", {
      method: "DELETE",
      headers: { "content-type": "application/json" },
      body,
    });

    const data = await response.json();

    return data;
  } catch (error) {
    console.error({
      error,
      service: "web",
      pathname: "/api/data/comments",
      component: "deleteComment",
    });
    return { success: false };
  }
}

export async function createAICompletion(data) {
  const body = JSON.stringify(data);

  try {
    const response = await fetch("/api/data/completions", {
      method: "POST",
      headers: { "content-type": "application/json" },
      body,
    });

    const data = await response.json();

    return { success: true, data };
  } catch (error) {
    console.error({
      error,
      service: "web",
      pathname: "/api/data/completions",
      component: "createAICompletion",
    });
    return { success: false };
  }
}

export async function starDream(data) {
  const body = JSON.stringify(data);

  try {
    const response = await fetch("/api/data/stars", {
      method: "POST",
      headers: { "content-type": "application/json" },
      body,
    });

    const data = await response.json();

    return { success: true, data };
  } catch (error) {
    console.error({
      error,
      service: "web",
      pathname: "/api/data/stars",
      component: "starDream",
    });
    return { success: false };
  }
}

export async function unstarDream(data) {
  const body = JSON.stringify(data);

  try {
    const response = await fetch("/api/data/stars", {
      method: "DELETE",
      headers: { "content-type": "application/json" },
      body,
    });

    const data = await response.json();

    return data;
  } catch (error) {
    console.error({
      error,
      service: "web",
      pathname: "/api/data/stars",
      component: "unstarDream",
    });
    return { success: false };
  }
}

export async function markInboxMessagesAsRead(inboxIds, all = undefined) {
  const body = JSON.stringify({ inboxIds, all });

  try {
    const response = await fetch("/api/data/inbox", {
      method: "PATCH",
      headers: { "content-type": "application/json" },
      body,
    });

    const data = await response.json();

    return data;
  } catch (error) {
    console.error({
      error,
      service: "web",
      pathname: "/api/data/inbox",
      component: "markAsRead",
    });
    return { success: false };
  }
}

export async function deleteInboxMessages(inboxIds, all = undefined) {
  const body = JSON.stringify({ inboxIds, all });

  try {
    const response = await fetch("/api/data/inbox", {
      method: "DELETE",
      headers: { "content-type": "application/json" },
      body,
    });

    const data = await response.json();

    return data;
  } catch (error) {
    console.error({
      error,
      service: "web",
      pathname: "/api/data/inbox",
      component: "markAsRead",
    });
    return { success: false };
  }
}