diff --git a/build/metadata/Dockerfile b/build/metadata/Dockerfile index fad0a62..d8b7d9e 100644 --- a/build/metadata/Dockerfile +++ b/build/metadata/Dockerfile @@ -35,6 +35,7 @@ COPY ./cmd/metadata/mappings ./mappings COPY ./cmd/metadata/graphql ./graphql COPY ./build/*.yml ./ COPY ./cmd/metadata/views/*.sql ./views/ +COPY ./cmd/metadata/sql/*.sql ./sql/ COPY ./cmd/metadata/custom_hasura_config ./custom_hasura_config ENTRYPOINT ["/go/bin/dipdup-metadata"] diff --git a/cmd/metadata/custom_hasura_config/0_expired_field.json b/cmd/metadata/custom_hasura_config/0_expired_field.json new file mode 100644 index 0000000..a2b5fb5 --- /dev/null +++ b/cmd/metadata/custom_hasura_config/0_expired_field.json @@ -0,0 +1,21 @@ +{ + "type": "bulk", + "source": "default", + "resource_version": 195, + "args": [ + { + "type": "pg_add_computed_field", + "args": { + "table": { "schema": "public", "name": "token_metadata" }, + "name": "expired", + "definition": { + "function": { "name": "token_metadata_expired", "schema": "public" }, + "table_argument": null, + "session_argument": null + }, + "comment": null, + "source": "default" + } + } + ] +} diff --git a/cmd/metadata/custom_hasura_config/1_partner_role.json b/cmd/metadata/custom_hasura_config/1_partner_role.json new file mode 100644 index 0000000..ab777a7 --- /dev/null +++ b/cmd/metadata/custom_hasura_config/1_partner_role.json @@ -0,0 +1,58 @@ +{ + "type": "bulk", + "source": "default", + "resource_version": 195, + "args": [ + { + "type": "pg_create_select_permission", + "args": { + "table": { "name": "token_metadata", "schema": "public" }, + "role": "partner", + "permission": { + "columns": [ + "id", + "created_at", + "updated_at", + "update_id", + "token_id", + "network", + "contract", + "link", + "metadata", + "retry_count", + "status", + "image_processed", + "error" + ], + "computed_fields": ["expired"], + "backend_only": false, + "filter": {}, + "limit": 100, + "allow_aggregations": false + }, + "source": "default" + } + }, + { + "type": "pg_create_update_permission", + "args": { + "table": { "name": "token_metadata", "schema": "public" }, + "role": "partner", + "permission": { + "columns": ["retry_count", "status"], + "filter": { + "_and": [ + { "contract": { "_eq": "X-Hasura-User-Id" } }, + { "status": { "_neq": 1 } }, + { "expired": { "_eq": "true" } } + ] + }, + "backend_only": false, + "set": {} + }, + "source": "default" + } + } + ] + } + \ No newline at end of file diff --git a/cmd/metadata/custom_hasura_config/2_invalidate_endpoint.json b/cmd/metadata/custom_hasura_config/2_invalidate_endpoint.json new file mode 100644 index 0000000..a66f037 --- /dev/null +++ b/cmd/metadata/custom_hasura_config/2_invalidate_endpoint.json @@ -0,0 +1,30 @@ +{ + "type": "bulk", + "source": "default", + "resource_version": 195, + "args": [ + { + "type": "add_query_to_collection", + "args": { + "collection_name": "allowed-queries", + "query_name": "Invalidate token metadata", + "query": "mutation Invalidate($contract: String) {\n update_token_metadata(\n where: {\n contract: {_eq: $contract}, \n status: {_neq: \"1\"}, \n expired: {_eq: true}\n }, \n _set: {\n status: \"1\", \n retry_count: \"0\"\n }) {\n \taffected_rows\n }\n}" + } + }, + { + "type": "create_rest_endpoint", + "args": { + "name": "Invalidate token metadata", + "url": "invalidate_token_metadata", + "definition": { + "query": { + "query_name": "Invalidate token metadata", + "collection_name": "allowed-queries" + } + }, + "methods": ["PUT", "PATCH"] + } + } + ] + } + \ No newline at end of file diff --git a/cmd/metadata/main.go b/cmd/metadata/main.go index d889694..535b1f2 100644 --- a/cmd/metadata/main.go +++ b/cmd/metadata/main.go @@ -57,6 +57,11 @@ func main() { prometheusService.Start() } + if err := execScripts(ctx, cfg.Database); err != nil { + log.Err(err).Msg("execScripts") + return + } + views, err := createViews(ctx, cfg.Database) if err != nil { log.Err(err).Msg("createViews") @@ -210,3 +215,34 @@ func createViews(ctx context.Context, database golibConfig.Database) ([]string, return views, nil } + +func execScripts(ctx context.Context, database golibConfig.Database) error { + files, err := os.ReadDir("sql") + if err != nil { + return err + } + + db, err := models.NewDatabase(ctx, database) + if err != nil { + return err + } + defer db.Close() + + for i := range files { + if files[i].IsDir() { + continue + } + + path := fmt.Sprintf("sql/%s", files[i].Name()) + raw, err := os.ReadFile(path) + if err != nil { + return err + } + + if err := db.Exec(string(raw)); err != nil { + return err + } + } + + return nil +} diff --git a/cmd/metadata/sql/token_metadata_expired.sql b/cmd/metadata/sql/token_metadata_expired.sql new file mode 100644 index 0000000..e5127a5 --- /dev/null +++ b/cmd/metadata/sql/token_metadata_expired.sql @@ -0,0 +1,11 @@ +CREATE OR REPLACE FUNCTION public.token_metadata_expired(IN p_item token_metadata) + RETURNS boolean + LANGUAGE 'plpgsql' STABLE + PARALLEL SAFE + COST 100 + +AS $BODY$ +begin + return to_timestamp(p_item.updated_at + 7200) < now(); +end; +$BODY$; \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 2245f65..bc8364a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -12,6 +12,7 @@ services: environment: - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-changeme} - ADMIN_SECRET=${ADMIN_SECRET:-changeme} + - IPFS_NODE_URI=${IPFS_NODE_URI:-https://ipfs.io} volumes: - ipfs:/etc/metadata/ipfs @@ -33,7 +34,7 @@ services: retries: 5 hasura: - image: hasura/graphql-engine:v2.0.1 + image: hasura/graphql-engine:v2.0.8 ports: - 127.0.0.1:8080:8080 restart: always