Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add ent schemas and project config files #1

Merged
merged 12 commits into from
Apr 23, 2024
28 changes: 28 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# --------------------------------------------------------------
# SPDX-FileCopyrightText: Copyright © 2024 The Protobom Authors
# SPDX-FileType: SOURCE
# SPDX-License-Identifier: Apache-2.0
# --------------------------------------------------------------
BASH := ${shell type -p bash}
SHELL := ${BASH}

# ANSI color escape codes
BOLD := \033[1m
CYAN := \033[36m
YELLOW := \033[33m
RESET := \033[0m

.PHONY: help
help: # Display this help
@awk 'BEGIN {FS = ":.*#"; printf "\n${YELLOW}Usage: make <target>${RESET}\n\n"} \
/^[a-zA-Z_0-9-]+:.*?#/ { printf " ${CYAN}%-20s${RESET} %s\n", $$1, $$2 } \
/^#@/ { printf "\n${BOLD}%s${RESET}\n", substr($$0, 4) }' ${MAKEFILE_LIST} && echo

include backends/ent/Makefile

#@ Development Tools
lint: # Lint Golang code files
golangci-lint run --verbose

lint-fix: # Fix linter findings
golangci-lint run --fix --verbose
18 changes: 18 additions & 0 deletions backends/ent/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# --------------------------------------------------------------
# SPDX-FileCopyrightText: Copyright © 2024 The Protobom Authors
# SPDX-FileType: SOURCE
# SPDX-License-Identifier: Apache-2.0
# --------------------------------------------------------------
ENT_ROOT_DIR := ${abspath ${patsubst %/,%,${dir ${lastword ${MAKEFILE_LIST}}}}}

.PHONY: generate-ent describe-schemas
.SILENT: generate-ent describe-schemas

#@ Ent Utilities
generate-ent: # Generate ent database types from schema
printf "Generating ${CYAN}ent${RESET} database types with ${CYAN}go generate${RESET}..."
go generate ${ENT_ROOT_DIR}
printf "${GREEN}DONE${RESET}\n"

describe-schemas: # Print descriptions of generated ent schema types
go run -mod=mod entgo.io/ent/cmd/ent describe ${ENT_ROOT_DIR}/schema
25 changes: 25 additions & 0 deletions backends/ent/entc.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
//go:build ignore
// +build ignore

// --------------------------------------------------------------
// SPDX-FileCopyrightText: Copyright © 2024 The Protobom Authors
// SPDX-FileType: SOURCE
// SPDX-License-Identifier: Apache-2.0
// --------------------------------------------------------------
package main

import (
"log"

"entgo.io/ent/entc"
"entgo.io/ent/entc/gen"
)

func main() {
if err := entc.Generate("./schema", &gen.Config{
Features: []gen.Feature{gen.FeatureUpsert},
Templates: []*gen.Template{gen.MustParse(gen.NewTemplate("header").ParseFiles("template/header.tmpl"))},
}); err != nil {
log.Fatalf("running ent codegen: %v", err)
}
}
8 changes: 8 additions & 0 deletions backends/ent/generate.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// --------------------------------------------------------------
// SPDX-FileCopyrightText: Copyright © 2024 The Protobom Authors
// SPDX-FileType: SOURCE
// SPDX-License-Identifier: Apache-2.0
// --------------------------------------------------------------
package ent

//go:generate go run -mod=mod entc.go
34 changes: 34 additions & 0 deletions backends/ent/schema/document.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// --------------------------------------------------------------
// SPDX-FileCopyrightText: Copyright © 2024 The Protobom Authors
// SPDX-FileType: SOURCE
// SPDX-License-Identifier: Apache-2.0
// --------------------------------------------------------------
package schema

import (
"entgo.io/ent"
"entgo.io/ent/schema"
"entgo.io/ent/schema/edge"
"entgo.io/ent/schema/index"
)

type Document struct {
ent.Schema
}

func (Document) Fields() []ent.Field { return nil }

func (Document) Edges() []ent.Edge {
return []ent.Edge{
edge.From("metadata", Metadata.Type).Ref("document").Required().Unique(),
edge.From("node_list", NodeList.Type).Ref("document").Required().Unique(),
}
}

func (Document) Indexes() []ent.Index {
return []ent.Index{
index.Edges("metadata", "node_list").Unique(),
}
}

func (Document) Annotations() []schema.Annotation { return nil }
43 changes: 43 additions & 0 deletions backends/ent/schema/document_type.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
// --------------------------------------------------------------
// SPDX-FileCopyrightText: Copyright © 2024 The Protobom Authors
// SPDX-FileType: SOURCE
// SPDX-License-Identifier: Apache-2.0
// --------------------------------------------------------------
package schema

import (
"entgo.io/ent"
"entgo.io/ent/schema"
"entgo.io/ent/schema/edge"
"entgo.io/ent/schema/field"
)

type DocumentType struct {
ent.Schema
}

func (DocumentType) Fields() []ent.Field {
return []ent.Field{
field.Enum("type").Values(
"OTHER",
"DESIGN",
"SOURCE",
"BUILD",
"ANALYZED",
"DEPLOYED",
"RUNTIME",
"DISCOVERY",
"DECOMISSION",
).Optional().Nillable(),
field.String("name").Optional().Nillable(),
field.String("description").Optional().Nillable(),
}
}

func (DocumentType) Edges() []ent.Edge {
return []ent.Edge{
edge.From("metadata", Metadata.Type).Ref("document_types").Unique(),
}
}

func (DocumentType) Annotations() []schema.Annotation { return nil }
87 changes: 87 additions & 0 deletions backends/ent/schema/edge_type.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
// --------------------------------------------------------------
// SPDX-FileCopyrightText: Copyright © 2024 The Protobom Authors
// SPDX-FileType: SOURCE
// SPDX-License-Identifier: Apache-2.0
// --------------------------------------------------------------
package schema

import (
"entgo.io/ent"
"entgo.io/ent/schema"
"entgo.io/ent/schema/edge"
"entgo.io/ent/schema/field"
"entgo.io/ent/schema/index"
)

type EdgeType struct {
ent.Schema
}

func (EdgeType) Fields() []ent.Field {
return []ent.Field{
field.Enum("type").Values(
"UNKNOWN",
"amends",
"ancestor",
"buildDependency",
"buildTool",
"contains",
"contained_by",
"copy",
"dataFile",
"dependencyManifest",
"dependsOn",
"dependencyOf",
"descendant",
"describes",
"describedBy",
"devDependency",
"devTool",
"distributionArtifact",
"documentation",
"dynamicLink",
"example",
"expandedFromArchive",
"fileAdded",
"fileDeleted",
"fileModified",
"generates",
"generatedFrom",
"metafile",
"optionalComponent",
"optionalDependency",
"other",
"packages",
"patch",
"prerequisite",
"prerequisiteFor",
"providedDependency",
"requirementFor",
"runtimeDependency",
"specificationFor",
"staticLink",
"test",
"testCase",
"testDependency",
"testTool",
"variant",
),
field.String("node_id"),
field.String("to_id"),
}
}

func (EdgeType) Edges() []ent.Edge {
return []ent.Edge{
edge.To("from", Node.Type).Required().Unique().Field("node_id"),
edge.To("to", Node.Type).Required().Unique().Field("to_id"),
}
}

func (EdgeType) Indexes() []ent.Index {
return []ent.Index{
index.Fields("type").Edges("from", "to").Unique(),
}
}

func (EdgeType) Annotations() []schema.Annotation { return nil }
97 changes: 97 additions & 0 deletions backends/ent/schema/external_reference.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
// --------------------------------------------------------------
// SPDX-FileCopyrightText: Copyright © 2024 The Protobom Authors
// SPDX-FileType: SOURCE
// SPDX-License-Identifier: Apache-2.0
// --------------------------------------------------------------
package schema

import (
"entgo.io/ent"
"entgo.io/ent/schema"
"entgo.io/ent/schema/edge"
"entgo.io/ent/schema/field"
)

type ExternalReference struct {
ent.Schema
}

func (ExternalReference) Fields() []ent.Field {
return []ent.Field{
field.String("url"),
field.String("comment"),
field.String("authority").Optional(),
field.Enum("type").Values(
"UNKNOWN",
"ATTESTATION",
"BINARY",
"BOM",
"BOWER",
"BUILD_META",
"BUILD_SYSTEM",
"CERTIFICATION_REPORT",
"CHAT",
"CODIFIED_INFRASTRUCTURE",
"COMPONENT_ANALYSIS_REPORT",
"CONFIGURATION",
"DISTRIBUTION_INTAKE",
"DOCUMENTATION",
"DOWNLOAD",
"DYNAMIC_ANALYSIS_REPORT",
"EOL_NOTICE",
"EVIDENCE",
"EXPORT_CONTROL_ASSESSMENT",
"FORMULATION",
"FUNDING",
"ISSUE_TRACKER",
"LICENSE",
"LOG",
"MAILING_LIST",
"MATURITY_REPORT",
"MAVEN_CENTRAL",
"METRICS",
"MODEL_CARD",
"NPM",
"NUGET",
"OTHER",
"POAM",
"PRIVACY_ASSESSMENT",
"PRODUCT_METADATA",
"PURCHASE_ORDER",
"QUALITY_ASSESSMENT_REPORT",
"QUALITY_METRICS",
"RELEASE_HISTORY",
"RELEASE_NOTES",
"RISK_ASSESSMENT",
"RUNTIME_ANALYSIS_REPORT",
"SECURE_SOFTWARE_ATTESTATION",
"SECURITY_ADVERSARY_MODEL",
"SECURITY_ADVISORY",
"SECURITY_CONTACT",
"SECURITY_FIX",
"SECURITY_OTHER",
"SECURITY_PENTEST_REPORT",
"SECURITY_POLICY",
"SECURITY_SWID",
"SECURITY_THREAT_MODEL",
"SOCIAL",
"SOURCE_ARTIFACT",
"STATIC_ANALYSIS_REPORT",
"SUPPORT",
"VCS",
"VULNERABILITY_ASSERTION",
"VULNERABILITY_DISCLOSURE_REPORT",
"VULNERABILITY_EXPLOITABILITY_ASSESSMENT",
"WEBSITE",
),
}
}

func (ExternalReference) Edges() []ent.Edge {
return []ent.Edge{
edge.To("hashes", HashesEntry.Type),
edge.From("node", Node.Type).Ref("external_references").Required().Unique(),
}
}

func (ExternalReference) Annotations() []schema.Annotation { return nil }
Loading