Commit Graph

67 Commits

Author SHA1 Message Date
Sacha Al Himdani
e1148f812e Replace implemented column with CMMI maturity level
Drop the boolean implemented/not-implemented state in favor of a
mandatory CMMI maturity level enum (NONE, INITIAL, MANAGED, DEFINED,
QUANTITATIVELY_MANAGED, OPTIMIZING) stored as a Postgres enum type.

The migration backfills existing rows (NOT_IMPLEMENTED → NONE,
IMPLEMENTED → INITIAL), makes the column NOT NULL, and drops the old
implemented column and its enum type.

- maturityLevel is required on CreateControlInput and non-nullable (!)
  in the GraphQL schema
- CLI displays human-readable CMMI labels instead of raw enum tokens
- SOA table and published document use a single Maturity column in
  place of the old Implemented + Maturity columns
- Remove ControlImplementationState type and all implemented references
  across backend, frontend, CLI, MCP, n8n, and E2E tests

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-04-21 11:06:36 +02:00
Alejandro Juan
da91afc2a7 Add CMMI maturity level to compliance controls
Adds an optional CMMI 0-5 maturity level field to Control to support
ISO 27001 clause 9.1 effectiveness measurement and HITRUST CSF maturity
requirements. The field is nullable, framework-agnostic, and exposed
across all four API surfaces (GraphQL, MCP, CLI, n8n) plus the
generated SoA document.

Signed-off-by: Alejandro Juan <alejandrojuan@alejandrojuan.com>
2026-04-21 11:06:36 +02:00
Bryan Frimin
f17fb7bf49 Upgrade to kit v0.3.0
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-04-03 11:56:06 +02:00
Bryan Frimin
e74c0a11c6 Update copyright headers to 2025-2026 for modified files
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-25 15:19:47 +01:00
Bryan Frimin
d24712344e Add GraphQL dataloaders for batched record lookups
Introduce dataloadgen-based dataloaders to batch individual
record-by-ID fetches in GraphQL resolvers into single SQL
queries. Each entity type (organization, framework, control,
vendor, document, risk, measure, task, file, report, profile)
gets a LoadByIDs method in coredata and a GetByIDs service
method with variadic arguments and dedicated collection return
types. Resolvers now use dataloader.FromContext instead of
direct service calls for single-record lookups.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-25 15:19:46 +01:00
Bryan Frimin
82f241628c Refactor MeasuresPage to use Relay fragments
Replace the client-side grouped-by-category view (fetching 500 items)
with a flat table using server-side filtering and cursor-based
pagination. Colocate GraphQL queries, fragments, and mutations in the
component file per console CLAUDE.md conventions.

Backend changes add a category filter to the measure list endpoints
(GraphQL, MCP) and a new measureCategories field on Organization.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-19 09:54:33 +01:00
Bryan Frimin
a5743729f7 Add file visibility (PRIVATE/PUBLIC) + public files API
Adds a visibility enum to files with PRIVATE (default) and PUBLIC states.
PUBLIC files are accessible via an unauthenticated /api/files/v1/{fileID}
endpoint that redirects to a presigned S3 URL. Introduces pkg/file service
to manage file operations. Logo uploads (trust centers, organizations,
frameworks, references) are marked PUBLIC; other files are PRIVATE.
Includes database migration and backfill for existing logos.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-18 19:19:04 +01:00
Sacha Al Himdani
cf1dadc0b5 Add implemented state and justification to controls
Introduce `implemented` enum (IMPLEMENTED/NOT_IMPLEMENTED) and
`not_implemented_justification` (nullable text) fields on the Control
entity across all API surfaces (GraphQL, MCP, CLI), database, frontend,
and SOA export.

