summaryrefslogtreecommitdiff
path: root/src/pages/api/imgs.ts
diff options
context:
space:
mode:
authorYuval Adam <_@yuv.al>2025-09-24 12:44:27 +0200
committerYuval Adam <_@yuv.al>2025-09-24 12:44:27 +0200
commit50d2992168223b32eeb90a6c9afc545136747b50 (patch)
tree16aa098f4b6dcad08123113fa8747613573d45dc /src/pages/api/imgs.ts
parent1076752caa8f2f3804c0d79c7db937e88ecdf205 (diff)
Add /imgs/ endpoint and fix type errors
Diffstat (limited to 'src/pages/api/imgs.ts')
-rw-r--r--src/pages/api/imgs.ts76
1 files changed, 76 insertions, 0 deletions
diff --git a/src/pages/api/imgs.ts b/src/pages/api/imgs.ts
new file mode 100644
index 0000000..378d36d
--- /dev/null
+++ b/src/pages/api/imgs.ts
@@ -0,0 +1,76 @@
+import type { APIRoute } from 'astro';
+
+export const prerender = false;
+
+interface CloudflareEnv {
+ IMGS_BUCKET: R2Bucket;
+}
+
+export const GET: APIRoute = async ({ locals }) => {
+ try {
+ const env = (locals as any).runtime?.env;
+
+ if (!env?.IMGS_BUCKET) {
+ return new Response('R2 bucket not configured', { status: 500 });
+ }
+
+ const bucket = env.IMGS_BUCKET;
+
+ // Get the latest images from yesterday onwards
+ const yesterday = new Date();
+ yesterday.setDate(yesterday.getDate() - 1);
+ const yesterdayStr = yesterday.toISOString().slice(0, 10).replace(/-/g, '');
+
+ const objects = await bucket.list({
+ prefix: 'imgs/',
+ startAfter: `imgs/${yesterdayStr}`
+ });
+
+ // Filter for 280.png files and get the latest 10
+ const imageKeys = objects.objects
+ .map((obj: any) => obj.key)
+ .filter((key: string) => key.endsWith('/280.png'))
+ .sort()
+ .slice(-10);
+
+ // Transform keys to full URLs
+ const images = imageKeys.map((key: string) => {
+ // Extract date/time from path: imgs/20250622/0930/280.png
+ const pathParts = key.split('/');
+ const date = pathParts[1];
+ const time = pathParts[2];
+ const filename = pathParts[3];
+
+ return {
+ path: key,
+ url: `https://imgs.geshem.space/${date}/${time}/${filename}`,
+ date: date,
+ time: time
+ };
+ });
+
+ return new Response(JSON.stringify({
+ images: images,
+ count: images.length,
+ timestamp: new Date().toISOString()
+ }), {
+ status: 200,
+ headers: {
+ 'Content-Type': 'application/json',
+ 'Cache-Control': 'public, max-age=60, s-maxage=60'
+ }
+ });
+
+ } catch (error) {
+ console.error('Error fetching images:', error);
+ return new Response(JSON.stringify({
+ error: 'Failed to fetch images',
+ message: error instanceof Error ? error.message : 'Unknown error'
+ }), {
+ status: 500,
+ headers: {
+ 'Content-Type': 'application/json'
+ }
+ });
+ }
+}; \ No newline at end of file