Advertisement
Guest User

Untitled

a guest
Feb 21st, 2020
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 3.15 KB | None | 0 0
  1. package players
  2.  
  3. import (
  4.     "fmt"
  5.     "github.com/minus5/marketing/internal/bonus"
  6.     "github.com/minus5/marketing/pkg/bonus/service/api"
  7.     "sync"
  8. )
  9.  
  10. type Repo interface {
  11.     PlayerByGuid(playerId string) (*api.Player, error)
  12.     PlayersByNickname(nickname string) ([]*api.Player, error)
  13.     ActivePlayerWithNickname(nickname string) (*api.Player, error)
  14.     PlayerUpsert(player *api.Player) error
  15. }
  16.  
  17. var repo Repo
  18. var indexGuid = make(map[string]*api.Player)
  19. var lock = sync.RWMutex{}
  20.  
  21. func UseRepo(r Repo) {
  22.     repo = r
  23. }
  24.  
  25. func Execute(e *bonus.Event) error {
  26.     i := e.Igrac
  27.     if i == nil {
  28.         return nil
  29.     }
  30.     // igraca imamo u cacheu
  31.     if inCache, changedData := playerFromCache(i); inCache {
  32.         if changedData {
  33.             upsertPlayer(i)
  34.         }
  35.         return nil
  36.     }
  37.     // provjeri imamo li igraca u mongu
  38.     p, err := repo.PlayerByGuid(i.Id)
  39.     if err != nil {
  40.         return err
  41.     }
  42.     // nema igraca u mongu, azuriraj indexe i insertaj dokument u mongo
  43.     if p == nil {
  44.         upsertPlayer(i)
  45.         return nil
  46.     }
  47.     // postoji u mongu, ako su mu se promijenili podatci azuriraj indexe i dokument u mongu
  48.     if !playerChanged(p, i) {
  49.         return nil
  50.     }
  51.     upsertPlayer(i)
  52.     return nil
  53. }
  54.  
  55. func playerFromCache(i *bonus.Igrac) (inCache bool, changedData bool) { // dohvati igraca iz cachea i ako postoji provjeri jesu li isti podatci
  56.     lock.RLock()
  57.     defer lock.RUnlock()
  58.     player, ok := indexGuid[i.Id]
  59.     inCache = false
  60.     changedData = false
  61.     if !ok {
  62.         return
  63.     }
  64.     inCache = true
  65.     if !playerChanged(player, i) {
  66.         return
  67.     }
  68.     changedData = true
  69.     return
  70. }
  71.  
  72. func upsertPlayer(i *bonus.Igrac) {
  73.     lock.Lock()
  74.     defer lock.Unlock()
  75.     player := &api.Player{
  76.         PlayerId: i.Id,
  77.         Nickname: i.Nickname,
  78.         Oib:      i.Oib,
  79.         Tester:   i.Tester,
  80.         State:    i.State,
  81.     }
  82.     indexGuid[i.Id] = player
  83.     repo.PlayerUpsert(player)
  84. }
  85.  
  86. func playerChanged(igrac *api.Player, i *bonus.Igrac) bool {
  87.     return igrac.Nickname == i.Nickname && igrac.Tester == i.Tester && igrac.Oib == i.Oib && igrac.State == i.State
  88. }
  89.  
  90. func GetById(playerId string) (*api.Player, error) {
  91.     lock.Lock()
  92.     defer lock.Unlock()
  93.     if playerId == "" {
  94.         return nil, fmt.Errorf("player id is empty")
  95.     }
  96.     if player, ok := indexGuid[playerId]; ok { // imamo li igraca u cacheu?
  97.         return player, nil
  98.     }
  99.     player, err := repo.PlayerByGuid(playerId)
  100.     if err != nil {
  101.         return nil, err
  102.     }
  103.     if player == nil {
  104.         return nil, api.ErrUnknownPlayer
  105.     }
  106.     indexGuid[player.PlayerId] = player
  107.     return player, nil
  108. }
  109.  
  110. func GetPlayersByNickname(nickname string) ([]*api.Player, error) {
  111.     if nickname == "" {
  112.         return nil, fmt.Errorf("nickname is empty")
  113.     }
  114.     players, err := repo.PlayersByNickname(nickname)
  115.     if err != nil {
  116.         return nil, err
  117.     }
  118.     return players, nil
  119. }
  120.  
  121. func GetActivePlayerWithNickname(nickname string) (*api.Player, error) {
  122.     if nickname == "" {
  123.         return nil, fmt.Errorf("nickname is empty")
  124.     }
  125.     player, err := repo.ActivePlayerWithNickname(nickname)
  126.     if err != nil {
  127.         return nil, err
  128.     }
  129.     return player, nil
  130. }
  131.  
  132. func IsTester(playerId string) (bool, error) {
  133.     player, err := GetById(playerId)
  134.     if err != nil {
  135.         return false, err
  136.     }
  137.     if player == nil {
  138.         return false, api.ErrUnknownPlayer
  139.     }
  140.     return player.Tester, nil
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement