public static void Main()
Console.WriteLine("Hello World");
public class PostgrsDBRepository : IRepository {
public class PostgresDBRepository : IRepository
private readonly string _connectionString;
public PostgresDBRepository(string connectionString)
_connectionString = connectionString;
private void SetupDatabase()
using var connection = new NpgsqlConnection(_connectionString);
using var command = new NpgsqlCommand(
@"CREATE TABLE IF NOT EXISTS repositories (
command.ExecuteNonQuery();
public async Task<T?> Get<T>(string repoName, string key, CancellationToken cancellationToken, string? fileType = null)
using var connection = new NpgsqlConnection(_connectionString);
using var command = new NpgsqlCommand(
@"SELECT value FROM repositories WHERE name = @name AND key = @key",
command.Parameters.AddWithValue("@name", repoName);
command.Parameters.AddWithValue("@key", key);
await using var reader = await command.ExecuteReaderAsync(cancellationToken);
await reader.ReadAsync(cancellationToken);
var json = reader.GetString(0);
return JsonSerializer.Deserialize<T>(json);
public async Task Set<T>(string repoName, string key, T value, CancellationToken cancellationToken, string? fileType = null)
var json = JsonSerializer.Serialize(value);
using var connection = new NpgsqlConnection(_connectionString);
using var command = new NpgsqlCommand(
@"INSERT INTO repositories (name, key, value) VALUES (@name, @key, @value)
ON CONFLICT (name, key) DO UPDATE SET value = @value",
command.Parameters.AddWithValue("@name", repoName);
command.Parameters.AddWithValue("@key", key);
command.Parameters.AddWithValue("@value", json);
await command.ExecuteNonQueryAsync(cancellationToken);
public async Task Remove(string repoName, string key, CancellationToken cancellationToken, string? fileType = null)
using var connection = new NpgsqlConnection(_connectionString);
using var command = new NpgsqlCommand(
@"DELETE FROM repositories WHERE name = @name AND key = @key",
command.Parameters.AddWithValue("@name", repoName);
command.Parameters.AddWithValue("@key", key);
await command.ExecuteNonQueryAsync(cancellationToken);