Skip to content

Commit

Permalink
feat: Hasura permissions and actions improvements (#54)
Browse files Browse the repository at this point in the history
* build(deps): bump github.com/spf13/cobra from 1.6.0 to 1.6.1 (forbole#488)

Bumps [github.com/spf13/cobra](https://github.com/spf13/cobra) from 1.6.0 to 1.6.1.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a href="https://github.com/spf13/cobra/releases">github.com/spf13/cobra's releases</a>.</em></p>
<blockquote>
<h2>v1.6.1</h2>
<h3>Bug fixes 🐛</h3>
<ul>
<li>Fixes a panic when <code>AddGroup</code> isn't called before <code>AddCommand(my-sub-command)</code> is executed. This can happen within more complex cobra file structures that have many different <code>init</code>s to be executed. Now, the check for groups has been moved to <code>ExecuteC</code> and provides more flexibility when working with grouped commands - <a href="https://github.com/marckhouzam"><code>@​marckhouzam</code></a> (and shout out to <a href="https://github.com/aawsome"><code>@​aawsome</code></a>, <a href="https://github.com/andig"><code>@​andig</code></a> and <a href="https://github.com/KINGSABRI"><code>@​KINGSABRI</code></a> for a deep investigation into this! 👏🏼)</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/spf13/cobra/commit/b43be995ebb4bee335a787bd44498b91aef7619c"><code>b43be99</code></a> Check for group presence after full initialization (<a href="https://github-redirect.dependabot.com/spf13/cobra/issues/1839">#1839</a>) (<a href="https://github-redirect.dependabot.com/spf13/cobra/issues/1841">#1841</a>)</li>
<li>See full diff in <a href="https://github.com/spf13/cobra/compare/v1.6.0...v1.6.1">compare view</a></li>
</ul>
</details>
<br />

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=github.com/spf13/cobra&package-manager=go_modules&previous-version=1.6.0&new-version=1.6.1)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

</details>

* fix: improve Hasura permissions (forbole#473)

Closes: #XXXX

---

*All items are required. Please add a note to the item if the item is not applicable and
please add links to any relevant follow up issues.*

I have...

- [ ] included the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title
- [ ] added `!` to the type prefix if API or client breaking change
- [ ] targeted the correct branch
- [ ] provided a link to the relevant issue or specification
- [ ] added a changelog entry to `CHANGELOG.md`
- [ ] included comments for [documenting Go code](https://blog.golang.org/godoc)
- [ ] updated the relevant documentation or specification
- [ ] reviewed "Files changed" and left comments if necessary
- [ ] confirmed all CI checks have passed

*All items are required. Please add a note if the item is not applicable and please add
your handle next to the items reviewed if you only reviewed selected items.*

I have...

- [ ] confirmed the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title
- [ ] confirmed `!` in the type prefix if API or client breaking change
- [ ] confirmed all author checklist items have been addressed
- [ ] reviewed API design and naming
- [ ] reviewed documentation is accurate
- [ ] reviewed tests and test coverage
- [ ] manually tested (if applicable)

* feat: remove block height foreign key from propoval vote and deposit, add timestamp column (forbole#489)

block height foreign key on `proposal_vote` and `proposal_deposit` tables is getting `parse genesis-file` errors because the block table could be empty at the time of parsing genesis. It results in the error like `pq: insert or update on table "proposal_deposit" violates foreign key constraint "proposal_deposit_height_fkey"`

Add `timestamp` column so frontend can access this data.

---

*All items are required. Please add a note to the item if the item is not applicable and
please add links to any relevant follow up issues.*

I have...

- [x] included the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title
- [ ] added `!` to the type prefix if API or client breaking change
- [x] targeted the correct branch
- [ ] provided a link to the relevant issue or specification
- [x] added a changelog entry to `CHANGELOG.md`
- [ ] included comments for [documenting Go code](https://blog.golang.org/godoc)
- [ ] updated the relevant documentation or specification
- [x] reviewed "Files changed" and left comments if necessary
- [x] confirmed all CI checks have passed

*All items are required. Please add a note if the item is not applicable and please add
your handle next to the items reviewed if you only reviewed selected items.*

I have...

- [ ] confirmed the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title
- [ ] confirmed `!` in the type prefix if API or client breaking change
- [ ] confirmed all author checklist items have been addressed
- [ ] reviewed API design and naming
- [ ] reviewed documentation is accurate
- [ ] reviewed tests and test coverage
- [ ] manually tested (if applicable)

* feat: add host address to hasura actions (forbole#491)

Fixes forbole#490

---

*All items are required. Please add a note to the item if the item is not applicable and
please add links to any relevant follow up issues.*

I have...

- [x] included the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title
- [ ] added `!` to the type prefix if API or client breaking change
- [x] targeted the correct branch
- [x] provided a link to the relevant issue or specification
- [x] added a changelog entry to `CHANGELOG.md`
- [ ] included comments for [documenting Go code](https://blog.golang.org/godoc)
- [ ] updated the relevant documentation or specification
- [x] reviewed "Files changed" and left comments if necessary
- [x] confirmed all CI checks have passed

*All items are required. Please add a note if the item is not applicable and please add
your handle next to the items reviewed if you only reviewed selected items.*

I have...

- [ ] confirmed the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title
- [ ] confirmed `!` in the type prefix if API or client breaking change
- [ ] confirmed all author checklist items have been addressed
- [ ] reviewed API design and naming
- [ ] reviewed documentation is accurate
- [ ] reviewed tests and test coverage
- [ ] manually tested (if applicable)

* Fix merge conflicts

* fix: Linting

* Switch struct order in gov database types

* Switch Config struct

* Update gov.go

* Update .golangci.yaml

* Sync linter with upstream

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Magic Cat <37407870+MonikaCat@users.noreply.github.com>
Co-authored-by: Aaron <76254323+huichiaotsou@users.noreply.github.com>
Co-authored-by: jay-dee7 <jasdeepsingh.uppal@gmail.com>
  • Loading branch information
5 people committed Nov 1, 2022
1 parent f3d9c70 commit d8c5440
Show file tree
Hide file tree
Showing 55 changed files with 211 additions and 165 deletions.
22 changes: 12 additions & 10 deletions .github/linters/.golangci.yaml
Original file line number Diff line number Diff line change
@@ -1,27 +1,29 @@
run:
tests: false
# # timeout for analysis, e.g. 30s, 5m, default is 1m
timeout: 10m
timeout: 5m

linters:
disable-all: true
enable:
- bodyclose
- unused
- deadcode
- depguard
- dogsled
- gocritic
- gofmt
- goimports
- revive
- golint
- gosec
- gosimple
- govet
- ineffassign
- maligned
- misspell
- nakedret
- exportloopref
- scopelint
- staticcheck
- structcheck
- stylecheck
- typecheck
- unconvert
Expand All @@ -37,10 +39,10 @@ issues:
- gosec
- text: "comment on exported var"
linters:
- revive
- golint
- text: "don't use an underscore in package name"
linters:
- revive
- golint
- text: "ST1003:"
linters:
- stylecheck
Expand All @@ -55,14 +57,14 @@ issues:
linters-settings:
dogsled:
max-blank-identifiers: 3
maligned:
# print struct with more effective memory layout or not, false by default
suggest-new: true
nolintlint:
allow-unused: false
allow-leading-space: true
require-explanation: false
require-specific: false
require-specific: false
misspell:
ignore-words:
- cheqd
govet:
enable:
- fieldalignment
2 changes: 1 addition & 1 deletion cmd/migrate/v3/migrate.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ func migrateConfig() (Config, error) {
}

if cfg.Actions == nil {
cfg.Actions = actions.NewConfig(3000, nil)
cfg.Actions = actions.NewConfig("127.0.0.1", 3000, nil)
}

return cfg, nil
Expand Down
15 changes: 9 additions & 6 deletions database/gov.go
Original file line number Diff line number Diff line change
Expand Up @@ -247,22 +247,24 @@ func (db *Db) SaveDeposits(deposits []types.Deposit) error {
return nil
}

query := `INSERT INTO proposal_deposit (proposal_id, depositor_address, amount, height) VALUES `
query := `INSERT INTO proposal_deposit (proposal_id, depositor_address, amount, timestamp, height) VALUES `
var param []interface{}

for i, deposit := range deposits {
vi := i * 4
query += fmt.Sprintf("($%d,$%d,$%d,$%d),", vi+1, vi+2, vi+3, vi+4)
vi := i * 5
query += fmt.Sprintf("($%d,$%d,$%d,$%d,$%d),", vi+1, vi+2, vi+3, vi+4, vi+5)
param = append(param, deposit.ProposalID,
deposit.Depositor,
pq.Array(dbtypes.NewDbCoins(deposit.Amount)),
deposit.Timestamp,
deposit.Height,
)
}
query = query[:len(query)-1] // Remove trailing ","
query += `
ON CONFLICT ON CONSTRAINT unique_deposit DO UPDATE
SET amount = excluded.amount,
timestamp = excluded.timestamp,
height = excluded.height
WHERE proposal_deposit.height <= excluded.height`
_, err := db.Sql.Exec(query, param...)
Expand All @@ -278,10 +280,11 @@ WHERE proposal_deposit.height <= excluded.height`
// SaveVote allows to save for the given height and the message vote
func (db *Db) SaveVote(vote types.Vote) error {
query := `
INSERT INTO proposal_vote (proposal_id, voter_address, option, height)
VALUES ($1, $2, $3, $4)
INSERT INTO proposal_vote (proposal_id, voter_address, option, timestamp, height)
VALUES ($1, $2, $3, $4, $5)
ON CONFLICT ON CONSTRAINT unique_vote DO UPDATE
SET option = excluded.option,
timestamp = excluded.timestamp,
height = excluded.height
WHERE proposal_vote.height <= excluded.height`

Expand All @@ -291,7 +294,7 @@ WHERE proposal_vote.height <= excluded.height`
return fmt.Errorf("error while storing voter account: %s", err)
}

_, err = db.Sql.Exec(query, vote.ProposalID, vote.Voter, vote.Option.String(), vote.Height)
_, err = db.Sql.Exec(query, vote.ProposalID, vote.Voter, vote.Option.String(), vote.Timestamp, vote.Height)
if err != nil {
return fmt.Errorf("error while storing vote: %s", err)
}
Expand Down
44 changes: 25 additions & 19 deletions database/gov_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -348,19 +348,23 @@ func (suite *DbTestSuite) TestBigDipperDb_SaveDeposits() {
depositor3 := suite.getAccount("cosmos1gyds87lg3m52hex9yqta2mtwzw89pfukx3jl7g")
amount3 := sdk.NewCoins(sdk.NewCoin("desmos", sdk.NewInt(50000)))

timestamp1 := time.Date(2020, 1, 1, 15, 00, 00, 000, time.UTC)
timestamp2 := time.Date(2020, 1, 1, 16, 00, 00, 000, time.UTC)
timestamp3 := time.Date(2020, 1, 1, 17, 00, 00, 000, time.UTC)

deposit := []types.Deposit{
types.NewDeposit(proposal.ProposalID, depositor.String(), amount, 10),
types.NewDeposit(proposal.ProposalID, depositor2.String(), amount2, 10),
types.NewDeposit(proposal.ProposalID, depositor3.String(), amount3, 10),
types.NewDeposit(proposal.ProposalID, depositor.String(), amount, timestamp1, 10),
types.NewDeposit(proposal.ProposalID, depositor2.String(), amount2, timestamp2, 10),
types.NewDeposit(proposal.ProposalID, depositor3.String(), amount3, timestamp3, 10),
}

err := suite.database.SaveDeposits(deposit)
suite.Require().NoError(err)

expected := []dbtypes.DepositRow{
dbtypes.NewDepositRow(1, depositor.String(), dbtypes.NewDbCoins(amount), 10),
dbtypes.NewDepositRow(1, depositor2.String(), dbtypes.NewDbCoins(amount2), 10),
dbtypes.NewDepositRow(1, depositor3.String(), dbtypes.NewDbCoins(amount3), 10),
dbtypes.NewDepositRow(1, depositor.String(), dbtypes.NewDbCoins(amount), timestamp1, 10),
dbtypes.NewDepositRow(1, depositor2.String(), dbtypes.NewDbCoins(amount2), timestamp2, 10),
dbtypes.NewDepositRow(1, depositor3.String(), dbtypes.NewDbCoins(amount3), timestamp3, 10),
}
var result []dbtypes.DepositRow
err = suite.database.Sqlx.Select(&result, `SELECT * FROM proposal_deposit`)
Expand All @@ -377,19 +381,19 @@ func (suite *DbTestSuite) TestBigDipperDb_SaveDeposits() {
amount3 = sdk.NewCoins(sdk.NewCoin("desmos", sdk.NewInt(30)))

deposit = []types.Deposit{
types.NewDeposit(proposal.ProposalID, depositor.String(), amount, 9),
types.NewDeposit(proposal.ProposalID, depositor2.String(), amount2, 10),
types.NewDeposit(proposal.ProposalID, depositor3.String(), amount3, 11),
types.NewDeposit(proposal.ProposalID, depositor.String(), amount, timestamp1, 9),
types.NewDeposit(proposal.ProposalID, depositor2.String(), amount2, timestamp2, 10),
types.NewDeposit(proposal.ProposalID, depositor3.String(), amount3, timestamp3, 11),
}

err = suite.database.SaveDeposits(deposit)
suite.Require().NoError(err)

expected = []dbtypes.DepositRow{
dbtypes.NewDepositRow(1, depositor.String(), dbtypes.NewDbCoins(
sdk.NewCoins(sdk.NewCoin("desmos", sdk.NewInt(10000)))), 10),
dbtypes.NewDepositRow(1, depositor2.String(), dbtypes.NewDbCoins(amount2), 10),
dbtypes.NewDepositRow(1, depositor3.String(), dbtypes.NewDbCoins(amount3), 11),
sdk.NewCoins(sdk.NewCoin("desmos", sdk.NewInt(10000)))), timestamp1, 10),
dbtypes.NewDepositRow(1, depositor2.String(), dbtypes.NewDbCoins(amount2), timestamp2, 10),
dbtypes.NewDepositRow(1, depositor3.String(), dbtypes.NewDbCoins(amount3), timestamp3, 11),
}

result = []dbtypes.DepositRow{}
Expand All @@ -410,11 +414,13 @@ func (suite *DbTestSuite) TestBigDipperDb_SaveVote() {
proposal := suite.getProposalRow(1)
voter := suite.getAccount("cosmos1z4hfrxvlgl4s8u4n5ngjcw8kdqrcv43599amxs")

vote := types.NewVote(1, voter.String(), govtypes.OptionYes, 1)
timestamp := time.Date(2020, 1, 1, 15, 00, 00, 000, time.UTC)

vote := types.NewVote(1, voter.String(), govtypes.OptionYes, timestamp, 1)
err := suite.database.SaveVote(vote)
suite.Require().NoError(err)

expected := dbtypes.NewVoteRow(int64(proposal.ProposalID), voter.String(), govtypes.OptionYes.String(), 1)
expected := dbtypes.NewVoteRow(int64(proposal.ProposalID), voter.String(), govtypes.OptionYes.String(), timestamp, 1)

var result []dbtypes.VoteRow
err = suite.database.Sqlx.Select(&result, `SELECT * FROM proposal_vote`)
Expand All @@ -423,7 +429,7 @@ func (suite *DbTestSuite) TestBigDipperDb_SaveVote() {
suite.Require().True(expected.Equals(result[0]))

// Update with lower height should not change option
vote = types.NewVote(1, voter.String(), govtypes.OptionNo, 0)
vote = types.NewVote(1, voter.String(), govtypes.OptionNo, timestamp, 0)
err = suite.database.SaveVote(vote)
suite.Require().NoError(err)

Expand All @@ -434,11 +440,11 @@ func (suite *DbTestSuite) TestBigDipperDb_SaveVote() {
suite.Require().True(expected.Equals(result[0]))

// Update with same height should change option
vote = types.NewVote(1, voter.String(), govtypes.OptionAbstain, 1)
vote = types.NewVote(1, voter.String(), govtypes.OptionAbstain, timestamp, 1)
err = suite.database.SaveVote(vote)
suite.Require().NoError(err)

expected = dbtypes.NewVoteRow(int64(proposal.ProposalID), voter.String(), govtypes.OptionAbstain.String(), 1)
expected = dbtypes.NewVoteRow(int64(proposal.ProposalID), voter.String(), govtypes.OptionAbstain.String(), timestamp, 1)

result = []dbtypes.VoteRow{}
err = suite.database.Sqlx.Select(&result, `SELECT * FROM proposal_vote`)
Expand All @@ -447,11 +453,11 @@ func (suite *DbTestSuite) TestBigDipperDb_SaveVote() {
suite.Require().True(expected.Equals(result[0]))

// Update with higher height should change option
vote = types.NewVote(1, voter.String(), govtypes.OptionNoWithVeto, 2)
vote = types.NewVote(1, voter.String(), govtypes.OptionNoWithVeto, timestamp, 2)
err = suite.database.SaveVote(vote)
suite.Require().NoError(err)

expected = dbtypes.NewVoteRow(int64(proposal.ProposalID), voter.String(), govtypes.OptionNoWithVeto.String(), 2)
expected = dbtypes.NewVoteRow(int64(proposal.ProposalID), voter.String(), govtypes.OptionNoWithVeto.String(), timestamp, 2)

result = []dbtypes.VoteRow{}
err = suite.database.Sqlx.Select(&result, `SELECT * FROM proposal_vote`)
Expand Down
6 changes: 4 additions & 2 deletions database/schema/08-gov.sql
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,8 @@ CREATE TABLE proposal_deposit
proposal_id INTEGER NOT NULL REFERENCES proposal (id),
depositor_address TEXT REFERENCES account (address),
amount COIN[],
height BIGINT NOT NULL REFERENCES block (height),
timestamp TIMESTAMP,
height BIGINT NOT NULL,
CONSTRAINT unique_deposit UNIQUE (proposal_id, depositor_address)
);
CREATE INDEX proposal_deposit_proposal_id_index ON proposal_deposit (proposal_id);
Expand All @@ -42,7 +43,8 @@ CREATE TABLE proposal_vote
proposal_id INTEGER NOT NULL REFERENCES proposal (id),
voter_address TEXT NOT NULL REFERENCES account (address),
option TEXT NOT NULL,
height BIGINT NOT NULL REFERENCES block (height),
timestamp TIMESTAMP,
height BIGINT NOT NULL,
CONSTRAINT unique_vote UNIQUE (proposal_id, voter_address)
);
CREATE INDEX proposal_vote_proposal_id_index ON proposal_vote (proposal_id);
Expand Down
24 changes: 16 additions & 8 deletions database/types/gov.go
Original file line number Diff line number Diff line change
Expand Up @@ -118,23 +118,26 @@ func (w TallyResultRow) Equals(v TallyResultRow) bool {

// VoteRow represents a single row inside the vote table
type VoteRow struct {
Voter string `db:"voter_address"`
Option string `db:"option"`
ProposalID int64 `db:"proposal_id"`
Height int64 `db:"height"`
ProposalID int64 `db:"proposal_id"`
Voter string `db:"voter_address"`
Option string `db:"option"`
Timestamp time.Time `db:"timestamp"`
Height int64 `db:"height"`
}

// NewVoteRow allows to easily create a new VoteRow
func NewVoteRow(
proposalID int64,
voter string,
option string,
timestamp time.Time,
height int64,
) VoteRow {
return VoteRow{
ProposalID: proposalID,
Voter: voter,
Option: option,
Timestamp: timestamp,
Height: height,
}
}
Expand All @@ -144,28 +147,32 @@ func (w VoteRow) Equals(v VoteRow) bool {
return w.ProposalID == v.ProposalID &&
w.Voter == v.Voter &&
w.Option == v.Option &&
w.Timestamp.Equal(v.Timestamp) &&
w.Height == v.Height
}

// DepositRow represents a single row inside the deposit table
type DepositRow struct {
Depositor string `db:"depositor_address"`
Amount DbCoins `db:"amount"`
ProposalID int64 `db:"proposal_id"`
Height int64 `db:"height"`
ProposalID int64 `db:"proposal_id"`
Depositor string `db:"depositor_address"`
Amount DbCoins `db:"amount"`
Timestamp time.Time `db:"timestamp"`
Height int64 `db:"height"`
}

// NewDepositRow allows to easily create a new NewDepositRow
func NewDepositRow(
proposalID int64,
depositor string,
amount DbCoins,
timestamp time.Time,
height int64,
) DepositRow {
return DepositRow{
ProposalID: proposalID,
Depositor: depositor,
Amount: amount,
Timestamp: timestamp,
Height: height,
}
}
Expand All @@ -175,6 +182,7 @@ func (w DepositRow) Equals(v DepositRow) bool {
return w.ProposalID == v.ProposalID &&
w.Depositor == v.Depositor &&
w.Amount.Equal(&v.Amount) &&
w.Timestamp.Equal(v.Timestamp) &&
w.Height == v.Height
}

Expand Down
3 changes: 2 additions & 1 deletion hasura/metadata/databases/bdjuno/tables/public_account.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,9 @@ array_relationships:
schema: public
select_permissions:
- permission:
allow_aggregations: true
allow_aggregations: false
columns:
- address
filter: {}
limit: 100
role: anonymous
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@ table:
schema: public
select_permissions:
- permission:
allow_aggregations: true
allow_aggregations: false
columns:
- average_time
- height
filter: {}
limit: 1
role: anonymous
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@ table:
schema: public
select_permissions:
- permission:
allow_aggregations: true
allow_aggregations: false
columns:
- average_time
- height
filter: {}
limit: 1
role: anonymous
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@ table:
schema: public
select_permissions:
- permission:
allow_aggregations: true
allow_aggregations: false
columns:
- average_time
- height
filter: {}
limit: 1
role: anonymous
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@ table:
schema: public
select_permissions:
- permission:
allow_aggregations: true
allow_aggregations: false
columns:
- average_time
- height
filter: {}
limit: 1
role: anonymous
Loading

0 comments on commit d8c5440

Please sign in to comment.