1 Features 1.1 Plan 1.10 Similars 1.11 Specification 1.12 Massimport 1.13 Faq 1.14 Gifting 1.2 BazarItemRepost 1.3 Parkoló, előzmények 1.4 Streetview 1.5 ContextAd 1.6 CtrCounter 1.7 KuponCode 1.8 Recommendation Engine 1.9 Approving 2 Üzemeltetés 2.1 Racing-bazar.hu: átállás kötőjel nélküli domain névre 2.2 MassBazarItem 2.3 Egyedi hack-ek 3 Core funkciók 3.1 BazarItem 3.2 Member 4 Infrastruktúra 4.1 AdaptiveLayout 4.10 SocialLogin 4.2 GuestProfile 4.3 Adatbázis 4.4 OpQueue 4.5 ShowModel 4.6 UI 4.7 CtrCounter 4.8 Modulok 4.9 EntityRef 5 Controllerek 5.1 FindS - Hirdetések listája 5.2 Details3 6 SEO 6.1 FindS - Lista képernyő 6.2 Streetview lista 7 Design 7.1 Általános 8 Performance 8.1 Caching
RacingNet.GeneralBazar 1 Features 1.1 Plan A plan-ek a fizetős szolgáltatásokat, fizetősen igénybe vehető lehetőségeket foglalják össze
1.1.1 Szereplők Plan RacingNet.GeneralBazar.Features.Plans.Plan Type Egy, a hirdető által igénybe vett szolgáltatáscsomagot reprezentál Minden Memberhez pontosan egy Plan van hozzárendelve Az új Memberekhez a Default Plan
kerül hozzárendelésre
Minden member minden pillanatban egy plan-ban van
1.1.2 Áttekintés - Minden hirdetőnek van pontosan egy plan-ja. - Az alapértelmezett plan innen jön: GBApp.DP.PlanDP.DefaultPlan Egy plan valójában PlanFeatureFactory-k halmaza. A PlanFeatureFactory megmondja, hogy egy adott PlanFeature egy adott Plan-ban milyen költséggel vehető igénybe. A PlanFeature és a PlanFeatureFactory absztrakt osztályok. Minden konkrét szolgáltatást egy PlanFeature leszármazott valósít meg, amelyhez minden esetben tartozik egy PlanFeatureFactory leszármazott. PlanFeatureFactory RacingNet.GeneralBazar.Features.Plans.PlanFeatureFactory Type Meghatározza, hogy az adott Plan-hoz mely PlanFeature-k milyen költséggel vehetők igénybe Minden PlanFeature-hoz tartozik egy PlanFeatureFactory
A PlanFeatureUnit az egy konkrét, igénybe vett fizetős szolgáltatás, jellemzően minden objektum példányhoz tartozik egy fizetési tranzakció. Hogy ez mit csinál, az általában egyedileg van leprogramozva PlanFeatureUnit RacingNet.GeneralBazar.Features.Plans.PlanFeatureUnit Namespace
PlanFeatureUnit-okat BazarItem-hez, vagy Member-hez lehet csatolni. Azt, hogy ugyanazon PlanFeatureUnit-ból lehet-e egy alanyhoz egyszerre többet csatolni, a PileUpKind property mondja meg: - None: nem leht - AmountExtendable: lehet, egyszerűen a mennyiség nő (pl. HD kép feltöltés) - DateExtendable: lehet, az újabb PlanFeature-ek időben kitolják egymást (pl hirdetés kiemelés 10 napra )
1.1.3 Plan rendelés: PlanManageController A Plan rendelés, módosítás a PlanManageController-ben kapott helyet. Tartozik hozzá egy persisted model: PlanOrder PlanOrder RacingNet.GeneralBazar.Features.Plans.PlanOrder Type A Plan rendelés modelje. A memberhez van eltárolva, de UI modelként viselkedik
A rendelés folyamata: 1, Létrejön a PlanOrder Ez akkor történik meg, mikor a PlanMatrix-ban nyomnak egy jót az Ezt Választom gombon Order_createNew RacingNet.GeneralBazar.Features.Plans.PlanEvents.Order_createNew Method Ezt kell meghívni, mikor valaki új csomag igénylésébe kezd System.Int64
2, Nyomkodja az user a megrendeléssel kapcsolatos opciókat (díjfizetés gyakoriság, fizetési mód, ilyesmik...) Ilyenkor mindig lefut az Order_calculate, hogy a megjelenített infókat újraszámolja Order_calculate RacingNet.GeneralBazar.Features.Plans.PlanEvents.Order_calculate Method A megadott order számítható értékei számítja ki (pl. fizetendő összeg) RacingNet.GeneralBazar.Features.Plans.PlanOrder
3, Véglegesedik az Order (Place) Az user rányomott a véglegesítő gombra. Ekkor jön létre a megrendeléshez szükséges fizetési objektum (Purchase) Order_place RacingNet.GeneralBazar.Features.Plans.PlanEvents.Order_place Method A member véglegesíti az ordert. Ekkor jön létre a Purchase objektum RacingNet.GeneralBazar.Features.Plans.PlanOrder
4, Fizetés folyamata. A Pay_start elindítja a kiválasztott fizetési módhoz tartozó fizetést. Ha át kell ugrani, akkor visszaad egy url-t. Pay_start RacingNet.GeneralBazar.Features.Plans.PurchaseEngine.Pay_start Method Fizetés inditása Egyrész, elindíta a fizetést a pay module segítségével, másrész pedig a UI-t is meghatározza RacingNet.GeneralBazar.Features.Plans.Purchase, RacingNet.GeneralBazar.Features.Plans.PurchasePaymode
5, Finish Vagy a fizetés képernyőről ugrott ide, vagy közvetlen az előzőről. Megjelenít információkat a fizetési tranzakcióval kapcsolatban, illetve a rendelés állapotával kapcsolatban. A Rendelést az Order_finish zárja le, ez határozza meg az itt megjelenítendő szövegeket. apply...
1.1.4 Purchase A Purchase reprezentál egy számlázási tételt. Az esetek többségében egy számlára egy számlázási tétel kerül
1.1.4.1 Life and death Minden esetben a PurchaseEngine.Purchase_add függvénnyel jön létre: Purchase_add RacingNet.GeneralBazar.Features.Plans.PurchaseEngine.Purchase_add Method Létrehoz egy új purchase-t System.Int64, System.String, RacingNet.Modules.Pay.Currency.Price, RacingNet.GeneralBazar.Features.Plans.PurchasePaymode, System.Boolean, System.Nullable{System.Int64}
- A Purchase_add-hoz a text-et és price-t a hívó oldal adja meg A tényleges fizetési tranzakciót (pénzlevonást) a PayStart függvény indítja el: Pay_start RacingNet.GeneralBazar.Features.Plans.PurchaseEngine.Pay_start Method Fizetés inditása (TÉNYLEGES fizetési folyamat) Egyrész, elindíta a fizetést a pay module segítségével, másrész pedig a UI-t is meghatározza RacingNet.GeneralBazar.Features.Plans.Purchase, RacingNet.GeneralBazar.Features.Plans.PurchasePaymode, System.String, System.String
Ez elindítja a fizetési mechanizmust, másrészt visszatér vagy egy megjelenítendő string-el, vagy pedig egy redirect-etl (pl a bankkártyás fizetés oldalra) Miután bármilyen módon megtörtént a fizetés, az OnPaid függvény hívódik meg Paid RacingNet.GeneralBazar.Features.Plans.PurchaseEngine.Paid Method Ez akkor fut le, ha megtörtént a kifizetés RacingNet.GeneralBazar.Features.Plans.Purchase
A különböző entitások kifizetéséhez ennek al-függvényei vannak: Paid_planOrder RacingNet.GeneralBazar.Features.Plans.PurchaseEngine.Paid_planOrder Method Plan megrendelésének kifizetése esetén fut le. RacingNet.GeneralBazar.Features.Plans.Purchase, RacingNet.GeneralBazar.Features.Plans.PlanOrder
1.1.4.2 Számlázás Számla bármikor létrehozható egy vagy több purchase-hez: Szamla_create A számlák pdf-jeit össze lehet merge-lni, hogy egyszerűbb legyen kinyomtatni: Szamla_merge A számlázandó purchase-k listáját a Purchase_getBillCreateList függvény generálja. Ez elvégzi a csoportosítást is (egy számlára több Purchase is kerülhet), amelyet az admin felületen felül lehet bírálni. Purchase_getBillCreateList RacingNet.GeneralBazar.Features.Plans.PurchaseEngine.Purchase_getBillCreateList Method Az adatbázisból listázza azoknak a Purchase-eknek a listáját, amelyekhez számlát kell készíteni Elvégzi a csoportosítást is
Csoportosítás: Purchases_process RacingNet.GeneralBazar.Features.Plans.PurchaseEngine.Purchases_process Method Purchasekből létrehozza a PurchaseCollectionöket MemberId szerint van csoportosítva System.Collections.Generic.List{RacingNet.GeneralBazar.Features.Plans.Purchase}
A számlagenerálásr váró purchase-k validálást ez végzi el: Purchases_getError RacingNet.GeneralBazar.Features.Plans.PurchaseEngine.Purchases_getError Method Ellenörzi, hogy jelen állás szerint elkészíthető-e a megadott dokumentum- ha a visszatérési érték egy string, akkor az a hibaüzenetet jelenti - ha a visszatérési érték null, akkor nincs hiba RacingNet.GeneralBazar.Features.Plans.PurchaseCollection
1.1.5 Usage - felhasznált mennyiségek
A Plan-ek tartalmazhatnak a plan árában foglalt ingyenes mennyiségeket, illetve egyébként is szükség lehet member-szinten eltárolni a PlanFeature-ök használatával kapcsolatos információkat. Ezeknek a helye a Member.PlanFeatureUsages PlanFeatureUsageCollection RacingNet.GeneralBazar.Features.Plans.Entities.PlanFeatureUsageCollection Type Ez az osztály tárolja el a PlanFeature-ök felhasználását memberenként Minden PlanFeature minden cucca be van égetve
Ide kulcs-érték párosok kerülnek, amelyek kezeléséről a PlanFeautureFactory-k gondoskodnak, az alábbi fügvényekkel: Usage_get RacingNet.GeneralBazar.Features.Plans.PFFListaFolottiKiemeles.Usage_get Method Visszaadja a pillanatnyilag érvényes Usage objektumot System.Int64
Usage_reset RacingNet.GeneralBazar.Features.Plans.PFFListaFolottiKiemeles.Usage_reset Method Reseteli, inicializálja a megadott memberhez tartozó Usage-t, és el is menti a memberhez, meg majd jól visszaadja Ez a függvény használható önállóan is (Ide kerülhetnek majd a régebbi cuccok gyomlálása is) System.Int64
Usage_increment RacingNet.GeneralBazar.Features.Plans.PFFListaFolottiKiemeles.Usage_increment Method Inkrementálja az ingyenes használatot, majd rögtön el is menti nincs paraméter RacingNet.GeneralBazar.Entities.Member, System.Object[]
Usage_decrement RacingNet.GeneralBazar.Features.Plans.PFFListaFolottiKiemeles.Usage_decrement Method Dekrementálja az ingyenes használatot, majd rögtön el is menti nincs paraméter RacingNet.GeneralBazar.Entities.Member, System.Object[]
UsageString_forMember RacingNet.GeneralBazar.Features.Plans.PFFListaFolottiKiemeles.UsageString_forMember Method Ez lesz megjelenítve a publikus adminon. Formája: tábla sorok RacingNet.GeneralBazar.Entities.Member
Az UsageString_forMember függvény generálja a Vezérlőpulton megjelenített információkat a szolgáltatások használatával kapcsolatban
1.1.6 PlanFeatures 1.1.6.1 PfAdTotalLimit Feladata: a Member feladott hirdetéseinek korlátozása. Akinek a Planjében szerepel az nem adhat fel több hirdetést mint a meghatározott limit. Ez nem vonatkozik a tömegesen feltöltött hirdetésekre. Amennyiben eléri a limitben megadott hirdetések számának a 90%-át, hirdetésfeladáskor tájékoztató üzenetet kap erről. PFFAdTotalLimit
RacingNet.GeneralBazar.Features.Plans.PFFAdTotalLimit Type Feladott hirdetések számának korlátozása
Hirdetésfeladáskor és hirdetésújrafeladáskor a GetAvailable() függvény segítségével ellenőrizzük, hogy hányat adhat még fel. Itt tesszük rá az AdTotalLimitReached flaget ha elérte a limitet. Erről Syslog is létrejön. Dashboard Statba ezt beírjuk. GetAvailable RacingNet.GeneralBazar.Features.Plans.PFFAdTotalLimit.GetAvailable Method Megmondja, hogy hány hirdetést adhat még fel a Member RacingNet.GeneralBazar.Entities.Member
Hirdetésfeladáskor a GetUsagePercentage() mondja meg, hogy a limit hány százalékánál jár a Member. GetUsagePercentage RacingNet.GeneralBazar.Features.Plans.PFFAdTotalLimit.GetUsagePercentage Method Visszaadja, hogy a felhasználható mennyiségnek hány százalékát használta már el a Member System.Int64
UsageString_forMember() függvény segítségével jelenítjük meg a számokat a Membernek. UsageString_forMember RacingNet.GeneralBazar.Features.Plans.PFFAdTotalLimit.UsageString_forMember Method Ez lesz megjelenítve a publikus adminon. Formája: tábla sorok RacingNet.GeneralBazar.Entities.Member
Hirdetések száma (Feladott, Összes, Élő): GetCountByMember_Added RacingNet.GeneralBazar.Engines.BazarItemEngine.GetCountByMember_Added Method Feladott: Feladott, nemtörölt hirdetések System.Int64 GetCountByMember_All RacingNet.GeneralBazar.Engines.BazarItemEngine.GetCountByMember_All Method Összes hirdetés: Összes hirdetés (feladott, massimportos, törölt) System.Int64 GetCountByMember_Live RacingNet.GeneralBazar.Engines.BazarItemEngine.GetCountByMember_Live Method Élő hirdetések: feladott + massimportos, nemtörölt hirdetések System.Int64
1.1.6.2 PFAjanlatkeres Lehetőséget adunk bármely látogatónak, hogy konkrét alkatrészre ajánlatot kérhessen Partnereinktől. A bejelentkezett felhasználók a /vezerlopult/ajanlatkereseim oldalon láthatják a kiküldött ajánlatkéréseiket. A listában feltüntetjük, hogy hány Partnerünk kapta meg. A Partnerek a /vezerlopult/ajanlatkeres/beallitasok oldalon tudják megadni: - akarnak-e ajánlatkéréseket kapni - milyen autótípus ajánlatkéréseit (Facetek) szeretnék megkapni - kér-e erről emailben értesítést és ha igen, milyen gyakorisággal Ezeket a beállításokat külön kollekcióban (AjanlatkeresMemberConfig) tároljuk.
AjanlatkeresMemberConfig RacingNet.GeneralBazar.Features.Plans.PlanFeatures.PFAjanlatkeres.AjanlatkeresMemberConfig Namespace
Ajanlatkeres_TimedTask: - 10 percenként meghívja a Service - feladata: ajánlatkérések szétosztása, emailek kiküldése, purgálás Ajanlatkeres_PropagateAll RacingNet.GeneralBazar.Features.Plans.PlanFeatures.PFAjanlatkeres.AjanlatkeresEngine.Ajanlatkeres_PropagateAll Method Végigmegy a még ki nemküldött Ajanlatkereseken és kiküldi a megfelelő Membereknek. System.Collections.Generic.List{RacingNet.GeneralBazar.Entities.Member} Ajanlatkeres_SendNotifications RacingNet.GeneralBazar.Features.Plans.PlanFeatures.PFAjanlatkeres.AjanlatkeresEngine.Ajanlatkeres_SendNotifications Method Végigmegy az AjanlatkeresKapva-kon és kiküldi a megfelelő emaileket System.Collections.Generic.List{RacingNet.GeneralBazar.Entities.Member} Ajanlatkeres_Purge RacingNet.GeneralBazar.Features.Plans.PlanFeatures.PFAjanlatkeres.AjanlatkeresEngine.Ajanlatkeres_Purge Method Törli az 1 napnál régebbi, IsPending Ajanlatkereseket
A Partnerek a /vezerlopult/ajanlatkeresek/bejovo oldalon láthatják a hozzájuk beérkezett ajánlatkéréseket.
1.10 Similars A hasonlóság-listák generálásért és tárolásáért felelős osztályok
1.10.1 Szereplők SimilarEngine RacingNet.GeneralBazar.Features.Similars.SimilarEngine Namespace
FilteredListGeneratorBase RacingNet.GeneralBazar.Features.Similars.FilteredListGeneratorBase Type A Solr hasonlóság generátoroknak az őse, ebből kell származtatni valamennyit
SimilarsModel RacingNet.GeneralBazar.Features.Similars.SimilarsModel Type A hasonlóság-listák megjelenésének alapját képezi Tárolja a generátorokat, és néhányhoz a legenerált listát is
1.10.2 Működés A hasonló elemeket Solr lekérdezésekker gyüjtjük össze, leginkább a facetek alapján Kétfajta lista van: SimilarList: Általános hasonló elemek listája, indul egy nagyon szigorú SolR queryvel, majd lefuttatja többször, egyre lazítva a feltételetek. A cspásirányt a facet prioritásokkal lehet befolyáslni
FilteredList: Több, előre kitalált sablon szerint (Pl. Honda CRX használtautók Debrecenben) futtat le lekérdezéseket.
1.10.3 SolR használat A SolR-ben a Hasonlóság listázás az spc és az spcb mezők alapján történik. Ez a facet és tagword id-k listája tehát gyakorlatilag a FacetCollection szöveges lekérdezése. Azért van stringként, így eltárolva, hogy felhasználhasuk a SolR score-ját. spc a normál, spcb a boosted mező Ezekben a Similar handlerrel lehet keresni
1.11 Specification A Specification az az objektum, amely tartalmazza az adott entitás nevesíthető paramétereinek értékeit. Célja, hogy ezeket meg lehessen adni, fel lehessen használni szűréshez, kereséshez, illetve szövegesen meg lehessen jeleníteni.
1.11.1 Szereplők SpecProperty Egy tulajdonság, amelyet egyes entitásokhoz hozzá lehet rendelni. Ilyen pl: felniátmérő, autótípus, kategória, stb. Ezeknek kódba beégetett ID-ja van, illetve a SpecificationProperties táblában vannak hozzá további adatok tárolva. SpecValue A SpecProperty-k lehetséges értékei. SpecPropertyContent Egy konkrét entitás esetében egy SpecProperty aktuális értéke. Ez lehet string, vagy SpecValue, illetve mindkét esetben lehet több érték is (string vagy SpecValue lista) Specification Egy konkrét entitáshoz rendelt SpecProperty értékek halmaza
1.12 Massimport A Massimport feladata külső adatforrások feldolgozása, és hirdetésekként való beintegrálása
1.13 Faq A Faq egy súgó rendszer, mely főbb részei a következők: - Faq aloldal: statikus, csoportokba szedett kérdés-válasz gyüjtemény - Faq levelek: kontextusfüggően kiküldött levelek
1.13.1 Szereplők FaqPost: faq a weben FaqMail: levélben elküldött faq tartalom - tarolja hogy melyik FaqEvent-hez van kotve - tarolja hogy melyik FaqFlag-hez van kotve FaqEvent: class: FaqMailId, TimedFaqEvents: Dict member élete során bekövetkező események listája FaqEngine.Init hozza letre a peldanyokat, a propertyk itt be vannak egetve
MemberFaqEvents: kollekció, memberhez rendelt FaqEvent-ek (mi, mikor következett be, mikor kell elküldeni, mikor lett elküldve) FaqFlag RacingNet.GeneralBazar.Features.Faq.Entities.FaqFlag Type A FaqFlag-okat a moderátorok osztják, ezzel lehet a hirdetéseket bizonyos szempontok alapján megjelölni (pl. hibás, stb...)
MemberFaqFlags: kollekció, membernek ELKÜLDÖTT faqmailok BazarItemFaqFlags: moderátor által BazarItemhez rendelt FaqFlag-ek (mi, mikor) (hirdetés módosításkor törlődik)
1.13.2 Működés FaqEngine.EnsureFaqEvent(event, member) Ha nincs a membernek még olyan eventje, akkor hozzáadja és kiküldi a levelet FaqEngine.AggregateFaqFlags() Service fogja futtatni, összeszedni miket kell kiküldeni, és hozzáadja a mebmerhez, kiküldi - MemberFlaqFlags: csak n hónapra tároljuk (6) - Egy FaqMail-t max. havonta egyszer kap meg - Hetente csak 1 FaqMailt kap - Csak az 1 hónapnál nem régebbi BazarItemeket vesszük figyelembe (CreatedAt) FaqEngine.SendFaqMail() Elküldi a levelet a MongoWM.QueueSentMail használatával FaqEngine.SendTimedEvents() Elkuldi az idozitett FaqEventes mailokat
1.13.3 FaqMail Tokenek: - ##BazarItemList#
1.14 Gifting Ajándék-sorsolás, bizonyos tevékenységes esetén (hirdetésfeladás, futárrendelés, ilyesmi) ajándékot sorosolunk ki. Egy giftingnek van eleje, vége, illetve eltároljuk hogy mikor van a sorsolás. Gifting lehet automatikus, vagy checkox-al jelentkezni kellhet rá.
1.2 BazarItemRepost Lehetőség van a már lejárt, és/vagy törölt hirdetés újrafeladására. Ekkor a hirdetés dátuma a következő módon számítódik: - Ha az eredeti hirdetés már lejárt, akkor a Reposted dátuma a lejárat dátuma lesz, az új lejárat dátuma pedig rendesen számítódik - Ha a hirdetést törölt, de még nem járt le (tehát kézzel törölték), akkor hirdetés dátuma nem változik, a lejárat dátuma viszont kitolódik. Repost-nál figyelni kell a title-t is, ez ugye megváltozhat, ekkor hozzácsapjuk majd az id-t is. Figyelni kell az egy member által elsütött repostok számát is, ezt lehet hogy majd korlátozni kell
1.2.1 Elemei - Repost tényleges végrehajtása: BazarItemEngine.Repost - Hirdetéskezelő: Repost gomb a törölteknél
- Repostolások eltárolása, szűrése (Most a BazarItem.Reposts prop (reports), később majd a history) - Repost link az Expired mailban - Repost link kattintás utáni képernyő (SiteControllerBase) - FAQ bejegyzés, facebook kampány
1.3 Parkoló, előzmények SavedEngine RacingNet.GeneralBazar.Engines.SavedEngine Type Parkoló és Előzmények kezelése ============================== Eltároljuk a Memberek és a nemregisztrált felhasználók előzményeit és parkolóhoz adott itemjeit. Bejelentkezéskor Mergeljük. Éjjelente Purgáljuk. ------------------------------ Add: BazarItemből SavedItemet hozunk létre és eltároljuk. Duplázódás nem jön létre a Unique index miatt MergeSavedItems: bejelentkezéskor Mergeli a Guest és Member SavedItemjeit PurgeAll: Service hívja meg éjszaka, törli amiket kell RenderParkoloAddOrRemoveLink: kirenderel egy Parkolóhoz adás gombot vagy linket SavedItem RacingNet.GeneralBazar.Entities.Saved.SavedItem Type Egy Parkoló/Előzmény itemet reprezentál.
Célja: megtekintett hirdetések eltárolása előzményekhez vagy opcionálisan a parkolóba. Nem szükséges bejelentkezni a használatához (ebben az esetben GuestId alapján tároljuk) Bejelentkezéskor mergeljük a kijelentkezve megtekintett hirdetéseket a bejelentkezett Memberhez. Index: MemberId, GuestId, ListId, BazarItemRef.Id (Unique, így elkerüljük a duplázódást) Purgálás: PurgeAll RacingNet.GeneralBazar.Entities.Saved.SavedItemDataProvider.PurgeAll Method Service hívja meg éjszaka 1.: Azoknak a Membereknek/Guesteknek a SavedItemjeinek a törlése ahol a Historyban több van mint a megengedett 2.: Azoknak a Membereknek/Guesteknek a SavedItemjeinek a törlése ahol a Member-nek 1 évnél régebbi a legutóbbi SavedItem, a Guestnek pedig 1 hónapnál régebbi
1.3.1 Brainstorming - Parkoló, előzmények lista: ugyanaz a motor jelenítse meg, különbségek azért lehetnek köztük - Parkolóhoz hozzáadásnál lehetne valami animálni - működjön kijelentkezett usernél is. Ha ez bejelentkezik, akkor mergelje össze őket - Parkoló: térképen is jelenítsük meg. Lehessen körüljárási útvonalat készíteni (waypoint) - Listát lehessen rendezni - lehessen jegyzetelni minden hirdetéshez (úgy, hogy az majd minden hirdetés listánál működjön) - details oldal: parkolóba adásnál "kinylik" a parkoló jelenlegi tartalma, oly módon mint most a képnézegető - listában a törölt hirdetések is jelenjenek meg, töröltként megjelölve
1.4 Streetview A Streetviewen található autók összegyüjtése. Egy StreetviewCar reprezentál egy Streetview nézetet, a Facets tulajdonságon keresztül válik böngészhetővé
1.4.1 Onsite SEO Finds A Finds listában legfelül megjelenítünk egy linket, amennyiben van típursra történő szűrés
1.4.2 Szereplők StreetviewCar
RacingNet.GeneralBazar.Features.Streetview.StreetviewCar Type Egy Streetview oldlaon megjelenített autó reprezentál StreetviewCarEngine RacingNet.GeneralBazar.Features.Streetview.StreetviewCarEngine Namespace StreetviewCarDataProvider RacingNet.GeneralBazar.Features.Streetview.StreetviewCarDataProvider Namespace StreetviewCarRoute RacingNet.GeneralBazar.Features.Streetview.StreetviewCarRoute Type Streetview listához tartozo Route StreetviewCarUrlModel RacingNet.GeneralBazar.Features.Streetview.StreetviewCarUrlModel Type A Streetview listához tartozó Url model StreetviewCar_ControllerBase RacingNet.GeneralBazar.Features.Streetview.StreetviewCar_ControllerBase Namespace StreetviewCar_ModelCreators RacingNet.GeneralBazar.Features.Streetview.StreetviewCar_ModelCreators Namespace
1.5 ContextAd A ContextAd Google AdSense-szerű reklámot jelent, amely egy Facet collection alapján, hasonlóságtól függően jelenik meg itt-ott ContextAd RacingNet.GeneralBazar.Features.ContextAds.ContextAd Type Egy ContextAd, amely Google AdSense szerű megjelenéssel rendelkezik A Facets alapján dől el, hogy melyik felületen melyik jelenik meg.
1.6 CtrCounter A CtrCounter feladata valamennyi elem megjelenésének és kattintásainak a számlálása. Működés: A kattintásokat és a megjelenéseket egy raw táblába gyüjti, ahol ezek rendszeres időközönként feldoglozásra kerülnek. Egyik legfontosabb része az alábbi függvény, ebben van a statok generálásának üzleti logikája. ProcessLine RacingNet.GeneralBazar.Features.CtrCounter.CtrCounterEngine.ProcessLine Method Ez dolgoz fel egy CtrView-et. Jelenleg ez tartalmazza a statok készítéséhez szükséges valamennyi üzlet logikát. Az ezután generálandó statokat is ebbe kell tenni. Egyesével updatel, a jövőben lehet hogy kéne csinálni valami batch feldolgozást RacingNet.GeneralBazar.Features.CtrCounter.CtrView
1.7 KuponCode Hirdetésfeladás során kuponkódot lehet megadni, amelyért cserébe ajándék szolgáltatást kap.
A jelenlegi megvalósítás még erősen favágó: - kupon esetén a BAzarItem flag-et kap - a flagtól függően jelenik meg kiemelve - a kuponkódok be vannak égetve a forráskódba AdvertEdit_StoreAd RacingNet.GeneralBazar.Features.Plans.KuponManager.AdvertEdit_StoreAd Method AdvertEdit.StoreAd esetén fut le Ellenörzi a kuponkódot, eltárolja a memberhez, beállítja a BazarItem-nek a flag-et, berakja az instantTopKiemelésbe RacingNet.GeneralBazar.Entities.AdvertEditModel
SolrDocModel_setKuponKiemelesByBazarItem RacingNet.GeneralBazar.Features.Plans.KuponManager.SolrDocModel_setKuponKiemelesByBazarItem Method A flag-es kuponkiemelést hajtj végre Vagyis a flag alapján beállítja a lejárat dátumot Ez a SolrDocModel konstruktorából van meghívva RacingNet.GeneralBazar.Models.SolrDocModel, RacingNet.GeneralBazar.Entities.BazarItem
1.8 Recommendation Engine 1.8.1 Generátorok 1.8.1.1 UsedCars További Opel (Astra) használtautók (Debrecenben és környékén) Használtató kategóriából lista képekkel
1.8.1.2 Questions_Similars 1.8.1.3 Parts_Felni Hasonló felnik átmérő és lyukosztás alapján
1.8.1.4 MemberItems 1.8.1.5 FindLinks 1.9 Approving Ez a moderálást jelenti, amelynek során a hirdetéseket moderátorok ellenörzik, és szükség esetén törlik, áthelyezik, képeket törölni belőle, faceteket módosítanak, FaqFlag-okat adnak hozzá. A moderálás koncepciója, hogy minden hirdetéset több moderátornak ellenőrizni kell, és ha ezek megegyeznek, akkor végrehajtódnak, ellenkező esetben pedig kézzel kell őket ellenőrízni. InstantApply: egyes moderátoroknál be lehet állítani egy százalékos értéket, hogy ekkora eséllyel, azonnal érvényesül a moderálása. Ez csak azoknál a Group-oknál működik, ahol explicit módon engedélyezve van. A moderálásook hozzáadódnak a BazarItemhez ( Az ApprovingStatus5 objektumon keresztül), és ez kap egy státuszt: Unchecked: még nem történet moderálás InProgress: már történt moderálás, de még nem gyűlt össze elegendő Gathered: már összegyült elegendő DiffError: a moderálások között eltérések vannak, csekkolni kell őket
Applied: a moderálások megegyezőek, és végre lettek hajtva Skipped: a moderálások között volt skipped, emiatt nem lettek végrehjtva Ha összegyült egy itemhez elegendő mennyiségű moderálás (Gathered), akkor a service gondoskodik azoknak a végrehajtásáról, stb...
1.9.1 ApprovingStatus Az ApprovingStatus tartalmazza egy BazarItem approvel-olásának pillanatnyi állapotát (státusz, prioritás, ApprovingActionok, stb...) ApprovingStatus5 RacingNet.GeneralBazar.Features.Approving_v5.ApprovingStatus5 Type slotos moderálás, ez van eltárolva a BazarItem-hez. Tárolja: - Moderálás státusát - Elvégzett moderálások Ezt csak az ApprovingEngine5 piszkalja!
Ezt az objektumot CSAK az ApprovingAction_newForItem hozhatja létre. ApprovingStatus_newForItem RacingNet.GeneralBazar.Features.Approving.ApprovingEngine5.ApprovingStatus_newForItem Method Reseteli egy itemapproving statusat, tehat ujra kell approve-olni Uj hirdetsnel kel hasznalni, vagy hirdetes modositasnal RacingNet.GeneralBazar.Entities.BazarItem
1.9.2 ApprovingQuery A moderálandó hirdetéseket az ApprovingQuery objektumk leszármazottaival lehet lekérdezni: ApprovingQuery RacingNet.GeneralBazar.Features.Approving.ApprovingQuery Type Query-k őse Működés: 1, UI lekérdezi a megjeleníthető queryk listáját GetQueries függvénnyel 2, Kiválasztódik egy query 3, A kiválasztott Query-nek meghívódik a UIState_get, ez alapján inicializálódik a UI 4, User kattintgat a UI-on, majd megnyomja a Fill gombot 5, Ekkor meghívódik az Items_get függvény, paraméterként megkapja az aktuális UI állapotot 6, Amikor kijelőlödik egy BazarItem, a UI meghívja a Quert.Item_selected függvényt 7, Amikor a User befejezi az itemapproveolását (Approve, vagy Skip vagy Delete), a UI létrehozza az ApprovingAction függvényt, és meghívja vele az Engine.Approving_attach függvényt
Általános moderálás, diákmunkás által: AQ_Normal2 RacingNet.GeneralBazar.Features.Approving.AQ_Normal2 Type Masik alapertelmezett query, Elsosorban az InProressegeket listazza, egyebkent meg a magas prioritasukat Beleszamitja a group modositokat is max 50-et ad vissza
Eltérő moderálások összehasonlítása: AQ_DiffErrors RacingNet.GeneralBazar.Features.Approving.AQ_DiffErrors Type Moderatorok csekkolasahoz hasznalt query. A diffErrorokat listazza, minden csoportból max 10-et Mejeleniti az AActionDiffs panelt
Skippedek listázása: AQ_Skippeds RacingNet.GeneralBazar.Features.Approving.AQ_Skippeds
Type A Skipped-eket listázza ki
1.9.3 ApprovingAction, Attach, Apply A moderálás során létrjön az ApprovingAction objektum, amely a moderátor valamennyi módosítását tartalmazza. Az ApprovingAction önálló entitás, de BazarItemhez tartozik. A BazarItem tárolja az ApprovingAction-jainak egy egyszerűsített változatát (ApprovingActionLink) ApprovingAction RacingNet.GeneralBazar.Features.Approving.ApprovingAction Type Egy BazarItem-hez tartozó egy admin által elvégzett egy Approve-olást tartalmaz IMMUTABLE!! egszer összerakjuk, aztán ne változzon
Az ApprovingAction hozzáadódik a BazarItemhez, amely approving statusát az ApprovingStatus objektum tárolja: ApprovingStatus5 RacingNet.GeneralBazar.Features.Approving_v5.ApprovingStatus5 Type slotos moderálás, ez van eltárolva a BazarItem-hez. Tárolja: - Moderálás státusát - Elvégzett moderálások Ezt csak az ApprovingEngine5 piszkalja!
A BazarItemhez az ApprovingAction-t a BazarItemEngine.Attach függvény adja hozzá: Approving_attach RacingNet.GeneralBazar.Features.Approving.ApprovingEngine5.Approving_attach Method Ezt hívja meg a UI, mikor az admin approve-olt egy itemet A modositast rogton perzisztalja is Ez állítja be a Gathered státust is! System.Int64, RacingNet.GeneralBazar.Features.Approving.ApprovingAction
ApprovingStatus5 RacingNet.GeneralBazar.Features.Approving_v5.ApprovingStatus5 Type slotos moderálás, ez van eltárolva a BazarItem-hez. Tárolja: - Moderálás státusát - Elvégzett moderálások Ezt csak az ApprovingEngine5 piszkalja!
1.9.4 Service A Service által futtatott ApprovingFinisher task gondoskodik az a moderálás végrehajtásáról. ApproveFinisherTask RacingNet.GeneralBazar.Features.Approving.ApprovingEngine5.ApproveFinisherTask Method Osszegyujt amiket mar elegen approveoltak, csekkolja oket, es vagy Applizza, vagy DiffErrorozza System.String
A moderálás végül az Apply függvénnyel hajtódik végre ténylegesen Approving_apply RacingNet.GeneralBazar.Features.Approving.ApprovingEngine5.Approving_apply Method Sikeress diff vizsgalat eseten fut le, vegrehatja az approving-ban leveo valtoztatasokat RacingNet.GeneralBazar.Entities.BazarItem, RacingNet.GeneralBazar.Features.Approving.ApprovingAction
2 Üzemeltetés
2.1 Racing-bazar.hu: átállás kötőjel nélküli domain névre A GBApp.SiteWebConfig.BaseUrl használatáról folyamatosan átállunk a BaseNoKotojelUrl és a BaseKotojelCurrentUrl használatára. Amikor ez befejeződk, és a kötőjel nélküli alexa-indexe legalább akkor mint a kötőjelesé, akkor végrehajtjuk az átállást a WMT-ben. A List és Details oldalak kivételével a többi esetében törekszünk arra, hogy abszolút Url-t kapjanak, a kötőjel nélkülivel. Arra is törekszünk, hogy ha valakai a kötőjel nélküliről indít, akkor soha ne váltódjon át a kötőjelesre.
2.2 MassBazarItem A MassBazarItem azt jelenti, hogy egy hirdetőnek nagyon sok, nagyon hasonló hirdetése van, jellemzően a Massimportosok. Ekkor, hogy ezek a hirdetések ne spammeljék tele a hirdetési listákat, a következőket tesszük - List-Q: csoportosítunk memberenként, hogy minden membertől csak egy, a legrelevánsabb hirdetés jelenjen meg (ezt mindenképpen megteszük, nem csak MassBazarItem esetén) -
2.3 Egyedi hack-ek Ide kerülnek azok az egy-egy konrét cél érdekében belekerült hack-ek, beégetett kódok, amelyek valami miatt kilógnak a rendszerből
2.3.1 P-rendszám kiemelt hirdetések Ha a P-rendszámra keresnek, akkor több kiemelt találatot kell megjeleníteni mint máshol. Ezért a FindSControllerBase.CreateModel függvényben van egy beégetett vizsgálat az 539-es TW-re, amely esetben megnöveli a KiemeltItemsPerPage értékét
3 Core funkciók 3.1 BazarItem A BazarItem egy hirdetést reprezentál Létrehozás: a BazarItem.CreateNew() függvénnyel, CSAK. CreateNew RacingNet.GeneralBazar.Entities.BazarItem.CreateNew Method Létrehoz egy BazarItem-et. BazarItemCSAK így jöhet létre!
3.1.1 Hirdetés törlés (BazarItem delete) A hirdetés törlés logikai törlést jelent, vagyis a BazarItem.IsDeleted true lesz. Deleted V2: Az IsDeleted helyett egy új class van: BazarItem_DeleteStatus RacingNet.GeneralBazar.Entities.BazarItem_DeleteStatus Type Akkor van megadva, ha törölve van a hirdetése Információkat tartalmaz a törlés okáról, idejéről. stb... IMMUTABLE
Eszerint egy hirdetés pontosan akkor nincs törölve, ha a DeleteStatus.Kind=0, ill akkor van törölve, ha a DeleteStatus.Kind>0
A BazarItem.DeleteStatus megmondja, hogy miért, hogyan lett törölve. - Ha a felhasználó törölte, akkor tudja a Hirdetéskezelőben Repostolni - Ha a moderátor törölte, akkor nem lehet repostolni, viszont a hirdetéskezelőben megjelenik a törlés oka (ami egy FaqFlag)) - Ha spam hirdetés, akkor titkosan lett törölve, egyszerűen nem jelenik meg a hirdetéskezelőben a töröltek között A moderátornak törléskor meg kell adni egy indokot (FaqFlag) Ez lesz a törlés oka, ez fog eltárolódni a BazarItemFaqFlag-ban A törölt hirdetések nem tárolódnak el a SolR-ben Áttérés a DeletedStatus-ra: - Migrálni kell a meglévő itemeket, hogy rendelkezzenek DeleteStatus-al - Az IsDeleted és a DeletedAt helyett szépen át kell térni a DeleteStatus-ra Törölt hirdetések fizikai törlése (remove): todo!
3.1.2 Hirdetés eltávolítás (BazarItem Remove) Ez azt jelenti, hogy a logikailag törölt hirdetéseket eltávolítjuk az adatbázisból. MINDEN vele kapcsolatos sort eltávolítunk az összes kollekcióból!! CSAK ezekkel szabad: RemoveDeleteds RacingNet.GeneralBazar.Engines.BazarItemEngine.RemoveDeleteds Method Véglegesen töröljük a régi hirdetéseket. Azokat a hirdetéseket, amelyekre a ShowCount alapján még jönnek kattintások, csak 60 hónap után töröljük Csak a 40 napnál régebben törölt hirdetéseket remove-oljuk, mert: - PlanFeature-ok helyes kezelése - Massimport: ha kikerült az adatforrásból, majd visszakerült, akkor folytatólagosan jelenjenek meg System.String
RemoveItem RacingNet.GeneralBazar.Engines.BazarItemEngine.RemoveItem Method BazarItemvégleges eltávolítása - törli a képeket - törli az összes Db kollekcióból az ehhez tartozó sorokat - REMOVE op-ot tesz az OpQ-ba RacingNet.GeneralBazar.Entities.BazarItem, System.Boolean
3.2 Member Egy regisztrált tagot, vagyis egy hirdetőt reprezentál
3.2.1 Member törlés - Erase Member törlése során maga a member entitás megmarad, csak ennek a tényleges mezői törlődnek ki. EraseMember RacingNet.GeneralBazar.Engines.MemberEngine.EraseMember Method Kitörli a membert: meghagyja a member entitást, de kitörli az adatait (név, email, stb..) - törli a hirdetéseit System.Int64
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 AuthManualLink: 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
5 Controllerek 5.1 FindS - Hirdetések listája Find, illetve FindS néven is használva van, mert korábban meg volt különböztetve a listázásás és a keresés A listázás teljes egészében a SolR-en alapul Funkciók: - jelzi, ha nincs új hirdetés (mondjuk a service megállása miatt) (checkHirdetesDatumok)
5.1.1 GroupingQ, GroupingMassitems A listában csoportosítás történik, hogy egy hirdető ne spammelhesse tele a listát GroupingQ: keresés esetében mindenkit groupolunk, kivéve akinek a Memberje rendelkezik a GroupFoundsOff flaggal (mondjuk 5-öt jelenítünk meg memberenként) GroupingMassitems: ha nincs GroupingQ, akkor is is groupolunk: azokat a hirdetéseket, amelyek rendelkeznek a GroupMassItem flag-al. (Mondjuk 1-et jelenítünk meg member-enként) SolR field: gr_msi Nincs GroupingMassitems, ha: - a fő-listában vagyunk - éppen Member-re szűrünk
5.1.2 Helper függvények isMainList RacingNet.GeneralBazar.Controllers.FindSControllerBase.isMainList Method Megállapítja, hogy a kezdőoldalon vagyunk-e, vagyis a teljes, szűrés nélküli listát látjuk0e RacingNet.GeneralBazar.Models.FoundsSModel checkHirdetesDatumok RacingNet.GeneralBazar.Controllers.FindSControllerBase.checkHirdetesDatumok Method Ha a főoldalon a legfrissebb hirdetés is régebbi bizonyos időpontnál. hibát logol RacingNet.GeneralBazar.Models.FoundsSModel
5.2 Details3 Details oldal belépési pontja: ShowPage RacingNet.GeneralBazar.Controllers.Details3_ControllerBase.ShowPage Method Megjeleniti az egesz details oldalt, kezeli a deleted... eseteket, stb.. System.String, System.Boolean
3 féle DisplayMode van jelenleg: Details, Deleted, Redirect. FlatTitle alapján megkeressük a hirdetést. - Ha megtaláltuk és nem törölt: Details - Ha megtaláltuk és törölt: Deleted - Ha fizikailag törölt: Redirect Details3Model RacingNet.GeneralBazar.Controllers.Details3Model Type Details képernyő modelje. Ez tartalmazza a Details, és a Deleted képernyő modelleket is.
A Details3 model cache-ből jön (ShowModel). Ha nincs benne, akkor legeneráljuk. A UI Lite módban generálja, aztán a Service revalidálja, ekkor kerülnek be a drágább műveletet igénylő dolgok (pl.: RecommendationList, PartnerBanner). Create függvények: createBacklinksModel RacingNet.GeneralBazar.Controllers.Details3_ModelCreators.createBacklinksModel Method Backlinkek összegyűjtése RacingNet.GeneralBazar.Entities.BazarItem, System.Int32, System.Boolean createMemberInfo RacingNet.GeneralBazar.Controllers.Details3_ModelCreators.createMemberInfo Method A details oldalon megjelenő Member információkat generálja. Nicknév, reg. időpont, Trust.. RacingNet.GeneralBazar.Entities.Member createRecommendationLists RacingNet.GeneralBazar.Controllers.Details3_ModelCreators.createRecommendationLists Method Használandó recommendation listák meghatározása, és azok legenerálása RacingNet.GeneralBazar.Controllers.Details3Model, RacingNet.GeneralBazar.Entities.BazarItem createShippingBoxModel RacingNet.GeneralBazar.Controllers.Details3_ModelCreators.createShippingBoxModel Method Szállítási adatok generálása RacingNet.GeneralBazar.Entities.BazarItem, System.Collections.Generic.List{RacingNet.GeneralBazar.Entities.MemberPlace}
createSLinks RacingNet.GeneralBazar.Controllers.Details3_ModelCreators.createSLinks Method SEO linkeket generál facetek alapján. Egyelőre csak gumifelni kategóriában. RacingNet.GeneralBazar.Entities.BazarItem
5.2.1 DetailsPager Ha egy listában egy hirdetésre kattintunk, akkor végiglapozhatjuk a listában szereplő hirdetéseket. Ezeket a hirdetéseket Local Storage-ban tároljuk és folyamatosan bővítjük. Solr esetén a "start" paramétert növeljük, Mongo esetén a "skip" paramétert. A lista azonosítása refferrer alapján történik. 1. DetailsPager Modelbe DetailsPager RacingNet.GeneralBazar.Infrastructure.DetailsPager Type A Details oldali lapozóhoz tartozó dolgok vannak benne. Az Items-ben tároljuk az aktuális szűrésnek megfelelő itemeket. A QueryUrl-ben a Solr Query van. A QueryMongo_string, QueryMongo_skip, QueryMongo_limit és QueryMongo_sortBy-ban tároljuk a Mongo Queryt. ToJson() függvény JSON-á alakítja és átadjuk a JS-nek, az pedig eltárolja Local Storage-ben. GetAppendItems() lekéri a következő oldal Itemjeit.
2. JS függvény: new DetailsPagerCollection().processList(@Html.Raw(Model.DetailsPager)); Url alapján tudjuk azonosítani 3. JS: GetLastByReferrer: refferrer-hez tartozó legutolsó lapozó objektum 4. lapozáskor ezeken az Itemeken megyünk végig 5. ha az utolsóhoz érünk, akkor a JS: appendItems() lekéri a következő Itemeket DetailsPagerGetByQuery RacingNet.GeneralBazar.Controllers.SiteControllerBase.DetailsPagerGetByQuery Method DetailsPager-hez Itemekt próbál lekérdezni Mongo Queryvel System.String, System.Int32, System.Int32, System.String DetailsPagerGetByUrl RacingNet.GeneralBazar.Controllers.SiteControllerBase.DetailsPagerGetByUrl Method DetailsPager-hez Itemekt próbál lekérdezni Solr Queryvel System.String
5.2.2 Sublayout Célja: különböző méretű képernyőkön a lehető legtöbb helyet kihasználjuk. Minden Sublayoutot nevesíteni kell! A RenderingFeedback kliens minden hirdetést különböző szélességekben megvizsgál és kiszámolja a szükséges méreteket. Ezek alapján a determineSublayout() meghatározz a Sublayoutot. determineSublayout RacingNet.GeneralBazar.Controllers.Details3_ModelCreators.determineSublayout Method Meghatározza a layout-ot Meghatározza a sublayout-ot. RacingNet.GeneralBazar.Controllers.Details3Model, RacingNet.GeneralBazar.Entities.BazarItem
Amikor beállítjuk a Sublayoutot, akkor a megfelelő Flageket hozzáadjuk a BazarItem-hez, hogy WebAdminon tudjunk rá szűrni. determineSublayout_syncFlags RacingNet.GeneralBazar.Controllers.Details3_ModelCreators.determineSublayout_syncFlags Method A meghatározott Sublayouthoz tartozó BazarItemflag-ek szinkronizálására való. Ezek a flagek azért kellenek, hogy WebAdminban tudjunk szűrni a Sublayouttal rendelkező Itemekre. RacingNet.GeneralBazar.Entities.BazarItem, System.Collections.Generic.List{RacingNet.GeneralBazar.Entities.BazarItemFlag}
5.2.3 RecommendationLists Célja: ajnálási listák létrehozása szavak, facetek, tagwordok és town alapján. Ezek lehetnek drága műveletek, mert a Service generálja ezeket. createRecommendationLists RacingNet.GeneralBazar.Controllers.Details3_ModelCreators.createRecommendationLists Method Használandó recommendation listák meghatározása, és azok legenerálása RacingNet.GeneralBazar.Controllers.Details3Model, RacingNet.GeneralBazar.Entities.BazarItem
Amikor generáljuk a RecommendationListeket, akkor a megfelelő Flageket hozzáadjuk a BazarItem-hez, hogy WebAdminon tudjunk rá szűrni. createRecommendationLists_syncFlags RacingNet.GeneralBazar.Controllers.Details3_ModelCreators.createRecommendationLists_syncFlags Method A Recommendation listekhez tartozó BazarItemflageket szinkronizálja. Ezek a flagek azért kellenek, hogy WebAdminban tudjunk szűrni a Recommendation listával rendelkező Itemekre. RacingNet.GeneralBazar.Entities.BazarItem, System.Collections.Generic.List{RacingNet.GeneralBazar.Entities.BazarItemFlag}
Jelenleg ilyen listákat generálunk: RecGr_FindLinks RacingNet.GeneralBazar.Features.RecommendationEngine.RecGr_FindLinks Type Ilyeneket generál: Opel Astra lengőkar, Ferrari futóműalkatrészek RecGr_MemberItems RacingNet.GeneralBazar.Features.RecommendationEngine.RecGr_MemberItems Type Member néhány további hirdetését listázza Ha lehet, egyezzen a Manufacturer, Typ, kategória RecGr_Parts_Felni RacingNet.GeneralBazar.Features.RecommendationEngine.RecGr_Parts_Felni Type További (15"-ös), (4x100-as) felni Debrecen és környékén További (15"-ös), (4x100-as) felni vagy semmi (ha nincs megadva, akkor ne tegye bele) RecGr_Parts_Manuf RacingNet.GeneralBazar.Features.RecommendationEngine.RecGr_Parts_Manuf Type Ilyeneket generál: Opel alkatrészek Opel alkatrészek Debrecenben és környékén RecGr_Parts_ManufType RacingNet.GeneralBazar.Features.RecommendationEngine.RecGr_Parts_ManufType Type Ilyeneket generál: Opel Astra alkatrészek Opel Astra alkatrészek Debrecenben és környékén RecGr_Questions_ServiceVideos RacingNet.GeneralBazar.Features.RecommendationEngine.RecGr_Questions_ServiceVideos Type Opel Astra szervízvideók vagy Opel szervízvideók vagy semmi (Jókérdés szervízvideo flag alapján) RecGr_Questions_Similars RacingNet.GeneralBazar.Features.RecommendationEngine.RecGr_Questions_Similars Type Hasonló kérdések (facet-similar), lista RecGr_UsedCars RacingNet.GeneralBazar.Features.RecommendationEngine.RecGr_UsedCars Type
További Opel (Astra) használtautók (Debrecenben és környékén) (lista képekkel) Márka, típus, település, ha van legalább 3 egyébként Márka, típus, ha van legalább 3 egyébként semmi
6 SEO SEO elemek felsorolva képernyőnként
6.1 FindS - Lista képernyő 6.1.1 Page SEO 6.1.2 Content linkek Streetview lista link: - ha filterezve van autómárkára, akkor a HeadLink-ek között megjelenik link a Streetview listára, az adott gyártóra filterezve. A link FacetTexteres createModel_renderStreetviewCarLinks RacingNet.GeneralBazar.Controllers.FindSControllerBase.createModel_renderStreetviewCarLinks Method Amennyiben van autógyártó megadva, legenerál egy seo linket a Streetview fele RacingNet.GeneralBazar.Models.FoundsSModel FindsHeaderSEOLink RacingNet.GeneralBazar.Features.Streetview.StreetviewCarEngine.FindsHeaderSEOLink Method Visszatér egy komplett A tag-gel, ha tud (vagyis ha van autótípus megadva), egyébként üres stringgel RacingNet.GeneralBazar.Features.Faceting.FacetOption FacetTexter_FindsHeadlinkStreetviewAjanlo RacingNet.GeneralBazar.Features.Streetview.StreetviewCarEngine.FacetTexter_FindsHeadlinkStreetviewAjanlo Field FindS headlink-be ajánlü
6.2 Streetview lista 6.2.1 Page SEO Title, Desc képzés a filter facetek alapján, FacetTexter-ekkel. Ezek meg is jelennek h1, h2 elemként FacetTexter_StreetviewListTitle RacingNet.GeneralBazar.Features.Streetview.StreetviewCarEngine.FacetTexter_StreetviewListTitle Field Streetview list title-jét generálja le
6.2.2 Content linkek Link saját magára: az itemeknél a facet-értékek kattintható linkek, amelyek a streetview-lista szűrésre ugranak
7 Design
7.1 Általános Sections TitleSection: a head-ban jelenik meg HeadSection: alul, a body tag előtt jelenik meg JSHandler működés - Az alkalmazásban használt összes létező JS-t 2-3 kupacba gyüjti, amelyből mindegyikből van nyelvesített verzió. Ezek fájlneve CRC kód alapján képződik, biztosítva a megfelelő HTTP cache-elést App init-ben összegyűjtjük a szükséges script-eket nevesíttett “bundle”-kba - Ez az összegyüjtés lehet URL-ből betöltés, file-ból betöltés, explicit módon megadás, dll-kből begyüjtés, view-kból begyüjtés - Az összegyüjtött script-eket lefordítjük, eltároljuk a minden megadott nyelvhez Két fajta script van, a Normál, és a Deferred. Lehetőleg mindent a Deferred-be kell tenni, Normal-ba csak az menjen, ami nagyon muszáj. A JSHandler begyűjti a dll-ekből az erőforrás JS scripteket: mindent, ami .rn.js-re végződik. Ha valamit mégsem kell begyüjteni, akkor azt meg lehet adni az Excluded listában. Begyüjti a View könyvtárakból is a scripteket. Ezek lehetőleg JS function-ok legyenek, amelyekt a view meg tud hívni a ScriptSection segíségével. A beolvasott JS fájlok elején az alábbi paraméterek adhatóak meg: Deferred legyen: //JSHandler.load=deferred Sorrend meghatározása: //JSHandler.priority=99999 JS scriptek
8 Performance 8.1 Caching 8.1.1 HTTP Cache header Minden oldalnak be lehet (és be kell!) állítani a http cache headert a CommonModel attribútum CacheControlHeaderKind paramétere segítségével PublicMaxage600: - expires 10 perc múlva - max age 10 perc