From 1743e7fcbebb8997d9a968a01f2af0604827f453 Mon Sep 17 00:00:00 2001 From: Tomas Horsky Date: Tue, 16 Jun 2026 23:18:20 +0900 Subject: [PATCH] added saving photos to firebase --- .firebaserc | 5 +++++ cors.json | 7 +++++++ firebase.json | 5 +++++ scripts/get-token.mjs | 11 +++++++++++ scripts/set-cors.mjs | 36 ++++++++++++++++++++++++++++++++++++ scripts/set-cors2.mjs | 32 ++++++++++++++++++++++++++++++++ src/App.svelte | 2 +- src/lib/layout/TopBar.svelte | 2 +- storage.rules | 9 +++++++++ 9 files changed, 107 insertions(+), 2 deletions(-) create mode 100644 .firebaserc create mode 100644 cors.json create mode 100644 firebase.json create mode 100644 scripts/get-token.mjs create mode 100644 scripts/set-cors.mjs create mode 100644 scripts/set-cors2.mjs create mode 100644 storage.rules diff --git a/.firebaserc b/.firebaserc new file mode 100644 index 0000000..67126c8 --- /dev/null +++ b/.firebaserc @@ -0,0 +1,5 @@ +{ + "projects": { + "default": "map-jurnal" + } +} diff --git a/cors.json b/cors.json new file mode 100644 index 0000000..bb25360 --- /dev/null +++ b/cors.json @@ -0,0 +1,7 @@ +[ + { + "origin": ["http://localhost:5173", "https://map-jurnal.web.app", "https://map-jurnal.firebaseapp.com"], + "method": ["GET", "HEAD", "PUT", "POST", "DELETE"], + "maxAgeSeconds": 3600 + } +] diff --git a/firebase.json b/firebase.json new file mode 100644 index 0000000..1bae8b3 --- /dev/null +++ b/firebase.json @@ -0,0 +1,5 @@ +{ + "storage": { + "rules": "storage.rules" + } +} diff --git a/scripts/get-token.mjs b/scripts/get-token.mjs new file mode 100644 index 0000000..aec71a8 --- /dev/null +++ b/scripts/get-token.mjs @@ -0,0 +1,11 @@ +import { getAccessToken } from 'firebase-tools'; +import { writeFileSync } from 'fs'; +(async () => { + try { + const token = await getAccessToken(); + writeFileSync('token.txt', token); + console.log('Token saved'); + } catch (e) { + console.error('Failed:', e.message); + } +})(); diff --git a/scripts/set-cors.mjs b/scripts/set-cors.mjs new file mode 100644 index 0000000..472f01a --- /dev/null +++ b/scripts/set-cors.mjs @@ -0,0 +1,36 @@ +import { readFileSync } from 'fs'; + +const config = JSON.parse(readFileSync( + 'C:\\Users\\tomas\\.config\\configstore\\firebase-tools.json', 'utf-8' +)); +const token = config.tokens.access_token; + +// Try to list buckets first +const listRes = await fetch('https://storage.googleapis.com/storage/v1/b?project=map-jurnal', { + headers: { Authorization: `Bearer ${token}` }, +}); +const buckets = await listRes.json(); +console.log('Buckets:', buckets.items?.map(b => b.name) ?? buckets); + +const bucket = 'map-jurnal.appspot.com'; +const corsConfig = [{ + origin: ['http://localhost:5173', 'https://map-jurnal.web.app', 'https://map-jurnal.firebaseapp.com'], + method: ['GET', 'HEAD', 'PUT', 'POST', 'DELETE'], + maxAgeSeconds: 3600, +}]; + +const res = await fetch(`https://storage.googleapis.com/storage/v1/b/${bucket}`, { + method: 'PATCH', + headers: { + Authorization: `Bearer ${token}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ cors: corsConfig }), +}); + +if (res.ok) { + console.log('CORS configured successfully!'); +} else { + const text = await res.text(); + console.error('Failed:', res.status, text); +} diff --git a/scripts/set-cors2.mjs b/scripts/set-cors2.mjs new file mode 100644 index 0000000..5190edb --- /dev/null +++ b/scripts/set-cors2.mjs @@ -0,0 +1,32 @@ +import { readFileSync } from 'fs'; +import { Storage } from '@google-cloud/storage'; + +const config = JSON.parse(readFileSync('C:/Users/tomas/.config/configstore/firebase-tools.json', 'utf-8')); + +const storage = new Storage({ + projectId: 'map-jurnal', + credentials: { + client_email: 'firebase-cli@map-jurnal.iam.gserviceaccount.com', + // We'll use token-based auth instead + }, +}); + +// Try with direct token +const token = config.tokens.access_token; + +// List all buckets to find the right name +const [buckets] = await storage.getBuckets({ project: 'map-jurnal' }); +console.log('Buckets:', buckets.map(b => b.name)); + +if (buckets.length > 0) { + const bucket = buckets[0]; + console.log('Configuring CORS for:', bucket.name); + await bucket.setCorsConfiguration([ + { + origin: ['http://localhost:5173', 'https://map-jurnal.web.app', 'https://map-jurnal.firebaseapp.com'], + method: ['GET', 'HEAD', 'PUT', 'POST', 'DELETE'], + maxAgeSeconds: 3600, + }, + ]); + console.log('CORS configured!'); +} diff --git a/src/App.svelte b/src/App.svelte index 0a9f00e..3686922 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -123,7 +123,7 @@ background: #8b5cf6; color: #fff; font-size: 15px; - font-weight: 600; + font-weight: 500; gap: 6px; cursor: pointer; display: flex; diff --git a/src/lib/layout/TopBar.svelte b/src/lib/layout/TopBar.svelte index 7a3d2e0..ecd6839 100644 --- a/src/lib/layout/TopBar.svelte +++ b/src/lib/layout/TopBar.svelte @@ -137,7 +137,7 @@ cursor: pointer; font-family: var(--sans); font-size: 14px; - font-weight: 300; + font-weight: 500; color: var(--text); letter-spacing: 0.01em; transition: color 0.2s ease; diff --git a/storage.rules b/storage.rules new file mode 100644 index 0000000..0168901 --- /dev/null +++ b/storage.rules @@ -0,0 +1,9 @@ +rules_version = '2'; +service firebase.storage { + match /b/{bucket}/o { + match /{allPaths=**} { + allow read: if true; + allow write: if request.auth != null; + } + } +}