From 39b21b97d82c3d28e75cd15203abeefaa4d594f3 Mon Sep 17 00:00:00 2001 From: Kush Sharma Date: Fri, 7 Feb 2025 18:46:05 +0530 Subject: [PATCH 1/2] fix: make org and project name case insensitive All org and project slugs will be converted to lower case before they are created. Existing org and projects will continue to work as usual. Signed-off-by: Kush Sharma --- internal/store/postgres/organization_repository.go | 1 + .../store/postgres/organization_repository_test.go | 8 ++++++++ internal/store/postgres/project_repository.go | 1 + internal/store/postgres/project_repository_test.go | 10 ++++++++++ 4 files changed, 20 insertions(+) diff --git a/internal/store/postgres/organization_repository.go b/internal/store/postgres/organization_repository.go index f93550b5a..a79a505a6 100644 --- a/internal/store/postgres/organization_repository.go +++ b/internal/store/postgres/organization_repository.go @@ -146,6 +146,7 @@ func (r OrganizationRepository) Create(ctx context.Context, org organization.Org if strings.TrimSpace(org.Name) == "" { return organization.Organization{}, organization.ErrInvalidDetail } + org.Name = strings.ToLower(org.Name) marshaledMetadata, err := json.Marshal(org.Metadata) if err != nil { diff --git a/internal/store/postgres/organization_repository_test.go b/internal/store/postgres/organization_repository_test.go index 020f45a6b..5f55590ca 100644 --- a/internal/store/postgres/organization_repository_test.go +++ b/internal/store/postgres/organization_repository_test.go @@ -236,6 +236,14 @@ func (s *OrganizationRepositoryTestSuite) TestCreate() { }, ErrString: organization.ErrConflict.Error(), }, + { + Description: "should return error if organization name already exist case sensitive", + OrganizationToCreate: organization.Organization{ + Name: "ORG-1", + Metadata: metadata.Metadata{}, + }, + ErrString: organization.ErrConflict.Error(), + }, { Description: "should return error if organization name is empty", OrganizationToCreate: organization.Organization{ diff --git a/internal/store/postgres/project_repository.go b/internal/store/postgres/project_repository.go index 1acb13a3e..5dfbc4502 100644 --- a/internal/store/postgres/project_repository.go +++ b/internal/store/postgres/project_repository.go @@ -108,6 +108,7 @@ func (r ProjectRepository) Create(ctx context.Context, prj project.Project) (pro if strings.TrimSpace(prj.Name) == "" { return project.Project{}, project.ErrInvalidDetail } + prj.Name = strings.ToLower(prj.Name) marshaledMetadata, err := json.Marshal(prj.Metadata) if err != nil { diff --git a/internal/store/postgres/project_repository_test.go b/internal/store/postgres/project_repository_test.go index b6634ce34..193420f2a 100644 --- a/internal/store/postgres/project_repository_test.go +++ b/internal/store/postgres/project_repository_test.go @@ -250,6 +250,16 @@ func (s *ProjectRepositoryTestSuite) TestCreate() { }, ErrString: project.ErrConflict.Error(), }, + { + Description: "should return error if project slug already exist case sensitive", + ProjectToCreate: project.Project{ + Name: "PROJECT-2", + Organization: organization.Organization{ + ID: s.orgs[0].ID, + }, + }, + ErrString: project.ErrConflict.Error(), + }, { Description: "should return error if org id not an uuid", ProjectToCreate: project.Project{ From d6fc71d5cbfdcf62c106277c0f85e79a37d218ef Mon Sep 17 00:00:00 2001 From: Kush Sharma Date: Fri, 7 Feb 2025 18:56:17 +0530 Subject: [PATCH 2/2] add additional latency metrics for few service calls Signed-off-by: Kush Sharma --- core/authenticate/service.go | 6 ++++++ core/organization/service.go | 6 ++++++ internal/metrics/metrics.go | 1 + internal/metrics/service.go | 16 ++++++++++++++++ 4 files changed, 29 insertions(+) create mode 100644 internal/metrics/service.go diff --git a/core/authenticate/service.go b/core/authenticate/service.go index c32a08457..cd49e4a7c 100644 --- a/core/authenticate/service.go +++ b/core/authenticate/service.go @@ -23,6 +23,7 @@ import ( frontiersession "github.com/raystack/frontier/core/authenticate/session" "github.com/raystack/frontier/core/serviceuser" "github.com/raystack/frontier/internal/bootstrap/schema" + "github.com/raystack/frontier/internal/metrics" "github.com/raystack/frontier/pkg/errors" "github.com/lestrrat-go/jwx/v2/jwk" @@ -739,6 +740,11 @@ func (s Service) getOrCreateUser(ctx context.Context, email, title string) (user } func (s Service) GetPrincipal(ctx context.Context, assertions ...ClientAssertion) (Principal, error) { + if metrics.ServiceOprLatency != nil { + promCollect := metrics.ServiceOprLatency("authenticate", "GetPrincipal") + defer promCollect() + } + var currentPrincipal Principal if len(assertions) == 0 { // check all assertions diff --git a/core/organization/service.go b/core/organization/service.go index a81b491e8..17bd9c00c 100644 --- a/core/organization/service.go +++ b/core/organization/service.go @@ -18,6 +18,7 @@ import ( "github.com/raystack/frontier/core/relation" "github.com/raystack/frontier/core/user" "github.com/raystack/frontier/internal/bootstrap/schema" + "github.com/raystack/frontier/internal/metrics" ) type Repository interface { @@ -229,6 +230,11 @@ func (s Service) Update(ctx context.Context, org Organization) (Organization, er } func (s Service) ListByUser(ctx context.Context, principal authenticate.Principal, filter Filter) ([]Organization, error) { + if metrics.ServiceOprLatency != nil { + promCollect := metrics.ServiceOprLatency("organization", "ListByUser") + defer promCollect() + } + subjectIDs, err := s.relationService.LookupResources(ctx, relation.Relation{ Object: relation.Object{ Namespace: schema.OrganizationNamespace, diff --git a/internal/metrics/metrics.go b/internal/metrics/metrics.go index 6745137c4..92d48ee41 100644 --- a/internal/metrics/metrics.go +++ b/internal/metrics/metrics.go @@ -9,6 +9,7 @@ import ( func Init() { initStripe() initDB() + initService() } type HistogramFunc func(labelValue ...string) func() diff --git a/internal/metrics/service.go b/internal/metrics/service.go new file mode 100644 index 000000000..b119cc108 --- /dev/null +++ b/internal/metrics/service.go @@ -0,0 +1,16 @@ +package metrics + +import ( + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" +) + +var ServiceOprLatency HistogramFunc + +func initService() { + ServiceOprLatency = createMeasureTime(promauto.NewHistogramVec(prometheus.HistogramOpts{ + Name: "service_operation_latency", + Help: "Time taken for service operation to complete", + Buckets: []float64{.005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10, 30, 60}, + }, []string{"service", "operation"})) +}