feat(ideas): add idea creator, grant calls and applications
Implement the idea creator and application generator: idea status workflow, social canvas card, grant call windows with 409 when closed, and an LLM-backed idea assistant with offline fallback.
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
using SurrealDb.Net;
|
||||
using TarninaHub.Application.Abstractions;
|
||||
using TarninaHub.Application.Dtos;
|
||||
|
||||
namespace TarninaHub.Infrastructure.Persistence;
|
||||
|
||||
public sealed class GrantCallService : IGrantCallService
|
||||
{
|
||||
private const string SelectFields =
|
||||
"type::string(id) AS id, name, opens_at, closes_at, status, external_id";
|
||||
|
||||
private readonly ISurrealDbClient _client;
|
||||
|
||||
public GrantCallService(ISurrealDbClient client)
|
||||
{
|
||||
_client = client;
|
||||
}
|
||||
|
||||
public async Task<IReadOnlyList<GrantCallResponse>> ListAsync(
|
||||
string? status,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
var parameters = new Dictionary<string, object?>();
|
||||
var where = string.Empty;
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(status))
|
||||
{
|
||||
where = " WHERE status = $status";
|
||||
parameters["status"] = status;
|
||||
}
|
||||
|
||||
var response = await _client.RawQuery(
|
||||
$"SELECT {SelectFields} FROM grant_call{where} ORDER BY opens_at DESC;",
|
||||
parameters,
|
||||
cancellationToken);
|
||||
response.EnsureAllOks();
|
||||
|
||||
var rows = response.GetValue<List<GrantCallRow>>(0) ?? [];
|
||||
|
||||
return rows.Select(Map).ToList();
|
||||
}
|
||||
|
||||
public async Task<GrantCallResponse?> GetAsync(string grantCallId, CancellationToken cancellationToken)
|
||||
{
|
||||
var (table, id) = SurrealRecordId.Split(grantCallId);
|
||||
|
||||
var response = await _client.RawQuery(
|
||||
$"SELECT {SelectFields} FROM type::record($table, $id) LIMIT 1;",
|
||||
new Dictionary<string, object?> { ["table"] = table, ["id"] = id },
|
||||
cancellationToken);
|
||||
response.EnsureAllOks();
|
||||
|
||||
var rows = response.GetValue<List<GrantCallRow>>(0) ?? [];
|
||||
|
||||
return rows.Count > 0 ? Map(rows[0]) : null;
|
||||
}
|
||||
|
||||
private static GrantCallResponse Map(GrantCallRow row) => new(
|
||||
row.Id,
|
||||
row.Name,
|
||||
row.OpensAt,
|
||||
row.ClosesAt,
|
||||
row.Status,
|
||||
row.ExternalId);
|
||||
}
|
||||
Reference in New Issue
Block a user