A Teletype Orbit olyan játékbolt, mint az itch.io vagy a Steam: Rails 8 + Hotwire alkalmazás a WarpEngine katalógusmotorra építve. A katalógus a WarpEngine-é — szoftverek, kiadások, artifactok, CI-publikálás. Az Orbité mindaz, amire egy boltnak ezen felül szüksége van: ár, rendelés, jogosultság, kiadó, moderáció, kifizetés.
| Terület | Mit hoz az Orbit |
|---|---|
| Bolt | katalógusoldalak, keresés, szűrők, termékoldal, kosár, pénztár, rendelések |
| Könyvtár | jogosultságok, kapuzott letöltések, kulcsok, ajándékok |
| Játék | böngészőben játszható buildek jogosultság-ellenőrzés mögött |
| Studio | kiadói portál: termék, ár, áruházi oldal, képek, csatornák, publikálási tokenek, hosztolt buildek |
| Moderáció | beküldések, bejelentések, repójóváhagyás |
| Közösség | értékelések, fórum, kívánságlista, követés, aktivitás |
| Pénzügy | csak hozzáfűzhető főkönyv, bevételmegosztás, kifizetések, számlák |
A motor szavai a motoré maradnak. A Software a technikai katalógusbejegyzés, a Release egy buildverzió. Az eladható dolog a Store::Product, a vevő felé mutató buildmutató pedig a Studio::Channel. A kettőt csak egy azonosító köti össze, idegen kulcs nélkül — a motor soft delete-tel dolgozik, így a sorai eltűnhetnek alóla.
Korábban. A WarpEngine /api/download és /file/* végpontjai nem hitelesítettek, ezért az Orbit mindkettőt lefedte olyan útvonalakkal, amelyek a mount WarpEngine::Engine sor elé kerültek. Működött, de az útvonalak sorrendjén múlt — olyan védelem, amely némán elromlik, ha egy sor arrébb kerül.
Most. A WarpEngine 0.5.0 óta a motor először megkérdez egy hozzáférési szabályzatot, az Orbité pedig a Library::AccessPolicy:
| Metódus | Mit csinál |
|---|---|
visible_software_scope |
leszűkíti a GET /api/software végpontot a Store::Product.listed körre, így a piszkozat, a bírálat alatti, a listáról levett és a privát termékek nem jelennek meg |
access_for |
hozzáfűzi az árat, a vásárlási oldalt, és azt, hogy ez a hívó birtokolja-e |
authorize_download |
lefuttatja azokat a szabályokat, amelyek a Library::DownloadService szolgáltatásban már megvoltak: jogosultság, sebességkorlát, engedély, letöltési esemény |
Az /api/download már nincs lefedve. A /file/* szándékosan még mindig igen: egy webes build böngészőben fut, ahol a hitelesítő adat a munkamenet, és a „nem a tiéd" helyes válasza a bejelentkezésre irányítás, nem egy csupasz 403. A motornak egyik sincs meg.
A kockázat nem eltűnt, csak alakot váltott — egy szabályzatot ugyanolyan némán el lehet felejteni bekötni, mint amilyen némán az útvonalsorrend elromlott. A spec/requests/library/download_gate_spec.rb a regressziós teszt, és nem opcionális.
Az Orbit beállítja a WarpEngine eszközhitelesítési folyamatát, így az asztali WarpEngine Client fiókot tud tartani:
c.access_token_owner_class = "Accounts::User"
c.identity_verification_url = "/devices"
c.subject_resolver = ->(request) { request.env["warden"]&.user(:user) }
A folyamat a motoré. A két oldal az Orbité, mert a jóváhagyáshoz munkamenet és bejelentkezett ember kell:
| Oldal | Mit csinál |
|---|---|
/devices |
valaki beírja a rövid kódot, amit a kliens mutat, látja, melyik eszköz kérdez, majd jóváhagy vagy elutasít |
/client_tokens |
az ehhez a fiókhoz bejelentkezett eszközök, és egy eltávolítása |
A subject_resolver a másik fele: egy böngésző munkamenetet hordoz, nem bearer tokent, és enélkül a motor visszautasítaná az Orbit saját bejelentkezett látogatóit is.
A kliens csak azt tudja meg, amire szüksége van, és semmi többet. Ár, tulajdonlás, hol lehet megvenni, van-e bejelentkezés — mindez a motor általános szerződéséből jön, így a kliens nem hordoz Orbit-specifikus kódot. Egy kliensnek bármelyik WarpEngine-katalógust ki kell tudnia szolgálni; egy belefordított szabály minden másikat elrontana.
Minden WarpEngine::Software "development" státusszal jött létre, és semmi nem mozdította el, mert az Orbitban semmi nem olvassa ezt a mezőt — az oldalai a terméket kérdezik. Egy katalóguskliens viszont olvassa: az asztali áruház a kiadott és archivált címeket listázza, a többit kihagyja, így a teljes katalógus láthatatlan volt a számára. A Store::Product most after_save hívással szinkronban tartja a kettőt (published → released, delisted → archived, demótermék → demo), nem egy szolgáltatás egyik sorában, mert az állapot a moderációs folyamatból és az ActiveAdminból egyaránt változhat.
Minden Compose-ban van, az alkalmazás és a Sidekiq-worker is:
cp .env.example .env
make up
docker compose exec app bin/rails db:seed
| Felület | URL |
|---|---|
| Bolt | http://localhost:3000 |
| Admin | http://localhost:3000/admin |
| Levél (Mailpit) | http://localhost:8025 |
| MinIO-konzol | http://localhost:9001 |
A seedelésnek két szintje van:
make seed-core — referenciaadatok, amelyek élesben is lefutnak: műfajok, címkék, EU-s áfakulcsok, bevételmegosztások, fórumok.make seed-examples — csak fejlesztéshez való minták. A valódi úton mennek végig (Studio → beküldés → jóváhagyás → kosár → fizetési webhook), így a főkönyvben és a riportokban értelmes adat lesz.Az alkalmazás a Growing Rails Applications in Practice könyvet követi. A munka nagy részét két szabály végzi:
DeviceApprovalsController#create, nem DevicesController#approve. Egy letöltés olyan erőforrás, amelynek a létrehozása kiadja az engedélyt.A teljes terv és a döntések indoklása a repó NOTES_TELETYPE_ORBIT.md fájljában van.