summaryrefslogtreecommitdiff
path: root/src/marlin.agents.shell/MarlinApiClient.cs
blob: aa4f013484c643b4ea91a963d9b2fe504e784fb7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
namespace marlin.agents.shell;

using System.Net.Http.Json;
using core.models;

public class MarlinApiClient
{
    private readonly HttpClient _http;

    public MarlinApiClient(string baseUrl, Guid agentId, string agentToken)
    {
        _http = new HttpClient { BaseAddress = new Uri(baseUrl) };
        _http.DefaultRequestHeaders.Add("Agent", $"{agentId} {agentToken}");
    }
    
    public static MarlinApiClient FromEnvironment()
    {
        var baseUrl = RequireEnv("MARLIN_API_BASE_URL");
        var agentId = RequireEnv("MARLIN_AGENT_ID");
        var agentToken = RequireEnv("MARLIN_AGENT_TOKEN");

        return new MarlinApiClient(baseUrl, Guid.Parse(agentId), agentToken);
    }

    private static string RequireEnv(string name) =>
        Environment.GetEnvironmentVariable(name)
        ?? throw new InvalidOperationException($"Missing required environment variable: {name}");

    public async Task<AgentConfiguration> Handshake(AgentStatus status, CancellationToken ct = default)
    {
        var response = await _http.PostAsJsonAsync("api/dispatch/handshake", status, ct);
        response.EnsureSuccessStatusCode();
        return (await response.Content.ReadFromJsonAsync<AgentConfiguration>(ct))!;
    }

    public async Task<DispatchJob?> QueueNextJob(CancellationToken ct = default) 
        => await _http.GetFromJsonAsync<DispatchJob?>("api/dispatch/queue", ct);
}