Some checks failed
Deploy analytics worker / Deploy analytics worker to ${{ (github.ref == 'refs/heads/production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Failing after 1s
i18n upload strings / Upload latest strings (push) Failing after 1s
Deploy bemo / Deploy bemo to ${{ (github.ref == 'refs/heads/bemo-production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Failing after 1s
Deploy grafana resources / ${{ github.event_name == 'push' && 'Deploy grafana resources' || 'Validate grafana resources (dry run)' }} (push) Failing after 0s
End to end tests (dotcom) / Check for relevant changes (push) Failing after 0s
End to end tests (examples) / Check for relevant changes (push) Failing after 0s
End to end tests (mermaid readability) / Check for relevant changes (push) Failing after 1s
End to end tests (perf) / Check for relevant changes (push) Failing after 0s
Publish editor extensions / Publish editor extensions (push) Failing after 1s
Publish SDK packages / Remove the publish-packages label (push) Has been skipped
Checks / Tests & checks (push) Has been cancelled
Checks / Build all projects (push) Has been cancelled
Deploy templates / Deploy templates (push) Has been cancelled
End to end tests (dotcom) / End to end tests (dotcom) (push) Has been cancelled
End to end tests (mermaid readability) / End to end tests (mermaid readability) (push) Has been cancelled
End to end tests (perf) / End to end tests (perf) (push) Has been cancelled
Deploy .com / Deploy dotcom to ${{ (github.ref == 'refs/heads/production' && 'production') || (github.ref == 'refs/heads/main' && 'staging') || 'preview' }} (push) Has been cancelled
End to end tests (examples) / End to end tests (examples) (push) Has been cancelled
Publish SDK packages / Publish SDK packages (push) Has been cancelled
Publish SDK packages / Tell user released version (push) Has been cancelled
Publish SDK packages / Publishes code templates to separate repositories (push) Has been cancelled
Publish SDK packages / Deploys the template demos with the new SDK version (push) Has been cancelled
25 lines
1.2 KiB
PL/PgSQL
25 lines
1.2 KiB
PL/PgSQL
-- Stamp comment."createdAt" on the server: the notifications reply gate compares comment times
|
|
-- with a strict ">", which needs one clock and one total order per thread. Monotonic (max + 1)
|
|
-- rather than plain time because the Durable Object drains several comments in one transaction,
|
|
-- where now() is frozen and clock_timestamp() ties at millisecond resolution. No race on the
|
|
-- SELECT MAX: a thread belongs to one file, and one file is one Durable Object.
|
|
--
|
|
-- BEFORE INSERT only: the drain retries at-least-once via ON CONFLICT, whose update set does not
|
|
-- include "createdAt", so the first successful insert's stamp is permanent.
|
|
CREATE OR REPLACE FUNCTION set_comment_created_at() RETURNS TRIGGER AS $$
|
|
BEGIN
|
|
NEW."createdAt" := GREATEST(
|
|
(SELECT COALESCE(MAX("createdAt"), 0) + 1 FROM comment WHERE "threadId" = NEW."threadId"),
|
|
(EXTRACT(EPOCH FROM clock_timestamp()) * 1000)::BIGINT
|
|
);
|
|
-- keep the derived sort key consistent with the re-stamped creation time
|
|
NEW."updatedAt" := GREATEST(NEW."updatedAt", NEW."createdAt");
|
|
RETURN NEW;
|
|
END;
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
CREATE TRIGGER "set_comment_created_at_trigger"
|
|
BEFORE INSERT ON comment
|
|
FOR EACH ROW
|
|
EXECUTE FUNCTION set_comment_created_at();
|