Skip to content

Commit

Permalink
feat: add aggregator
Browse files Browse the repository at this point in the history
  • Loading branch information
omarsy authored and Villaquiranm committed Aug 18, 2024
1 parent 7378d05 commit 296d1f5
Show file tree
Hide file tree
Showing 4 changed files with 105 additions and 42 deletions.
41 changes: 39 additions & 2 deletions examples/gno.land/p/demo/teritori/worx/worxs.gno
Original file line number Diff line number Diff line change
@@ -1,13 +1,50 @@
package worx

import (
"gno.land/p/demo/avl"
"gno.land/p/demo/ufmt"
)

type WorxKeeper struct {
worxs []*Worx
}

const dayToSeconds = 1

func NewWorxKeeper() *WorxKeeper {
return &WorxKeeper{
worxs: avl.NewTree(),
}
}

func (keeper *WorxKeeper) Store(worx *Worx) {
keeper.worxs = append(keeper.worxs, worx)
}

func (keeper *WorxKeeper) Get() []*Worx {
return keeper.worxs
}
totalWorx := make([]*Worx, 0)
keeper.worxs.Iterate("", "", func(key string, value interface{}) bool {
worxByDay := value.([]*Worx)
totalWorx = append(totalWorx, worxByDay...)
return false
})

return totalWorx
}

func (keeper *WorxKeeper) GetFromDate(date int64) []*Worx {
start := ufmt.Sprintf("%d", date)
totalWorx := make([]*Worx, 0)
keeper.worxs.Iterate(start, "", func(key string, value interface{}) bool {
// here we account for string comparation "95" > "105" because comparing first character 9 > 1 (Comparation of lenght)
// and simply comparing same lenght string 25 > 12 this in order to stop tree for iterating over lower dates leaves
if len(start) > len(key) || start > key {
return true
}
worxByDay := value.([]*Worx)
totalWorx = append(totalWorx, worxByDay...)
return false
})

return totalWorx
}
17 changes: 17 additions & 0 deletions examples/gno.land/r/demo/teritori/worx_aggregator/aggregator.gno
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package worx_aggregator

import (
"std"

"gno.land/p/demo/teritori/worx"
)

func GetWorx(addr std.Address) []*worx.Worx {
keeper := getKeeper(addr)
return keeper.Get()
}

func GetWorxFromDate(addr std.Address, date int64) []*worx.Worx {
keeper := getKeeper(addr)
return keeper.GetFromDate(date)
}
5 changes: 5 additions & 0 deletions examples/gno.land/r/demo/teritori/worx_aggregator/gno.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module gno.land/r/demo/teritori/worx_aggregator

require (
gno.land/p/demo/teritori/worx v0.0.0-latest
)
84 changes: 44 additions & 40 deletions examples/gno.land/r/demo/teritori/worx_aggregator/worx.gno
Original file line number Diff line number Diff line change
@@ -1,54 +1,58 @@
package worx_aggregator

import(
import (
"std"

"gno.land/p/demo/avl"
"gno.land/p/demo/teritori/worx"
"std"
"gno.land/p/demo/teritori/worx"
)

var (
admin std.Address
registeredProviders avl.Tree
worxByAddress avl.Tree
)
var admin std.Address
var registeredProviders avl.Tree
var worxByAddress avl.Tree

func Push(hours int, metadata string, addr std.Address, points int, timestamp int64) {
prevRealm := std.PrevRealm().Addr()
dataProviders, ok := registeredProviders.Get(string(prevRealm))
if !ok {
panic("caller realm is not registered as provider")
}
keeper := getKeeper(addr)
keeper.Store(worx.NewWorx(hours, metadata, addr, points, timestamp))
worxByAddress.Set(string(addr), keeper)

std.Emit("worx_added",
"addr",string(addr),
"metadata", metadata,
)
}
assertRegistered(addr)

func getKeeper(addr std.Address) *worx.WorxKeeper{
data, ok := worxByAddress.Get(string(addr))
if ok {
return data.(*worx.WorxKeeper)
}
return &worx.WorxKeeper{}
}
keeper := getKeeper(addr)
keeper.Store(worx.NewWorx(hours, metadata, addr, points, timestamp))
worxByAddress.Set(string(addr), keeper)

func Get(dataType string, addr std.Address) []*worx.Worx {
return getKeeper(addr).Get()
std.Emit("worx_added",
"addr", string(addr),
"metadata", metadata,
)
}

func getKeeper(addr std.Address) *worx.WorxKeeper {
data, ok := worxByAddress.Get(string(addr))
if ok {
return data.(*worx.WorxKeeper)
}
return &worx.WorxKeeper{}
}

func RegisterDataProvider(addr std.Address) {
assertAdmin()
_, ok :=registeredProviders.Get(string(addr))
if !ok {
panic("Data provider already registered")
}
registeredProviders.Set(string(addr), 0)
assertAdmin()
_, ok := registeredProviders.Get(string(addr))
if !ok {
panic("Data provider already registered")
}
registeredProviders.Set(string(addr), 0)
}

func assertRegistered(addr std.Address) {
prevRealm := std.PrevRealm().Addr()
dataProviders, ok := registeredProviders.Get(string(prevRealm))
if !ok {
panic("caller realm is not registered as provider")
}
}

func assertAdmin(){
if (std.PrevRealm().Addr() != admin) {
panic("unathorized")
}
}
func assertAdmin() {
if std.PrevRealm().Addr() != admin {
panic("unathorized")
}
}

0 comments on commit 296d1f5

Please sign in to comment.