diff --git a/api/adapter/controller.go b/api/adapter/controller.go deleted file mode 100644 index 0d1fbf23e..000000000 --- a/api/adapter/controller.go +++ /dev/null @@ -1,190 +0,0 @@ -package adapter - -import ( - "encoding/json" - "fmt" - "strconv" - - "bisonai.com/orakl/api/feed" - "bisonai.com/orakl/api/utils" - - "github.com/ethereum/go-ethereum/crypto" - "github.com/go-playground/validator/v10" - "github.com/gofiber/fiber/v2" -) - -type AdapterHashModel struct { - Name string `db:"name" json:"name"` - Decimals *utils.CustomInt32 `db:"decimals" json:"decimals"` - Feeds []feed.FeedWithoutAdapterIdModel `json:"feeds"` -} - -type AdapterInsertModel struct { - AdapterHash string `db:"adapter_hash" json:"adapterHash"` - Name string `db:"name" json:"name" validate:"required"` - Decimals *utils.CustomInt32 `db:"decimals" json:"decimals" validate:"required"` - Feeds []feed.FeedInsertModel `json:"feeds"` -} - -type HashInsertModel struct { - AdapterHash string `db:"adapter_hash" json:"adapterHash"` - Name string `db:"name" json:"name" validate:"required"` - Decimals *utils.CustomInt32 `db:"decimals" json:"decimals" validate:"required"` - Feeds []feed.FeedWithoutAdapterIdModel `json:"feeds"` -} - -type AdapterModel struct { - AdapterId *utils.CustomInt64 `db:"adapter_id" json:"id"` - AdapterHash string `db:"adapter_hash" json:"adapterHash"` - Name string `db:"name" json:"name" validate:"required"` - Decimals *utils.CustomInt32 `db:"decimals" json:"decimals" validate:"required"` -} - -type AdapterDetailModel struct { - AdapterModel - Feeds []feed.FeedModel `json:"feeds"` -} - -type AdapterIdModel struct { - AdapterId *utils.CustomInt64 `db:"adapter_id" json:"id"` -} - -type FeedIdModel struct { - FeedId *utils.CustomInt64 `db:"feed_id" json:"id"` -} - -func insert(c *fiber.Ctx) error { - payload := new(AdapterInsertModel) - if err := c.BodyParser(payload); err != nil { - return err - } - - validate := validator.New() - if err := validate.Struct(payload); err != nil { - return err - } - - err := computeAdapterHashForInsertRoute(payload, true) - if err != nil { - return err - } - - row, err := utils.QueryRow[AdapterIdModel](c, InsertAdapter, map[string]any{ - "adapter_hash": payload.AdapterHash, - "name": payload.Name, - "decimals": payload.Decimals}) - if err != nil { - return err - } - - for _, item := range payload.Feeds { - item.AdapterId = row.AdapterId - _, err := utils.QueryRow[FeedIdModel](c, InsertFeed, map[string]any{ - "name": item.Name, - "definition": item.Definition, - "adapter_id": item.AdapterId}) - if err != nil { - return err - } - } - - result := AdapterModel{AdapterId: row.AdapterId, AdapterHash: payload.AdapterHash, Name: payload.Name, Decimals: payload.Decimals} - - return c.JSON(result) -} - -func hash(c *fiber.Ctx) error { - verifyRaw := c.Query("verify") - verify, err := strconv.ParseBool(verifyRaw) - if err != nil { - return err - } - - var payload HashInsertModel - - if err := c.BodyParser(&payload); err != nil { - return err - } - - validate := validator.New() - if err := validate.Struct(payload); err != nil { - return err - } - - err = computeAdapterHashForHashRoute(&payload, verify) - if err != nil { - return err - } - return c.JSON(payload) -} - -func get(c *fiber.Ctx) error { - results, err := utils.QueryRows[AdapterModel](c, GetAdapter, nil) - if err != nil { - return err - } - - return c.JSON(results) -} - -func getById(c *fiber.Ctx) error { - id := c.Params("id") - result, err := utils.QueryRow[AdapterModel](c, GetAdpaterById, map[string]any{"id": id}) - if err != nil { - return err - } - - return c.JSON(result) -} - -func deleteById(c *fiber.Ctx) error { - id := c.Params("id") - result, err := utils.QueryRow[AdapterModel](c, RemoveAdapter, map[string]any{"id": id}) - if err != nil { - return err - } - - return c.JSON(result) -} - -func computeAdapterHashForHashRoute(data *HashInsertModel, verify bool) error { - hashString, err := computeAdapterHash(data.Name, data.Decimals, data.Feeds, data.AdapterHash, verify) - if err != nil { - return err - } - data.AdapterHash = hashString - return nil -} - -func computeAdapterHashForInsertRoute(data *AdapterInsertModel, verify bool) error { - adapterIdRemovedFeeds := make([]feed.FeedWithoutAdapterIdModel, len(data.Feeds)) - for idx, item := range data.Feeds { - adapterIdRemovedFeeds[idx] = feed.FeedWithoutAdapterIdModel{ - Name: item.Name, - Definition: item.Definition, - } - } - - hashString, err := computeAdapterHash(data.Name, data.Decimals, adapterIdRemovedFeeds, data.AdapterHash, verify) - if err != nil { - return err - } - data.AdapterHash = hashString - return nil -} - -func computeAdapterHash(name string, decimals *utils.CustomInt32, feeds []feed.FeedWithoutAdapterIdModel, prevHashString string, verify bool) (string, error) { - input := AdapterHashModel{name, decimals, feeds} - out, err := json.Marshal(input) - if err != nil { - return "", fmt.Errorf("failed to compute adapter hash: %s", err.Error()) - } - - hash := crypto.Keccak256Hash([]byte(out)) - hashString := fmt.Sprintf("0x%x", hash) - if verify && prevHashString != hashString { - return hashString, fmt.Errorf("hashes do not match!\nexpected %s, received %s", prevHashString, hashString) - } - - return fmt.Sprintf("0x%x", hash), nil -} diff --git a/api/adapter/queries.go b/api/adapter/queries.go deleted file mode 100644 index 7cbbeda84..000000000 --- a/api/adapter/queries.go +++ /dev/null @@ -1,19 +0,0 @@ -package adapter - -const ( - InsertAdapter = ` - INSERT INTO adapters (adapter_hash, name, decimals) VALUES (@adapter_hash, @name, @decimals) RETURNING adapter_id; - ` - - InsertFeed = ` - INSERT INTO feeds (name, definition, adapter_id) VALUES (@name, @definition, @adapter_id) RETURNING feed_id; - ` - - GetAdapter = `SELECT * FROM adapters;` - - GetAdpaterById = `SELECT * FROM adapters WHERE adapter_id = @id;` - - GetAdapterByHash = `SELECT * FROM adapters WHERE adapter_hash = @adapter_hash` - - RemoveAdapter = `DELETE FROM adapters WHERE adapter_id = @id RETURNING *;` -) diff --git a/api/adapter/route.go b/api/adapter/route.go deleted file mode 100644 index b6bcd6cad..000000000 --- a/api/adapter/route.go +++ /dev/null @@ -1,15 +0,0 @@ -package adapter - -import ( - "github.com/gofiber/fiber/v2" -) - -func Routes(router fiber.Router) { - adapter := router.Group("/adapter") - - adapter.Post("", insert) - adapter.Post("/hash", hash) - adapter.Get("", get) - adapter.Get("/:id", getById) - adapter.Delete("/:id", deleteById) -} diff --git a/api/aggregate/controller.go b/api/aggregate/controller.go deleted file mode 100644 index 86e5a284e..000000000 --- a/api/aggregate/controller.go +++ /dev/null @@ -1,152 +0,0 @@ -package aggregate - -import ( - "encoding/json" - - "bisonai.com/orakl/api/utils" - - "github.com/go-playground/validator/v10" - "github.com/gofiber/fiber/v2" -) - -type AggregateRedisValueModel struct { - Timestamp *utils.CustomDateTime `db:"timestamp" json:"timestamp" validate:"required"` - Value *utils.CustomInt64 `db:"value" json:"value" validate:"required"` -} - -type WrappedInsertModel struct { - Data AggregateInsertModel `json:"data"` -} - -type AggregateInsertModel struct { - Timestamp *utils.CustomDateTime `db:"timestamp" json:"timestamp" validate:"required"` - Value *utils.CustomInt64 `db:"value" json:"value" validate:"required"` - AggregatorId *utils.CustomInt64 `db:"aggregator_id" json:"aggregatorId" validate:"required"` -} - -type AggregateModel struct { - AggregateId *utils.CustomInt64 `db:"aggregate_id" json:"id"` - Timestamp *utils.CustomDateTime `db:"timestamp" json:"timestamp" validate:"required"` - Value *utils.CustomInt64 `db:"value" json:"value" validate:"required"` - AggregatorId *utils.CustomInt64 `db:"aggregator_id" json:"aggregatorId" validate:"required"` -} - -type AggregateIdModel struct { - AggregateId *utils.CustomInt64 `db:"aggregate_id" json:"id"` -} - -func insert(c *fiber.Ctx) error { - _payload := new(WrappedInsertModel) - if err := c.BodyParser(_payload); err != nil { - return err - } - payload := _payload.Data - - validate := validator.New() - if err := validate.Struct(payload); err != nil { - return err - } - - row, err := utils.QueryRow[AggregateIdModel](c, InsertAggregate, map[string]any{ - "timestamp": payload.Timestamp.String(), - "value": payload.Value, - "aggregator_id": payload.AggregatorId}) - if err != nil { - return err - } - - key := "latestAggregate:" + payload.AggregatorId.String() - value, err := json.Marshal(AggregateRedisValueModel{Timestamp: payload.Timestamp, Value: payload.Value}) - if err != nil { - return err - } - - err = utils.SetRedis(c, key, string(value)) - if err != nil { - return err - } - - result := AggregateModel{AggregateId: row.AggregateId, Timestamp: payload.Timestamp, Value: payload.Value, AggregatorId: payload.AggregatorId} - return c.JSON(result) -} - -func get(c *fiber.Ctx) error { - results, err := utils.QueryRows[AggregateModel](c, GetAggregate, nil) - if err != nil { - return err - } - return c.JSON(results) -} - -func getById(c *fiber.Ctx) error { - id := c.Params("id") - result, err := utils.QueryRow[AggregateModel](c, GetAggregateById, map[string]any{"id": id}) - if err != nil { - return err - } - - return c.JSON(result) -} - -func getLatestByHash(c *fiber.Ctx) error { - hash := c.Params("hash") - result, err := utils.QueryRow[AggregateModel](c, GetLatestAggregateByHash, map[string]any{"aggregator_hash": hash}) - if err != nil { - return err - } - - return c.JSON(result) -} - -func getLatestById(c *fiber.Ctx) error { - var result AggregateRedisValueModel - - id := c.Params("id") - key := "latestAggregate:" + id - rawResult, err := utils.GetRedis(c, key) - - if err != nil { - pgsqlResult, err := utils.QueryRow[AggregateModel](c, GetLatestAggregateById, map[string]any{"aggregator_id": id}) - if err != nil { - return err - } - return c.JSON(pgsqlResult) - } - - err = json.Unmarshal([]byte(rawResult), &result) - if err != nil { - return err - } - - return c.JSON(result) -} - -func updateById(c *fiber.Ctx) error { - id := c.Params("id") - payload := new(AggregateInsertModel) - if err := c.BodyParser(payload); err != nil { - return err - } - - validate := validator.New() - if err := validate.Struct(payload); err != nil { - return err - } - - result, err := utils.QueryRow[AggregateModel](c, UpdateAggregateById, map[string]any{"timestamp": payload.Timestamp.String(), "value": payload.Value, "aggregator_id": payload.AggregatorId, "id": id}) - if err != nil { - return err - } - - return c.JSON(result) -} - -func deleteById(c *fiber.Ctx) error { - id := c.Params("id") - result, err := utils.QueryRow[AggregateModel](c, DeleteAggregateById, map[string]any{"id": id}) - if err != nil { - return err - } - - return c.JSON(result) -} diff --git a/api/aggregate/queries.go b/api/aggregate/queries.go deleted file mode 100644 index 0aa68c281..000000000 --- a/api/aggregate/queries.go +++ /dev/null @@ -1,43 +0,0 @@ -package aggregate - -const ( - InsertAggregate = ` - INSERT INTO aggregates (timestamp, value, aggregator_id) VALUES (@timestamp::timestamptz, @value, @aggregator_id) RETURNING aggregate_id; - ` - - GetAggregate = ` - SELECT * FROM aggregates; - ` - - GetAggregateById = ` - SELECT * - FROM aggregates - WHERE aggregate_id = @id - LIMIT 1; - ` - - GetLatestAggregateByHash = ` - SELECT * - FROM aggregates - WHERE aggregator_id = (SELECT aggregator_id FROM aggregators WHERE aggregator_hash = @aggregator_hash) - ORDER BY timestamp DESC - LIMIT 1; - ` - - GetLatestAggregateById = ` - SELECT * - FROM aggregates - WHERE aggregator_id = @aggregator_id - ORDER BY timestamp DESC - LIMIT 1; - ` - - UpdateAggregateById = ` - UPDATE aggregates - SET aggregator_id = @aggregator_id, timestamp = @timestamp::timestamptz, value = @value - WHERE aggregate_id = @id - RETURNING *; - ` - - DeleteAggregateById = `DELETE FROM aggregates WHERE aggregate_id = @id RETURNING *;` -) diff --git a/api/aggregate/route.go b/api/aggregate/route.go deleted file mode 100644 index 1f0de8666..000000000 --- a/api/aggregate/route.go +++ /dev/null @@ -1,17 +0,0 @@ -package aggregate - -import ( - "github.com/gofiber/fiber/v2" -) - -func Routes(router fiber.Router) { - aggregate := router.Group("/aggregate") - - aggregate.Post("", insert) - aggregate.Get("", get) - aggregate.Get("/:id", getById) - aggregate.Get("/hash/:hash/latest", getLatestByHash) - aggregate.Get("/id/:id/latest", getLatestById) - aggregate.Patch("/:id", updateById) - aggregate.Delete("/:id", deleteById) -} diff --git a/api/aggregator/controller.go b/api/aggregator/controller.go deleted file mode 100644 index 5bd73b106..000000000 --- a/api/aggregator/controller.go +++ /dev/null @@ -1,329 +0,0 @@ -package aggregator - -import ( - "encoding/json" - "fmt" - "strconv" - - "bisonai.com/orakl/api/adapter" - "bisonai.com/orakl/api/chain" - "bisonai.com/orakl/api/feed" - "bisonai.com/orakl/api/utils" - - "github.com/ethereum/go-ethereum/crypto" - "github.com/go-playground/validator/v10" - "github.com/gofiber/fiber/v2" -) - -type WrappedUpdateModel struct { - Data AggregatorUpdateModel `json:"data"` -} - -type AggregatorUpdateModel struct { - Active *utils.CustomBool `db:"active" json:"active"` - Chain string `db:"chain" json:"chain" validate:"required"` -} - -type AggregatorInsertModel struct { - AggregatorHash string `db:"aggregator_hash" json:"aggregatorHash"` - Active *utils.CustomBool `db:"active" json:"active"` - Name string `db:"name" json:"name" validate:"required"` - Address string `db:"address" json:"address" validate:"required"` - Heartbeat *utils.CustomInt32 `db:"heartbeat" json:"heartbeat" validate:"required"` - Threshold *utils.CustomFloat `db:"threshold" json:"threshold" validate:"required"` - AbsoluteThreshold *utils.CustomFloat `db:"absolute_threshold" json:"absoluteThreshold" validate:"required"` - AdapterHash string `db:"adapter_hash" json:"adapterHash" validate:"required"` - Chain string `db:"chain" json:"chain" validate:"required"` - FetcherType *utils.CustomInt32 `db:"fetcher_type" json:"fetcherType"` -} - -type AggregatorResultModel struct { - AggregatorId *utils.CustomInt64 `db:"aggregator_id" json:"id"` - AggregatorHash string `db:"aggregator_hash" json:"aggregatorHash"` - Active *utils.CustomBool `db:"active" json:"active"` - Name string `db:"name" json:"name"` - Address string `db:"address" json:"address"` - Heartbeat *utils.CustomInt32 `db:"heartbeat" json:"heartbeat"` - Threshold *utils.CustomFloat `db:"threshold" json:"threshold"` - AbsoluteThreshold *utils.CustomFloat `db:"absolute_threshold" json:"absoluteThreshold"` - AdapterId *utils.CustomInt64 `db:"adapter_id" json:"adapterId"` - ChainId *utils.CustomInt64 `db:"chain_id" json:"chainId"` - FetcherType *utils.CustomInt32 `db:"fetcher_type" json:"fetcherType"` -} - -type AggregatorDetailResultModel struct { - AggregatorResultModel - Adapter adapter.AdapterDetailModel `json:"adapter"` -} - -type _AggregatorInsertModel struct { - AggregatorHash string `db:"aggregator_hash" json:"aggregatorHash"` - Active *utils.CustomBool `db:"active" json:"active"` - Name string `db:"name" json:"name"` - Address string `db:"address" json:"address"` - Heartbeat *utils.CustomInt32 `db:"heartbeat" json:"heartbeat"` - Threshold *utils.CustomFloat `db:"threshold" json:"threshold"` - AbsoluteThreshold *utils.CustomFloat `db:"absolute_threshold" json:"absoluteThreshold"` - AdapterId *utils.CustomInt64 `db:"adapter_id" json:"adapterId"` - ChainId *utils.CustomInt64 `db:"chain_id" json:"chainId"` - FetcherType *utils.CustomInt32 `db:"fetcher_type" json:"fetcherType"` -} - -type AggregatorHashComputeProcessModel struct { - Name string `db:"name" json:"name"` - Heartbeat *utils.CustomInt32 `db:"heartbeat" json:"heartbeat"` - Threshold *utils.CustomFloat `db:"threshold" json:"threshold"` - AbsoluteThreshold *utils.CustomFloat `db:"absolute_threshold" json:"absoluteThreshold"` - AdapterHash string `db:"adapter_hash" json:"adapterHash"` -} - -type AggregatorHashComputeInputModel struct { - AggregatorHash string `db:"aggregator_hash" json:"aggregatorHash"` - AggregatorHashComputeProcessModel -} - -type AggregatorIdModel struct { - AggregatorId *utils.CustomInt64 `db:"aggregator_id" json:"id"` -} - -func insert(c *fiber.Ctx) error { - payload := new(AggregatorInsertModel) - if err := c.BodyParser(payload); err != nil { - return err - } - - validate := validator.New() - if err := validate.Struct(payload); err != nil { - return err - } - - chain_result, err := utils.QueryRow[chain.ChainModel](c, chain.GetChainByName, map[string]any{"name": payload.Chain}) - if err != nil { - return err - } - - adapter_result, err := utils.QueryRow[adapter.AdapterModel](c, adapter.GetAdapterByHash, map[string]any{"adapter_hash": payload.AdapterHash}) - if err != nil { - return err - } - - hashComputeParam := AggregatorHashComputeInputModel{ - AggregatorHash: payload.AggregatorHash, - AggregatorHashComputeProcessModel: AggregatorHashComputeProcessModel{ - Name: payload.Name, - Heartbeat: payload.Heartbeat, - Threshold: payload.Threshold, - AbsoluteThreshold: payload.AbsoluteThreshold, - AdapterHash: payload.AdapterHash, - }, - } - err = computeAggregatorHash(&hashComputeParam, true) - if err != nil { - return err - } - - insertParam := _AggregatorInsertModel{ - AggregatorHash: payload.AggregatorHash, - Active: payload.Active, - Name: payload.Name, - Address: payload.Address, - Heartbeat: payload.Heartbeat, - Threshold: payload.Threshold, - AbsoluteThreshold: payload.AbsoluteThreshold, - AdapterId: adapter_result.AdapterId, - ChainId: chain_result.ChainId, - FetcherType: payload.FetcherType, - } - - if insertParam.Active == nil { - insertBool := utils.CustomBool(false) - insertParam.Active = &insertBool - } - - if insertParam.FetcherType == nil { - insertFetcherType := utils.CustomInt32(0) - insertParam.FetcherType = &insertFetcherType - } - - row, err := utils.QueryRow[AggregatorIdModel](c, InsertAggregator, map[string]any{ - "aggregator_hash": insertParam.AggregatorHash, - "active": insertParam.Active, - "name": insertParam.Name, - "address": insertParam.Address, - "heartbeat": insertParam.Heartbeat, - "threshold": insertParam.Threshold, - "absolute_threshold": insertParam.AbsoluteThreshold, - "adapter_id": insertParam.AdapterId, - "chain_id": insertParam.ChainId, - "fetcher_type": insertParam.FetcherType, - }) - if err != nil { - return err - } - - result := AggregatorResultModel{ - AggregatorId: row.AggregatorId, - AggregatorHash: insertParam.AggregatorHash, - Active: insertParam.Active, - Name: insertParam.Name, - Address: insertParam.Address, - Heartbeat: insertParam.Heartbeat, - Threshold: insertParam.Threshold, - AbsoluteThreshold: insertParam.AbsoluteThreshold, - AdapterId: insertParam.AdapterId, - ChainId: insertParam.ChainId, - FetcherType: insertParam.FetcherType, - } - - return c.JSON(result) -} - -func hash(c *fiber.Ctx) error { - verifyRaw := c.Query("verify") - verify, err := strconv.ParseBool(verifyRaw) - if err != nil { - return err - } - - payload := new(AggregatorInsertModel) - if err := c.BodyParser(payload); err != nil { - return err - } - - validate := validator.New() - if err := validate.StructExcept(payload, "Chain"); err != nil { - return err - } - - hashComputeParam := AggregatorHashComputeInputModel{ - AggregatorHash: payload.AggregatorHash, - AggregatorHashComputeProcessModel: AggregatorHashComputeProcessModel{ - Name: payload.Name, - Heartbeat: payload.Heartbeat, - Threshold: payload.Threshold, - AbsoluteThreshold: payload.AbsoluteThreshold, - AdapterHash: payload.AdapterHash, - }, - } - - err = computeAggregatorHash(&hashComputeParam, verify) - if err != nil { - return err - } - - return c.JSON(hashComputeParam) -} - -func get(c *fiber.Ctx) error { - queries := c.Queries() - queryParam := GetAggregatorQueryParams{ - Active: queries["active"], - Chain: queries["chain"], - Address: queries["address"], - } - queryString, err := GenerateGetAggregatorQuery(queryParam) - if err != nil { - return err - } - - results, err := utils.QueryRows[AggregatorResultModel](c, queryString, nil) - if err != nil { - return err - } - - return c.JSON(results) -} - -func getByHashAndChain(c *fiber.Ctx) error { - var result = new(AggregatorDetailResultModel) - hash := c.Params("hash") - _chain := c.Params("chain") - - chain_result, err := utils.QueryRow[chain.ChainModel](c, chain.GetChainByName, map[string]any{"name": _chain}) - if err != nil { - return err - } - - result.AggregatorResultModel, err = utils.QueryRow[AggregatorResultModel](c, GetAggregatorByChainAndHash, map[string]any{ - "aggregator_hash": hash, - "chain_id": chain_result.ChainId, - }) - if err != nil { - return err - } - - result.Adapter.AdapterModel, err = utils.QueryRow[adapter.AdapterModel](c, adapter.GetAdpaterById, map[string]any{"id": result.AggregatorResultModel.AdapterId}) - if err != nil { - return err - } - - result.Adapter.Feeds, err = utils.QueryRows[feed.FeedModel](c, feed.GetFeedsByAdapterId, map[string]any{"id": result.AggregatorResultModel.AdapterId}) - if err != nil { - return err - } - return c.JSON(result) -} - -func deleteById(c *fiber.Ctx) error { - id := c.Params("id") - result, err := utils.QueryRow[AggregatorResultModel](c, RemoveAggregator, map[string]any{"id": id}) - if err != nil { - return err - } - - return c.JSON(result) -} - -func updateByHash(c *fiber.Ctx) error { - hash := c.Params("hash") - _payload := new(WrappedUpdateModel) - if err := c.BodyParser(_payload); err != nil { - return err - } - - payload := _payload.Data - - validate := validator.New() - if err := validate.Struct(payload); err != nil { - return err - } - - if payload.Active == nil { - insertBool := utils.CustomBool(false) - payload.Active = &insertBool - } - - chain_result, err := utils.QueryRow[chain.ChainModel](c, chain.GetChainByName, map[string]any{"name": payload.Chain}) - if err != nil { - return err - } - - result, err := utils.QueryRow[AggregatorResultModel](c, UpdateAggregatorByHash, map[string]any{ - "active": payload.Active, - "hash": hash, - "chain_id": chain_result.ChainId}) - if err != nil { - return err - } - - return c.JSON(result) -} - -func computeAggregatorHash(data *AggregatorHashComputeInputModel, verify bool) error { - input := data - processData := input.AggregatorHashComputeProcessModel - out, err := json.Marshal(processData) - if err != nil { - return fmt.Errorf("failed to compute adapter hash: %s", err.Error()) - } - - hash := crypto.Keccak256Hash([]byte(out)) - hashString := fmt.Sprintf("0x%x", hash) - if verify && data.AggregatorHash != hashString { - hashComputeErr := fmt.Errorf("hashes do not match!\nexpected %s, received %s", hashString, data.AggregatorHash) - return fmt.Errorf("failed to compute adapter hash: %s", hashComputeErr.Error()) - } - - data.AggregatorHash = hashString - return nil -} diff --git a/api/aggregator/queries.go b/api/aggregator/queries.go deleted file mode 100644 index c1cf25721..000000000 --- a/api/aggregator/queries.go +++ /dev/null @@ -1,77 +0,0 @@ -package aggregator - -import ( - "strconv" - "strings" -) - -type GetAggregatorQueryParams struct { - Active string - Chain string - Address string -} - -const ( - InsertAggregator = ` - INSERT INTO aggregators ( - aggregator_hash, - active, - name, - address, - heartbeat, - threshold, - absolute_threshold, - adapter_id, - chain_id, - fetcher_type - ) VALUES ( - @aggregator_hash, - @active, - @name, - @address, - @heartbeat, - @threshold, - @absolute_threshold, - @adapter_id, - @chain_id, - @fetcher_type - ) - RETURNING aggregator_id; - ` - - GetAggregatorByChainAndHash = ` - SELECT * - FROM aggregators - WHERE - aggregator_hash = @aggregator_hash AND - chain_id = @chain_id - LIMIT 1; - ` - - RemoveAggregator = `DELETE FROM aggregators WHERE aggregator_id = @id RETURNING *;` - UpdateAggregator = `UPDATE aggregators SET active = @active WHERE aggregator_id = @id AND chain_id = @chain_id RETURNING *;` - UpdateAggregatorByHash = `UPDATE aggregators SET active = @active WHERE aggregator_hash = @hash AND chain_id = @chain_id RETURNING *;` -) - -func GenerateGetAggregatorQuery(params GetAggregatorQueryParams) (string, error) { - baseQuery := `SELECT * FROM aggregators` - var conditionQueries []string - if params.Active != "" { - _, err := strconv.ParseBool(params.Active) - if err != nil { - return "", err - } - conditionQueries = append(conditionQueries, "active = "+params.Active) - } - if params.Chain != "" { - conditionQueries = append(conditionQueries, "chain_id = (SELECT chain_id FROM chains WHERE name = '"+params.Chain+"')") - } - if params.Address != "" { - conditionQueries = append(conditionQueries, "address = '"+params.Address+"'") - } - if len(conditionQueries) == 0 { - return baseQuery, nil - } - joinedString := strings.Join(conditionQueries, " AND ") - return baseQuery + " WHERE " + joinedString, nil -} diff --git a/api/aggregator/route.go b/api/aggregator/route.go deleted file mode 100644 index 9e397b25e..000000000 --- a/api/aggregator/route.go +++ /dev/null @@ -1,16 +0,0 @@ -package aggregator - -import ( - "github.com/gofiber/fiber/v2" -) - -func Routes(router fiber.Router) { - aggregator := router.Group("/aggregator") - - aggregator.Post("", insert) - aggregator.Post("/hash", hash) - aggregator.Get("", get) - aggregator.Get("/:hash/:chain", getByHashAndChain) - aggregator.Delete("/:id", deleteById) - aggregator.Patch("/:hash", updateByHash) -} diff --git a/api/data/controller.go b/api/data/controller.go deleted file mode 100644 index 49267633e..000000000 --- a/api/data/controller.go +++ /dev/null @@ -1,98 +0,0 @@ -package data - -import ( - "fmt" - - "bisonai.com/orakl/api/utils" - - "github.com/gofiber/fiber/v2" -) - -type BulkInsertModel struct { - Data []DataInsertModel `json:"data"` -} - -type DataInsertModel struct { - Timestamp *utils.CustomDateTime `db:"timestamp" json:"timestamp" validate:"required"` - Value *utils.CustomInt64 `db:"value" json:"value" validate:"required"` - AggregatorId *utils.CustomInt64 `db:"aggregator_id" json:"aggregatorId" validate:"required"` - FeedId *utils.CustomInt64 `db:"feed_id" json:"feedId" validate:"required"` -} - -type DataResultModel struct { - DataId *utils.CustomInt64 `db:"data_id" json:"id"` - Timestamp *utils.CustomDateTime `db:"timestamp" json:"timestamp" validate:"required"` - Value *utils.CustomInt64 `db:"value" json:"value" validate:"required"` - AggregatorId *utils.CustomInt64 `db:"aggregator_id" json:"aggregatorId" validate:"required"` - FeedId *utils.CustomInt64 `db:"feed_id" json:"feedId" validate:"required"` -} - -type BulkInsertResultModel struct { - Count int `json:"count"` -} - -func bulkInsert(c *fiber.Ctx) error { - payload := new(BulkInsertModel) - if err := c.BodyParser(payload); err != nil { - return err - } - - query, err := GenerateBulkInsertQuery(payload.Data) - if err != nil { - return err - } - err = utils.RawQueryWithoutReturn(c, query, nil) - - if err != nil { - return err - } - - countResult := BulkInsertResultModel{Count: len(payload.Data)} - - return c.JSON(countResult) -} - -func get(c *fiber.Ctx) error { - results, err := utils.QueryRows[DataResultModel](c, GetData, nil) - if err != nil { - return err - } - - return c.JSON(results) -} - -func getById(c *fiber.Ctx) error { - id := c.Params("id") - result, err := utils.QueryRow[DataResultModel](c, GetDataById, map[string]any{"id": id}) - if err != nil { - return err - } - - return c.JSON(result) -} - -func getByFeedId(c *fiber.Ctx) error { - if !utils.IsTesting(c) { - panic(fmt.Errorf("not allowed")) - } - id := c.Params("id") - results, err := utils.QueryRows[DataResultModel](c, GetDataByFeedId, map[string]any{"id": id}) - if err != nil { - return err - } - - return c.JSON(results) -} - -func deleteById(c *fiber.Ctx) error { - if !utils.IsTesting(c) { - panic(fmt.Errorf("not allowed")) - } - id := c.Params("id") - result, err := utils.QueryRow[DataResultModel](c, DeleteDataById, map[string]any{"id": id}) - if err != nil { - return err - } - - return c.JSON(result) -} diff --git a/api/data/queries.go b/api/data/queries.go deleted file mode 100644 index c300f4022..000000000 --- a/api/data/queries.go +++ /dev/null @@ -1,36 +0,0 @@ -package data - -import ( - "fmt" - "strings" - - "github.com/go-playground/validator/v10" -) - -const ( - GetData = `SELECT * FROM data;` - - GetDataById = `SELECT * FROM data WHERE data_id = @id;` - - DeleteDataById = `DELETE FROM data WHERE data_id = @id RETURNING *;` - - GetDataByFeedId = `SELECT * FROM data WHERE feed_id = @id;` -) - -func GenerateBulkInsertQuery(bulkInsertData []DataInsertModel) (string, error) { - baseQuery := `INSERT INTO data (timestamp, value, aggregator_id, feed_id) VALUES` - var insertQueries []string - validate := validator.New() - - for _, insertData := range bulkInsertData { - if err := validate.Struct(insertData); err != nil { - return "", err - } - - insertValueString := fmt.Sprintf("('%v'::timestamptz,%v,%v,%v)", insertData.Timestamp.String(), insertData.Value, insertData.AggregatorId, insertData.FeedId) - insertQueries = append(insertQueries, insertValueString) - } - joinedString := strings.Join(insertQueries, ", ") - result := baseQuery + " " + joinedString + " RETURNING *;" - return result, nil -} diff --git a/api/data/route.go b/api/data/route.go deleted file mode 100644 index af9ca1cb9..000000000 --- a/api/data/route.go +++ /dev/null @@ -1,15 +0,0 @@ -package data - -import ( - "github.com/gofiber/fiber/v2" -) - -func Routes(router fiber.Router) { - data := router.Group("/data") - - data.Post("", bulkInsert) - data.Get("", get) - data.Get("/:id", getById) - data.Delete("/:id", deleteById) - data.Get("/feed/:id", getByFeedId) -} diff --git a/api/feed/controller.go b/api/feed/controller.go deleted file mode 100644 index 82c7a3bd0..000000000 --- a/api/feed/controller.go +++ /dev/null @@ -1,73 +0,0 @@ -package feed - -import ( - "fmt" - - "bisonai.com/orakl/api/utils" - - "encoding/json" - - "github.com/gofiber/fiber/v2" -) - -type FeedWithoutAdapterIdModel struct { - Name string `db:"name" json:"name"` - Definition json.RawMessage `db:"definition" json:"definition"` -} - -type FeedInsertModel struct { - Name string `db:"name" json:"name"` - Definition json.RawMessage `db:"definition" json:"definition"` - AdapterId *utils.CustomInt64 `db:"adapter_id" json:"adapterId"` -} - -type FeedModel struct { - FeedId *utils.CustomInt64 `db:"feed_id" json:"id"` - Name string `db:"name" json:"name"` - Definition json.RawMessage `db:"definition" json:"definition"` - AdapterId *utils.CustomInt64 `db:"adapter_id" json:"adapterId"` -} - -func get(c *fiber.Ctx) error { - results, err := utils.QueryRows[FeedModel](c, GetFeed, nil) - if err != nil { - return err - } - - return c.JSON(results) -} - -func getById(c *fiber.Ctx) error { - id := c.Params("id") - result, err := utils.QueryRow[FeedModel](c, GetFeedById, map[string]any{"id": id}) - if err != nil { - return err - } - - return c.JSON(result) -} - -func getByAdpaterId(c *fiber.Ctx) error { - if !utils.IsTesting(c) { - panic(fmt.Errorf("not allowed")) - } - id := c.Params("id") - results, err := utils.QueryRows[FeedModel](c, GetFeedsByAdapterId, map[string]any{"id": id}) - if err != nil { - return err - } - return c.JSON(results) -} - -func removeById(c *fiber.Ctx) error { - if !utils.IsTesting(c) { - panic(fmt.Errorf("not allowed")) - } - id := c.Params("id") - result, err := utils.QueryRow[FeedModel](c, DeleteFeedById, map[string]any{"id": id}) - if err != nil { - return err - } - - return c.JSON(result) -} diff --git a/api/feed/queries.go b/api/feed/queries.go deleted file mode 100644 index 1e2eb7fac..000000000 --- a/api/feed/queries.go +++ /dev/null @@ -1,11 +0,0 @@ -package feed - -const ( - GetFeed = `SELECT * FROM feeds;` - - GetFeedById = `SELECT * FROM feeds WHERE feed_id = @id;` - - DeleteFeedById = `DELETE FROM feeds WHERE feed_id = @id RETURNING *` - - GetFeedsByAdapterId = `SELECT * FROM feeds WHERE adapter_id = @id;` -) diff --git a/api/feed/route.go b/api/feed/route.go deleted file mode 100644 index d0070dbd6..000000000 --- a/api/feed/route.go +++ /dev/null @@ -1,15 +0,0 @@ -package feed - -import ( - "github.com/gofiber/fiber/v2" -) - -func Routes(router fiber.Router) { - - feed := router.Group("/feed") - feed.Delete("/:id", removeById) - feed.Get("/adapter/:id", getByAdpaterId) - feed.Get("", get) - feed.Get("/:id", getById) - -} diff --git a/api/go.mod b/api/go.mod index b1bdee414..18a92ba81 100644 --- a/api/go.mod +++ b/api/go.mod @@ -3,7 +3,6 @@ module bisonai.com/orakl/api go 1.22.3 require ( - github.com/ethereum/go-ethereum v1.13.8 github.com/go-playground/validator/v10 v10.16.0 github.com/gofiber/fiber/v2 v2.52.0 github.com/hashicorp/vault/api v1.13.0 @@ -18,11 +17,9 @@ require ( require ( github.com/andybalholm/brotli v1.0.5 // indirect - github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect github.com/cenkalti/backoff/v3 v3.0.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/davecgh/go-spew v1.1.1 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/gabriel-vasile/mimetype v1.4.2 // indirect github.com/go-jose/go-jose/v4 v4.0.1 // indirect @@ -38,11 +35,11 @@ require ( github.com/hashicorp/go-secure-stdlib/strutil v0.1.2 // indirect github.com/hashicorp/go-sockaddr v1.0.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/holiman/uint256 v1.2.4 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect github.com/jackc/puddle/v2 v2.2.1 // indirect github.com/klauspost/compress v1.17.0 // indirect + github.com/kr/pretty v0.3.1 // indirect github.com/leodido/go-urn v1.2.4 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect diff --git a/api/go.sum b/api/go.sum index 964ac4a77..1fd6174fe 100644 --- a/api/go.sum +++ b/api/go.sum @@ -6,26 +6,17 @@ github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= -github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k= -github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/cenkalti/backoff/v3 v3.0.0 h1:ske+9nBpD9qZsTBoF41nW5L+AIuFBKMeze18XQ3eG1c= github.com/cenkalti/backoff/v3 v3.0.0/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= -github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= -github.com/ethereum/go-ethereum v1.13.8 h1:1od+thJel3tM52ZUNQwvpYOeRHlbkVFZ5S8fhi0Lgsg= -github.com/ethereum/go-ethereum v1.13.8/go.mod h1:sc48XYQxCzH3fG9BcrXCOOgQk2JfZzNAmIKnceogzsA= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= @@ -84,8 +75,6 @@ github.com/hashicorp/vault/api v1.13.0 h1:RTCGpE2Rgkn9jyPcFlc7YmNocomda44k5ck8FK github.com/hashicorp/vault/api v1.13.0/go.mod h1:0cb/uZUv1w2cVu9DIvuW1SMlXXC6qtATJt+LXJRx+kg= github.com/hashicorp/vault/api/auth/kubernetes v0.6.0 h1:K8sKGhtTAqGKfzaaYvUSIOAqTOIn3Gk1EsCEAMzZHtM= github.com/hashicorp/vault/api/auth/kubernetes v0.6.0/go.mod h1:Htwcjez5J9PwAHaZ1EYMBlgGq3/in5ajUV4+WCPihPE= -github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= -github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= @@ -126,6 +115,7 @@ github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUb github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= diff --git a/api/main.go b/api/main.go index cf41e64a5..900051862 100644 --- a/api/main.go +++ b/api/main.go @@ -4,14 +4,9 @@ import ( _ "embed" "log" - "bisonai.com/orakl/api/adapter" - "bisonai.com/orakl/api/aggregate" - "bisonai.com/orakl/api/aggregator" "bisonai.com/orakl/api/apierr" "bisonai.com/orakl/api/blocks" "bisonai.com/orakl/api/chain" - "bisonai.com/orakl/api/data" - "bisonai.com/orakl/api/feed" "bisonai.com/orakl/api/listener" "bisonai.com/orakl/api/proxy" "bisonai.com/orakl/api/reporter" @@ -69,13 +64,8 @@ func SetRouter(_router fiber.Router) { return c.SendString("Orakl Network API") }) - adapter.Routes(_router) - aggregate.Routes(_router) - aggregator.Routes(_router) apierr.Routes(_router) chain.Routes(_router) - data.Routes(_router) - feed.Routes(_router) listener.Routes(_router) proxy.Routes(_router) reporter.Routes(_router) diff --git a/api/tests/adapter_test.go b/api/tests/adapter_test.go deleted file mode 100644 index 2c96d6eda..000000000 --- a/api/tests/adapter_test.go +++ /dev/null @@ -1,113 +0,0 @@ -package tests - -import ( - "bisonai.com/orakl/api/adapter" - "bisonai.com/orakl/api/feed" - "bisonai.com/orakl/api/utils" - "encoding/json" - "fmt" - "testing" - - "github.com/joho/godotenv" - "github.com/stretchr/testify/assert" -) - -func TestAdapter(t *testing.T) { - err := godotenv.Load("../.env") - if err != nil { - fmt.Print("env file is not found, continueing without .env file") - } - - _adapterInsertData := _AdapterInsertModel{ - AdapterHash: "0xbb555a249d01133784fa04c608ce03c129f73f2a1ef7473d0cfffdc4bcba794e", - Name: "BTC-USD", - Decimals: 8, - } - - adapterInsertData := AdapterInsertModel{ - _AdapterInsertModel: _adapterInsertData, - Feeds: []feed.FeedInsertModel{ - { - Name: "Binance-BTC-USD-adapter", - Definition: json.RawMessage(`{ - "url": "https://api.binance.us/api/v3/ticker/price?symbol=BTCUSD", - "headers": { - "Content-Type": "application/json" - }, - "method": "GET", - "reducers": [ - { - "function": "PARSE", - "args": [ - "price" - ] - }, - { - "function": "POW10", - "args": 8 - }, - { - "function": "ROUND" - } - ] - }`), - }, - }, - } - - appConfig, _ := utils.Setup() - - pgxClient := appConfig.Postgres - redisClient := appConfig.Redis - app := appConfig.App - - defer pgxClient.Close() - defer redisClient.Close() - v1 := app.Group("/api/v1") - adapter.Routes(v1) - feed.Routes(v1) - - // read all before insertion - readAllResult, err := utils.GetRequest[[]adapter.AdapterModel](app, "/api/v1/adapter", nil) - assert.Nil(t, err) - totalBefore := len(readAllResult) - - // insert - adapterInsertResult, err := utils.PostRequest[adapter.AdapterModel](app, "/api/v1/adapter", adapterInsertData) - assert.Nil(t, err) - - // read all after insertion - readAllAfter, err := utils.GetRequest[[]adapter.AdapterModel](app, "/api/v1/adapter", nil) - assert.Nil(t, err) - totalAfter := len(readAllAfter) - assert.Less(t, totalBefore, totalAfter) - - // get single - singleReadResult, err := utils.GetRequest[adapter.AdapterModel](app, "/api/v1/adapter/"+adapterInsertResult.AdapterId.String(), nil) - assert.Nil(t, err) - assert.Equalf(t, adapterInsertResult, singleReadResult, "should read single element") - - // hash - hashTestInsertData := adapterInsertData - hashTestInsertData.AdapterHash = "" - hashResult, err := utils.PostRequest[adapter.AdapterInsertModel](app, "/api/v1/adapter/hash?verify=false", hashTestInsertData) - assert.Nil(t, err) - assert.Equal(t, adapterInsertData.AdapterHash, hashResult.AdapterHash, "hash should be same") - - // delete by id - feeds, _ := utils.GetRequest[[]feed.FeedModel](app, "/api/v1/feed", nil) - - for _, f := range feeds { - _, err = utils.DeleteRequest[feed.FeedModel](app, "/api/v1/feed/"+f.FeedId.String(), nil) - assert.Nil(t, err) - } - - deleteResult, err := utils.DeleteRequest[adapter.AdapterModel](app, "/api/v1/adapter/"+adapterInsertResult.AdapterId.String(), nil) - assert.Nil(t, err) - assert.Equalf(t, singleReadResult, deleteResult, "should be deleted") - - readAllResultAfterDeletion, err := utils.GetRequest[[]adapter.AdapterModel](app, "/api/v1/adapter", nil) - assert.Nil(t, err) - assert.Less(t, len(readAllResultAfterDeletion), totalAfter) - -} diff --git a/api/tests/aggregate_test.go b/api/tests/aggregate_test.go deleted file mode 100644 index 553fd352e..000000000 --- a/api/tests/aggregate_test.go +++ /dev/null @@ -1,247 +0,0 @@ -package tests - -import ( - "encoding/json" - "fmt" - "testing" - "time" - - "bisonai.com/orakl/api/adapter" - "bisonai.com/orakl/api/aggregate" - "bisonai.com/orakl/api/aggregator" - "bisonai.com/orakl/api/chain" - "bisonai.com/orakl/api/feed" - "bisonai.com/orakl/api/utils" - - "github.com/joho/godotenv" - "github.com/stretchr/testify/assert" -) - -/* -sample data - -POST localhost:3111/api/v1/chain - -{ - "name":"aggregate-test-chain" -} - -POST localhost:3111/api/v1/adapter - -{ - "adapterHash": "0xbb555a249d01133784fa04c608ce03c129f73f2a1ef7473d0cfffdc4bcba794e", - "name": "BTC-USD", - "decimals": 8, - "feeds": [ - { - "name": "Binance-BTC-USD-adapter", - "definition": { - "url": "https://api.binance.us/api/v3/ticker/price?symbol=BTCUSD", - "headers": { - "Content-Type": "application/json" - }, - "method": "GET", - "reducers": [ - { - "function": "PARSE", - "args": [ - "price" - ] - }, - { - "function": "POW10", - "args": 8 - }, - { - "function": "ROUND" - } - ] - } - } - ] -} - -POST localhost:3111/api/v1/aggregator - -{ - "aggregatorHash": "0x9ca45583d7b9b061d9e8a20d6a874fcfba50c7a9dbc9c65c3792b4ef0b31e7b9", - "active": false, - "name": "BTC-USD", - "address": "0x222", - "heartbeat": 10000, - "threshold": 0.04, - "absoluteThreshold": 0.1, - "adapterHash": "0xbb555a249d01133784fa04c608ce03c129f73f2a1ef7473d0cfffdc4bcba794e", - "chain": "aggregate-test-chain" -} -*/ - -func TestAggregate(t *testing.T) { - err := godotenv.Load("../.env") - if err != nil { - fmt.Print("env file is not found, continueing without .env file") - } - - insertChain := chain.ChainInsertModel{Name: "aggregate-test-chain"} - - _adapterInsertData := _AdapterInsertModel{ - AdapterHash: "0xbb555a249d01133784fa04c608ce03c129f73f2a1ef7473d0cfffdc4bcba794e", - Name: "BTC-USD", - Decimals: 8, - } - - adapterInsertData := AdapterInsertModel{ - _AdapterInsertModel: _adapterInsertData, - Feeds: []feed.FeedInsertModel{ - { - Name: "Binance-BTC-USD-adapter", - Definition: json.RawMessage(`{ - "url": "https://api.binance.us/api/v3/ticker/price?symbol=BTCUSD", - "headers": { - "Content-Type": "application/json" - }, - "method": "GET", - "reducers": [ - { - "function": "PARSE", - "args": [ - "price" - ] - }, - { - "function": "POW10", - "args": 8 - }, - { - "function": "ROUND" - } - ] - }`), - }, - }, - } - - // aggregatorInsertData := aggregator.AggregatorInsertModel{ - // AGGREGATOR_HASH: "0x9ca45583d7b9b061d9e8a20d6a874fcfba50c7a9dbc9c65c3792b4ef0b31e7b9", - // ACTIVE: false, - // NAME: "BTC-USD", - // ADDRESS: "0x222", - // HEARTBEAT: 10000, - // THRESHOLD: 0.04, - // ABSOLUTE_THRESHOLD: 0.1, - // ADAPTER_HASH: _adapterInsertData.ADAPTER_HASH, - // CHAIN: insertChain.NAME, - // FETCHER_TYPE: 0, - // } - - aggregatorInsertData := map[string]interface{}{ - "aggregatorHash": "0x9ca45583d7b9b061d9e8a20d6a874fcfba50c7a9dbc9c65c3792b4ef0b31e7b9", - "active": false, - "name": "BTC-USD", - "address": "0x222", - "heartbeat": 10000, - "threshold": 0.04, - "absoluteThreshold": 0.1, - "adapterHash": _adapterInsertData.AdapterHash, - "chain": insertChain.Name, - "fetcherType": 0, - } - appConfig, _ := utils.Setup() - - pgxClient := appConfig.Postgres - redisClient := appConfig.Redis - app := appConfig.App - - defer pgxClient.Close() - defer redisClient.Close() - v1 := app.Group("/api/v1") - - chain.Routes(v1) - adapter.Routes(v1) - aggregator.Routes(v1) - aggregate.Routes(v1) - feed.Routes(v1) - - // insert chain, adapter, and aggregator before test - chainInsertResult, err := utils.PostRequest[chain.ChainModel](app, "/api/v1/chain", insertChain) - assert.Nil(t, err) - - adapterInsertResult, err := utils.PostRequest[adapter.AdapterModel](app, "/api/v1/adapter", adapterInsertData) - assert.Nil(t, err) - - aggregatorInsertResult, err := utils.PostRequest[aggregator.AggregatorResultModel](app, "/api/v1/aggregator", aggregatorInsertData) - assert.Nil(t, err) - - // read all before insertion - readAllResult, err := utils.GetRequest[[]aggregate.AggregateModel](app, "/api/v1/aggregate", nil) - assert.Nil(t, err) - totalBefore := len(readAllResult) - - now := time.Now().Truncate(time.Second) - - // insert - insertValue := utils.CustomInt64(10) - aggregateInsertData := aggregate.AggregateInsertModel{ - Timestamp: &utils.CustomDateTime{Time: now}, - AggregatorId: aggregatorInsertResult.AggregatorId, - Value: &insertValue} - wrappedAggregateInsertData := aggregate.WrappedInsertModel{Data: aggregateInsertData} - - aggregateInsertResult, err := utils.PostRequest[aggregate.AggregateModel](app, "/api/v1/aggregate", wrappedAggregateInsertData) - assert.Nil(t, err) - - // read all after insertion - readAllAfter, err := utils.GetRequest[[]aggregate.AggregateModel](app, "/api/v1/aggregate", nil) - assert.Nil(t, err) - totalAfter := len(readAllAfter) - assert.Less(t, totalBefore, totalAfter) - - // read single - singleReadResult, err := utils.GetRequest[aggregate.AggregateModel](app, "/api/v1/aggregate/"+aggregateInsertResult.AggregateId.String(), nil) - assert.Nil(t, err) - assert.Equalf(t, aggregateInsertResult, singleReadResult, "should get single element") - - // read latest by hash - latestByHashResult, err := utils.GetRequest[aggregate.AggregateModel](app, "/api/v1/aggregate/hash/"+aggregatorInsertData["aggregatorHash"].(string)+"/latest", nil) - assert.Nil(t, err) - assert.Equalf(t, aggregateInsertResult, latestByHashResult, "should get latest by hash") - - // read latest by aggregatorId - latestByAggregatorIdResult, err := utils.GetRequest[aggregate.AggregateRedisValueModel](app, "/api/v1/aggregate/id/"+aggregatorInsertResult.AggregatorId.String()+"/latest", nil) - assert.Nil(t, err) - assert.Equalf(t, aggregateInsertResult.Timestamp, latestByAggregatorIdResult.Timestamp, "should get latest by aggregatorId") - assert.Equalf(t, aggregateInsertResult.Value, latestByAggregatorIdResult.Value, "should get latest by aggregatorId") - - // should update by id - updateValue := utils.CustomInt64(20) - aggregateUpdateData := aggregateInsertData - aggregateUpdateData.Value = &updateValue - updateResult, err := utils.PatchRequest[aggregate.AggregateModel](app, "/api/v1/aggregate/"+aggregateInsertResult.AggregateId.String(), aggregateUpdateData) - assert.Nil(t, err) - singleReadResult, err = utils.GetRequest[aggregate.AggregateModel](app, "/api/v1/aggregate/"+aggregateInsertResult.AggregateId.String(), nil) - assert.Nil(t, err) - assert.Equalf(t, updateResult, singleReadResult, "should get single element") - - // should delete by id - deleteResult, err := utils.DeleteRequest[aggregate.AggregateModel](app, "/api/v1/aggregate/"+aggregateInsertResult.AggregateId.String(), nil) - assert.Nil(t, err) - assert.Equalf(t, updateResult, deleteResult, "should be deleted") - readAllAfterDeletion, err := utils.GetRequest[[]aggregate.AggregateModel](app, "/api/v1/aggregate", nil) - assert.Nil(t, err) - assert.Less(t, len(readAllAfterDeletion), totalAfter) - - // clean up - feeds, _ := utils.GetRequest[[]feed.FeedModel](app, "/api/v1/feed", nil) - for _, f := range feeds { - _, err = utils.DeleteRequest[feed.FeedModel](app, "/api/v1/feed/"+f.FeedId.String(), nil) - assert.Nil(t, err) - } - - _, err = utils.DeleteRequest[aggregator.AggregatorResultModel](app, "/api/v1/aggregator/"+aggregatorInsertResult.AggregatorId.String(), nil) - assert.Nil(t, err) - _, err = utils.DeleteRequest[adapter.AdapterModel](app, "/api/v1/adapter/"+adapterInsertResult.AdapterId.String(), nil) - assert.Nil(t, err) - _, err = utils.DeleteRequest[chain.ChainModel](app, "/api/v1/chain/"+chainInsertResult.ChainId.String(), nil) - assert.Nil(t, err) - -} diff --git a/api/tests/aggregator_test.go b/api/tests/aggregator_test.go deleted file mode 100644 index 8e1aff56f..000000000 --- a/api/tests/aggregator_test.go +++ /dev/null @@ -1,160 +0,0 @@ -package tests - -import ( - "bisonai.com/orakl/api/adapter" - "bisonai.com/orakl/api/aggregator" - "bisonai.com/orakl/api/chain" - "bisonai.com/orakl/api/feed" - "bisonai.com/orakl/api/utils" - "encoding/json" - "fmt" - "testing" - - "github.com/joho/godotenv" - "github.com/stretchr/testify/assert" -) - -func TestAggregator(t *testing.T) { - err := godotenv.Load("../.env") - if err != nil { - fmt.Print("env file is not found, continueing without .env file") - } - insertChain := chain.ChainInsertModel{Name: "aggregator-test-chain"} - - _adapterInsertData := _AdapterInsertModel{ - AdapterHash: "0xbb555a249d01133784fa04c608ce03c129f73f2a1ef7473d0cfffdc4bcba794e", - Name: "BTC-USD", - Decimals: 8, - } - - adapterInsertData := AdapterInsertModel{ - _AdapterInsertModel: _adapterInsertData, - Feeds: []feed.FeedInsertModel{ - { - Name: "Binance-BTC-USD-adapter", - Definition: json.RawMessage(`{ - "url": "https://api.binance.us/api/v3/ticker/price?symbol=BTCUSD", - "headers": { - "Content-Type": "application/json" - }, - "method": "GET", - "reducers": [ - { - "function": "PARSE", - "args": [ - "price" - ] - }, - { - "function": "POW10", - "args": 8 - }, - { - "function": "ROUND" - } - ] - }`), - }, - }, - } - - aggregatorInsertData := map[string]interface{}{ - "aggregatorHash": "0x9ca45583d7b9b061d9e8a20d6a874fcfba50c7a9dbc9c65c3792b4ef0b31e7b9", - "active": false, - "name": "BTC-USD", - "address": "0x222", - "heartbeat": 10000, - "threshold": 0.04, - "absoluteThreshold": 0.1, - "adapterHash": _adapterInsertData.AdapterHash, - "chain": insertChain.Name, - "fetcherType": 0, - } - - customTrue := utils.CustomBool(true) - aggregatorUpdateData := aggregator.WrappedUpdateModel{ - Data: aggregator.AggregatorUpdateModel{ - Active: &customTrue, - Chain: insertChain.Name, - }, - } - - appConfig, _ := utils.Setup() - - pgxClient := appConfig.Postgres - redisClient := appConfig.Redis - app := appConfig.App - - defer pgxClient.Close() - defer redisClient.Close() - - v1 := app.Group("/api/v1") - - chain.Routes(v1) - adapter.Routes(v1) - aggregator.Routes(v1) - feed.Routes(v1) - - // insert chain, adapter (setup) - chainInsertResult, err := utils.PostRequest[chain.ChainModel](app, "/api/v1/chain", insertChain) - assert.Nil(t, err) - - adapterInsertResult, err := utils.PostRequest[adapter.AdapterModel](app, "/api/v1/adapter", adapterInsertData) - assert.Nil(t, err) - - // read all before insertion - readAllResult, err := utils.GetRequest[[]aggregator.AggregatorResultModel](app, "/api/v1/aggregator?chain="+insertChain.Name, nil) - assert.Nil(t, err) - totalBefore := len(readAllResult) - - // insert - aggregatorInsertResult, err := utils.PostRequest[aggregator.AggregatorResultModel](app, "/api/v1/aggregator", aggregatorInsertData) - assert.Nil(t, err) - - // read all after insertion - readAllAfter, err := utils.GetRequest[[]aggregator.AggregatorResultModel](app, "/api/v1/aggregator?chain="+insertChain.Name, nil) - assert.Nil(t, err) - totalAfter := len(readAllAfter) - assert.Less(t, totalBefore, totalAfter) - - // read by hash and chain - singleReadResult, err := utils.GetRequest[aggregator.AggregatorResultModel](app, "/api/v1/aggregator/"+aggregatorInsertData["aggregatorHash"].(string)+"/"+insertChain.Name, nil) - assert.Nil(t, err) - // FIXME: singleReadResult has more detailed info, should check differently - assert.Equalf(t, aggregatorInsertResult.AggregatorId, singleReadResult.AggregatorId, "should read single element") - - // update by id - patchResult, err := utils.PatchRequest[aggregator.AggregatorResultModel](app, "/api/v1/aggregator/"+aggregatorInsertResult.AggregatorHash, aggregatorUpdateData) - assert.Nil(t, err) - singleReadResult, err = utils.GetRequest[aggregator.AggregatorResultModel](app, "/api/v1/aggregator/"+aggregatorInsertData["aggregatorHash"].(string)+"/"+insertChain.Name, nil) - assert.Nil(t, err) - assert.Equalf(t, patchResult, singleReadResult, "should be patched") - - // hash - hashTestInsertData, _ := utils.DeepCopyMap(aggregatorInsertData) - hashTestInsertData["aggregatorHash"] = "" - hashResult, err := utils.PostRequest[aggregator.AggregatorHashComputeInputModel](app, "/api/v1/aggregator/hash?verify=false", hashTestInsertData) - assert.Nil(t, err) - assert.Equalf(t, aggregatorInsertData["aggregatorHash"].(string), hashResult.AggregatorHash, "hash should be same") - - // delete by id - deleteResult, err := utils.DeleteRequest[aggregator.AggregatorResultModel](app, "/api/v1/aggregator/"+aggregatorInsertResult.AggregatorId.String(), nil) - assert.Nil(t, err) - assert.Equalf(t, patchResult, deleteResult, "should be deleted") - - readAllResultAfterDeletion, err := utils.GetRequest[[]aggregator.AggregatorResultModel](app, "/api/v1/aggregator?chain="+insertChain.Name, nil) - assert.Nil(t, err) - assert.Less(t, len(readAllResultAfterDeletion), totalAfter) - - // cleanup - feeds, _ := utils.GetRequest[[]feed.FeedModel](app, "/api/v1/feed", nil) - for _, f := range feeds { - _, err = utils.DeleteRequest[feed.FeedModel](app, "/api/v1/feed/"+f.FeedId.String(), nil) - assert.Nil(t, err) - } - - _, err = utils.DeleteRequest[adapter.AdapterModel](app, "/api/v1/adapter/"+adapterInsertResult.AdapterId.String(), nil) - assert.Nil(t, err) - _, err = utils.DeleteRequest[chain.ChainModel](app, "/api/v1/chain/"+chainInsertResult.ChainId.String(), nil) - assert.Nil(t, err) -} diff --git a/api/tests/data_test.go b/api/tests/data_test.go deleted file mode 100644 index 8e0a55dff..000000000 --- a/api/tests/data_test.go +++ /dev/null @@ -1,162 +0,0 @@ -package tests - -import ( - "bisonai.com/orakl/api/adapter" - "bisonai.com/orakl/api/aggregator" - "bisonai.com/orakl/api/chain" - "bisonai.com/orakl/api/data" - "bisonai.com/orakl/api/feed" - "bisonai.com/orakl/api/utils" - "encoding/json" - "fmt" - "testing" - "time" - - "github.com/joho/godotenv" - "github.com/stretchr/testify/assert" -) - -func TestData(t *testing.T) { - err := godotenv.Load("../.env") - if err != nil { - fmt.Print("env file is not found, continueing without .env file") - } - - insertChain := chain.ChainInsertModel{Name: "data-test-chain"} - - _adapterInsertData := _AdapterInsertModel{ - AdapterHash: "0xbb555a249d01133784fa04c608ce03c129f73f2a1ef7473d0cfffdc4bcba794e", - Name: "BTC-USD", - Decimals: 8, - } - - adapterInsertData := AdapterInsertModel{ - _AdapterInsertModel: _adapterInsertData, - Feeds: []feed.FeedInsertModel{ - { - Name: "Binance-BTC-USD-adapter", - Definition: json.RawMessage(`{ - "url": "https://api.binance.us/api/v3/ticker/price?symbol=BTCUSD", - "headers": { - "Content-Type": "application/json" - }, - "method": "GET", - "reducers": [ - { - "function": "PARSE", - "args": [ - "price" - ] - }, - { - "function": "POW10", - "args": 8 - }, - { - "function": "ROUND" - } - ] - }`), - }, - }, - } - - aggregatorInsertData := map[string]interface{}{ - "aggregatorHash": "0x9ca45583d7b9b061d9e8a20d6a874fcfba50c7a9dbc9c65c3792b4ef0b31e7b9", - "active": false, - "name": "BTC-USD", - "address": "0x222", - "heartbeat": 10000, - "threshold": 0.04, - "absoluteThreshold": 0.1, - "adapterHash": _adapterInsertData.AdapterHash, - "chain": insertChain.Name, - "fetcherType": 0, - } - - appConfig, _ := utils.Setup() - - pgxClient := appConfig.Postgres - redisClient := appConfig.Redis - app := appConfig.App - - defer pgxClient.Close() - defer redisClient.Close() - v1 := app.Group("/api/v1") - - chain.Routes(v1) - adapter.Routes(v1) - aggregator.Routes(v1) - data.Routes(v1) - feed.Routes(v1) - - // insert chain, adapter, and aggregator before test - chainInsertResult, err := utils.PostRequest[chain.ChainModel](app, "/api/v1/chain", insertChain) - assert.Nil(t, err) - - adapterInsertResult, err := utils.PostRequest[adapter.AdapterModel](app, "/api/v1/adapter", adapterInsertData) - assert.Nil(t, err) - - aggregatorInsertResult, err := utils.PostRequest[aggregator.AggregatorResultModel](app, "/api/v1/aggregator", aggregatorInsertData) - assert.Nil(t, err) - - insertedFeeds, err := utils.GetRequest[[]feed.FeedModel](app, "/api/v1/feed/adapter/"+adapterInsertResult.AdapterId.String(), nil) - assert.Nil(t, err) - - // read all before insertion - readAllResult, err := utils.GetRequest[[]data.DataResultModel](app, "/api/v1/data", nil) - assert.Nil(t, err) - totalBefore := len(readAllResult) - - insertData := map[string]interface{}{ - "data": []map[string]interface{}{ - { - "aggregatorId": aggregatorInsertResult.AggregatorId, - "timestamp": time.Now().UTC().Format(utils.RFC3339Milli), - "value": 2241772466578, - "feedId": insertedFeeds[0].FeedId, - }, - }, - } - - count, err := utils.PostRequest[struct { - COUNT int `json:"count"` - }](app, "/api/v1/data", insertData) - assert.Nil(t, err) - assert.Equalf(t, 1, count.COUNT, "1 insert") - - // read all after insertion - readAllResultAfter, err := utils.GetRequest[[]data.DataResultModel](app, "/api/v1/data", nil) - assert.Nil(t, err) - totalAfter := len(readAllResultAfter) - assert.Less(t, totalBefore, totalAfter) - - // read single - lastDataElement := readAllResultAfter[len(readAllResultAfter)-1] - singleReadResult, err := utils.GetRequest[data.DataResultModel](app, "/api/v1/data/"+lastDataElement.DataId.String(), nil) - assert.Nil(t, err) - assert.Equalf(t, lastDataElement, singleReadResult, "should get single element") - - // delete by id - insertedData, err := utils.GetRequest[[]data.DataResultModel](app, "/api/v1/data/feed/"+insertedFeeds[0].FeedId.String(), nil) - assert.Nil(t, err) - deletedData, err := utils.DeleteRequest[data.DataResultModel](app, "/api/v1/data/"+insertedData[0].DataId.String(), nil) - assert.Nil(t, err) - assert.Equalf(t, insertedData[0], deletedData, "should delete by id") - - // clean up - - feeds, _ := utils.GetRequest[[]feed.FeedModel](app, "/api/v1/feed", nil) - for _, f := range feeds { - _, err = utils.DeleteRequest[feed.FeedModel](app, "/api/v1/feed/"+f.FeedId.String(), nil) - assert.Nil(t, err) - } - - _, err = utils.DeleteRequest[aggregator.AggregatorResultModel](app, "/api/v1/aggregator/"+aggregatorInsertResult.AggregatorId.String(), nil) - assert.Nil(t, err) - _, err = utils.DeleteRequest[adapter.AdapterModel](app, "/api/v1/adapter/"+adapterInsertResult.AdapterId.String(), nil) - assert.Nil(t, err) - _, err = utils.DeleteRequest[chain.ChainModel](app, "/api/v1/chain/"+chainInsertResult.ChainId.String(), nil) - assert.Nil(t, err) - -} diff --git a/api/tests/feed_test.go b/api/tests/feed_test.go deleted file mode 100644 index e47abb8fd..000000000 --- a/api/tests/feed_test.go +++ /dev/null @@ -1,117 +0,0 @@ -package tests - -import ( - "bisonai.com/orakl/api/adapter" - "bisonai.com/orakl/api/feed" - "bisonai.com/orakl/api/utils" - "encoding/json" - "fmt" - "testing" - - "github.com/joho/godotenv" - "github.com/stretchr/testify/assert" -) - -func containsFeed(arr []feed.FeedModel, target feed.FeedModel) bool { - for _, f := range arr { - if f.FeedId == target.FeedId { - return true - } - } - return false -} - -func TestFeed(t *testing.T) { - err := godotenv.Load("../.env") - if err != nil { - fmt.Print("env file is not found, continueing without .env file") - } - - _adapterInsertData := _AdapterInsertModel{ - AdapterHash: "0xbb555a249d01133784fa04c608ce03c129f73f2a1ef7473d0cfffdc4bcba794e", - Name: "BTC-USD", - Decimals: 8, - } - adapterInsertData := AdapterInsertModel{ - _AdapterInsertModel: _adapterInsertData, - Feeds: []feed.FeedInsertModel{ - { - Name: "Binance-BTC-USD-adapter", - Definition: json.RawMessage(`{ - "url": "https://api.binance.us/api/v3/ticker/price?symbol=BTCUSD", - "headers": { - "Content-Type": "application/json" - }, - "method": "GET", - "reducers": [ - { - "function": "PARSE", - "args": [ - "price" - ] - }, - { - "function": "POW10", - "args": 8 - }, - { - "function": "ROUND" - } - ] - }`), - }, - }, - } - - appConfig, _ := utils.Setup() - - pgxClient := appConfig.Postgres - redisClient := appConfig.Redis - app := appConfig.App - - defer pgxClient.Close() - defer redisClient.Close() - v1 := app.Group("/api/v1") - - adapter.Routes(v1) - feed.Routes(v1) - - // read all before insert - readAllResult, err := utils.GetRequest[[]feed.FeedModel](app, "/api/v1/feed", nil) - assert.Nil(t, err) - totalBefore := len(readAllResult) - - // insert adapter which adds feed - adapterInsertResult, err := utils.PostRequest[adapter.AdapterModel](app, "/api/v1/adapter", adapterInsertData) - assert.Nil(t, err) - - // read all after insertion - readAllResultAfter, err := utils.GetRequest[[]feed.FeedModel](app, "/api/v1/feed", nil) - assert.Nil(t, err) - totalAfter := len(readAllResultAfter) - assert.Less(t, totalBefore, totalAfter) - - // read single - lastElement := readAllResultAfter[len(readAllResultAfter)-1] - singleReadResult, err := utils.GetRequest[feed.FeedModel](app, "/api/v1/feed/"+lastElement.FeedId.String(), nil) - assert.Nil(t, err) - assert.Equalf(t, lastElement, singleReadResult, "should get single element") - - // delete added feeds - for _, f := range readAllResultAfter { - if !containsFeed(readAllResult, f) { - deletedFeed, err := utils.DeleteRequest[feed.FeedModel](app, "/api/v1/feed/"+f.FeedId.String(), nil) - assert.Nil(t, err) - assert.NotNil(t, deletedFeed) - } - } - - // delete adapter (cleanup) - _, err = utils.DeleteRequest[adapter.AdapterModel](app, "/api/v1/adapter/"+adapterInsertResult.AdapterId.String(), nil) - assert.Nil(t, err) - - // read all after deletion and cleanup - readAllResultAfterDeletion, err := utils.GetRequest[[]feed.FeedModel](app, "/api/v1/feed", nil) - assert.Nil(t, err) - assert.Less(t, len(readAllResultAfterDeletion), totalAfter) -} diff --git a/api/tests/models.go b/api/tests/models.go deleted file mode 100644 index f3de17e61..000000000 --- a/api/tests/models.go +++ /dev/null @@ -1,19 +0,0 @@ -package tests - -import ( - "bisonai.com/orakl/api/feed" -) - -// FIXME: redeclares structs that aren't accessable from test -// had to define again since _AdapterInsertModel isn't exported struct - -type AdapterInsertModel struct { - _AdapterInsertModel - Feeds []feed.FeedInsertModel `json:"feeds"` -} - -type _AdapterInsertModel struct { - AdapterHash string `db:"adapter_hash" json:"adapterHash" validate:"required"` - Name string `db:"name" json:"name" validate:"required"` - Decimals int `db:"decimals" json:"decimals" validate:"required"` -}