199 lines
5.3 KiB
TypeScript
199 lines
5.3 KiB
TypeScript
import { redirect, error } from "@sveltejs/kit";
|
|
|
|
export const load = async ({ locals }) => {
|
|
const { pb, user } = locals;
|
|
if (!pb.authStore.isValid) {
|
|
redirect(303, "/login");
|
|
}
|
|
|
|
const getNotificationChannels = async () => {
|
|
const userId = user?.id;
|
|
let output = {};
|
|
|
|
try {
|
|
// Check if the user already exists in the collection
|
|
output = await pb.collection("notificationChannels").getFirstListItem(`user="${userId}"`);
|
|
} catch (error) {
|
|
if (error.status === 404) {
|
|
try {
|
|
// Fetch the collection schema to dynamically get all boolean fields
|
|
const collectionSchema = await pb.collection("notificationChannels").getFullList();
|
|
|
|
// Find all boolean fields and set them to `true`
|
|
const defaultValues = collectionSchema[0]
|
|
? Object.keys(collectionSchema[0]).reduce((acc, key) => {
|
|
if (typeof collectionSchema[0][key] === "boolean") {
|
|
acc[key] = true;
|
|
}
|
|
return acc;
|
|
}, {})
|
|
: {};
|
|
|
|
// Ensure the user field is included
|
|
defaultValues.user = userId;
|
|
|
|
// Create the new record
|
|
output = await pb.collection("notificationChannels").create(defaultValues);
|
|
} catch (creationError) {
|
|
console.error("Error creating new user notification channel:", creationError);
|
|
}
|
|
} else {
|
|
console.error("Error checking for existing user:", error);
|
|
}
|
|
}
|
|
return output; // Return only the latest item
|
|
};
|
|
|
|
|
|
const getPushSubscriptionData = async () => {
|
|
let output = {};
|
|
try {
|
|
output = await pb.collection("pushSubscription").getFullList({
|
|
filter: `user="${user?.id}"`,
|
|
sort: "-created", // Sorts newest first
|
|
});
|
|
|
|
if (output?.length > 1) {
|
|
const [, ...toDelete] = output; // Keep the first item, delete the rest
|
|
await Promise.all(
|
|
toDelete.map((item) => pb.collection("pushSubscription").delete(item?.id))
|
|
);
|
|
}
|
|
} catch (err) {
|
|
console.log(err);
|
|
}
|
|
|
|
return output?.at(0) || null; // Return only the latest item
|
|
};
|
|
|
|
|
|
const getSubscriptionData = async () => {
|
|
const output =
|
|
(
|
|
await pb.collection("payments").getFullList({
|
|
filter: `user="${user.id}" `,
|
|
sort: "-created",
|
|
})
|
|
)?.at(0)?.data?.data?.attributes ?? {};
|
|
|
|
//console.log(output)
|
|
|
|
return output;
|
|
};
|
|
|
|
|
|
|
|
|
|
return {
|
|
getSubscriptionData: await getSubscriptionData(),
|
|
getPushSubscriptionData: await getPushSubscriptionData(),
|
|
getNotificationChannels: await getNotificationChannels(),
|
|
};
|
|
|
|
};
|
|
|
|
export const actions = {
|
|
cancelSubscription: async ({ request, locals }) => {
|
|
const formData = await request?.formData();
|
|
|
|
const apiKey = import.meta.env.VITE_LEMON_SQUEEZY_API_KEY;
|
|
const subscriptionId = formData?.get("subscriptionId");
|
|
|
|
try {
|
|
const url = `https://api.lemonsqueezy.com/v1/subscriptions/${subscriptionId}`;
|
|
const headers = {
|
|
Accept: "application/vnd.api+json",
|
|
"Content-Type": "application/vnd.api+json",
|
|
Authorization: `Bearer ${apiKey}`,
|
|
};
|
|
|
|
const response = await fetch(url, {
|
|
method: "DELETE",
|
|
headers: headers,
|
|
});
|
|
} catch (err) {
|
|
console.log("Error: ", err);
|
|
error(err.status, err.message);
|
|
}
|
|
|
|
redirect(302, "/profile");
|
|
},
|
|
|
|
reactivateSubscription: async ({ request, locals }) => {
|
|
const formData = await request?.formData();
|
|
|
|
const apiKey = import.meta.env.VITE_LEMON_SQUEEZY_API_KEY;
|
|
const subscriptionId = formData?.get("subscriptionId");
|
|
|
|
try {
|
|
const url = `https://api.lemonsqueezy.com/v1/subscriptions/${subscriptionId}`;
|
|
const headers = {
|
|
Accept: "application/vnd.api+json",
|
|
"Content-Type": "application/vnd.api+json",
|
|
Authorization: `Bearer ${apiKey}`,
|
|
};
|
|
|
|
const payload = {
|
|
data: {
|
|
type: "subscriptions",
|
|
id: `${subscriptionId}`,
|
|
attributes: {
|
|
cancelled: false,
|
|
},
|
|
},
|
|
};
|
|
|
|
const response = await fetch(url, {
|
|
method: "PATCH",
|
|
headers: headers,
|
|
body: JSON.stringify(payload),
|
|
});
|
|
} catch (err) {
|
|
console.log("Error: ", err);
|
|
error(err.status, err.message);
|
|
}
|
|
|
|
redirect(302, "/profile");
|
|
},
|
|
|
|
changeSubscription: async ({ request, locals }) => {
|
|
const formData = await request?.formData();
|
|
|
|
const apiKey = import.meta.env.VITE_LEMON_SQUEEZY_API_KEY;
|
|
const subscriptionId = formData?.get("subscriptionId");
|
|
|
|
try {
|
|
const url = `https://api.lemonsqueezy.com/v1/subscriptions/${subscriptionId}`;
|
|
const headers = {
|
|
Accept: "application/vnd.api+json",
|
|
"Content-Type": "application/vnd.api+json",
|
|
Authorization: `Bearer ${apiKey}`,
|
|
};
|
|
|
|
// Create the data payload
|
|
const payload = {
|
|
data: {
|
|
type: "subscriptions",
|
|
id: subscriptionId,
|
|
attributes: {
|
|
variant_id: import.meta.env.VITE_LEMON_SQUEEZY_ANNUAL_VARIANT_ID, // Change from monthly to annually plan
|
|
},
|
|
},
|
|
};
|
|
|
|
const response = await fetch(url, {
|
|
method: "PATCH",
|
|
headers: headers,
|
|
body: JSON.stringify(payload),
|
|
});
|
|
|
|
console.log(await response.json());
|
|
} catch (err) {
|
|
console.log("Error: ", err);
|
|
error(err.status, err.message);
|
|
}
|
|
|
|
redirect(302, "/profile");
|
|
},
|
|
};
|