50 lines
1.4 KiB
TypeScript
50 lines
1.4 KiB
TypeScript
import { S3Client } from "@aws-sdk/client-s3";
|
|
import type { SupabaseClient } from "@supabase/supabase-js";
|
|
import { Hono } from "hono";
|
|
import { config } from "./config.js";
|
|
import { writeCalendarFileToR2 } from "./helpers.js";
|
|
|
|
export const taskRouter = new Hono<{
|
|
Variables: { supabase: SupabaseClient };
|
|
}>();
|
|
|
|
taskRouter.post("/sync-calendars", async (c) => {
|
|
const supabase = c.get("supabase");
|
|
if (c.req.header("Authorization") !== `Basic ${config.SYNC_CALS_SECRET}`) {
|
|
return c.json({ error: "Unauthorized" }, 401);
|
|
}
|
|
|
|
const s3 = new S3Client({
|
|
region: "auto",
|
|
endpoint: `https://${config.R2_ACCOUNT_ID}.r2.cloudflarestorage.com`,
|
|
credentials: {
|
|
accessKeyId: config.R2_ACCESS_KEY_ID,
|
|
secretAccessKey: config.R2_SECRET_ACCESS_KEY,
|
|
},
|
|
});
|
|
const { data, error } = await supabase
|
|
.from("calendar_subscriptions")
|
|
.select("token, tablo_id, tablos(name)");
|
|
if (error) {
|
|
return c.json({ error: error.message }, 500);
|
|
}
|
|
|
|
const calendarSubscriptionsData = data as unknown as [
|
|
{
|
|
token: string;
|
|
tablo_id: string;
|
|
tablos: { name: string };
|
|
}
|
|
];
|
|
|
|
calendarSubscriptionsData.forEach(async (subscription) => {
|
|
const tabloName = subscription.tablos.name.replace(/ /g, "_");
|
|
await writeCalendarFileToR2(s3, supabase, {
|
|
tabloName,
|
|
token: subscription.token,
|
|
tablo_id: subscription.tablo_id,
|
|
});
|
|
});
|
|
|
|
return c.json({ message: "Synced calendars" });
|
|
});
|