Skip to content

Commit

Permalink
Extend metadata API endpoints for global constants
Browse files Browse the repository at this point in the history
  • Loading branch information
Groxan committed Nov 22, 2021
1 parent c1921a6 commit 410fe76
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 0 deletions.
50 changes: 50 additions & 0 deletions Tzkt.Api/Controllers/MetadataController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,56 @@ public MetadataController(MetadataRepository metadata, IAuthService auth)
}
#endregion

#region constants
[HttpGet("constants/{address}")]
public async Task<ActionResult<RawJson>> GetConstantMetadata(
[FromHeader] AuthHeaders headers,
[ExpressionHash] string address,
string section = null)
{
if (!Auth.TryAuthenticate(headers, out var error))
return Unauthorized(error);

return Ok(await Metadata.GetConstantMetadata(address, section));
}

[HttpGet("constants")]
public async Task<ActionResult<IEnumerable<MetadataUpdate<string>>>> GetConstantMetadata(
[FromHeader] AuthHeaders headers,
JsonParameter metadata,
[Min(0)] int offset = 0,
[Range(0, 10000)] int limit = 100,
string section = null)
{
if (!Auth.TryAuthenticate(headers, out var error))
return Unauthorized(error);

return Ok(await Metadata.GetConstantMetadata(metadata, offset, limit, section));
}

[HttpPost("constants")]
public async Task<ActionResult<IEnumerable<MetadataUpdate<string>>>> UpdateConstantMetadata(
[FromHeader] AuthHeaders headers)
{
try
{
var body = await Request.Body.ReadAsStringAsync();
if (!Auth.TryAuthenticate(headers, body, out var error))
return Unauthorized(error);

var metadata = JsonSerializer.Deserialize<List<MetadataUpdate<string>>>(body);
if (metadata.Any(x => !Regex.IsMatch(x.Key, "^expr[0-9A-Za-z]{50}$")))
return BadRequest("Invalid expression hash");

return Ok(await Metadata.UpdateConstantMetadata(metadata));
}
catch (JsonException)
{
return new BadRequest("body", "Invalid json");
}
}
#endregion

#region blocks
[HttpGet("blocks/{level:int}")]
public async Task<ActionResult<RawJson>> GetBlockMetadata(
Expand Down
9 changes: 9 additions & 0 deletions Tzkt.Api/Repositories/MetadataRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,9 @@ public Task<RawJson> GetProtocolMetadata(string hash, string section = null)
public Task<RawJson> GetSoftwareMetadata(string shortHash, string section = null)
=> Get("Software", "ShortHash", "character(8)", shortHash, section);

public Task<RawJson> GetConstantMetadata(string address, string section = null)
=> Get("RegisterConstantOps", "Address", "character(54)", address, section);

public Task<RawJson> GetBlockMetadata(int level, string section = null)
=> Get("Blocks", "Level", "integer", level, section);

Expand Down Expand Up @@ -62,6 +65,9 @@ public Task<IEnumerable<MetadataUpdate<string>>> GetProtocolMetadata(JsonParamet
public Task<IEnumerable<MetadataUpdate<string>>> GetSoftwareMetadata(JsonParameter metadata, int offset, int limit, string section = null)
=> Get<string>("Software", "ShortHash", metadata, offset, limit, section);

public Task<IEnumerable<MetadataUpdate<string>>> GetConstantMetadata(JsonParameter metadata, int offset, int limit, string section = null)
=> Get<string>("RegisterConstantOps", "Address", metadata, offset, limit, section);

public Task<IEnumerable<MetadataUpdate<int>>> GetBlockMetadata(JsonParameter metadata, int offset, int limit, string section = null)
=> Get<int>("Blocks", "Level", metadata, offset, limit, section);

Expand Down Expand Up @@ -156,6 +162,9 @@ public Task<List<MetadataUpdate<string>>> UpdatProtocolMetadata(List<MetadataUpd
public Task<List<MetadataUpdate<string>>> UpdateSoftwareMetadata(List<MetadataUpdate<string>> metadata)
=> Update("Software", "ShortHash", "character(8)", metadata);

public Task<List<MetadataUpdate<string>>> UpdateConstantMetadata(List<MetadataUpdate<string>> metadata)
=> Update("RegisterConstantOps", "Address", "character(54)", metadata);

public Task<List<MetadataUpdate<int>>> UpdateBlockMetadata(List<MetadataUpdate<int>> metadata)
=> Update("Blocks", "Level", "integer", metadata);

Expand Down
4 changes: 4 additions & 0 deletions Tzkt.Api/Services/Sync/StateListener.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ public class StateListener : BackgroundService
const string ProposalMetadataChanged = "proposal_metadata_changed";
const string ProtocolMetadataChanged = "protocol_metadata_changed";
const string SoftwareMetadataChanged = "software_metadata_changed";
const string ConstantMetadataChanged = "constant_metadata_changed";
const string BlockMetadataChanged = "block_metadata_changed";
#endregion

Expand Down Expand Up @@ -93,6 +94,7 @@ protected override async Task ExecuteAsync(CancellationToken cancellationToken)
LISTEN {StateHashChanged};
LISTEN {AccountMetadataChanged};
LISTEN {SoftwareMetadataChanged};");
//LISTEN {ConstantMetadataChanged};
//LISTEN {StateMetadataChanged};
//LISTEN {ProposalMetadataChanged};
//LISTEN {ProtocolMetadataChanged};
Expand Down Expand Up @@ -265,6 +267,8 @@ void NotifyMetadata(string channel, string payload)
case SoftwareMetadataChanged:
Software.UpdateMetadata(key);
break;
//case ConstantMetadataChanged:
// break;
//case BlockMetadataChanged:
// break;
default:
Expand Down
7 changes: 7 additions & 0 deletions Tzkt.Data/Migrations/20210714125513_Triggers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,12 @@ protected override void Up(MigrationBuilder migrationBuilder)
"Metadata",
@"NEW.""ShortHash"" || ':' || COALESCE(NEW.""Metadata""::text, '')");

AddNotificationTrigger(migrationBuilder,
"constant_metadata_changed",
"RegisterConstantOps",
"Metadata",
@"NEW.""Address"" || ':' || COALESCE(NEW.""Metadata""::text, '')");

AddNotificationTrigger(migrationBuilder,
"block_metadata_changed",
"Blocks",
Expand All @@ -83,6 +89,7 @@ protected override void Down(MigrationBuilder migrationBuilder)
RemoveNotificationTrigger(migrationBuilder, "proposal_metadata_changed", "Proposals");
RemoveNotificationTrigger(migrationBuilder, "protocol_metadata_changed", "Protocols");
RemoveNotificationTrigger(migrationBuilder, "software_metadata_changed", "Software");
RemoveNotificationTrigger(migrationBuilder, "constant_metadata_changed", "RegisterConstantOps");
RemoveNotificationTrigger(migrationBuilder, "block_metadata_changed", "Blocks");
}
}
Expand Down

0 comments on commit 410fe76

Please sign in to comment.