feat: closing last gaps in backend functions we have available

This commit is contained in:
2026-04-24 12:15:56 +02:00
parent 13ace08a41
commit f96759ab2f
16 changed files with 610 additions and 62 deletions

66
lib/bds/cli_sync.ex Normal file
View File

@@ -0,0 +1,66 @@
defmodule BDS.CliSync do
@moduledoc false
import Ecto.Query
alias BDS.CliSync.Notification
alias BDS.Persistence
alias BDS.Repo
@processed_ttl_ms 60 * 60 * 1000
@unprocessed_ttl_ms 24 * 60 * 60 * 1000
def cli_mutation_performed(entity_type, entity_id, action)
when is_binary(entity_type) and is_binary(entity_id) do
now = Persistence.now_ms()
%Notification{}
|> Notification.changeset(%{
entity_type: entity_type,
entity_id: entity_id,
action: action,
from_cli: true,
seen_at: nil,
created_at: now
})
|> Repo.insert()
end
def db_file_change_detected do
now = Persistence.now_ms()
notifications =
Repo.all(
from notification in Notification,
where: notification.from_cli == true and is_nil(notification.seen_at),
order_by: [asc: notification.created_at]
)
ids = Enum.map(notifications, & &1.id)
if ids != [] do
Repo.update_all(from(notification in Notification, where: notification.id in ^ids), set: [seen_at: now])
end
{:ok,
Enum.map(notifications, fn notification ->
%{entity_type: notification.entity_type, entity_id: notification.entity_id, action: notification.action}
end)}
end
def prune_notifications(now \\ Persistence.now_ms()) when is_integer(now) do
{processed_count, _} =
Repo.delete_all(
from notification in Notification,
where: not is_nil(notification.seen_at) and notification.created_at <= ^(now - @processed_ttl_ms)
)
{unprocessed_count, _} =
Repo.delete_all(
from notification in Notification,
where: is_nil(notification.seen_at) and notification.created_at <= ^(now - @unprocessed_ttl_ms)
)
{:ok, %{processed: processed_count, unprocessed: unprocessed_count}}
end
end