Commit Graph

36 Commits

Author SHA1 Message Date
Sacha Al Himdani
f462b124e6 Batch signature and approval notifications via debounced worker
Replace the immediate per-document approval email and the manual
"send signing notifications" action with a single debounced worker that
batches pending requests per recipient and organization.

The worker (go.gearno.de/kit/worker) polls on an interval (default 5m)
and claims one (organization, recipient) group at a time, sending one
consolidated signing email and/or one approval email per recipient/org
that lists every document awaiting their signature or approval. The
claim is a conditional UPDATE that doubles as concurrency-safe dedup, so
several workers never email the same group twice.

Each request is notified once it has been pending past the debounce
delay (default 15m), then reminded at 1x, 2x and 3x the reminder
interval (default 1 day) after the previous email, after which it stops.
New last_notified_at and notification_count columns on signatures and
approval decisions drive the debounce, the widening reminder cadence and
the four-email cap.

Email copy lists each document with its title, type and a deep link to
the employee page. Removed the inline approval-on-publish email, the
SendSigningNotifications service method/mutation/MCP tool, its IAM action,
and the related console UI and n8n operation.

Signed-off-by: Sacha Al Himdani <sacha@probo.com>
2026-06-18 15:39:04 +02:00
Ludovic Vielle
dbfd191bc5 Add cache control to Files API static assets
Brand assets served at /api/files/v1/static had no cache headers.
Introduce brand.Assets to own the embedded filesystem, content-hash
ETags, and HTTP serving. Responses now carry Cache-Control and ETag
so clients can cache and revalidate; stable email URLs stay
revalidatable (max-age=3600, no immutable).

Replace hardcoded Default*Path constants with StaticPathPrefix,
logical filename constants, and StaticPath(). NewAssets validates
required assets at startup so a rename fails fast instead of 404ing
in sent emails. The files handler keeps routing and 404 rendering;
ServeAssets sets cache headers and serves the file.

Signed-off-by: Ludovic Vielle <ludovic@probo.com>
2026-06-12 17:24:00 +02:00
Sacha Al Himdani
c7e2fc209f Use probo.com for bare and marketing domain references
Replace the bare `getprobo.com` domain and the `www.getprobo.com`
marketing host with `probo.com` / `www.probo.com` across the codebase.
Functional subdomains (app, console, notification, custom, test,
cookie-banner, compliance) keep their existing `getprobo.com` hosts,
and changelog entries are left untouched.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-06-11 13:46:10 +02:00
Ludovic Vielle
60435f277b Serve brand assets as static files via /api/files/v1/static instead of S3
Signed-off-by: Ludovic Vielle <ludovic@probo.com>
2026-06-09 17:42:18 +02:00
Sacha Al Himdani
9ac71f948f Update contact email to hello@probo.com
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-06-09 16:45:23 +02:00
Sacha Al Himdani
6948a6b9ab Tailor signature certificate email copy for approvals
Store the per-signature email subject as text on the electronic_signatures
row at creation time, mirroring the consent_text pattern. The document
approval service sets "Your approved <Title> - Certificate of Completion";
other callers default to "Your signed <Name> - Certificate of Completion".
The certificate worker uses signature.email_subject as the email subject,
falling back to the default format when the column is empty.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-05-21 14:49:19 +02:00
Émile Ré
9156d6a16a Add wsl linter and fix
Signed-off-by: Émile Ré <emile@probo.com>
2026-05-20 09:27:28 +04:00
Sacha Al Himdani
999171a626 Add document approval workflow
Introduce a complete approval system for document publishing. Document
versions can now require approval from selected reviewers before being
published, with automatic publishing once all approvers have approved.

- Add approval quorum and decision tables with backfill migration
- Implement request approval, approve, and reject flows with electronic
  signature support for approve decisions
- Add employee approvals page with dedicated tab and pending approvals view
- Add changelog field to publish and request approval flows
- Pre-select previous version's approvers in the publish dialog
- Show quorum approvers in document list with 100 approver hard limit
- Expose approval workflow through GraphQL, MCP, and CLI
- Remove legacy default approvers feature entirely
- Add comprehensive e2e test coverage for approval workflows

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-27 19:43:20 +01:00
Sacha Al Himdani
8c02c53315 Update copyright headers across all Go files
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-25 17:38:32 +01:00
Sacha Al Himdani
85ec106cd6 Send mailing list emails
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-11 15:34:37 +01:00
Émile Ré
355e6b81b8 Add an account activation step in the signing request flow when needed
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-03-11 17:08:42 +04:00
Émile Ré
0a532f17c5 Remove legacy document signing endpoints
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-03-11 17:08:42 +04:00
Bryan Frimin
d4b3025463 Use go 1.26 syntax
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-06 15:00:42 +01:00
Bryan Frimin
54f80596b6 Set cache header
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-06 14:59:34 +01:00
Bryan Frimin
c191d25e9a Add electronic signature
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-02-23 09:38:27 +01:00
Émile Ré
ab5fe8e5e2 Fix e2e tests
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-02-19 16:13:01 +04:00
Émile Ré
e094dc847b Fix typo in function name + fix email render return values on error
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-02-05 12:56:23 +04:00
Émile Ré
f7936ff2c2 Rename parameter
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-02-05 12:44:01 +04:00
Émile Ré
6189a8ed81 Generate presigned URL for email assets at render time
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-02-05 12:41:35 +04:00
Émile Ré
27821632c6 Serve email static assets from object store
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-02-04 18:32:52 +04:00
Émile Ré
cdf70f3cac Add powered by Probo in email footer
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-02-02 13:32:59 +04:00
Émile Ré
926d008c60 Fix email url paths
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-02-02 13:32:59 +04:00
Émile Ré
d9c07ecdef Fix bot review
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-02-02 13:32:58 +04:00
Émile Ré
e13ff134ed Extract email presentation configuration layer to streamline email branding
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-02-02 13:32:57 +04:00
Émile Ré
73ec5ce96b Rename trust center to compliance page in displayed text
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-01-29 08:41:18 +04:00
Émile Ré
6c7bcfb50a Get rid of old trust-auth config
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-01-17 12:36:47 -08:00
Émile Ré
8b3bda56e6 Add magic link login for trust center
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-01-17 12:34:24 -08:00
Émile Ré
7322201dab Plug trust center part 1
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-01-17 12:34:23 -08:00
Émile Ré
1ed291aa0e Fix cubic review
Signed-off-by: Émile Ré <nemile.re@gmail.com>
2025-12-11 16:24:36 +01:00
Émile Ré
4638685b89 Fix reject email subject
Signed-off-by: Émile Ré <nemile.re@gmail.com>
2025-12-11 16:24:34 +01:00
Émile Ré
c8471cd48d Add reject button + email on trust center access request
Signed-off-by: Émile Ré <nemile.re@gmail.com>
2025-12-11 16:24:34 +01:00
Bryan Frimin
896e6e0736 Refactor hostname to become baseurl
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2025-10-30 19:41:15 +01:00
Bryan Frimin
6f2bd9c92f Fix failed to to cannot
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2025-10-30 16:38:08 +01:00
Sacha Al Himdani
1f0a5dff5c Redesign trust center console
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2025-10-28 16:42:56 +01:00
Sacha Al Himdani
87ac7485f3 Use link to png logo in emails
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2025-10-15 18:53:23 +02:00
Sacha Al Himdani
ae45410b82 Use html in emails
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2025-10-15 17:55:36 +02:00