The database stores implementation state as a PostgreSQL enum
`control_implementation_state`. Controls default to IMPLEMENTED during
migration. The SOA list and PDF export show implementation status
alongside applicability, with "-" for non-applicable controls.
Justification columns are renamed for clarity: "Justification for
non-applicability" and "Justification for non-implementation".

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-17 11:01:04 +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
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
Sacha Al Himdani
40e4db9278 Remove deprecated SOA code
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-02-17 15:06:49 +01: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
Bryan Frimin
ece54f1616 Fix golint errors
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-02-02 18:42:50 +01: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
Sacha Al Himdani
4ed3f5a067 Change state of applicability
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-01-16 22:56:00 +01:00
Émile Ré
427565c521 Add light and dark logo files for frameworks
Signed-off-by: Émile Ré <nemile.re@gmail.com>
2025-12-16 19:02:57 +01:00
Émile Ré
c0b2a5702d Introduce pkg/mail.Addr
Signed-off-by: Émile Ré <nemile.re@gmail.com>
2025-12-15 18:24:00 +01:00
Sacha Al Himdani
21c4b7cd9d Add role management
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2025-11-13 17:11:22 +01:00
Antoine Bouchardy
139f5984e2 Add meeting and meeting summary objects
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2025-11-12 23:55:49 +01:00
Bryan Frimin
f9216d30b2 Add validator lib
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2025-11-06 13:13:17 +01:00
Sacha Al Himdani
288c59a5f2 Make descriptions nullable
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2025-11-05 17:58:50 +01:00
Bryan Frimin
59aa332ab5 Move to vanity import url
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2025-10-31 17:01:52 +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
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
Sacha Al Himdani
d757c9604b Add company name and logo to documents
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2025-10-14 11:02:12 +02:00
Bryan Frimin
344b340d1a Allow to filter measures by state
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2025-10-13 21:21:18 +02:00
Yannis Varni
ff7ba08fc1 File refs in one table
Added a file service
Refactored evidence and vendor compliance associated services and resolvers
Created SQL migration scripts
Updated GraphQL schema accordingly and the UI components
Removed unused methods and resolvers for evidence service

Signed-off-by: Yannis Varni <yannis@edinomis.fr>
2025-10-08 17:21:19 +02:00
Sacha Al Himdani
e2f3cd1a8d Add missing s3 metadata
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2025-10-03 15:17:54 +02:00
Sacha Al Himdani
56a666b7e8 Add export document pdf options
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2025-09-30 18:00:08 +02:00
yvarni
0f8135482e Change file size from int to int64
Signed-off-by: Yannis Varni <yannis@edinomis.fr>
2025-09-26 17:47:23 +02:00
Sacha Al Himdani
04e3eb81a7 Upgrade documents
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2025-09-18 16:32:59 +02:00
Sacha Al Himdani
e08c7af05f Send framework export by email
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2025-09-11 18:00:30 +02:00
Sacha Al Himdani
393672378a Fix framework export for evidence link
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2025-09-04 17:32:21 +02:00
Bryan Frimin
9a3c4d3965 Plug framework export
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2025-09-04 13:35:34 +02:00
Bryan Frimin
d47cac911d Initial export
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2025-09-04 12:44:41 +02:00
Sacha Al Himdani
16ced9638d Add risk snapshots
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2025-09-03 15:11:22 +02:00
Sacha Al Himdani
05b9672a03 Add controls snapshots
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2025-08-27 11:47:26 +02:00
Sacha Al Himdani
85bd140599 Exclude controls
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2025-07-21 11:05:04 +02:00
Bryan Frimin
afa5a822aa Refactor SOA generation
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2025-07-18 16:24:47 +02:00
Bryan Frimin
ead7d15f38 Fix SOA risk
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2025-06-30 12:15:49 +02:00
Bryan Frimin
2f9b64f332 Style
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2025-06-30 09:56:57 +02:00
Bryan Frimin
e9b68e923c Returns error instead of printf
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2025-06-30 09:32:49 +02:00
Bryan Frimin
364c6e4499 Generate excel in memory
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2025-06-30 09:31:56 +02:00
Bryan Frimin
ede3ea4e43 Fix SOA filename
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2025-06-30 07:22:13 +02:00
Bryan Frimin
c41d7439d1 Add SOA generator
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2025-06-30 00:31:21 +02:00
Bryan Frimin
c7c889e5ca Add frameworks totalCount support
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2025-06-09 20:14:47 -07:00
Sacha Al Himdani
a9a5f9cf49 Add fulltext search on risks, documents, and measures
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2025-06-09 15:11:36 -07:00