SoftTraderBackend/DatabaseHandler/PostgresAnnotationStore.cs
2026-03-20 10:42:48 -04:00

84 lines
2.4 KiB
C#

using Backend.Interface;
using Npgsql;
using NpgsqlTypes;
namespace Backend.DatabaseHandler
{
public sealed class PostgresAnnotationStore : IAnnotationStore
{
private readonly string _connectionString;
public PostgresAnnotationStore(IConfiguration configuration)
{
_connectionString = configuration.GetConnectionString("MarketDataDb")
?? throw new InvalidOperationException("Missing connection string: MarketDataDb");
}
public async Task<string?> GetAsync(
string user,
string symbol,
CancellationToken cancellationToken = default)
{
await using var conn = new NpgsqlConnection(_connectionString);
await conn.OpenAsync(cancellationToken);
const string sql = """
SELECT annotations
FROM chart_annotations
WHERE username = @user AND symbol = @symbol;
""";
await using var cmd = new NpgsqlCommand(sql, conn);
cmd.Parameters.AddWithValue("user", user);
cmd.Parameters.AddWithValue("symbol", symbol);
var result = await cmd.ExecuteScalarAsync(cancellationToken);
return result as string;
}
public async Task UpsertAsync(
string user,
string symbol,
string annotationsJson,
CancellationToken cancellationToken = default)
{
await using var conn = new NpgsqlConnection(_connectionString);
await conn.OpenAsync(cancellationToken);
const string sql = """
INSERT INTO chart_annotations (username, symbol, annotations)
VALUES (@user, @symbol, @annotations)
ON CONFLICT (username, symbol)
DO UPDATE SET annotations = @annotations;
""";
await using var cmd = new NpgsqlCommand(sql, conn);
cmd.Parameters.AddWithValue("user", user);
cmd.Parameters.AddWithValue("symbol", symbol);
cmd.Parameters.Add(new NpgsqlParameter("annotations", NpgsqlDbType.Jsonb) { Value = annotationsJson });
await cmd.ExecuteNonQueryAsync(cancellationToken);
}
public async Task DeleteAsync(
string user,
string symbol,
CancellationToken cancellationToken = default)
{
await using var conn = new NpgsqlConnection(_connectionString);
await conn.OpenAsync(cancellationToken);
const string sql = """
DELETE FROM chart_annotations
WHERE username = @user AND symbol = @symbol;
""";
await using var cmd = new NpgsqlCommand(sql, conn);
cmd.Parameters.AddWithValue("user", user);
cmd.Parameters.AddWithValue("symbol", symbol);
await cmd.ExecuteNonQueryAsync(cancellationToken);
}
}
}