From c582a105b08d3bdfafbf94695ea83675f0f885a5 Mon Sep 17 00:00:00 2001 From: gearnode Date: Mon, 31 Mar 2025 14:47:07 +0200 Subject: [PATCH] Add control reference id Signed-off-by: gearnode --- pkg/probo/framework_service.go | 4 +++ pkg/slug/slug.go | 36 +++++++++++++++++++++++++++ pkg/slug/slug_test.go | 45 ++++++++++++++++++++++++++++++++++ 3 files changed, 85 insertions(+) create mode 100644 pkg/slug/slug.go create mode 100644 pkg/slug/slug_test.go diff --git a/pkg/probo/framework_service.go b/pkg/probo/framework_service.go index c687d62ae..c3b00dd79 100644 --- a/pkg/probo/framework_service.go +++ b/pkg/probo/framework_service.go @@ -22,6 +22,7 @@ import ( "github.com/getprobo/probo/pkg/coredata" "github.com/getprobo/probo/pkg/gid" "github.com/getprobo/probo/pkg/page" + "github.com/getprobo/probo/pkg/slug" "go.gearno.de/kit/pg" ) @@ -33,6 +34,7 @@ type ( CreateFrameworkRequest struct { OrganizationID gid.GID Name string + Description string } UpdateFrameworkRequest struct { @@ -67,6 +69,8 @@ func (s FrameworkService) Create( ID: frameworkID, OrganizationID: req.OrganizationID, Name: req.Name, + Description: req.Description, + ReferenceID: slug.Make(req.Name), CreatedAt: now, UpdatedAt: now, } diff --git a/pkg/slug/slug.go b/pkg/slug/slug.go new file mode 100644 index 000000000..22f39bd05 --- /dev/null +++ b/pkg/slug/slug.go @@ -0,0 +1,36 @@ +// Copyright (c) 2025 Probo Inc . +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +// OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +// PERFORMANCE OF THIS SOFTWARE. + +package slug + +import ( + "regexp" + "strings" +) + +var ( + regHyphens = regexp.MustCompile("-+") + regSpaces = regexp.MustCompile(" ") + regLower = regexp.MustCompile("[^a-z0-9-]") +) + +func Make(s string) string { + s = strings.ToLower(s) + s = regSpaces.ReplaceAllString(s, "-") + s = regLower.ReplaceAllString(s, "") + s = regHyphens.ReplaceAllString(s, "-") + s = strings.Trim(s, "-") + + return s +} diff --git a/pkg/slug/slug_test.go b/pkg/slug/slug_test.go new file mode 100644 index 000000000..01eb4339d --- /dev/null +++ b/pkg/slug/slug_test.go @@ -0,0 +1,45 @@ +// Copyright (c) 2025 Probo Inc . +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +// REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +// AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +// INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +// LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +// OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +// PERFORMANCE OF THIS SOFTWARE. + +package slug + +import ( + "testing" +) + +func TestMake(t *testing.T) { + tests := []struct { + input string + expected string + }{ + {"Hello World", "hello-world"}, + {"This is a test", "this-is-a-test"}, + {"Special characters: !@#$%^&*()", "special-characters"}, + {"Multiple---Hyphens", "multiple-hyphens"}, + {"-Trim-Hyphens-", "trim-hyphens"}, + {"123 Numbers", "123-numbers"}, + {" Spaces ", "spaces"}, + {"", ""}, + {"UPPERCASE", "uppercase"}, + {"under_score", "under-score"}, + {"dots.and.more.dots", "dotsandmoredots"}, + } + + for _, test := range tests { + slug := Make(test.input) + if slug != test.expected { + t.Errorf("Slug(%q) = %q; expected %q", test.input, slug, test.expected) + } + } +}