Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
da4b4a0
bump grip version
matthewpeterkort Jun 11, 2025
2721be8
update grip
matthewpeterkort Jun 12, 2025
a689f43
bump grip version
matthewpeterkort Jun 12, 2025
efedfd1
update grip
matthewpeterkort Jun 16, 2025
464b1b2
tidy
matthewpeterkort Jun 16, 2025
a28e992
bump grip version
matthewpeterkort Jul 7, 2025
97aad45
fix go version
matthewpeterkort Jul 7, 2025
65b2562
update grip
matthewpeterkort Jul 14, 2025
6fac72b
update grip version
matthewpeterkort Aug 26, 2025
bc12642
bump grip version
matthewpeterkort Sep 16, 2025
f00ddef
bump grip version
matthewpeterkort Sep 16, 2025
21f56e4
Merge branch 'main' into feature/test-delete
matthewpeterkort Sep 24, 2025
9d025b6
bump grip version
matthewpeterkort Oct 15, 2025
f5da0bb
fix up tests to work with latest grip. fix jsonschemagraph dep
matthewpeterkort Oct 20, 2025
60f5828
bump grip version
matthewpeterkort Oct 27, 2025
ce65656
cleanup old code to be better code
matthewpeterkort Nov 6, 2025
8339e32
update deps
matthewpeterkort Nov 6, 2025
7ab9f50
add go work
matthewpeterkort Nov 6, 2025
7daa1d2
upgrade deps
matthewpeterkort Nov 6, 2025
567c9e6
build errs
matthewpeterkort Nov 6, 2025
b5c0dbe
add middleware replace stmt
matthewpeterkort Nov 6, 2025
8b2f286
commit middleware?
matthewpeterkort Nov 6, 2025
64daba4
update deps
matthewpeterkort Dec 2, 2025
b962957
bump grip version
matthewpeterkort Feb 19, 2026
10b2f4a
Merge branch 'main' into feature/test-delete
matthewpeterkort Feb 19, 2026
8eb0555
update deps
matthewpeterkort Feb 25, 2026
8034f7a
update grip-graphql
matthewpeterkort Mar 6, 2026
6f6d290
tidy the go mod
matthewpeterkort Mar 6, 2026
e02f6fd
fix tests
matthewpeterkort Mar 6, 2026
5d234e4
patch benchtop
matthewpeterkort Mar 6, 2026
ec4eec3
bump benchtop
matthewpeterkort Mar 6, 2026
323cdbf
bump grip
matthewpeterkort Mar 6, 2026
082b663
bump grip
matthewpeterkort Mar 9, 2026
132f097
fix grip deps
matthewpeterkort Mar 9, 2026
87d2c7a
bump grip version
matthewpeterkort Mar 10, 2026
b8741cf
fix execution bug
matthewpeterkort Mar 17, 2026
28fae65
fix traversal bug
matthewpeterkort Mar 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 57 additions & 26 deletions gen3_writer/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,8 @@ func TokenAuthMiddleware(jwtHandler middleware.JWTHandler) gin.HandlerFunc {

return func(c *gin.Context) {
// If request path is open access then no token needed no project_id needed.
project_split := strings.Split(c.Param("project-id"), "-")
if len(project_split) != 2 {
project_split := strings.SplitN(c.Param("project-id"), "-", 2)
if len(project_split) != 2 || project_split[0] == "" || project_split[1] == "" {
// This error usually occurs when part of the path is correct or a typo in path.
RegError(c, c.Writer, c.Param("graph"), &middleware.ServerError{StatusCode: 404, Message: fmt.Sprintf("incorrect path %s", c.Request.URL)})
return
Expand Down Expand Up @@ -456,6 +456,7 @@ func (gh *Handler) DeleteVertex(c *gin.Context, vertexId string) {

func (gh *Handler) BulkDelete(c *gin.Context) {
writer, request, graph := getFields(c)
log.WithFields(log.Fields{"graph": graph}).Info("BulkDelete start")

var body []byte
var err error
Expand All @@ -464,20 +465,28 @@ func (gh *Handler) BulkDelete(c *gin.Context) {
RegError(c, writer, graph, GetInternalServerErr(err))
return
}
if body == nil {
RegError(c, writer, graph, err)
if len(body) == 0 {
RegError(c, writer, graph, &middleware.ServerError{
StatusCode: 400,
Message: "Request body empty. Cannot parse request",
})
return
}
if err := protojson.Unmarshal(body, delData); err != nil {
RegError(c, writer, graph, &middleware.ServerError{
StatusCode: 400,
Message: fmt.Sprintf("Invalid bulk-delete payload: %v", err),
})
return
} else {
if err := protojson.Unmarshal([]byte(body), delData); err != nil {
RegError(c, writer, graph, err)
return
}
}
delData.Graph = graph
log.WithFields(log.Fields{"graph": graph, "vertices": len(delData.Vertices), "edges": len(delData.Edges)}).Info("BulkDelete parsed payload")

if err := gh.client.BulkDelete(delData); err != nil {
RegError(c, writer, graph, GetInternalServerErr(err))
return
}
log.WithFields(log.Fields{"graph": graph}).Info("BulkDelete complete")
Response(c, writer, graph, nil, 200, fmt.Sprintf("[200] bulk-delete on graph %s", graph))
}

Expand All @@ -486,7 +495,14 @@ func (gh *Handler) GetProjectVertices(c *gin.Context) {

writer, _, graph := getFields(c)
project_id := c.Param("project-id")
str_split := strings.Split(project_id, "-")
str_split := strings.SplitN(project_id, "-", 2)
if len(str_split) != 2 || str_split[0] == "" || str_split[1] == "" {
RegError(c, writer, graph, &middleware.ServerError{
StatusCode: 400,
Message: "project-id must be in '<program>-<project>' format",
})
return
}
project := "/programs/" + str_split[0] + "/projects/" + str_split[1]

Vquery := gripql.V().Has(gripql.Eq("auth_resource_path", project))
Expand Down Expand Up @@ -520,8 +536,16 @@ func (gh *Handler) ProjectDelete(c *gin.Context) {
var delVs []string

writer, _, graph := getFields(c)
log.WithFields(log.Fields{"graph": graph}).Info("ProjectDelete start")
project_id := c.Param("project-id")
str_split := strings.Split(project_id, "-")
str_split := strings.SplitN(project_id, "-", 2)
if len(str_split) != 2 || str_split[0] == "" || str_split[1] == "" {
RegError(c, writer, graph, &middleware.ServerError{
StatusCode: 400,
Message: "project-id must be in '<program>-<project>' format",
})
return
}
project := "/programs/" + str_split[0] + "/projects/" + str_split[1]

Vquery := gripql.V().Has(gripql.Eq("auth_resource_path", project)).Render("_id")
Expand All @@ -535,16 +559,25 @@ func (gh *Handler) ProjectDelete(c *gin.Context) {
/* Running bulkDelete with only the vertex ids specified will remove all of the disconnected edges caused by removing
All vertices in the graph. */
for i := range result {
v := i.ToInterface().(map[string]any)["render"].(string)
delVs = append(delVs, v)
if r := i.GetRender(); r != nil {
if id, ok := r.AsInterface().(string); ok && id != "" {
delVs = append(delVs, id)
if len(delVs)%10000 == 0 {
log.WithFields(log.Fields{"graph": graph, "project_id": project_id, "vertices_collected": len(delVs)}).Info("ProjectDelete traversal progress")
}
}
}
}
log.WithFields(log.Fields{"graph": graph, "project_id": project_id, "vertices_collected": len(delVs)}).Info("ProjectDelete traversal complete")

delData := &gripql.DeleteData{Graph: graph, Vertices: delVs, Edges: []string{}}
log.WithFields(log.Fields{"graph": graph, "project_id": project_id, "vertices_to_delete": len(delVs)}).Info("ProjectDelete bulk delete begin")

if err := gh.client.BulkDelete(delData); err != nil {
RegError(c, writer, graph, GetInternalServerErr(err))
return
}
log.WithFields(log.Fields{"graph": graph, "project_id": project_id}).Info("ProjectDelete complete")
Response(c, writer, graph, nil, 200, fmt.Sprintf("[200] project-delete on project %s", project_id))
}

Expand All @@ -559,14 +592,13 @@ func (gh *Handler) WriteVertex(c *gin.Context) {
RegError(c, writer, graph, err)
return
}
if body == nil {
RegError(c, writer, graph, err)
if len(body) == 0 {
RegError(c, writer, graph, &middleware.ServerError{StatusCode: 400, Message: "Request body empty. Cannot parse request"})
return
}
if err := protojson.Unmarshal(body, v); err != nil {
RegError(c, writer, graph, &middleware.ServerError{StatusCode: 400, Message: fmt.Sprintf("Invalid vertex payload: %v", err)})
return
} else {
if err := protojson.Unmarshal([]byte(body), v); err != nil {
RegError(c, writer, graph, err)
return
}
}
if err := gh.client.AddVertex(graph, v); err != nil {
RegError(c, writer, graph, GetInternalServerErr(err))
Expand All @@ -586,14 +618,13 @@ func (gh *Handler) WriteEdge(c *gin.Context) {
RegError(c, writer, graph, err)
return
}
if body == nil {
if len(body) == 0 {
RegError(c, writer, graph, &middleware.ServerError{StatusCode: 400, Message: "Request body empty. Cannot parse request"})
return
} else {
if err := protojson.Unmarshal([]byte(body), e); err != nil {
RegError(c, writer, graph, err)
return
}
}
if err := protojson.Unmarshal(body, e); err != nil {
RegError(c, writer, graph, &middleware.ServerError{StatusCode: 400, Message: fmt.Sprintf("Invalid edge payload: %v", err)})
return
}
if err := gh.client.AddEdge(graph, e); err != nil {
RegError(c, writer, graph, GetInternalServerErr(err))
Expand Down
91 changes: 89 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,69 +4,154 @@ go 1.24.2

require (
github.com/99designs/gqlgen v0.17.57
github.com/bmeg/grip v0.0.0-20251202230911-d54d9a03cb7d
github.com/bmeg/grip v0.0.0-20260315213055-7b57be8d0a5d
github.com/dop251/goja v0.0.0-20240707163329-b1681fb2a2f5
github.com/gin-gonic/gin v1.8.1
github.com/golang-jwt/jwt/v5 v5.2.1
github.com/google/uuid v1.6.0
github.com/graphql-go/graphql v0.8.1
github.com/graphql-go/handler v0.2.4
github.com/spf13/cobra v1.8.1
github.com/spf13/pflag v1.0.5
github.com/spf13/pflag v1.0.6
github.com/vektah/gqlparser/v2 v2.5.19
golang.org/x/exp v0.0.0-20240707233637-46b078467d37
google.golang.org/protobuf v1.36.7
)

require (
filippo.io/edwards25519 v1.1.0 // indirect
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 // indirect
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.0 // indirect
github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect
github.com/AzureAD/microsoft-authentication-library-for-go v1.3.2 // indirect
github.com/DataDog/zstd v1.5.7 // indirect
github.com/IBM/sarama v1.45.1 // indirect
github.com/Shopify/sarama v1.38.1 // indirect
github.com/Workiva/go-datastructures v1.1.5 // indirect
github.com/agnivade/levenshtein v1.2.0 // indirect
github.com/apache/arrow/go/v18 v18.0.0-20241007013041-ab95a4d25142 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/bmeg/benchtop v0.0.0-20260306193933-7cdd75fcb2fb // indirect
github.com/bmeg/jsonpath v0.0.0-20210207014051-cca5355553ad // indirect
github.com/bmeg/jsonschema/v6 v6.0.4 // indirect
github.com/bmeg/jsonschemagraph v0.0.4-0.20251017205345-236d2de9887c // indirect
github.com/boltdb/bolt v1.3.1 // indirect
github.com/bytedance/sonic v1.14.0 // indirect
github.com/bytedance/sonic/loader v0.3.0 // indirect
github.com/casbin/casbin/v2 v2.97.0 // indirect
github.com/casbin/govaluate v1.2.0 // indirect
github.com/cespare/xxhash v1.1.0 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/cloudwego/base64x v0.1.5 // indirect
github.com/cockroachdb/errors v1.11.3 // indirect
github.com/cockroachdb/fifo v0.0.0-20240616162244-4768e80dfb9a // indirect
github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect
github.com/cockroachdb/pebble v1.1.5 // indirect
github.com/cockroachdb/redact v1.1.5 // indirect
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/dgraph-io/badger/v2 v2.2007.4 // indirect
github.com/dgraph-io/ristretto v0.2.0 // indirect
github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect
github.com/dlclark/regexp2 v1.11.2 // indirect
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/eapache/go-resiliency v1.7.0 // indirect
github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 // indirect
github.com/eapache/queue v1.1.0 // indirect
github.com/edsrzf/mmap-go v1.2.0 // indirect
github.com/fatih/color v1.17.0 // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/getsentry/sentry-go v0.28.1 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/go-ini/ini v1.67.0 // indirect
github.com/go-playground/locales v0.14.0 // indirect
github.com/go-playground/universal-translator v0.18.0 // indirect
github.com/go-playground/validator/v10 v10.11.1 // indirect
github.com/go-sourcemap/sourcemap v2.1.4+incompatible // indirect
github.com/go-sql-driver/mysql v1.8.1 // indirect
github.com/go-viper/mapstructure/v2 v2.2.1 // indirect
github.com/goccy/go-json v0.10.3 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/golang/snappy v0.0.5-0.20231225225746-43d5d4cd4e0e // indirect
github.com/google/flatbuffers v24.3.25+incompatible // indirect
github.com/google/pprof v0.0.0-20240711041743-f6c9dda6c6da // indirect
github.com/gorilla/websocket v1.5.0 // indirect
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
github.com/hashicorp/go-hclog v1.6.3 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/hashicorp/go-plugin v1.6.1 // indirect
github.com/hashicorp/go-uuid v1.0.3 // indirect
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
github.com/hashicorp/yamux v0.1.1 // indirect
github.com/imdario/mergo v0.3.16 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/influxdata/tdigest v0.0.1 // indirect
github.com/jcmturner/aescts/v2 v2.0.0 // indirect
github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect
github.com/jcmturner/gofork v1.7.6 // indirect
github.com/jcmturner/gokrb5/v8 v8.4.4 // indirect
github.com/jcmturner/rpc/v2 v2.0.3 // indirect
github.com/jessevdk/go-flags v1.6.1 // indirect
github.com/jmoiron/sqlx v1.4.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/kennygrant/sanitize v1.2.4 // indirect
github.com/klauspost/compress v1.18.0 // indirect
github.com/klauspost/cpuid/v2 v2.2.8 // indirect
github.com/knakk/rdf v0.0.0-20190304171630-8521bf4c5042 // indirect
github.com/kr/pretty v0.3.1 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/kylelemons/godebug v1.1.0 // indirect
github.com/leodido/go-urn v1.2.1 // indirect
github.com/lib/pq v1.10.9 // indirect
github.com/logrusorgru/aurora v2.0.3+incompatible // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-sqlite3 v1.14.23 // indirect
github.com/maypok86/otter/v2 v2.1.0 // indirect
github.com/minio/md5-simd v1.1.2 // indirect
github.com/minio/minio-go/v7 v7.0.73 // indirect
github.com/mitchellh/go-testing-interface v1.14.1 // indirect
github.com/mitchellh/hashstructure/v2 v2.0.2 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/mongodb/mongo-tools v0.0.0-20250131183507-b8a566a7f38f // indirect
github.com/montanaflynn/stats v0.7.1 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/oklog/run v1.1.0 // indirect
github.com/paulbellamy/ratecounter v0.2.0 // indirect
github.com/pelletier/go-toml/v2 v2.0.5 // indirect
github.com/pierrec/lz4/v4 v4.1.22 // indirect
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/prometheus/client_golang v1.19.1 // indirect
github.com/prometheus/client_model v0.6.1 // indirect
github.com/prometheus/common v0.55.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect
github.com/robertkrimen/otto v0.4.0 // indirect
github.com/rogpeppe/go-internal v1.12.0 // indirect
github.com/rs/xid v1.5.0 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/segmentio/ksuid v1.0.4 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/sosodev/duration v1.3.1 // indirect
github.com/spf13/cast v1.9.2 // indirect
github.com/syndtr/goleveldb v1.0.0 // indirect
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.2.7 // indirect
github.com/urfave/cli/v2 v2.27.5 // indirect
github.com/xdg-go/pbkdf2 v1.0.0 // indirect
github.com/xdg-go/scram v1.1.2 // indirect
github.com/xdg-go/stringprep v1.0.4 // indirect
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect
github.com/zeebo/xxh3 v1.0.2 // indirect
go.etcd.io/bbolt v1.4.3 // indirect
go.mongodb.org/mongo-driver v1.17.0 // indirect
golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect
golang.org/x/crypto v0.36.0 // indirect
golang.org/x/mod v0.22.0 // indirect
Expand All @@ -76,9 +161,11 @@ require (
golang.org/x/term v0.30.0 // indirect
golang.org/x/text v0.23.0 // indirect
golang.org/x/tools v0.28.0 // indirect
golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20250811230008-5f3141c8851a // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250811230008-5f3141c8851a // indirect
google.golang.org/grpc v1.71.0 // indirect
gopkg.in/sourcemap.v1 v1.0.5 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
sigs.k8s.io/yaml v1.4.0 // indirect
Expand Down
Loading
Loading