4 Infrastruktúra 4.1 AdaptiveLayout 4.10 SocialLogin 4.2 GuestProfile 4.3 Adatbázis 4.4 OpQueue 4.4.1 Szereplők 4.4.2 Működés 4.4.3 EntityRef-ek 4.4.4 Entitások főbb op-jai 4.4.5 Hátravan még 4.5 ShowModel 4.5.1 Működés 4.5.2 Elemei 4.5.3 ShowModel példányok 4.6 UI 4.6.1 Elfogadásra várók 4.6.2 Megoldást kell találni 4.7 CtrCounter 4.7.1 Működés 4.8 Modulok 4.9 EntityRef 4.9.1 EntityRef ős és leszármazottak 4.9.2 IEntityRefUpdater, EntityRef_update
RacingNet.GeneralBazar 4 Infrastruktúra 4.1 AdaptiveLayout Az AL feladata: kliensoldalon meghatározza a böngésző tényleges méret, ezt a szerveroldal rendelkezésére bocsátja, és a szerveroldalon ennek függvényében más-más layoutot szolgálunk ki.
4.10 SocialLogin Lehetőség van regisztrálni és belépni Facebook, Google, Microsoft fiókkal. Működés: - Facebook/Google/Microsoft loginnal belép a felhasználó - Kapunk egy tokent - A tokennel lekérjük a felhasználó email címét, id-ját, amire szükségünk van - Ha már összekapcsolta a Memberrel, akkor bejelentkeztetjük (Facebook/Google/Microsoft id-t vizsgálunk) - Ha nincs összekapcsolva, akkor 4 eset van: - Auth-AutoReg: Nincs ilyen email címmel Member, nem jelentkezett be erről a gépről: regisztrálunk új Membert és összekapcsoljuk ezzel a közösségi fiókkal. - Auth-AutoLink: Van ilyen email címmel Member, belépett erről a gépről. Összekapcsoljuk a közösségi fiókkal. - Auth-ManualLink: Van ilyen email címmel Member, nem lépett be erről a gépről. Kérünk jelszót és ha jó, akkor összekapcsoljuk a közösségi fiókkal. - Auth-ShouldNotReg: Nincs ilyen email címmel Member, belépett már erről a gépről. Megkérdezzük, hogy azzal a Memberrel kapcsoljuk-e össze amivel belépett erről a gépről. Ha igen, akkor kérünk jelszót és összekapcsoljuk, ha nem, akkor regisztrálunk neki új Membert és összekapcsoljuk. SocialLoginCase_Determine RacingNet.GeneralBazar.Infrastructure.Membership.SocialLogin.SocialLoginCase_Determine Method Itt dől el minden! Auth-AutoReg eset: Nincs email ütközés, nincs még bejelentkezés arról a címről: regisztráció, összekapcsolás Auth-AutoLink: Emailcím alapján megtaláljuk a membert, de nincs még fiókkal összekapcsolva, viszont GuestId alapján lépett már be arról a gépről: automatikus összekapcsolás Auth-
ManualLink: Ha email címalapján megvan a Member, de nemakarjuk automatiksuan összekapcsolni, akkor rögtön jelszót is kérünk tőle, és utána összekapcsoljuk Auth-ShouldNotReg: ha email címalapján nincs meg a member, és van guestid alapján login: Megkérdezzük, hogy az így megtalált néven van-e reggelve. RacingNet.GeneralBazar.Infrastructure.Membership.SocialUser, System.String, System.String, RacingNet.GeneralBazar.Entities.Member@
Facebook: FacebookUser RacingNet.GeneralBazar.Infrastructure.Membership.FacebookUser Namespace FacebookUser_Get RacingNet.GeneralBazar.Infrastructure.Membership.SocialLogin.FacebookUser_Get Method Facebook user adatok https://developers.facebook.com/docs/facebook-login/web System.String
Google: GoogleUser RacingNet.GeneralBazar.Infrastructure.Membership.GoogleUser Namespace GoogleUser_Get RacingNet.GeneralBazar.Infrastructure.Membership.SocialLogin.GoogleUser_Get Method Google user adatok https://developers.google.com/identity/sign-in/web/ System.String
Microsoft: MicrosoftUser RacingNet.GeneralBazar.Infrastructure.Membership.MicrosoftUser Namespace MicrosoftUser_Get RacingNet.GeneralBazar.Infrastructure.Membership.SocialLogin.MicrosoftUser_Get Method Microsoft user adatok https://msdn.microsoft.com/en-us/library/hh826533.aspx System.String
4.2 GuestProfile Az ASP.Net Profile-hoz hasonló, a GuestId alapján profilokat lehet a látogatókhoz rendelni, amelyet adatbázisban tárolunk. Profil betöltés: MemberEngine.GuestProfile_current Profil mentés: MemberEngine.GuestProfile_save A purgálás jelenleg nincs megvalósítva!
4.3 Adatbázis Az adatbázisokhoz a következő technikákat használjuk EntityRef Az EntityRef egy beágyazott entitás egy másik entitásban, az SQL join-ok elkerülése miatt. Pl. a BazarItem tartalmaz 1-2 infót a Member-ről entityerf formájába. Az EntityRef a lehető legkevesebb mezőt tartalmazza, lehetőleg primitív típusokkal. Az EntityRef-ek frissítését a DataProviderek EntityRef_update függvénye végzi, amelyeket az OpQueueEngine hív meg
OpQueue Minden entitás változásakor (Add, Change, Delete, Remove) bekerül egy Op az OpQueue-ba (meghatározott prioritással), amelyet a GBService dolgoz fel. Az alábbiak történnek: - EntityRef update - SolR hozzáadás
4.4 OpQueue Az OpQueue olyan mechanizmus, amelynek segítségével háttér-műveletek, feldolgozások sorrendbe állíthatók, és ezeket egy vagy több service feldolgozza. Ilyen jellegű műveletek, min pl: - EntityRef-ek frissítése - Solr update
4.4.1 Szereplők Op RacingNet.GeneralBazar.Infrastructure.OpQueue.Op Type Elvégzendő műveletek ős-típusa. Ezek kerülnek az OpQueue-ba. Ebben a class-ban van implementálva a feldolgozás is: a Process függvény
OpQueueEngine RacingNet.GeneralBazar.Infrastructure.OpQueue.OpQueueEngine Namespace
4.4.2 Működés 4.4.2.1 EntityRef-ek használata Az EntityRef egy entitás (db-ben tárolt elem) egy tulajdonsága, amely egy (vagy több) más entitás egyes mezőit tartalmazza. Redundás információ, a JOIN-ok kiváltására valók Az EntityRef-eket update-elni kell, amikor a hivatkozott entitás valamely érintett mezője megváltozok. Ez a frissítés úgy történik, hogy egy entitás módosulásakor erről keletkezik egy Op_Entity op. Ennek feldolgozása során, meghívódik valamennyi DataProvider EntityRef_update függvénye, amely a megváltozott entitás típusa alapján eldönti, hogy érintett-e benne. Ha igen, elvégzi a frissítést azokon az EntityRef-eken, ahol tényleg szükséges, ezt a CRC értékkel állapítja meg. Az EntityRef IMMUTABLE működésű, vagyis létrejötte után már nem nagyon változik a tartalma. Létrehozása: konstruktorban megkapja az entitást, ami alapján létrehozza magát
4.4.2.2 OpQueue működés Az OpQueue op-ok halmaza, amelyek prioritás és dátum szerint rendezve kerülnek feldolgozásra. Op-ot az OpQueueEngine.AddOp függvénnyel adunk a halmazhoz. Ha ennek a prioritása Realtime, akkor itt rögtön fel is dolgozódik, egyébként meg majd az OpQueueEngine.OpQueue_execute fogja végrehajtani. Az op-ok az Op őstípustól származnak, és meg kell valósítaniuk a Process függvényt, amely elvégzi a feldolgozást. Op_Entity RacingNet.GeneralBazar.Infrastructure.OpQueue.Op_Entity Type Entitás változása (Add, Change, Delete, Remove) esetén lefutó op.
Op_CreateOpsForMember RacingNet.GeneralBazar.Infrastructure.OpQueue.Op_CreateOpsForMember Type Op, ha egy member-hez tartozó entitásokhoz kell op-okat generálni
4.4.2.3 Problémás részek Hasonló hirdetések lista Probléma: eddig a SolR saját similarity engine-e volt használva. Amíg az item nem volt benne a SolR-ben, addig nem lehetett hozzá hasonlókat listázni. Megoldás: Egyrészt, msot már a saját hasonlóság-listázást használjuk, ehhez pedig nem kell hogy a Solr-ben legyen az eredeti cucc. Másrészt, ha mégis kéne, akkor az így legenerált Details3 modelt nem tároljuk el amig az eredeti nincs a SolR-ben (az Uncachable property segítségével)
4.4.3 EntityRef-ek BazarItem_ref_Member RacingNet.GeneralBazar.Entities.BazarItem_ref_Member Type A Member néhány szükséges adatát tartalmazza,
PartnerBanner_ref_Member RacingNet.GeneralBazar.Entities.PartnerBanner_ref_Member Namespace
SavedItem_ref_BazarItem StreetViewCar_ref_Member StreetViewCar_ref_StreetViewCarScore
4.4.4 Entitások főbb op-jai BazarItem Member - MemberEngine.SetElofizetes: előfizetés változása esetén mindenképpen. Ekkor a member összes hirdetéséhez is generálódik egy Change op, hogy a Solr-ben is frissüljenek - MemberEngin: EmailChangeConfirm: Email változása esetén - DesktopAdmin: Member Details: Csomag változtatás,
4.4.5 Hátravan még - Párhuzamos feldolgozás: több service dolgozhassa fel az op-okat - ShowModel integrálás, vagy legaláb update - TimedTask-ok kezelése - Mongo: secondary-k megfelelő kezelése - Solr alternálás
4.5 ShowModel
A ShowModel-ek előre legenerált view-modelek, jellemzően azokban az esetekben, ahol költséges a viewmodel legenerelásá (pl. belekerülnek a HasonloItem-ek, amelyeket SolR query-vel kapunk), vagy nagyon sokszor kell legenerálni (pl lista oldalak) Kétfajta ShowModel van: Memóriában van eltárolva: jellemzően rövid ideg, néhány percig DB-ben van eltárolva: Több napig is lehet. Ezeknék gondoskodni kell a rendszeres frissítésről
4.5.1 Működés Lite ShowModel A drágább ShowModel-eket nem hozzuk teljesen létre a UI szálból, hogy ne terhelje a webszervert. Létrehozunk egy olyan változatot, amely nem tartalmazza a költségesen legenerálható, de nem feltétlen szükséges részeit a ShowModel-nek. Ebben az esetben a ValidBefore MinDate lesze, így a háttérszál a lehető leghamarabb legenerálja a teljesértékű ShowModelt AffectedEntityIds Minden ShowModel-hez el van tárolva, hogy mely entity-ket tartalmazza. Ha ezek közül valamelyik megváltoziks, akkor Revalidálni kell a ShowModelt. AffectedId alapján az invalidálást az alábbi függvény végzi el: Revalidate Ha egy ShowModel invalid (IsValid vagy ValidBefore flag alapján), akkor újra létre kell hozni, vagy törölni kell ha már egy ideje nem nézték meg. Ezt a Revalidate függvény végzi. Ezt a RevalidateAll függvény hívja, amelyet a háttérservice futtat. Az a cél, hogy egy éjszaka alatt az összes invalid showmodelre lefusson, és napközben is fusson rendszeresen Remove Ha egy ShowModel alapját képező entitás nagyon megváltozik, akkor Remove-olni kell. Ezáltal a következő Get...-nél automatikusan létrejön, így rögtön élesedni fognak a módosítások.
4.5.2 Elemei A ShowModel-ek konfigurációját a a ShowModelDefinition-ok tartalmazzák. Ezeket az alkalmazás indulásakor kell létrehozni ShowModelEntity RacingNet.Modules.WebFrontend.ShowModel.ShowModelEntity Type Show model konfigurációs osztály
ShowModelBase Valamennyi ShowModel-t ebből kell származtatni ShowModelBase RacingNet.Modules.WebFrontend.ShowModel.ShowModelBase Type A Showmodel-ek ősosztálya
ShowModelEngine Singleton, a ShowModel-ek általános függvényeit tartalmazza
4.5.3 ShowModel példányok Details3Model RacingNet.GeneralBazar.Controllers.Details3Model Type Details képernyő modelje. Ez tartalmazza a Details, és a Deleted képernyő modelleket is.
Mongo, valid: 14 nap FaqIndexModel Asp, valid: 10 perc GumiFelniModel Asp, valid: 4 perc (nulla szűrés esetén) Asp, valid: 10 perc (1 szűrés esetén, q nélkül) FoundsSModel Asp, valid: 4 perc MassimportBillingHistory Asp, valid: 26 óra
4.6 UI UI, html, css, cshtml, és ezekhez kötődő dolgokkal kapcsolatos szabályok, konvenciók
4.6.1 Elfogadásra várók - BS: Fluid layout esetén nem használunk fixed-width oszlopokat, legfeljebb a display mérettől függő oszlop-számmal játszunk
4.6.2 Megoldást kell találni Ezekre még valamilyen megoldást kell találni - css-ek összefűzött betöltése - js-ek összefűzött betöltése - UI könyvtár struktúra - css fájlok (bs, theme, debug, rn, komponensek, ...) - js fájlok (bs, theme, rn, komponensek, ....) - debugolás (glimpse) - adaptive layout - rendering feedback - css turkáló
4.7 CtrCounter A CtrCounter az alapja valamennyi megjelenés-, és kattintás számlálásnak. Minden egyes megjelenés létrehoz egy sort a Reports DB/CtrView kollekcióban, minden egyes kattintás pedig a CtrClicks kollekcióban, majd ezeket a CtrEngine.AggregateDay aggregálja.
Minden megtekintésről/kattintásról meg van jelölve hogy hol, mely felületen történt:
CtrLocation RacingNet.GeneralBazar.Features.CtrCounter.CtrLocation Type A weboldal részét azonosítja, ahol megjelent a kérdéses elem. Ezek jelenleg: ListMain, FindMain, ListLegacyTopKiemelt, FindLegacyTopKiemelt
A statisztikák pedig felület-csoportokhoz vannak hozzárendelve: CtrCounterEngine RacingNet.GeneralBazar.Features.CtrCounter.CtrCounterEngine Type A teljes weboldalon mindenféle elemek megjelenésének és kattintásainak statisztikáiiért felet. Minden megjelenés egy definiált helyen történik: CtrLocation A statisztikák megjelenés szerint csoportosítva készülnek, mindegyiknek saját neve van: Listing: Az alábbi CtrLocation-okon történő megjelenések: ListMain, FindMain, ListLegacyTopKiemelt, FindLegacyTopKiemelt ListingMass: ugyanaz mint a Listing, de csak a massimportált hirdetéseket veszi figyelembe Details: details oldal megjelenéseinek száma DetailsMass: ugyanaz mint a Details, de csak a massimportált hirdetések vevődnek figyelembe
Az entitásokhoz tartozó statisztikák jellemzően a MemberStat, stb. nevű kollekciókban vannak tárolva, ide dolgozik az Aggregate függvény
4.7.1 Működés 1, Szerveroldalon legenerál minden egyes elem megjelenéséhez egy view-t, minden view kap egy ObjectId ViewId-et View_add RacingNet.GeneralBazar.Features.CtrCounter.CtrCounterEngine.View_add Method Létrehoz egy view-t GlobalId alapján RacingNet.GeneralBazar.Infrastructure.GBGlobalId, RacingNet.GeneralBazar.Features.CtrCounter.CtrLocation, System.Int32, System.Int64 View_addDocModel RacingNet.GeneralBazar.Features.CtrCounter.CtrCounterEngine.View_addDocModel Method DocModel alapján hoz létre egy view-t RacingNet.GeneralBazar.Models.SolrDocModel, RacingNet.GeneralBazar.Features.CtrCounter.CtrLocation, System.Int32
2, A cshtml-ben a kattintható tag-ek a data-ctriid attributumban megkapják a view id-et 3, A CtrCounter.rn.js-ben lévő Ctr_setEventHandlers JS függvény minden data-ctriid attributummal rendelkező tag-nak ad egy OnClicket, amely a /ctr/click/viewid url-re navigál 4, Egy HttpHandelr elkapja a /ctr/click request-eket, és létrehoz a view-hoz egy click bejegyzést CtrHttpHandler RacingNet.GeneralBazar.Features.CtrCounter.CtrHttpHandler Type Elkapja a /ctr/click/viewid request-eket, és létrhoz hozzájuk click-eket
5, A naponta egyszer lefutó Aggreagate függvény aggregálja ezeket, és létrehozza a Stat táblákat... Aggregate_DailyTask RacingNet.GeneralBazar.Features.CtrCounter.CtrCounterEngine.Aggregate_DailyTask Method Az aggregálás kiidnulópontja, ez fut le naponta egyszer. - Bele-mergeli a clickeket a Views táblába0 - Legenerálja a statotkat a különböző Aggregate* függvényekkel - végül törli a feldolgozott Raw view-eket
4.8 Modulok
Felhasznált elemek modulokból: WebFrontend: - DebugPanel
4.9 EntityRef Az EntityRef feladata, hogy egyes entitások szükséges jelemzőit eltároljuk más entitásokban, elkerülve ezze a join használatat. Probléma: ha az eredeti entitás megváltozik, a redundánsan eltárolt verzióit is frissíteni kell. Megoldás: 1, A redundás entity infókhoz léterehozunk egy EntityRef leszármazottat 2, A tartalmazó entitás DataProviderébe teszünk egy EntityRef_update függvényt, amely update-li a redundás entitásokat, amennyiben azok megváltoztak 3, Ezeket az EnitityRef_update függvényeket az OpQueueEngine fogja hivogatni, tehát szükséges, hogy az entitás megváltozása esetén hozzunk létre hozzá Op-ot Az EntityRef ős tartalmaz egy CRC alapú ellenőrzést, amely lehetővé teszi, hogy csak akkor történjen update, ha tényleg megváltozott valami
4.9.1 EntityRef ős és leszármazottak Az EntityRef-eknek az EntityRef absztrakt osztályból kell leszármazniuk: Elnevezési konvenció: TartalmazóOsztály_ref_RedundánsOsztály Például: BazarItem_ref_Member RacingNet.GeneralBazar.Entities.BazarItem_ref_Member Type A Member néhány szükséges adatát tartalmazza,
4.9.2 IEntityRefUpdater, EntityRef_update Ezt az interface-t a DataPoviderben kell megvalósítani, ha az adott entitás tartalmaz EntityRef mezőt. IEntityRefUpdater RacingNet.GeneralBazar.Infrastructure.EntityRef.IEntityRefUpdater Type Amelyik dataprovider ezt megvalósítja, az tudja update-elni a saját EntityRef-jeit
EntityRef_update RacingNet.GeneralBazar.Infrastructure.EntityRef.IEntityRefUpdater.EntityRef_update Method Meghívódik mindent entitás op-nál System.Object, RacingNet.GeneralBazar.Infrastructure.GBGlobalId, RacingNet.GeneralBazar.Infrastructure.OpQueue.OpKind
Ez a függvény meghívódik minden Op esetén, így ebben a függvényben vizsgálni kell hogy a paraméterben megadott entitás változása érinti-e az adott dataprovidert. Ha igen, a következőket kell tenni: 1, léterehozni egy új EntityRef-et a megváltozott entitás alapján (mivel az EntityRef immutable!!), 2, update-elni az EntityRefHelper.MongoCollectionUpdate függvénnyel, amely gondoskodni fog róla a CRC alapján, hogy csak a módosult ref-ek frissüljenek.
MongoCollectionUpdate RacingNet.GeneralBazar.Infrastructure.EntityRef.EntityRefHelper.MongoCollectionUpdate Method A megadott kollekción update-eli az entityRe-eket, ha szükséges MongoDB.Driver.MongoCollection, System.String, System.Object, RacingNet.GeneralBazar.Infrastructure.EntityRef.EntityRef