Add document classification

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
This commit is contained in:
Bryan Frimin
2025-10-22 16:23:30 +02:00
parent 36ef29299c
commit c7cabf23de
32 changed files with 891 additions and 229 deletions

View File

@@ -28,15 +28,16 @@ import (
type (
Document struct {
ID gid.GID `db:"id"`
OrganizationID gid.GID `db:"organization_id"`
OwnerID gid.GID `db:"owner_id"`
Title string `db:"title"`
DocumentType DocumentType `db:"document_type"`
CurrentPublishedVersion *int `db:"current_published_version"`
TrustCenterVisibility TrustCenterVisibility `db:"trust_center_visibility"`
CreatedAt time.Time `db:"created_at"`
UpdatedAt time.Time `db:"updated_at"`
ID gid.GID `db:"id"`
OrganizationID gid.GID `db:"organization_id"`
OwnerID gid.GID `db:"owner_id"`
Title string `db:"title"`
DocumentType DocumentType `db:"document_type"`
Classification DocumentClassification `db:"classification"`
CurrentPublishedVersion *int `db:"current_published_version"`
TrustCenterVisibility TrustCenterVisibility `db:"trust_center_visibility"`
CreatedAt time.Time `db:"created_at"`
UpdatedAt time.Time `db:"updated_at"`
}
Documents []*Document
@@ -68,6 +69,7 @@ SELECT
owner_id,
title,
document_type,
classification,
current_published_version,
trust_center_visibility,
created_at,
@@ -150,6 +152,7 @@ SELECT
owner_id,
title,
document_type,
classification,
current_published_version,
trust_center_visibility,
created_at,
@@ -200,6 +203,7 @@ SELECT
owner_id,
title,
document_type,
classification,
current_published_version,
trust_center_visibility,
created_at,
@@ -249,6 +253,7 @@ INSERT INTO
owner_id,
title,
document_type,
classification,
current_published_version,
trust_center_visibility,
created_at,
@@ -261,6 +266,7 @@ VALUES (
@owner_id,
@title,
@document_type,
@classification,
@current_published_version,
@trust_center_visibility,
@created_at,
@@ -275,6 +281,7 @@ VALUES (
"owner_id": p.OwnerID,
"title": p.Title,
"document_type": p.DocumentType,
"classification": p.Classification,
"current_published_version": p.CurrentPublishedVersion,
"trust_center_visibility": p.TrustCenterVisibility,
"created_at": p.CreatedAt,
@@ -334,6 +341,7 @@ SET
current_published_version = @current_published_version,
owner_id = @owner_id,
document_type = @document_type,
classification = @classification,
trust_center_visibility = @trust_center_visibility,
updated_at = @updated_at
WHERE
@@ -350,6 +358,7 @@ WHERE
"current_published_version": p.CurrentPublishedVersion,
"owner_id": p.OwnerID,
"document_type": p.DocumentType,
"classification": p.Classification,
"trust_center_visibility": p.TrustCenterVisibility,
}
maps.Copy(args, scope.SQLArguments())
@@ -427,6 +436,7 @@ WITH plcs AS (
p.owner_id,
p.title,
p.document_type,
p.classification,
p.current_published_version,
p.trust_center_visibility,
p.created_at,
@@ -445,6 +455,7 @@ SELECT
owner_id,
title,
document_type,
classification,
current_published_version,
trust_center_visibility,
created_at,
@@ -543,6 +554,7 @@ WITH plcs AS (
p.owner_id,
p.title,
p.document_type,
p.classification,
p.current_published_version,
p.trust_center_visibility,
p.created_at,
@@ -562,6 +574,7 @@ SELECT
owner_id,
title,
document_type,
classification,
current_published_version,
trust_center_visibility,
created_at,

View File

@@ -0,0 +1,49 @@
package coredata
import (
"database/sql/driver"
"fmt"
)
type DocumentClassification string
const (
DocumentClassificationPublic DocumentClassification = "PUBLIC"
DocumentClassificationInternal DocumentClassification = "INTERNAL"
DocumentClassificationConfidential DocumentClassification = "CONFIDENTIAL"
DocumentClassificationSecret DocumentClassification = "SECRET"
)
func (dc DocumentClassification) String() string {
switch dc {
case DocumentClassificationPublic:
return "PUBLIC"
case DocumentClassificationInternal:
return "INTERNAL"
case DocumentClassificationConfidential:
return "CONFIDENTIAL"
case DocumentClassificationSecret:
return "SECRET"
}
panic(fmt.Errorf("invalid DocumentClassification value: %s", string(dc)))
}
// Scan implements the sql.Scanner interface for database deserialization.
func (dc *DocumentClassification) Scan(value interface{}) error {
if value == nil {
return nil
}
sv, ok := value.(string)
if !ok {
return fmt.Errorf("failed to scan DocumentClassification: %v", value)
}
*dc = DocumentClassification(sv)
return nil
}
// Value implements the driver.Valuer interface for database serialization.
func (dc DocumentClassification) Value() (driver.Value, error) {
return string(dc), nil
}

View File

@@ -28,17 +28,18 @@ import (
type (
DocumentVersion struct {
ID gid.GID `db:"id"`
DocumentID gid.GID `db:"document_id"`
Title string `db:"title"`
OwnerID gid.GID `db:"owner_id"`
VersionNumber int `db:"version_number"`
Content string `db:"content"`
Changelog string `db:"changelog"`
Status DocumentStatus `db:"status"`
PublishedAt *time.Time `db:"published_at"`
CreatedAt time.Time `db:"created_at"`
UpdatedAt time.Time `db:"updated_at"`
ID gid.GID `db:"id"`
DocumentID gid.GID `db:"document_id"`
Title string `db:"title"`
OwnerID gid.GID `db:"owner_id"`
VersionNumber int `db:"version_number"`
Classification DocumentClassification `db:"classification"`
Content string `db:"content"`
Changelog string `db:"changelog"`
Status DocumentStatus `db:"status"`
PublishedAt *time.Time `db:"published_at"`
CreatedAt time.Time `db:"created_at"`
UpdatedAt time.Time `db:"updated_at"`
}
DocumentVersions []*DocumentVersion
@@ -58,6 +59,7 @@ SELECT
title,
owner_id,
version_number,
classification,
content,
changelog,
status,
@@ -116,6 +118,7 @@ SELECT
title,
owner_id,
version_number,
classification,
content,
changelog,
status,
@@ -165,6 +168,7 @@ INSERT INTO document_versions (
title,
owner_id,
version_number,
classification,
content,
changelog,
status,
@@ -178,6 +182,7 @@ VALUES (
@title,
@owner_id,
@version_number,
@classification,
@content,
@changelog,
@status,
@@ -192,6 +197,7 @@ VALUES (
"title": p.Title,
"owner_id": p.OwnerID,
"version_number": p.VersionNumber,
"classification": p.Classification,
"content": p.Content,
"changelog": p.Changelog,
"status": p.Status,
@@ -221,6 +227,7 @@ SELECT
title,
owner_id,
version_number,
classification,
content,
changelog,
status,
@@ -272,6 +279,7 @@ SELECT
title,
owner_id,
version_number,
classification,
content,
changelog,
status,
@@ -321,6 +329,7 @@ SELECT
title,
owner_id,
version_number,
classification,
content,
changelog,
status,
@@ -372,6 +381,7 @@ UPDATE document_versions SET
status = @status,
content = @content,
published_at = @published_at,
classification = @classification,
updated_at = @updated_at
WHERE %s
AND id = @document_version_id
@@ -387,6 +397,7 @@ WHERE %s
"status": p.Status,
"content": p.Content,
"published_at": p.PublishedAt,
"classification": p.Classification,
"updated_at": p.UpdatedAt,
}
maps.Copy(args, scope.SQLArguments())

View File

@@ -0,0 +1,12 @@
CREATE TYPE document_classification AS ENUM (
'PUBLIC',
'INTERNAL',
'CONFIDENTIAL',
'SECRET'
);
ALTER TABLE documents ADD COLUMN classification document_classification NOT NULL DEFAULT 'CONFIDENTIAL';
ALTER TABLE documents ALTER COLUMN classification DROP DEFAULT;
ALTER TABLE document_versions ADD COLUMN classification document_classification NOT NULL DEFAULT 'CONFIDENTIAL';
ALTER TABLE document_versions ALTER COLUMN classification DROP DEFAULT;

View File

@@ -45,10 +45,20 @@ type (
Title string
Content string
OwnerID gid.GID
Classification coredata.DocumentClassification
DocumentType coredata.DocumentType
TrustCenterVisibility *coredata.TrustCenterVisibility
}
UpdateDocumentRequest struct {
DocumentID gid.GID
Title *string
OwnerID *gid.GID
Classification *coredata.DocumentClassification
DocumentType *coredata.DocumentType
TrustCenterVisibility *coredata.TrustCenterVisibility
}
UpdateDocumentVersionRequest struct {
ID gid.GID
Content string
@@ -308,6 +318,7 @@ func (s *DocumentService) Create(
Title: req.Title,
DocumentType: req.DocumentType,
TrustCenterVisibility: coredata.TrustCenterVisibilityNone,
Classification: req.Classification,
CreatedAt: now,
UpdatedAt: now,
}
@@ -317,15 +328,16 @@ func (s *DocumentService) Create(
}
documentVersion := &coredata.DocumentVersion{
ID: documentVersionID,
DocumentID: documentID,
Title: req.Title,
OwnerID: req.OwnerID,
VersionNumber: 1,
Content: req.Content,
Status: coredata.DocumentStatusDraft,
CreatedAt: now,
UpdatedAt: now,
ID: documentVersionID,
DocumentID: documentID,
Title: req.Title,
OwnerID: req.OwnerID,
VersionNumber: 1,
Content: req.Content,
Status: coredata.DocumentStatusDraft,
Classification: req.Classification,
CreatedAt: now,
UpdatedAt: now,
}
err := s.svc.pg.WithTx(
@@ -563,6 +575,7 @@ func (s *DocumentService) UpdateVersion(
documentVersion.Title = document.Title
documentVersion.OwnerID = document.OwnerID
documentVersion.Classification = document.Classification
documentVersion.Content = req.Content
documentVersion.UpdatedAt = time.Now()
@@ -764,6 +777,7 @@ func (s *DocumentService) CreateDraft(
draftVersion.Title = document.Title
draftVersion.OwnerID = document.OwnerID
draftVersion.VersionNumber = latestVersion.VersionNumber + 1
draftVersion.Classification = document.Classification
draftVersion.Content = latestVersion.Content
draftVersion.Status = coredata.DocumentStatusDraft
draftVersion.CreatedAt = now
@@ -1108,11 +1122,7 @@ func (s *DocumentService) ListForRiskID(
func (s *DocumentService) Update(
ctx context.Context,
documentID gid.GID,
newOwnerID *gid.GID,
documentType *coredata.DocumentType,
title *string,
trustCenterVisibility *coredata.TrustCenterVisibility,
req UpdateDocumentRequest,
) (*coredata.Document, error) {
document := &coredata.Document{}
people := &coredata.People{}
@@ -1121,27 +1131,35 @@ func (s *DocumentService) Update(
err := s.svc.pg.WithTx(
ctx,
func(tx pg.Conn) error {
if err := document.LoadByID(ctx, tx, s.svc.scope, documentID); err != nil {
return fmt.Errorf("cannot load document %q: %w", documentID, err)
if err := document.LoadByID(ctx, tx, s.svc.scope, req.DocumentID); err != nil {
return fmt.Errorf("cannot load document %q: %w", req.DocumentID, err)
}
if newOwnerID != nil {
if err := people.LoadByID(ctx, tx, s.svc.scope, *newOwnerID); err != nil {
return fmt.Errorf("cannot load new owner %q: %w", *newOwnerID, err)
if req.Title != nil {
document.Title = *req.Title
}
if req.Classification != nil {
document.Classification = *req.Classification
}
if req.DocumentType != nil {
document.DocumentType = *req.DocumentType
}
if req.DocumentType != nil {
document.DocumentType = *req.DocumentType
}
if req.TrustCenterVisibility != nil {
document.TrustCenterVisibility = *req.TrustCenterVisibility
}
if req.OwnerID != nil {
if err := people.LoadByID(ctx, tx, s.svc.scope, *req.OwnerID); err != nil {
return fmt.Errorf("cannot load owner %q: %w", *req.OwnerID, err)
}
document.OwnerID = *newOwnerID
}
if documentType != nil {
document.DocumentType = *documentType
}
if title != nil {
document.Title = *title
}
if trustCenterVisibility != nil {
document.TrustCenterVisibility = *trustCenterVisibility
document.OwnerID = people.ID
}
document.UpdatedAt = now

View File

@@ -95,11 +95,17 @@ enum PeopleKind
enum InvitationStatus
@goModel(model: "github.com/getprobo/probo/pkg/coredata.InvitationStatus") {
PENDING
@goEnum(value: "github.com/getprobo/probo/pkg/coredata.InvitationStatusPending")
@goEnum(
value: "github.com/getprobo/probo/pkg/coredata.InvitationStatusPending"
)
ACCEPTED
@goEnum(value: "github.com/getprobo/probo/pkg/coredata.InvitationStatusAccepted")
@goEnum(
value: "github.com/getprobo/probo/pkg/coredata.InvitationStatusAccepted"
)
EXPIRED
@goEnum(value: "github.com/getprobo/probo/pkg/coredata.InvitationStatusExpired")
@goEnum(
value: "github.com/getprobo/probo/pkg/coredata.InvitationStatusExpired"
)
}
enum DocumentStatus
@@ -961,6 +967,28 @@ enum DocumentType
)
}
enum DocumentClassification
@goModel(
model: "github.com/getprobo/probo/pkg/coredata.DocumentClassification"
) {
PUBLIC
@goEnum(
value: "github.com/getprobo/probo/pkg/coredata.DocumentClassificationPublic"
)
INTERNAL
@goEnum(
value: "github.com/getprobo/probo/pkg/coredata.DocumentClassificationInternal"
)
CONFIDENTIAL
@goEnum(
value: "github.com/getprobo/probo/pkg/coredata.DocumentClassificationConfidential"
)
SECRET
@goEnum(
value: "github.com/getprobo/probo/pkg/coredata.DocumentClassificationSecret"
)
}
enum AssetType
@goModel(model: "github.com/getprobo/probo/pkg/coredata.AssetType") {
PHYSICAL
@@ -1220,7 +1248,9 @@ enum SnapshotOrderField
}
enum MembershipOrderField
@goModel(model: "github.com/getprobo/probo/pkg/coredata.MembershipOrderField") {
@goModel(
model: "github.com/getprobo/probo/pkg/coredata.MembershipOrderField"
) {
FULL_NAME
@goEnum(
value: "github.com/getprobo/probo/pkg/coredata.MembershipOrderFieldFullName"
@@ -1240,7 +1270,9 @@ enum MembershipOrderField
}
enum InvitationOrderField
@goModel(model: "github.com/getprobo/probo/pkg/coredata.InvitationOrderField") {
@goModel(
model: "github.com/getprobo/probo/pkg/coredata.InvitationOrderField"
) {
FULL_NAME
@goEnum(
value: "github.com/getprobo/probo/pkg/coredata.InvitationOrderFieldFullName"
@@ -2077,6 +2109,7 @@ type Document implements Node {
title: String!
description: String!
documentType: DocumentType!
classification: DocumentClassification!
currentPublishedVersion: Int
trustCenterVisibility: TrustCenterVisibility!
owner: People! @goField(forceResolver: true)
@@ -3540,6 +3573,7 @@ input CreateDocumentInput {
content: String!
ownerId: ID!
documentType: DocumentType!
classification: DocumentClassification!
trustCenterVisibility: TrustCenterVisibility
}
@@ -3549,6 +3583,7 @@ input UpdateDocumentInput {
content: String
ownerId: ID
documentType: DocumentType
classification: DocumentClassification
trustCenterVisibility: TrustCenterVisibility
}
@@ -4174,6 +4209,7 @@ type DocumentVersion implements Node {
content: String!
changelog: String!
title: String!
classification: DocumentClassification!
owner: People! @goField(forceResolver: true)
signatures(

View File

@@ -607,6 +607,7 @@ type ComplexityRoot struct {
}
Document struct {
Classification func(childComplexity int) int
Controls func(childComplexity int, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.ControlOrderBy, filter *types.ControlFilter) int
CreatedAt func(childComplexity int) int
CurrentPublishedVersion func(childComplexity int) int
@@ -633,18 +634,19 @@ type ComplexityRoot struct {
}
DocumentVersion struct {
Changelog func(childComplexity int) int
Content func(childComplexity int) int
CreatedAt func(childComplexity int) int
Document func(childComplexity int) int
ID func(childComplexity int) int
Owner func(childComplexity int) int
PublishedAt func(childComplexity int) int
Signatures func(childComplexity int, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.DocumentVersionSignatureOrder, filter *types.DocumentVersionSignatureFilter) int
Status func(childComplexity int) int
Title func(childComplexity int) int
UpdatedAt func(childComplexity int) int
Version func(childComplexity int) int
Changelog func(childComplexity int) int
Classification func(childComplexity int) int
Content func(childComplexity int) int
CreatedAt func(childComplexity int) int
Document func(childComplexity int) int
ID func(childComplexity int) int
Owner func(childComplexity int) int
PublishedAt func(childComplexity int) int
Signatures func(childComplexity int, first *int, after *page.CursorKey, last *int, before *page.CursorKey, orderBy *types.DocumentVersionSignatureOrder, filter *types.DocumentVersionSignatureFilter) int
Status func(childComplexity int) int
Title func(childComplexity int) int
UpdatedAt func(childComplexity int) int
Version func(childComplexity int) int
}
DocumentVersionConnection struct {
@@ -3487,6 +3489,13 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin
return e.complexity.DeleteVendorServicePayload.DeletedVendorServiceID(childComplexity), true
case "Document.classification":
if e.complexity.Document.Classification == nil {
break
}
return e.complexity.Document.Classification(childComplexity), true
case "Document.controls":
if e.complexity.Document.Controls == nil {
break
@@ -3623,6 +3632,13 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin
return e.complexity.DocumentVersion.Changelog(childComplexity), true
case "DocumentVersion.classification":
if e.complexity.DocumentVersion.Classification == nil {
break
}
return e.complexity.DocumentVersion.Classification(childComplexity), true
case "DocumentVersion.content":
if e.complexity.DocumentVersion.Content == nil {
break
@@ -9146,11 +9162,17 @@ enum PeopleKind
enum InvitationStatus
@goModel(model: "github.com/getprobo/probo/pkg/coredata.InvitationStatus") {
PENDING
@goEnum(value: "github.com/getprobo/probo/pkg/coredata.InvitationStatusPending")
@goEnum(
value: "github.com/getprobo/probo/pkg/coredata.InvitationStatusPending"
)
ACCEPTED
@goEnum(value: "github.com/getprobo/probo/pkg/coredata.InvitationStatusAccepted")
@goEnum(
value: "github.com/getprobo/probo/pkg/coredata.InvitationStatusAccepted"
)
EXPIRED
@goEnum(value: "github.com/getprobo/probo/pkg/coredata.InvitationStatusExpired")
@goEnum(
value: "github.com/getprobo/probo/pkg/coredata.InvitationStatusExpired"
)
}
enum DocumentStatus
@@ -10012,6 +10034,28 @@ enum DocumentType
)
}
enum DocumentClassification
@goModel(
model: "github.com/getprobo/probo/pkg/coredata.DocumentClassification"
) {
PUBLIC
@goEnum(
value: "github.com/getprobo/probo/pkg/coredata.DocumentClassificationPublic"
)
INTERNAL
@goEnum(
value: "github.com/getprobo/probo/pkg/coredata.DocumentClassificationInternal"
)
CONFIDENTIAL
@goEnum(
value: "github.com/getprobo/probo/pkg/coredata.DocumentClassificationConfidential"
)
SECRET
@goEnum(
value: "github.com/getprobo/probo/pkg/coredata.DocumentClassificationSecret"
)
}
enum AssetType
@goModel(model: "github.com/getprobo/probo/pkg/coredata.AssetType") {
PHYSICAL
@@ -10271,7 +10315,9 @@ enum SnapshotOrderField
}
enum MembershipOrderField
@goModel(model: "github.com/getprobo/probo/pkg/coredata.MembershipOrderField") {
@goModel(
model: "github.com/getprobo/probo/pkg/coredata.MembershipOrderField"
) {
FULL_NAME
@goEnum(
value: "github.com/getprobo/probo/pkg/coredata.MembershipOrderFieldFullName"
@@ -10291,7 +10337,9 @@ enum MembershipOrderField
}
enum InvitationOrderField
@goModel(model: "github.com/getprobo/probo/pkg/coredata.InvitationOrderField") {
@goModel(
model: "github.com/getprobo/probo/pkg/coredata.InvitationOrderField"
) {
FULL_NAME
@goEnum(
value: "github.com/getprobo/probo/pkg/coredata.InvitationOrderFieldFullName"
@@ -11128,6 +11176,7 @@ type Document implements Node {
title: String!
description: String!
documentType: DocumentType!
classification: DocumentClassification!
currentPublishedVersion: Int
trustCenterVisibility: TrustCenterVisibility!
owner: People! @goField(forceResolver: true)
@@ -12591,6 +12640,7 @@ input CreateDocumentInput {
content: String!
ownerId: ID!
documentType: DocumentType!
classification: DocumentClassification!
trustCenterVisibility: TrustCenterVisibility
}
@@ -12600,6 +12650,7 @@ input UpdateDocumentInput {
content: String
ownerId: ID
documentType: DocumentType
classification: DocumentClassification
trustCenterVisibility: TrustCenterVisibility
}
@@ -13225,6 +13276,7 @@ type DocumentVersion implements Node {
content: String!
changelog: String!
title: String!
classification: DocumentClassification!
owner: People! @goField(forceResolver: true)
signatures(
@@ -32063,6 +32115,50 @@ func (ec *executionContext) fieldContext_Document_documentType(_ context.Context
return fc, nil
}
func (ec *executionContext) _Document_classification(ctx context.Context, field graphql.CollectedField, obj *types.Document) (ret graphql.Marshaler) {
fc, err := ec.fieldContext_Document_classification(ctx, field)
if err != nil {
return graphql.Null
}
ctx = graphql.WithFieldContext(ctx, fc)
defer func() {
if r := recover(); r != nil {
ec.Error(ctx, ec.Recover(ctx, r))
ret = graphql.Null
}
}()
resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
ctx = rctx // use context from middleware stack in children
return obj.Classification, nil
})
if err != nil {
ec.Error(ctx, err)
return graphql.Null
}
if resTmp == nil {
if !graphql.HasFieldError(ctx, fc) {
ec.Errorf(ctx, "must not be null")
}
return graphql.Null
}
res := resTmp.(coredata.DocumentClassification)
fc.Result = res
return ec.marshalNDocumentClassification2githubᚗcomᚋgetproboᚋproboᚋpkgᚋcoredataᚐDocumentClassification(ctx, field.Selections, res)
}
func (ec *executionContext) fieldContext_Document_classification(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
fc = &graphql.FieldContext{
Object: "Document",
Field: field,
IsMethod: false,
IsResolver: false,
Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
return nil, errors.New("field of type DocumentClassification does not have child fields")
},
}
return fc, nil
}
func (ec *executionContext) _Document_currentPublishedVersion(ctx context.Context, field graphql.CollectedField, obj *types.Document) (ret graphql.Marshaler) {
fc, err := ec.fieldContext_Document_currentPublishedVersion(ctx, field)
if err != nil {
@@ -32773,6 +32869,8 @@ func (ec *executionContext) fieldContext_DocumentEdge_node(_ context.Context, fi
return ec.fieldContext_Document_description(ctx, field)
case "documentType":
return ec.fieldContext_Document_documentType(ctx, field)
case "classification":
return ec.fieldContext_Document_classification(ctx, field)
case "currentPublishedVersion":
return ec.fieldContext_Document_currentPublishedVersion(ctx, field)
case "trustCenterVisibility":
@@ -32887,6 +32985,8 @@ func (ec *executionContext) fieldContext_DocumentVersion_document(_ context.Cont
return ec.fieldContext_Document_description(ctx, field)
case "documentType":
return ec.fieldContext_Document_documentType(ctx, field)
case "classification":
return ec.fieldContext_Document_classification(ctx, field)
case "currentPublishedVersion":
return ec.fieldContext_Document_currentPublishedVersion(ctx, field)
case "trustCenterVisibility":
@@ -33130,6 +33230,50 @@ func (ec *executionContext) fieldContext_DocumentVersion_title(_ context.Context
return fc, nil
}
func (ec *executionContext) _DocumentVersion_classification(ctx context.Context, field graphql.CollectedField, obj *types.DocumentVersion) (ret graphql.Marshaler) {
fc, err := ec.fieldContext_DocumentVersion_classification(ctx, field)
if err != nil {
return graphql.Null
}
ctx = graphql.WithFieldContext(ctx, fc)
defer func() {
if r := recover(); r != nil {
ec.Error(ctx, ec.Recover(ctx, r))
ret = graphql.Null
}
}()
resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (any, error) {
ctx = rctx // use context from middleware stack in children
return obj.Classification, nil
})
if err != nil {
ec.Error(ctx, err)
return graphql.Null
}
if resTmp == nil {
if !graphql.HasFieldError(ctx, fc) {
ec.Errorf(ctx, "must not be null")
}
return graphql.Null
}
res := resTmp.(coredata.DocumentClassification)
fc.Result = res
return ec.marshalNDocumentClassification2githubᚗcomᚋgetproboᚋproboᚋpkgᚋcoredataᚐDocumentClassification(ctx, field.Selections, res)
}
func (ec *executionContext) fieldContext_DocumentVersion_classification(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
fc = &graphql.FieldContext{
Object: "DocumentVersion",
Field: field,
IsMethod: false,
IsResolver: false,
Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
return nil, errors.New("field of type DocumentClassification does not have child fields")
},
}
return fc, nil
}
func (ec *executionContext) _DocumentVersion_owner(ctx context.Context, field graphql.CollectedField, obj *types.DocumentVersion) (ret graphql.Marshaler) {
fc, err := ec.fieldContext_DocumentVersion_owner(ctx, field)
if err != nil {
@@ -33587,6 +33731,8 @@ func (ec *executionContext) fieldContext_DocumentVersionEdge_node(_ context.Cont
return ec.fieldContext_DocumentVersion_changelog(ctx, field)
case "title":
return ec.fieldContext_DocumentVersion_title(ctx, field)
case "classification":
return ec.fieldContext_DocumentVersion_classification(ctx, field)
case "owner":
return ec.fieldContext_DocumentVersion_owner(ctx, field)
case "signatures":
@@ -33701,6 +33847,8 @@ func (ec *executionContext) fieldContext_DocumentVersionSignature_documentVersio
return ec.fieldContext_DocumentVersion_changelog(ctx, field)
case "title":
return ec.fieldContext_DocumentVersion_title(ctx, field)
case "classification":
return ec.fieldContext_DocumentVersion_classification(ctx, field)
case "owner":
return ec.fieldContext_DocumentVersion_owner(ctx, field)
case "signatures":
@@ -51743,6 +51891,8 @@ func (ec *executionContext) fieldContext_PublishDocumentVersionPayload_documentV
return ec.fieldContext_DocumentVersion_changelog(ctx, field)
case "title":
return ec.fieldContext_DocumentVersion_title(ctx, field)
case "classification":
return ec.fieldContext_DocumentVersion_classification(ctx, field)
case "owner":
return ec.fieldContext_DocumentVersion_owner(ctx, field)
case "signatures":
@@ -51807,6 +51957,8 @@ func (ec *executionContext) fieldContext_PublishDocumentVersionPayload_document(
return ec.fieldContext_Document_description(ctx, field)
case "documentType":
return ec.fieldContext_Document_documentType(ctx, field)
case "classification":
return ec.fieldContext_Document_classification(ctx, field)
case "currentPublishedVersion":
return ec.fieldContext_Document_currentPublishedVersion(ctx, field)
case "trustCenterVisibility":
@@ -57128,6 +57280,8 @@ func (ec *executionContext) fieldContext_TrustCenterDocumentAccess_document(_ co
return ec.fieldContext_Document_description(ctx, field)
case "documentType":
return ec.fieldContext_Document_documentType(ctx, field)
case "classification":
return ec.fieldContext_Document_classification(ctx, field)
case "currentPublishedVersion":
return ec.fieldContext_Document_currentPublishedVersion(ctx, field)
case "trustCenterVisibility":
@@ -58597,6 +58751,8 @@ func (ec *executionContext) fieldContext_UpdateDocumentPayload_document(_ contex
return ec.fieldContext_Document_description(ctx, field)
case "documentType":
return ec.fieldContext_Document_documentType(ctx, field)
case "classification":
return ec.fieldContext_Document_classification(ctx, field)
case "currentPublishedVersion":
return ec.fieldContext_Document_currentPublishedVersion(ctx, field)
case "trustCenterVisibility":
@@ -58673,6 +58829,8 @@ func (ec *executionContext) fieldContext_UpdateDocumentVersionPayload_documentVe
return ec.fieldContext_DocumentVersion_changelog(ctx, field)
case "title":
return ec.fieldContext_DocumentVersion_title(ctx, field)
case "classification":
return ec.fieldContext_DocumentVersion_classification(ctx, field)
case "owner":
return ec.fieldContext_DocumentVersion_owner(ctx, field)
case "signatures":
@@ -69128,7 +69286,7 @@ func (ec *executionContext) unmarshalInputCreateDocumentInput(ctx context.Contex
asMap[k] = v
}
fieldsInOrder := [...]string{"organizationId", "title", "content", "ownerId", "documentType", "trustCenterVisibility"}
fieldsInOrder := [...]string{"organizationId", "title", "content", "ownerId", "documentType", "classification", "trustCenterVisibility"}
for _, k := range fieldsInOrder {
v, ok := asMap[k]
if !ok {
@@ -69170,6 +69328,13 @@ func (ec *executionContext) unmarshalInputCreateDocumentInput(ctx context.Contex
return it, err
}
it.DocumentType = data
case "classification":
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("classification"))
data, err := ec.unmarshalNDocumentClassification2githubᚗcomᚋgetproboᚋproboᚋpkgᚋcoredataᚐDocumentClassification(ctx, v)
if err != nil {
return it, err
}
it.Classification = data
case "trustCenterVisibility":
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("trustCenterVisibility"))
data, err := ec.unmarshalOTrustCenterVisibility2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋcoredataᚐTrustCenterVisibility(ctx, v)
@@ -73421,7 +73586,7 @@ func (ec *executionContext) unmarshalInputUpdateDocumentInput(ctx context.Contex
asMap[k] = v
}
fieldsInOrder := [...]string{"id", "title", "content", "ownerId", "documentType", "trustCenterVisibility"}
fieldsInOrder := [...]string{"id", "title", "content", "ownerId", "documentType", "classification", "trustCenterVisibility"}
for _, k := range fieldsInOrder {
v, ok := asMap[k]
if !ok {
@@ -73463,6 +73628,13 @@ func (ec *executionContext) unmarshalInputUpdateDocumentInput(ctx context.Contex
return it, err
}
it.DocumentType = data
case "classification":
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("classification"))
data, err := ec.unmarshalODocumentClassification2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋcoredataᚐDocumentClassification(ctx, v)
if err != nil {
return it, err
}
it.Classification = data
case "trustCenterVisibility":
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("trustCenterVisibility"))
data, err := ec.unmarshalOTrustCenterVisibility2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋcoredataᚐTrustCenterVisibility(ctx, v)
@@ -80617,6 +80789,11 @@ func (ec *executionContext) _Document(ctx context.Context, sel ast.SelectionSet,
if out.Values[i] == graphql.Null {
atomic.AddUint32(&out.Invalids, 1)
}
case "classification":
out.Values[i] = ec._Document_classification(ctx, field, obj)
if out.Values[i] == graphql.Null {
atomic.AddUint32(&out.Invalids, 1)
}
case "currentPublishedVersion":
out.Values[i] = ec._Document_currentPublishedVersion(ctx, field, obj)
case "trustCenterVisibility":
@@ -81002,6 +81179,11 @@ func (ec *executionContext) _DocumentVersion(ctx context.Context, sel ast.Select
if out.Values[i] == graphql.Null {
atomic.AddUint32(&out.Invalids, 1)
}
case "classification":
out.Values[i] = ec._DocumentVersion_classification(ctx, field, obj)
if out.Values[i] == graphql.Null {
atomic.AddUint32(&out.Invalids, 1)
}
case "owner":
field := field
@@ -95590,6 +95772,38 @@ func (ec *executionContext) marshalNDocument2ᚖgithubᚗcomᚋgetproboᚋprobo
return ec._Document(ctx, sel, v)
}
func (ec *executionContext) unmarshalNDocumentClassification2githubᚗcomᚋgetproboᚋproboᚋpkgᚋcoredataᚐDocumentClassification(ctx context.Context, v any) (coredata.DocumentClassification, error) {
tmp, err := graphql.UnmarshalString(v)
res := unmarshalNDocumentClassification2githubᚗcomᚋgetproboᚋproboᚋpkgᚋcoredataᚐDocumentClassification[tmp]
return res, graphql.ErrorOnPath(ctx, err)
}
func (ec *executionContext) marshalNDocumentClassification2githubᚗcomᚋgetproboᚋproboᚋpkgᚋcoredataᚐDocumentClassification(ctx context.Context, sel ast.SelectionSet, v coredata.DocumentClassification) graphql.Marshaler {
_ = sel
res := graphql.MarshalString(marshalNDocumentClassification2githubᚗcomᚋgetproboᚋproboᚋpkgᚋcoredataᚐDocumentClassification[v])
if res == graphql.Null {
if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {
ec.Errorf(ctx, "the requested element is null which the schema does not allow")
}
}
return res
}
var (
unmarshalNDocumentClassification2githubᚗcomᚋgetproboᚋproboᚋpkgᚋcoredataᚐDocumentClassification = map[string]coredata.DocumentClassification{
"PUBLIC": coredata.DocumentClassificationPublic,
"INTERNAL": coredata.DocumentClassificationInternal,
"CONFIDENTIAL": coredata.DocumentClassificationConfidential,
"SECRET": coredata.DocumentClassificationSecret,
}
marshalNDocumentClassification2githubᚗcomᚋgetproboᚋproboᚋpkgᚋcoredataᚐDocumentClassification = map[coredata.DocumentClassification]string{
coredata.DocumentClassificationPublic: "PUBLIC",
coredata.DocumentClassificationInternal: "INTERNAL",
coredata.DocumentClassificationConfidential: "CONFIDENTIAL",
coredata.DocumentClassificationSecret: "SECRET",
}
)
func (ec *executionContext) marshalNDocumentConnection2githubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋconsoleᚋv1ᚋtypesᚐDocumentConnection(ctx context.Context, sel ast.SelectionSet, v types.DocumentConnection) graphql.Marshaler {
return ec._DocumentConnection(ctx, sel, &v)
}
@@ -101170,6 +101384,40 @@ func (ec *executionContext) marshalODocument2ᚖgithubᚗcomᚋgetproboᚋprobo
return ec._Document(ctx, sel, v)
}
func (ec *executionContext) unmarshalODocumentClassification2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋcoredataᚐDocumentClassification(ctx context.Context, v any) (*coredata.DocumentClassification, error) {
if v == nil {
return nil, nil
}
tmp, err := graphql.UnmarshalString(v)
res := unmarshalODocumentClassification2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋcoredataᚐDocumentClassification[tmp]
return &res, graphql.ErrorOnPath(ctx, err)
}
func (ec *executionContext) marshalODocumentClassification2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋcoredataᚐDocumentClassification(ctx context.Context, sel ast.SelectionSet, v *coredata.DocumentClassification) graphql.Marshaler {
if v == nil {
return graphql.Null
}
_ = sel
_ = ctx
res := graphql.MarshalString(marshalODocumentClassification2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋcoredataᚐDocumentClassification[*v])
return res
}
var (
unmarshalODocumentClassification2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋcoredataᚐDocumentClassification = map[string]coredata.DocumentClassification{
"PUBLIC": coredata.DocumentClassificationPublic,
"INTERNAL": coredata.DocumentClassificationInternal,
"CONFIDENTIAL": coredata.DocumentClassificationConfidential,
"SECRET": coredata.DocumentClassificationSecret,
}
marshalODocumentClassification2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋcoredataᚐDocumentClassification = map[coredata.DocumentClassification]string{
coredata.DocumentClassificationPublic: "PUBLIC",
coredata.DocumentClassificationInternal: "INTERNAL",
coredata.DocumentClassificationConfidential: "CONFIDENTIAL",
coredata.DocumentClassificationSecret: "SECRET",
}
)
func (ec *executionContext) unmarshalODocumentFilter2ᚖgithubᚗcomᚋgetproboᚋproboᚋpkgᚋserverᚋapiᚋconsoleᚋv1ᚋtypesᚐDocumentFilter(ctx context.Context, v any) (*types.DocumentFilter, error) {
if v == nil {
return nil, nil

View File

@@ -78,6 +78,7 @@ func NewDocument(document *coredata.Document) *Document {
ID: document.ID,
Title: document.Title,
DocumentType: document.DocumentType,
Classification: document.Classification,
CurrentPublishedVersion: document.CurrentPublishedVersion,
TrustCenterVisibility: document.TrustCenterVisibility,
CreatedAt: document.CreatedAt,

View File

@@ -54,14 +54,15 @@ func NewDocumentVersionEdge(documentVersion *coredata.DocumentVersion, orderBy c
func NewDocumentVersion(documentVersion *coredata.DocumentVersion) *DocumentVersion {
return &DocumentVersion{
ID: documentVersion.ID,
Version: documentVersion.VersionNumber,
Title: documentVersion.Title,
Content: documentVersion.Content,
Status: documentVersion.Status,
PublishedAt: documentVersion.PublishedAt,
Changelog: documentVersion.Changelog,
CreatedAt: documentVersion.CreatedAt,
UpdatedAt: documentVersion.UpdatedAt,
ID: documentVersion.ID,
Version: documentVersion.VersionNumber,
Title: documentVersion.Title,
Content: documentVersion.Content,
Status: documentVersion.Status,
Classification: documentVersion.Classification,
PublishedAt: documentVersion.PublishedAt,
Changelog: documentVersion.Changelog,
CreatedAt: documentVersion.CreatedAt,
UpdatedAt: documentVersion.UpdatedAt,
}
}

View File

@@ -351,6 +351,7 @@ type CreateDocumentInput struct {
Content string `json:"content"`
OwnerID gid.GID `json:"ownerId"`
DocumentType coredata.DocumentType `json:"documentType"`
Classification coredata.DocumentClassification `json:"classification"`
TrustCenterVisibility *coredata.TrustCenterVisibility `json:"trustCenterVisibility,omitempty"`
}
@@ -1006,18 +1007,19 @@ type DeleteVendorServicePayload struct {
}
type Document struct {
ID gid.GID `json:"id"`
Title string `json:"title"`
Description string `json:"description"`
DocumentType coredata.DocumentType `json:"documentType"`
CurrentPublishedVersion *int `json:"currentPublishedVersion,omitempty"`
TrustCenterVisibility coredata.TrustCenterVisibility `json:"trustCenterVisibility"`
Owner *People `json:"owner"`
Organization *Organization `json:"organization"`
Versions *DocumentVersionConnection `json:"versions"`
Controls *ControlConnection `json:"controls"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
ID gid.GID `json:"id"`
Title string `json:"title"`
Description string `json:"description"`
DocumentType coredata.DocumentType `json:"documentType"`
Classification coredata.DocumentClassification `json:"classification"`
CurrentPublishedVersion *int `json:"currentPublishedVersion,omitempty"`
TrustCenterVisibility coredata.TrustCenterVisibility `json:"trustCenterVisibility"`
Owner *People `json:"owner"`
Organization *Organization `json:"organization"`
Versions *DocumentVersionConnection `json:"versions"`
Controls *ControlConnection `json:"controls"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
}
func (Document) IsNode() {}
@@ -1033,18 +1035,19 @@ type DocumentFilter struct {
}
type DocumentVersion struct {
ID gid.GID `json:"id"`
Document *Document `json:"document"`
Status coredata.DocumentStatus `json:"status"`
Version int `json:"version"`
Content string `json:"content"`
Changelog string `json:"changelog"`
Title string `json:"title"`
Owner *People `json:"owner"`
Signatures *DocumentVersionSignatureConnection `json:"signatures"`
PublishedAt *time.Time `json:"publishedAt,omitempty"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
ID gid.GID `json:"id"`
Document *Document `json:"document"`
Status coredata.DocumentStatus `json:"status"`
Version int `json:"version"`
Content string `json:"content"`
Changelog string `json:"changelog"`
Title string `json:"title"`
Classification coredata.DocumentClassification `json:"classification"`
Owner *People `json:"owner"`
Signatures *DocumentVersionSignatureConnection `json:"signatures"`
PublishedAt *time.Time `json:"publishedAt,omitempty"`
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
}
func (DocumentVersion) IsNode() {}
@@ -1789,12 +1792,13 @@ type UpdateDatumPayload struct {
}
type UpdateDocumentInput struct {
ID gid.GID `json:"id"`
Title *string `json:"title,omitempty"`
Content *string `json:"content,omitempty"`
OwnerID *gid.GID `json:"ownerId,omitempty"`
DocumentType *coredata.DocumentType `json:"documentType,omitempty"`
TrustCenterVisibility *coredata.TrustCenterVisibility `json:"trustCenterVisibility,omitempty"`
ID gid.GID `json:"id"`
Title *string `json:"title,omitempty"`
Content *string `json:"content,omitempty"`
OwnerID *gid.GID `json:"ownerId,omitempty"`
DocumentType *coredata.DocumentType `json:"documentType,omitempty"`
Classification *coredata.DocumentClassification `json:"classification,omitempty"`
TrustCenterVisibility *coredata.TrustCenterVisibility `json:"trustCenterVisibility,omitempty"`
}
type UpdateDocumentPayload struct {

View File

@@ -2566,11 +2566,14 @@ func (r *mutationResolver) UpdateDocument(ctx context.Context, input types.Updat
document, err := prb.Documents.Update(
ctx,
input.ID,
input.OwnerID,
input.DocumentType,
input.Title,
input.TrustCenterVisibility,
probo.UpdateDocumentRequest{
DocumentID: input.ID,
Title: input.Title,
OwnerID: input.OwnerID,
Classification: input.Classification,
DocumentType: input.DocumentType,
TrustCenterVisibility: input.TrustCenterVisibility,
},
)
if err != nil {