WallpaperMachine
The wallpapers you love. A new home on your Mac.
Reserve washing machine and dryer slots for the building's laundry room
AI summary · website content
LifestylePLpgSQL · JavaScriptGitHub @tikerolaOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Suomenkielinen ja mobiiliystävällinen pesutuvan varauskalenteri taloyhtiön asukkaille.
GitHub Pages ei suorita palvelinkoodia, joten kaikki tarkistukset tehdään tietokannassa.
login-funktiolle, joka vertaa sitä tiivisteeseen. Salasanaa ei ole lähdekoodissa.localStorageen. Tietokantaan tallennetaan vain tunnisteen SHA-256-tiiviste.app_private, jota Supabasen REST-rajapinta ei julkaise. Selaimen rooleilla (anon, authenticated) ei ole niihin mitään oikeuksia, ja jokaisella taululla on lisäksi RLS päällä ilman sallivia politiikkoja.login, logout, get_devices, list_bookings, my_bookings, create_booking, extend_booking ja cancel_booking. Jokainen niistä tarkistaa istunnon ja säännöt.bookings_no_overlap). Se on atominen, joten samanaikaisista yrityksistä vain yksi voi onnistua.app_private.booking_log, jota selain ei voi lukea suoraan. Kirjautuneet näkevät lokin funktiolla list_booking_log (90 päivää, enintään 200 riviä). Muutoksen tehnyt istunto tallennetaan lokiin ylläpitäjää varten, mutta selaimelle ei palauteta laitetunnistetta. Sivulla näkyy vain "Tämä laite", "Ylläpito" ja poistoissa "Varauksen tekijä" tai "Joku muu kuin varauksen tekijä".| Sääntö | Missä tarkistetaan |
|---|---|
| Kesto 30 min – 3 h puolen tunnin välein; alku ja loppu tasa- tai puolelta tunnilta | create_booking ja CHECK-rajoitteet |
| Kesto ei voi olla nolla tai negatiivinen | CHECK (end_at > start_at) |
| Ei päällekkäisyyksiä samalla laitteella | exclusion constraint (laitekohtainen) |
| Pesukone ja kuivuri varataan erikseen | päällekkäisyys tarkistetaan laitteen mukaan |
| Varattava aika klo 8.00–22.00 Suomen aikaa (myös jatkaminen) | create_booking, extend_booking (asetukset open_hour, close_hour) |
| Mennyttä aikaa ei voi varata (kuluvan puolen tunnin jakson voi) | create_booking |
| Saman asunnon vierekkäiset varaukset samalle laitteelle yhteensä enintään 3 h | create_booking |
| Jatkaminen 30 minuutilla tai tunnilla, vain vuoron viimeisen tunnin aikana ja vain jos jatkoaika on vapaa | extend_booking ja exclusion constraint |
| Varauksen voi tehdä enintään 90 päivää etukäteen | create_booking (asetus booking_horizon_days) |
Asunnon numero: 1–10 merkkiä, vähintään yksi numero, esim. 9 tai A 12 | create_booking ja CHECK |
Ajat tallennetaan timestamptz-muodossa ja näytetään käyttäjän paikallisessa ajassa.
15 minuutin sääntö näytetään käyttöohjeissa. Sitä ei toteuteta automaattisesti, kuten vaatimuksissa linjataan.
Aja kansion supabase/migrations/ tiedostot aikajärjestyksessä, kukin omana kyselynään:
20261027000000_pesutupa_init.sql: taulut, funktiot ja oikeudet20261028000000_half_hour_slots.sql: puolen tunnin varausjaksot20261028010000_booking_hours.sql: varattava aika klo 8–2220261028020000_cancel_any_booking.sql: kuka tahansa kirjautunut voi poistaa varauksen20261028030000_extend_half_hour.sql: vuoron jatko myös 30 minuutilla20261028040000_booking_log.sql: muutosloki (oma sivu muutoshistoria.html, linkki varaussivun alalaidassa)20261028050000_log_hide_device.sql: muutoshistoria ei näytä laitetunnistettaAvaa projektissa SQL Editor → New query, liitä tiedoston koko sisältö ja paina Run. Tulokseksi pitää tulla Success. No rows returned.
Päivitettäessä aja uusi migraatio ennen kuin julkaiset uuden käyttöliittymän (push GitHubiin).
Vaihtoehtoisesti voit käyttää Supabase CLI:tä: supabase link --project-ref <ref> ja sen jälkeen supabase db push.
Aja SQL Editorissa uutena kyselynä (vaihda oma salasanasi):
select app_private.set_shared_password('pyy4k'); -- vaihda omaksesi
pyy4k) on parempi kuin pelkkä sana tai numerosarja.Project Settings → Data API:
public. app_private ei saa olla listassa.Kirjautumista ei tarvitse määrittää kohdassa Authentication, koska sovellus ei käytä Supabase Authia.
https://abcd1234.supabase.co.sb_publishable_…) tai vanha anon (eyJ…).⚠️ Älä koskaan käytä selaimessa tai repositoriossa
service_role- taisecret-avainta (sb_secret_…). Julkaisutyönkulku pysäyttää julkaisun, jos sellainen annetaan.
Sovellus lukee asetukset tiedostosta js/config.js. Esimerkki on tiedostossa js/config.example.js:
window.PESUTUPA_CONFIG = {
supabaseUrl: 'https://your-project-ref.supabase.co',
supabaseKey: 'your-anon-or-publishable-key',
};
js/config.js on .gitignoressa. Julkaisussa GitHub Actions luo sen repositorion muuttujista (ks. kohta 3). Paikallista kokeilua varten voit kopioida esimerkin ja täyttää siihen omat arvosi.
Luo GitHubiin uusi repositorio ja vie koodi sinne (main- tai master-haara):
git add .
git commit -m "Pesutuvan varausjärjestelmä"
git branch -M main
git remote add origin https://github.com/<käyttäjä>/<repo>.git
git push -u origin main
Settings → Secrets and variables → Actions → Variables → New repository variable:
SUPABASE_URL: kohdan 2.5 Project URLSUPABASE_KEY: kohdan 2.5 julkinen avainMolemmat arvot ovat julkisia (ne näkyvät sivun lähdekoodissa), joten ne ovat Variables-osiossa eivätkä Secrets-osiossa.
Settings → Pages → Build and deployment → Source: valitse GitHub Actions.
Actions-välilehdellä työnkulku Julkaise GitHub Pagesiin ajetaan jokaisella main- tai master-haaran päivityksellä. Ensimmäisellä kerralla sen voi käynnistää käsin painikkeella Run workflow.
Sivu löytyy osoitteesta https://<käyttäjä>.github.io/<repo>/. Jaa osoite ja salasana asukkaille.
Repositorio voi olla julkinen, koska siinä ei ole salaisuuksia. Ilmaisella GitHub-tilillä Pages edellyttää julkista repositoriota.
Ilman Actionsia: jos haluat julkaista suoraan haarasta, luo js/config.js oikeilla arvoilla, poista se .gitignoresta ja valitse Pagesin lähteeksi Deploy from a branch. Tiedostossa saa olla vain julkinen avain.
Ylläpito tehdään Supabasen SQL Editorissa. Tulevia varauksia voi poistaa myös suoraan sovelluksesta.
Vaihda salasana (vanhat kirjautumiset jäävät voimaan). Päivitä samalla GitHubin salaisuus PESUTUPA_PASSWORD (kohta 4.1):
select app_private.set_shared_password('Uusi-pitkä-salasana');
Vaihda salasana ja kirjaa kaikki laitteet ulos (esim. jos salasana on vuotanut):
select app_private.set_shared_password('Uusi-pitkä-salasana', true);
Katso tulevat varaukset:
select b.id, d.name, b.apartment_number,
b.start_at at time zone 'Europe/Helsinki' as alkaa,
b.end_at at time zone 'Europe/Helsinki' as paattyy
from app_private.bookings b join app_private.devices d on d.id = b.device_id
where b.end_at > now() order by b.start_at;
Poista varaus SQL:llä (esim. jos sovellukseen ei pääse):
delete from app_private.bookings where id = '<varauksen id>';
Ota laite pois käytöstä tai takaisin käyttöön:
update app_private.devices set active = false where name = 'Kuivuri';
Muuta varattavaa aikaa (esim. klo 7–23). Käyttöliittymä lukee ajat tietokannasta:
update app_private.settings set open_hour = 7, close_hour = 23;
Muuta istunnon kestoa tai sitä, kuinka pitkälle etukäteen voi varata:
update app_private.settings set session_days = 30, booking_horizon_days = 90;
Huomio Supabasen Free-tasosta: projekti keskeytetään, jos sitä ei käytetä viikkoon. Päivittäinen tarkistus (kohta 4.1) estää tämän. Keskeytetyn projektin voi palauttaa Supabasen hallintapaneelista, eikä data katoa.
Työnkulku .github/workflows/keepalive.yml ajaa joka aamu skriptin tests/keepalive.mjs, joka:
Varauksiin ei kosketa, eikä tuotantoon jää mitään pysyvää. Ajo pitää samalla ilmaisen Supabase-projektin aktiivisena. Jos ajo epäonnistuu, GitHub lähettää sähköpostin.
Käyttöönotto:
PESUTUPA_PASSWORD, arvoksi yhteinen salasana → Add secret. Salaisuus on salattu, eikä se näy koodissa eikä ajolokeissa.Työnkulku käyttää samoja muuttujia SUPABASE_URL ja SUPABASE_KEY kuin julkaisu (kohta 3).
Muista:
tests/local/docker-compose.yml käynnistää PostgreSQL:n ja PostgRESTin, joka on sama REST-kerros kuin Supabasessa. Migraatio ajetaan automaattisesti, ja testisalasanaksi asetetaan testisalasana-123.
# Tietokannan sääntö- ja käyttöoikeustestit (78 testiä)
bash tests/run-db-tests.sh --fresh
# REST-rajapinnan testit: 20 rinnakkaista varausyritystä samaan aikaan + käyttöoikeudet
node tests/api_test.mjs
Käyttöliittymän kokeilu paikallisesti:
# js/config.js paikallista ympäristöä varten
cat > js/config.js <<'EOF'
window.PESUTUPA_CONFIG = { restUrl: 'http://localhost:54321', supabaseKey: '' };
EOF
npx http-server -p 5500 -c-1
# avaa http://localhost:5500 ja kirjaudu salasanalla testisalasana-123
Sammutus: docker compose -f tests/local/docker-compose.yml down -v
Testit eivät jätä paikalliseen kantaan mitään: tietokantatesti ajetaan yhtenä transaktiona, joka perutaan (rollback) lopuksi. Testi myös kieltäytyy toimimasta, jos kanta ei ole paikallinen testikanta (asetus pesutupa.test_database, jonka vain tests/local/00_supabase_stub.sql asettaa).
Tuotantokanta on käytössä, joten sitä vastaan ajetaan vain tarkistuksia, jotka eivät kirjoita kantaan mitään. Ne eivät kirjaudu, eivät tee varauksia eivätkä kokeile salasanoja, eikä salasanaa tarvita.
PESUTUPA_SUPABASE_URL=https://abcd1234.supabase.co \
PESUTUPA_API_KEY=<julkinen avain> \
node tests/api_test.mjs
Tarkistukset varmistavat:
Istunto tarkistetaan ennen kuin mitään kirjoitetaan, joten hylätyt kutsut eivät muuta kantaa.
Kirjautuminen, varausten luonti ja poisto, 20 samanaikaista varausyritystä ja muut kirjoittavat testit ajetaan vain paikallisesti samoilla migraatioilla (kohta 5.1). API-testi tunnistaa paikallisen ympäristön osoitteesta (localhost) ja ajaa kirjoittavat testit vain siellä.
Älä aja
tests/db/booking_rules_test.sql-tiedostoa Supabasen SQL Editorissa. Se ei toimisi siellä (vartija pysäyttää sen), ja muutokset peruttaisiin joka tapauksessa.
index.html Varaussivu
muutoshistoria.html Muutoshistoria (oma sivu, linkki varaussivun alalaidassa)
css/styles.css Tyylit (mobiili ensin)
js/app.js Käyttöliittymän logiikka
js/api.js Supabasen RPC-kutsut (fetch, ei kirjastoja)
js/datepicker.js Suomenkielinen päivämäärävalitsin
js/history.js Muutoshistoria-sivun toiminta
js/config.example.js Esimerkki asetuksista
supabase/migrations/…sql Taulut, rajoitteet, funktiot ja käyttöoikeudet
tests/db/booking_rules_test.sql Tietokannan sääntö- ja oikeustestit
tests/api_test.mjs REST-, rinnakkaisuus- ja oikeustestit
tests/run-db-tests.sh Tietokantatestien ajo Dockerissa
tests/local/ Paikallinen testiympäristö (Docker Compose)
.github/workflows/pages.yml GitHub Pages -julkaisu