TITLE=Teletype Orbit ROUTE=/services/teletype-orbit LOCALE=hu MODIFIED=1792409344 URL=https://wiki.teletypegames.org/hu/services/teletype-orbit L=1 #22 L=2 #46 q│ A Teletype Orbit olyan játékbolt, mint az itch.io vagy a Steam: Rails 8 + q│ Hotwire alkalmazás a 1WarpEngine katalógusmotorra építve. A katalógus a q│ WarpEngine-é — szoftverek, kiadások, artifactok, CI-publikálás. Az Orbité q│ mindaz, amire egy boltnak ezen felül szüksége van: ár, rendelés, q│ jogosultság, kiadó, moderáció, kifizetés. 1Mit tesz hozzá a WarpEngine-hez 1═══════════════════════════════ t┌───────────┬────────────────────────────────────────────────────────────────┐ t│h Terület t│h Mit hoz az Orbit t│ t├───────────┼────────────────────────────────────────────────────────────────┤ t│0 bBolt0 t│0 katalógusoldalak, keresés, szűrők, termékoldal, kosár, t│ t│0 t│0 pénztár, rendelések t│ t├───────────┼────────────────────────────────────────────────────────────────┤ t│0 bKönyvtár0 t│0 jogosultságok, kapuzott letöltések, kulcsok, ajándékok t│ t├───────────┼────────────────────────────────────────────────────────────────┤ t│0 bJáték0 t│0 böngészőben játszható buildek jogosultság-ellenőrzés mögött t│ t├───────────┼────────────────────────────────────────────────────────────────┤ t│0 bStudio0 t│0 kiadói portál: termék, ár, áruházi oldal, képek, csatornák, t│ t│0 t│0 publikálási tokenek, hosztolt buildek t│ t├───────────┼────────────────────────────────────────────────────────────────┤ t│0 bModeráció0 t│0 beküldések, bejelentések, repójóváhagyás t│ t├───────────┼────────────────────────────────────────────────────────────────┤ t│0 bKözösség0 t│0 értékelések, fórum, kívánságlista, követés, aktivitás t│ t├───────────┼────────────────────────────────────────────────────────────────┤ t│0 bPénzügy0 t│0 csak hozzáfűzhető főkönyv, bevételmegosztás, kifizetések, t│ t│0 t│0 számlák t│ t└───────────┴────────────────────────────────────────────────────────────────┘ A motor szavai a motoré maradnak. A cSoftware0 a technikai katalógusbejegyzés, a cRelease0 egy buildverzió. Az eladható dolog a cStore::Product0, a vevő felé mutató buildmutató pedig a cStudio::Channel0. 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. 1A letöltési kapu 1════════════════ bKorábban.0 A WarpEngine c/api/download0 és c/file/*0 végpontjai nem hitelesítettek, ezért az Orbit mindkettőt lefedte olyan útvonalakkal, amelyek a cmount cWarpEngine::Engine0 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. bMost.0 A WarpEngine 0.5.0 óta a motor először megkérdez egy 1hozzáférési 1szabályzatot, az Orbité pedig a cLibrary::AccessPolicy0: t┌────────────────────────┬───────────────────────────────────────────────────┐ t│h Metódus t│h Mit csinál t│ t├────────────────────────┼───────────────────────────────────────────────────┤ t│0 cvisible_software_scope0 t│0 leszűkíti a cGET /api/software0 végpontot a t│ t│0 t│0 cStore::Product.listed0 körre, így a piszkozat, a t│ t│0 t│0 bírálat alatti, a listáról levett és a privát t│ t│0 t│0 termékek nem jelennek meg t│ t├────────────────────────┼───────────────────────────────────────────────────┤ t│0 caccess_for0 t│0 hozzáfűzi az árat, a vásárlási oldalt, és azt, t│ t│0 t│0 hogy iez0 a hívó birtokolja-e t│ t├────────────────────────┼───────────────────────────────────────────────────┤ t│0 cauthorize_download0 t│0 lefuttatja azokat a szabályokat, amelyek a t│ t│0 t│0 cLibrary::DownloadService0 szolgáltatásban már t│ t│0 t│0 megvoltak: jogosultság, sebességkorlát, engedély, t│ t│0 t│0 letöltési esemény t│ t└────────────────────────┴───────────────────────────────────────────────────┘ Az c/api/download0 már nincs lefedve. A c/file/*0 szándékosan még mindig igen: egy webes build bböngészőben0 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 cspec/requests/library/download_gate_spec.rb0 a regressziós teszt, és nem opcionális. 1Belépés kliensből 1═════════════════ Az Orbit beállítja a WarpEngine eszközhitelesítési folyamatát, így az asztali 2WarpEngine Client fiókot tud tartani: p c.access_token_owner_class = "Accounts::User" p c.identity_verification_url = "/devices" p 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: t┌────────────────┬───────────────────────────────────────────────────────────┐ t│h Oldal t│h Mit csinál t│ t├────────────────┼───────────────────────────────────────────────────────────┤ t│0 c/devices0 t│0 valaki beírja a rövid kódot, amit a kliens mutat, látja, t│ t│0 t│0 melyik eszköz kérdez, majd jóváhagy vagy elutasít t│ t├────────────────┼───────────────────────────────────────────────────────────┤ t│0 c/client_tokens0 t│0 az ehhez a fiókhoz bejelentkezett eszközök, és egy t│ t│0 t│0 eltávolítása t│ t└────────────────┴───────────────────────────────────────────────────────────┘ A csubject_resolver0 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. bA kliens csak azt tudja meg, amire szüksége van, és semmi többet.0 Á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. 1Egy Orbit-oldali hiba, amit érdemes megjegyezni 1═══════════════════════════════════════════════ Minden cWarpEngine::Software0 c"development"0 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 bkatalóguskliens viszont olvassa0: 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 cStore::Product0 most cafter_save hívással szinkronban tartja a kettőt (cpublished → released0, cdelisted → carchived0, demótermék → cdemo0), 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. 1Futtatás 1════════ Minden Compose-ban van, az alkalmazás és a Sidekiq-worker is: p cp .env.example .env p make up p docker compose exec app bin/rails db:seed t┌─────────────────┬─────────────────────────────┐ t│h Felület t│h URL t│ t├─────────────────┼─────────────────────────────┤ t│0 Bolt t│0 http://localhost:3000 t│ t│0 Admin t│0 http://localhost:3000/admin t│ t│0 Levél (Mailpit) t│0 http://localhost:8025 t│ t│0 MinIO-konzol t│0 http://localhost:9001 t│ t└─────────────────┴─────────────────────────────┘ A seedelésnek két szintje van: • cmake seed-core0 — referenciaadatok, amelyek élesben is lefutnak: műfajok, címkék, EU-s áfakulcsok, bevételmegosztások, fórumok. • cmake seed-examples0 — csak fejlesztéshez való minták. A bvalódi0 ú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. 1Konvenciók 1══════════ Az alkalmazás a iGrowing Rails Applications in Practice0 könyvet követi. A munka nagy részét két szabály végzi: • bA kontroller triviális, és csak szabványos akciói vannak.0 Egy eszköz jóváhagyása cDeviceApprovalsController#create0, nem cDevicesController#approve0. Egy letöltés olyan erőforrás, amelynek a létrehozása kiadja az engedélyt. • bA logika szolgáltatásokban él0, használati esetenként egy publikus metódussal, és a tesztek súlypontja is ott van: minden ág, minden hibaút. A teljes terv és a döntések indoklása a repó cNOTES_TELETYPE_ORBIT.md0 fájljában van.